From: fred Date: Wed, 27 Mar 2002 00:35:01 +0000 (+0000) Subject: lilypond-1.3.119 X-Git-Tag: release/1.5.59~1019 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=e7414db6c2dd6b52424c673a0e25457e49c012fb;p=lilypond.git lilypond-1.3.119 --- diff --git a/CHANGES b/CHANGES index 9b193edaf8..48dd80cd3e 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,21 @@ +1.3.119 +======= + +* Added some feature examples. + +* Bugfix for \partial and auto-beamer. + +* Bugfixes: warnings. + +* More feature examples. + +* Renamed some scm files. + +* Some more documentation fixes (move hacking.texi into normal +documentation.) + +* Bugfix: header protection in parser.yy + 1.3.117.mb1 =========== diff --git a/Documentation/hacking.texi b/Documentation/hacking.texi index 80aa3de327..63583e9134 100644 --- a/Documentation/hacking.texi +++ b/Documentation/hacking.texi @@ -3,26 +3,10 @@ @settitle LilyPond internals -@node Top, LilyPond internals, (dir), (dir) +@node Top, , (dir), (dir) @top -@menu -* LilyPond internals:: -* Overview:: -* Request_engraver:: -* Coding standards:: -* Making patches:: -* Localisation:: -@end menu - -@node LilyPond internals, , Top, Top - -@menu -* Overview:: Overview -* Request_engraver:: Request_engraver -@end menu - @chapter Getting involved @@ -96,640 +80,3 @@ scanning sheet music. @chapter LilyPond internals - -@node Overview, , , Top -@section Overview - -GNU LilyPond is a "multi-pass" system. - -@table @samp - -@item Parsing: - -No difficult algorithms. The .ly file is read, and converted to a list -of @code{Scores}, which each contain @code{Music} and paper/midi-definitions. - -@item Interpreting music - -The music is walked through in time-order. The iterators which do the -walking report Music to Translators which use this information to -create elements, either MIDI or "visual" elements. The translators -form a hierarchy; the ones for paper output are Engravers, for MIDI -Performers. - -The translators swallow Music (mostly atomic gobs called Requests), -create elements, broadcast them to other translators on higher or same -level in the hierarchy: - -The stem of a voice A is broadcast to the staff which contains A, but -not to the stems, beams and noteheads of a different voice (say B) or -a different staff. The stem and noteheads of A are coupled, because -the the Note_heads_engraver broadcasts its heads, and the Stem_engraver catches -these. - -The engraver which agrees to handle a request decides whether to to -honor the request, ignore it, or merge it with other requests. Merging -of requests is preferably done with other requests done by members of -the same voicegroups (beams, brackets, stems). In this way you can put -the voices of 2 instruments in a conductor's score so they make chords -(the Beam requests of both instruments will be merged). - -@item Prebreaking - -Breakable stuff (eg. clefs and bars) are copied into pre and -postbreaks. - -@item Preprocessing - -Some dependencies are resolved, such as the direction of stems, beams, -and "horizontal" placement issues (the order of clefs, keys etc, -placement of chords in multi-voice music), - -@item Break calculation: - -The lines and horizontal positions of the columns are determined. - -@item Breaking - -Through some magical interactions with Line_of_score and Super_elem -(check out the source) the "lines" are produced. - -All other spanners can figure across which lines they are spread. If -applicable, they break themselves into pieces. After this, each piece -(or, if there are no pieces, the original spanner itself) throws out -any dependencies which are in the wrong line. - -@item Postprocesing: - -Some items and all spanners need computation after the Paper_column -positions are determined. Examples: slurs, vertical positions of -staffs. - -@item Output paper - -@end table - - -@node Request_engraver, , , Top -@section Request_engraver - -In the previous section the idea of Request has been explained, but -this only solves one half of the problem. The other half is deciding -which requests should be honored, which should merged with other -requests, and which should be ignored. Consider this input - -@example - - \type Staff < % chord - @{ \meter 2/4; [c8 c8] @} - @{\meter 2/4; [e8 e8] @} - > - -@end example - -Both the cs and es are part of a staff (they are in the same -Voice_group), so they should share meters, but the two [ ] pairs -should be merged. - -The judge in this "allocation" problem a set of brokers: the requests -are transmitted to so-called engravers which respond if they want to -accept a request eg, the @code{Notehead_engraver} will accept -@code{Note_req}s, and turn down @code{Slur_req}s. If the Music_iterator -cannot find a engraver that wants the request, it is junked (with a -warning message). - -After all requests have been either assigned, or junked, the Engraver -will process the requests (which usually means creating an @code{Item} -or @code{Spanner}). If a @code{Request_engraver} creates something, it -tells the enclosing context. If all items/spanners have been created, -then each Engraver is notified of any created Score_element, via a -broadcasting system. - -@unnumberedsubsec example: - -@example - - c4 - -@end example - -produces: - -@example - - Note_request (duration 1/4) - Stem_request (duration 1/4) - -@end example - -Note_request will be taken by a @code{Notehead_engraver}, stem_request -will be taken by a @code{Stem_beam_engraver}. @code{Notehead_engraver} -creates a @code{Notehead}, @code{Stem_beam_engraver} creates a -@code{Stem}. Both announce this to the Staff_engraver. Staff_engraver -will tell @code{Stem_beam_engraver} about the @code{Notehead}, which -will add the @code{Notehead} to the @code{Stem} it just created. - -To decide on merging, several engravers have been grouped. Please -check @file{init/engraver.ly}. - -@node Coding standards, , , Top - -@chapter CodingStyle - standards while programming for GNU LilyPond - -Functions and methods do not return errorcodes: they never crash, but -report a programming_error and try to carry on.q - - -@unnumberedsubsec Languages - -C++ and Python are preferred. Python code should use an indent of 8, -using TAB characters. - -@unnumberedsubsec Filenames - -Definitions of classes that are only accessed via pointers -(*) or references (&) shall not be included as include files. - -filenames - -@example - ".hh" Include files - ".cc" Implementation files - ".icc" Inline definition files - ".tcc" non inline Template defs -@end example - -in emacs: - -@example - (setq auto-mode-alist - (append '(("\\.make$" . makefile-mode) - ("\\.cc$" . c++-mode) - ("\\.icc$" . c++-mode) - ("\\.tcc$" . c++-mode) - ("\\.hh$" . c++-mode) - ("\\.pod$" . text-mode) - ) - auto-mode-alist)) -@end example - - -The class Class_name_abbreviation is coded in @file{class-name-abbr.*} - -@unnumberedsubsec Indentation - -Standard GNU coding style is used. In emacs: - -@example - (add-hook 'c++-mode-hook - '(lambda() (c-set-style "gnu") - ) - ) -@end example - -If you like using font-lock, you can also add this to your @file{.emacs}: - -@example - (setq font-lock-maximum-decoration t) - (setq c++-font-lock-keywords-3 - (append - c++-font-lock-keywords-3 - '(("\\b\\([a-zA-Z_]+_\\)\\b" 1 font-lock-variable-name-face) - ("\\b\\([A-Z]+[a-z_]+\\)\\b" 1 font-lock-type-face)) - )) -@end example - -@unnumberedsubsec Classes and Types - -@example - This_is_a_class -@end example - -@unnumberedsubsec Members - -@example - Class::member () - Type Class::member_type_ - Type Class::member_type () -@end example - -the @code{type} is a Hungarian notation postfix for @code{Type}. See below - -@unnumberedsubsec Macros - -Macros should be written completely in uppercase - -@unnumberedsubsec Broken code - -Broken code (hardwired dependencies, hardwired constants, slow -algorithms and obvious limitations) should be marked as such: either -with a verbose TODO, or with a short "ugh" comment. - -@unnumberedsec Hungarian notation naming convention - -Proposed is a naming convention derived from the so-called -@emph{Hungarian Notation}. Macros, @code{enum}s and @code{const}s are all -uppercase, with the parts of the names separated by underscores. - -The hungarian notation is to be used when variables are not declared -near usage (mostly in member variables and functions). - -@unnumberedsubsec Types - -@table @samp -@item @code{byte} - unsigned char. (The postfix _by is ambiguous) -@item @code{b} - bool -@item @code{bi} - bit -@item @code{ch} - char -@item @code{f} - float -@item @code{i} - signed integer -@item @code{str} - string class -@item @code{sz} - Zero terminated c string -@item @code{u} - unsigned integer -@end table - -@unnumberedsubsec User defined types - -@example - - /** Slur blah. blah. - (slur) - */ - class Slur @{@}; - Slur* slur_p = new Slur; - -@end example - -@unnumberedsubsec Modifiers - -The following types modify the meaning of the prefix. -These are preceded by the prefixes: - -@table @samp -@item @code{a} - array -@item @code{array} - user built array. -@item @code{c} - const. Note that the proper order is @code{Type const} - i.s.o. @code{const Type} -@item @code{C} - A const pointer. This would be equivalent to @code{_c_l}, but since any - "const" pointer has to be a link (you can't delete a const pointer), - it is superfluous. -@item @code{l} - temporary pointer to object (link) -@item @code{p} - pointer to newed object -@item @code{r} - reference -@end table - -@unnumberedsubsec Adjective - -Adjectives such as global and static should be spelled out in full. -They come before the noun that they refer to, just as in normal english. - -@example - -foo_global_i: a global variable of type int commonly called "foo". - -@end example - -static class members do not need the static_ prefix in the name (the -Class::var notation usually makes it clear that it is static) - -@table @samp -@item @code{loop_i} - Variable loop: an integer -@item @code{u} - Temporary variable: an unsigned integer -@item @code{test_ch} - Variable test: a character -@item @code{first_name_str} - Variable first_name: a String class object -@item @code{last_name_ch_a} - Variable last_name: a @code{char} array -@item @code{foo_i_p} - Variable foo: an @code{Int*} that you must delete -@item @code{bar_i_l} - Variable bar: an @code{Int*} that you must not delete -@end table - -Generally default arguments are taboo, except for nil pointers. - -The naming convention can be quite conveniently memorised, by -expressing the type in english, and abbreviating it - -@example - - static Array foo - -@end example - -@code{foo} can be described as "the static int-pointer user-array", so you get - -@example - - foo_static_l_arr - -@end example - - -@unnumberedsec Miscellaneous - -For some tasks, some scripts are supplied, notably creating patches, a -mirror of the website, generating the header to put over cc and hh -files, doing a release. - -Use them. - -@node Making patches, , , Top - - -@unnumberedsec Track and distribute your code changes - -This page documents how to distribute your changes to GNU lilypond - -We would like to have unified context diffs with full pathnames. A -script automating supplied with Lily. - -Distributing a change normally goes like this: - -@itemize @bullet -@item make your fix/add your code -@item Add changes to CHANGES, and add yourself to Documentation/topdocs/AUTHORS.texi -@item generate a patch, -@item e-mail your patch to one of the mailing lists - gnu-music-discuss@@gnu.org or bug-gnu-music@@gnu.org -@end itemize - -Please do not send entire files, even if the patch is bigger than the -original. A patch makes it clear what is changed, and it won't -overwrite previous (not yet released) changes. - -@unnumberedsec Generating a patch - -Simple version: run - -@example - make -C lilypond-x.y.z/ distclean - make -C lilypond-x.y.z.NEW/ distclean - diff -urN lilypond-x.y.z/ lilypond-x.y.z.NEW/ -@end example - -Complicated (but automated) version: - -In @file{VERSION}, set MY_PATCH_LEVEL: - -@example - - VERSION: - ... - MY_PATCH_LEVEL=jcn1 - -@end example - -In @file{CHANGES}, enter a summary of changes: - -@example - pl 0.1.73.jcn1 - - added PATCHES.texi -@end example - -Then, from the top of Lily's source tree, type - -@example - make release -@end example - -These handy python scripts assume a directory structure which looks -like: - -@example - - lilypond -> lilypond-x.y.z # symlink to development directory - lilypond-x.y.z/ # current development - patches/ # patches between different releases - releases/ # .tar.gz releases - -@end example - -(Some scripts also assume this lives in @file{$HOME/usr/src}). - - -@unnumberedsec Applying patches - - -If you're following LilyPond development regularly, you probably want to -download just the patch for each subsequent release. -After downloading the patch (into the patches directory, of course), simply -apply it: - -@example - - gzip -dc ../patches/lilypond-0.1.74.diff.gz | patch -p1 -E - -@end example - -and don't forget to make automatically generated files: - -@example - - autoconf footnote(patches don't include automatically generated files, - i.e. file(configure) and files generated by file(configure).) - - configure - -@end example - -@node Localisation, , , Top - -@chapter Localisation - User messages in LilyPond - -@section Introduction - -This document provides some guidelines for uniformising user messages. -In the absence of other standards, we'll be using these rules when coding -for for LilyPond@footnote{ -In addition to the C++ coding standards that come with Lily -}. Hopefully, this can be replaced by general GNU -guidelines in the future. - -Not-preferred messages are marked with @code{+}. -By convention, agrammatical examples are marked with @code{*}. - - -@section Guidelines - -@itemize @bullet - -@item -Every message to the user should be localised (and thus be marked -for localisation). This includes warning and error messages. - -@item -Don't localise/gettextify: - -@itemize @minus -@item @code{programming_error ()}s -@item @code{programming_warning ()}s -@item debug strings -@item output strings (PostScript, TeX)@footnote{ -This may seem ridiculously obvious, however, makeinfo-3.12s localises -output strings. Sending bug report now ---jcn -} -@end itemize - - - -@item -Messages to be localised must be encapsulated in @code{_ (STRING)} -or @code{_f (FORMAT, ...)}. Eg: - -@example -warning (_ ("Need music in a score")); -error (_f ("Can't open file: `%s'", file_name)); -@end example - -In some rare cases you may need to call @code{gettext ()} by hand. -This happens when you pre-define (a list of) string constants for later -use. In that case, you'll probably also need to mark these string -constants for translation, using @code{_i (STRING)}. The @code{_i} -macro is a no-op, it only serves as a marker for @file{xgettext}. - -@example -char const* messages[] = @{ - _i ("enable debugging output"), - _i ("ignore lilypond version"), - 0 -@}; - -void -foo (int i) -@{ - puts (gettext (messages [i])); -@} -@end example - -See also -@file{flower/getopt-long.cc} and @file{lily/main.cc}. - -@item -Don't use leading or trailing whitespace in messages. - -@item -Messages containing a final verb, or a gerund (@code{-ing}-form) -always start with a capital. Other (simpler) messages start with -a lowercase letter: - -@example -The word `foo' is not declared. -`foo': not declared. -Not declaring: `foo'. -@end example - -@item -To avoid having a number of different messages for the same situation, -we'll use quoting like this @code{"message: `%s'"} for all strings. -Numbers are not quoted: - -@example -_f ("Can't open file: `%s'", name_str) -_f ("Can't find charater number: %d", i) -@end example - -@item -Think about translation issues. -In a lot of cases,it's better to translate a whole message. -The english grammar mustn't be imposed on the translator. -So, iso - -@example -_ ("Stem at ") + moment.str () + _(" doen't fit in beam") -@end example - -@noindent -have - -@example -_f ("Stem at %s doen't fit in beam", moment.str ()) -@end example - -@item -Split up multi-sentence messages, whenever possible. Instead of - -@example -warning (_f ("out of tune! Can't find: `%s', "Key_engraver")); - -warning (_f ("Can't find font `%s', loading default", - font_name)); -@end example - -@noindent -rather say: - -@example -warning (_ ("out of tune:"); -warning (_f ("Can't find: `%s', "Key_engraver")); - -warning (_f ("Can't find font: `%s', font_name)); -warning (_f ("Loading default font")); -@end example - -@item -If you must have multiple-sentence messages, use full punctuation. -Use two spaces after end of sentence punctuation. -No punctuation (esp. period) is used at the end of simple messages. - -@example - _f ("Non-matching braces in text `%s', adding braces", text) - _ ("Debug output disabled. Compiled with NPRINT.") - _f ("Huh? Not a Request: `%s'. Ignoring.", request) -@end example - -@item -Don't modularise too much; a lot of words cannot be translated -without context. -It's probably safe to treat most occurences of words like -stem, beam, crescendo as separately translatable words. - -@item -When translating, it is preferrable to put interesting information -at the end of the message, rather than embedded in the middle. -This especially applies to frequently used messages, even if this -would mean sacrificing a bit of eloquency. This holds for original -messages too, of course. - -@example - en: can't open: `foo.ly' -+ nl: kan `foo.ly' niet openen (1) - kan niet openen: `foo.ly'* (2) - niet te openen: `foo.ly'* (3) -@end example - -The first nl message, although gramatically and stylishly correct, -is not friendly for parsing by humans (even if they speak dutch). -I guess we'd prefer something like (2) or (3). - -@item -Please don't run make po/po-update with GNU gettext < 0.10.35 - -@end itemize - -@bye - - - -@bye - - diff --git a/Documentation/header.html.in b/Documentation/header.html.in index e0c92780f3..b920b95bfa 100644 --- a/Documentation/header.html.in +++ b/Documentation/header.html.in @@ -52,7 +52,8 @@ which substitutes some @AT_VARIABLES@ as well. Small FAQ
Full FAQ
User manual
- Features
+ Features
+ Regression Test
To do

diff --git a/Documentation/user/features.tely b/Documentation/user/features.tely index e0d85a7de4..7f7c939553 100644 --- a/Documentation/user/features.tely +++ b/Documentation/user/features.tely @@ -19,16 +19,20 @@ TODO * Slur attachments:: Slur attachments * Text spanner:: Text spanner * Engraver hacking:: Engraver hacking +* Part combiner:: Part combiner * Markup text:: Markup text +* Apply hacking:: Apply hacking * Output property:: Output property * Embedded TeX:: Embedded TeX * Embedded PostScript:: Embedded PostScript @end menu +@ignore Testin'' a b c... @lilypond[fragment,relative,verbatim,center] a'' b c @end lilypond +@end ignore @node Arpeggio @section Arpeggio @@ -67,8 +71,6 @@ Testin'' a b c... > @end lilypond -@c part combiner - @node Manual beam settings @section Manual beam settings @@ -92,54 +94,186 @@ Control number of beams... @end lilypond @lilypond[fragment,relative,verbatim,center] - f'32 g a b b a g f - - \property Voice.autoBeamSettings - \set #'(end * * * *) = #(make-moment 1 4) - f32 g a b b a g f - - f32 g a - \property Voice.stemRightBeamCount = #1 b - \property Voice.stemLeftBeamCount = #1 b - a g f + f'32 g a b b a g f + + \property Voice.autoBeamSettings + \set #'(end * * * *) = #(make-moment 1 4) + f32 g a b b a g f + + f32 g a + \property Voice.stemRightBeamCount = #1 b + \property Voice.stemLeftBeamCount = #1 b + a g f @end lilypond Don't extend to middle line esp. for grace @lilypond[fragment,relative,verbatim,center] - \grace a'8 a4 - \property Voice.Stem \set #'no-stem-extend = ##t - \grace g8 g4 + \grace a'8 a4 + \property Voice.Stem \set #'no-stem-extend = ##t + \grace g8 g4 @end lilypond -@c beam slope -@c beam start beam end +Beam slope (height) + +Horizontal beam + +@lilypond[fragment,relative,verbatim,center] + \property Voice.Beam \set #'direction = #1 + \property Voice.Beam \set #'height-hs = #0 + [a''8 e' d c] +@end lilypond + +beam start-y beam-height + +Weird beam +@lilypond[fragment,relative,verbatim,center] + \property Voice.Beam \set #'y-position-hs = #4 + \property Voice.Beam \set #'height-hs = #-4 + [c'8 c] +@end lilypond + + +Like stem... + +@lilypond[fragment,relative,verbatim,center] + [b''8 b] + \property Voice.Beam \set #'default-neutral-direction = #-1 + [b b] +@end lilypond + +There are several ways to calculate the direction of a beam. + +[Ross] states that the majority of the notes dictates the +direction (and not the mean of "center distance") + +But is that because it really looks better, or because he wants +to provide some real simple hands-on rules? + +We have our doubts, so we simply provide all sensible alternatives: + +@table @samp +@item majority +number count of up or down notes +@item mean +mean centre distance of all notes +@item median +mean centre distance weighted per note +@end table + +You can spot the difference of these settings quite easily from these simple examples: + +@lilypond[fragment,relative,verbatim,center] + [d''8 a] + \property Voice.Beam \set #'dir-function = #beam-dir-mean + [d a] + \property Voice.Beam \set #'dir-function = #beam-dir-median + [d a] +@end lilypond + +@lilypond[fragment,relative,verbatim,center] + \time 3/8; + [d''8 a a] + \property Voice.Beam \set #'dir-function = #beam-dir-mean + [d a a] + \property Voice.Beam \set #'dir-function = #beam-dir-median + [d a a] +@end lilypond @node Slur attachments @section Slur attachments -BUG Override attachments... +Override attachments... @lilypond[fragment,relative,verbatim,center] - \property Voice.Slur \set #'direction = #1 - \property Voice.Stem \set #'length = #5.5 - g''8(g)g4 - g4(g8)g - \property Voice.Slur \set #'attachment = #'(stem . stem) - g8(g)g4 - g4(g8)g + \property Voice.Slur \set #'direction = #1 + \property Voice.Stem \set #'length = #5.5 + g''8(g)g4 + g4(g8)g + \property Voice.Slur \set #'attachment = #'(stem . stem) + g8(g)g4 + g4(g8)g @end lilypond + +Test Before, after + +@c Ugh, ugh @multitable is broken in texinfo-4.0 +@c Fixed in 4.0.jcn3 +@c We'll have to postpone this before/after representation until +@c jcn3 is rolled into texinfo... + +@multitable @columnfractions .40 .40 +@item +@noindent +@lilypond[fragment,relative,verbatim,center] +\property Voice.Slur + \set #'direction = #1 +g''8(g)g4 +g4(g8)g +@end lilypond +@tab +@lilypond[fragment,relative,verbatim,center] +\property Voice.Slur + \set #'direction = #1 +\property Voice.Stem + \set #'length = #5.5 +\property Voice.Slur + \set #'attachment = #'(stem . stem) +g''8(g)g4 +g4(g8)g +@end lilypond +@end multitable + + Ophee slurs... @lilypond[fragment,relative,verbatim,center] - \property Voice.Slur \set #'direction = #1 - \property Voice.Slur \set #'attachment = #'(head . head) - g''16()g()g()g()d'()d()d()d + \property Voice.Slur \set #'direction = #1 + \property Voice.Slur \set #'attachment = #'(head . head) + g''16()g()g()g()d'()d()d()d @end lilypond -@c steep slur correct -@c high slurs, eg from gnossienes +Steep slur correct... +@lilypond[fragment,relative,verbatim,center] + \property Voice.Stem \set #'direction = #1 + \property Voice.Slur \set #'direction = #1 + d'32( d'4 )d8.. + \property Voice.Slur \set #'attachment = #'(stem . stem) + d,32( d'4 )d8.. +@end lilypond + +Ugly slurs... +@lilypond[verbatim,center] +\score { + \notes \context PianoStaff < + \time 6/4; + \context Staff=up { s1 * 6/4 } + \context Staff=down < + \clef bass; + \autochange Staff \context Voice + \notes \relative c { + d,8( a' d f a d f d a f d )a + } + > + > + \paper { + linewidth = -1.; + \translator { + \VoiceContext + Slur \override #'beautiful = #5.0 + Slur \override #'direction = #1 + Stem \override #'direction = #-1 + autoBeamSettings \override #'(end * * * *) + = #(make-moment 1 2) + } + \translator { + \PianoStaffContext + VerticalAlignment \override #'threshold = #'(5 . 5) + } + } +} +@end lilypond @node Text spanner @@ -157,15 +291,16 @@ Have crescendo set a text spanner iso hairpin @subsection Ottava @lilypond[fragment,relative,verbatim,center] - a'''' b c a - \property Voice.TextSpanner \set #'type = #'dotted-line - \property Voice.TextSpanner \set #'edge-height = #'(0 . 1.5) - \property Voice.TextSpanner \set #'edge-text = #'("8va " . "") - \property Staff.centralCPosition = #-13 - a\spanrequest \start "text" b c a \spanrequest \stop "text" + a'''' b c a + \property Voice.TextSpanner \set #'type = #'dotted-line + \property Voice.TextSpanner \set #'edge-height = #'(0 . 1.5) + \property Voice.TextSpanner \set #'edge-text = #'("8va " . "") + \property Staff.centralCPosition = #-13 + a\spanrequest \start "text" b c a \spanrequest \stop "text" @end lilypond + @node Engraver hacking @section Engraver hacking @@ -177,11 +312,11 @@ No time signature, no barlines... d c b a } \paper { + linewidth = -1.; \translator { \StaffContext whichBar = #"" \remove "Time_signature_engraver"; - linewidth = -1.; } } } @@ -192,23 +327,57 @@ No staff, no clef, squash pitches \score { \notes { c4 c4 c8 c8 } \paper { + linewidth = -1.; \translator { \StaffContext \remove Staff_symbol_engraver; \consists Pitch_squash_engraver; \remove Clef_engraver; } - linewidth = -1.; } } @end lilypond +@node Part combiner +@section Part combiner + +@lilypond[verbatim,center] +\score{ + \context Staff = flauti < + \time 4/4; + \context Voice=one \partcombine Voice + \context Thread=one \notes\relative c'' { + c4 d e f | b,4 d c d | r2 e4 f | c4 d e f | + c4 r e f | c4 r e f | c4 r a r | a a r a | + a2 \property Voice.soloADue = ##f a | + } + \context Thread=two \notes\relative c'' { + g4 b d f | r2 c4 d | a c c d | a4. b8 c4 d + c r e r | r2 s2 | a,4 r a r | a r r a | + a2 \property Voice.soloADue = ##f a | + } + > + \paper{ + linewidth = 80 * \staffspace; + \translator{ + \ThreadContext + \consists Rest_engraver; + } + \translator{ + \VoiceContext + \remove Rest_engraver; + } + } +} +@end lilypond + + + + @node Markup text @section Markup text -@c markup text hacking - Metrome hack... @lilypond[verbatim,center] @@ -256,12 +425,136 @@ Don't move the finger 2, only text "m.d." ... } @end lilypond - -@c subsection no clefs + @c equalizer -@c Embedded TeX +@node Apply hacking +@section Apply hacking + +@lilypond[verbatim,center] +music = \notes { c'4 d'4( e'4 f'4 } + +#(define (reverse-music music) + (let* ((elements (ly-get-mus-property music 'elements)) + (reversed (reverse elements)) + (span-dir (ly-get-mus-property music 'span-direction))) + + (ly-set-mus-property music 'elements reversed) + + (if (dir? span-dir) + (ly-set-mus-property music 'span-direction (- span-dir))) + + (map reverse-music reversed) + + music)) + +\score { + \context Voice { + \music + \apply #reverse-music \music + } + \paper { linewidth = -1.; } +} +@end lilypond + + +LilyPond is more flexible than some users realise. Han-Wen could be +very rich. + +Just too funny not to include. + +@example +@quotation + I've just entered a request on cosource.com : +@quotation + http://www.cosource.com/cgi-bin/cos.pl/wish/info/387 +@end quotation + Here's a copy of my feature request : +@quotation + Your task, if you accept it is to implement a \smarttranspose + command> that would translate such oddities into more natural + notations. Double accidentals should be removed, as well as #E + (-> F), bC (-> B), bF (-> E), #B (-> C). +@end quotation +@end quotation +You mean like this. (Sorry 'bout the nuked indentation.) + +Add IMPLEMENT_TYPE_P(Music, "music?"); to music.cc, and presto, done. + +That's an easy $ 100; if I'd make $ 200/hour for every hour I worked +on Lily, I'd be very rich :) +@end example + + +@lilypond[verbatim,center] +#(define (unhair-pitch p) + (let* ((o (pitch-octave p)) + (a (pitch-alteration p)) + (n (pitch-notename p))) + + (cond + ((and (> a 0) (or (eq? n 6) (eq? n 2))) + (set! a (- a 1)) (set! n (+ n 1))) + ((and (< a 0) (or (eq? n 0) (eq? n 3))) + (set! a (+ a 1)) (set! n (- n 1)))) + + (cond + ((eq? a 2) (set! a 0) (set! n (+ n 1))) + ((eq? a -2) (set! a 0) (set! n (- n 1)))) + + (if (< n 0) (begin (set! o (- o 1)) (set! n (+ n 7)))) + (if (> n 7) (begin (set! o (+ o 1)) (set! n (- n 7)))) + + (make-pitch o n a))) + +#(define (smart-transpose music pitch) + (let* ((es (ly-get-mus-property music 'elements)) + (e (ly-get-mus-property music 'element)) + (p (ly-get-mus-property music 'pitch)) + (body (ly-get-mus-property music 'body)) + (alts (ly-get-mus-property music 'alternatives))) + + (if (pair? es) + (ly-set-mus-property + music 'elements + (map (lambda (x) (smart-transpose x pitch)) es))) + + (if (music? alts) + (ly-set-mus-property + music 'alternatives + (smart-transpose alts pitch))) + + (if (music? body) + (ly-set-mus-property + music 'body + (smart-transpose body pitch))) + + (if (music? e) + (ly-set-mus-property + music 'element + (smart-transpose e pitch))) + + (if (pitch? p) + (begin + (set! p (unhair-pitch (Pitch::transpose p pitch))) + (ly-set-mus-property music 'pitch p))) + + music)) + + +music = \notes \relative c' { c4 d e f g a b c } + +\score { + \notes \context Staff { + \transpose ais' \music + \apply #(lambda (x) (smart-transpose x (make-pitch 0 5 1))) + \music + } + \paper { linewidth = -1.; } +} +@end lilypond + @node Embedded TeX @section Embedded TeX @@ -273,6 +566,9 @@ Don't move the finger 2, only text "m.d." ... @section Embedded PostScript Arbitrary lines and curves not supported... + +[TODO:] Make a direct postscript command? + @lilypond[verbatim,center] \score { \notes \relative c'' { @@ -282,9 +578,7 @@ Arbitrary lines and curves not supported... s2 a'1 } - \paper { - linewidth = 70.0*\staffspace; - } + \paper { linewidth = 70 * \staffspace; } } @end lilypond diff --git a/VERSION b/VERSION index 526c57deed..7b3b1cf65f 100644 --- a/VERSION +++ b/VERSION @@ -1,7 +1,7 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=3 -PATCH_LEVEL=118 +PATCH_LEVEL=119 MY_PATCH_LEVEL= # use the above to send patches: MY_PATCH_LEVEL is always empty for a diff --git a/input/test/follow-thread.ly b/input/test/follow-thread.ly index e58e1c91f8..26144d9121 100644 --- a/input/test/follow-thread.ly +++ b/input/test/follow-thread.ly @@ -9,21 +9,20 @@ property @code{followThread}. \score{ \context PianoStaff < \context Staff=one \notes\relative c''{ - \context Thread -%{ + \context Thread d, \translator Staff=two c - +%{ b \translator Staff=one a' -%} + [c,8 \translator Staff=two c] s2. - +%} } \context Staff=two { \clef bass; \skip 1*2; } > diff --git a/input/test/music-apply.ly b/input/test/music-apply.ly index a61ea1a7a1..e0f2144ef4 100644 --- a/input/test/music-apply.ly +++ b/input/test/music-apply.ly @@ -1,26 +1,31 @@ +\header { +texidoc=" +Simple customised music apply. +"; +} + +music = \notes { c'4 d'4( e'4 f'4 } -mus = \notes { c'4 d'4( e'4 f'4 } - -#(define (reverse-music mus) - (let* ( - (es (ly-get-mus-property mus 'elements)) - (reved (reverse es)) - (sd (ly-get-mus-property mus 'span-direction)) - ) - (ly-set-mus-property - mus - 'elements - reved - ) - (if (dir? sd) - (ly-set-mus-property mus 'span-direction (- sd))) - (map reverse-music reved) - mus) -) +#(define (reverse-music music) + (let* ((elements (ly-get-mus-property music 'elements)) + (reversed (reverse elements)) + (span-dir (ly-get-mus-property music 'span-direction))) + + (ly-set-mus-property music 'elements reversed) + + (if (dir? span-dir) + (ly-set-mus-property music 'span-direction (- span-dir))) + + (map reverse-music reversed) + + music)) \score { - \context Voice { - \mus - \apply #reverse-music \mus - } + \context Voice { + \music + \apply #reverse-music \music + } + \paper { + linewidth = -1.; + } } diff --git a/input/test/number-staff-lines.ly b/input/test/number-staff-lines.ly index d8f758a1e9..5494d66c52 100644 --- a/input/test/number-staff-lines.ly +++ b/input/test/number-staff-lines.ly @@ -1,17 +1,19 @@ \header{ -texidoc=" -The number of stafflines of a staff can be set with the property -numberOfStaffLines. Ledger lines both on note heads and rests are -adjusted. Barlines also are adjusted. -"; + +texidoc=" The number of stafflines of a staff can be set. Ledger +lines both on note heads and rests are adjusted. Barlines also are +adjusted. "; + } \score { - \context Voice \notes\relative c { - - c' c c c | g' g g g \property Staff . numberOfStaffLines = 3 - +\context Voice \notes\relative c { + c' c c c | g' g g g } - \paper { } + \paper { + +\translator { \StaffContext +StaffSymbol \override #'line-count = #3 +} } \midi { } } diff --git a/input/test/slur-ugly.ly b/input/test/slur-ugly.ly new file mode 100644 index 0000000000..7406ba233b --- /dev/null +++ b/input/test/slur-ugly.ly @@ -0,0 +1,35 @@ +\header { +texidoc="You can get ugly slurs, if you want. +"; +} + +baseWalk = \notes \relative c { + d,8( a' d f a d f d a f d )a +} + +\score { + \notes \context PianoStaff < + \time 6/4; + \context Staff=up { s1 * 6/4 } + \context Staff=down < + \clef bass; + \autochange Staff \context Voice \baseWalk + > + > + \paper { + linewidth = -1.; + \translator { + \VoiceContext + Slur \override #'beautiful = #5.0 + Slur \override #'direction = #1 + Stem \override #'direction = #-1 + autoBeamSettings \override #'(end * * * *) + = #(make-moment 1 2) + } + \translator { + \PianoStaffContext + VerticalAlignment \override #'threshold = #'(5 . 5) + } + } +} + diff --git a/input/test/smart-transpose.ly b/input/test/smart-transpose.ly new file mode 100644 index 0000000000..388ae4eec3 --- /dev/null +++ b/input/test/smart-transpose.ly @@ -0,0 +1,99 @@ +\header { +texidoc="LilyPond 1.3 is more flexible than some users realise. Han-Wen could be very rich. +"; +} + +% Btw, I've leant an el-neato trick for formatting code in email messages, +% using inderect buffers. +% +% M-x make-indirect-buffer RET RET foo RET C-x b foo RET +% Select region and then narrow: C-x n n +% Set mode, eg: M-x sch TAB RET +% + +%{ + I've just entered a request on cosource.com : + + http://www.cosource.com/cgi-bin/cos.pl/wish/info/387 + + Here's a copy of my feature request : + + Your task, if you accept it is to implement a \smarttranspose + command> that would translate such oddities into more natural + notations. Double accidentals should be removed, as well as #E + (-> F), bC (-> B), bF (-> E), #B (-> C). + +You mean like this. (Sorry 'bout the nuked indentation.) + +Add IMPLEMENT_TYPE_P(Music, "music?"); to music.cc, and presto, done. + +That's an easy $ 100; if I'd make $ 200/hour for every hour I worked +on Lily, I'd be very rich :) + +%} + +#(define (unhair-pitch p) + (let* ((o (pitch-octave p)) + (a (pitch-alteration p)) + (n (pitch-notename p))) + + (cond + ((and (> a 0) (or (eq? n 6) (eq? n 2))) + (set! a (- a 1)) (set! n (+ n 1))) + ((and (< a 0) (or (eq? n 0) (eq? n 3))) + (set! a (+ a 1)) (set! n (- n 1)))) + + (cond + ((eq? a 2) (set! a 0) (set! n (+ n 1))) + ((eq? a -2) (set! a 0) (set! n (- n 1)))) + + (if (< n 0) (begin (set! o (- o 1)) (set! n (+ n 7)))) + (if (> n 7) (begin (set! o (+ o 1)) (set! n (- n 7)))) + + (make-pitch o n a))) + +#(define (smart-transpose music pitch) + (let* ((es (ly-get-mus-property music 'elements)) + (e (ly-get-mus-property music 'element)) + (p (ly-get-mus-property music 'pitch)) + (body (ly-get-mus-property music 'body)) + (alts (ly-get-mus-property music 'alternatives))) + + (if (pair? es) + (ly-set-mus-property + music 'elements + (map (lambda (x) (smart-transpose x pitch)) es))) + + (if (music? alts) + (ly-set-mus-property + music 'alternatives + (smart-transpose alts pitch))) + + (if (music? body) + (ly-set-mus-property + music 'body + (smart-transpose body pitch))) + + (if (music? e) + (ly-set-mus-property + music 'element + (smart-transpose e pitch))) + + (if (pitch? p) + (begin + (set! p (unhair-pitch (Pitch::transpose p pitch))) + (ly-set-mus-property music 'pitch p))) + + music)) + + +music = \notes \relative c' { c4 d e f g a b c } + +\score { + \notes \context Staff { + \transpose ais' \music + \apply #(lambda (x) (smart-transpose x (make-pitch 0 5 1))) + \music + } + \paper { linewidth = -1.; } +} diff --git a/scm/backend-documentation-lib.scm b/scm/backend-documentation-lib.scm index 3125d7cc17..b9623477b8 100644 --- a/scm/backend-documentation-lib.scm +++ b/scm/backend-documentation-lib.scm @@ -121,7 +121,7 @@ doc))) ;; testin.. -- how to do this -(eval-string (ly-gulp-file "interface.scm")) +(eval-string (ly-gulp-file "interface-description.scm")) (define xinterface-description-alist `( (general-grob . ,general-grob-interface) @@ -148,7 +148,7 @@ (use-modules (ice-9 string-fun)) -(define interface-file-str (string-append (ly-gulp-file "interface.scm") "\n(define ")) +(define interface-file-str (string-append (ly-gulp-file "interface-description.scm") "\n(define ")) (define (list-interface-names) (let* ((text interface-file-str) @@ -162,7 +162,7 @@ -(eval (ly-gulp-file "interface.scm")) +(eval (ly-gulp-file "interface-description.scm")) (define interface-description-alist (map (lambda (x) (cons (string->symbol x) (eval-string x))) diff --git a/scm/grob-description.scm b/scm/grob-description.scm new file mode 100644 index 0000000000..9d7cd37e50 --- /dev/null +++ b/scm/grob-description.scm @@ -0,0 +1,657 @@ +;;;; grob-description.scm -- part of generated backend documentation +;;;; +;;;; source file of the GNU LilyPond music typesetter +;;;; +;;;; (c) 1998--2000 Han-Wen Nienhuys +;;;; Jan Nieuwenhuizen + +; distances are given in stafflinethickness (thicknesses) and +; staffspace (distances) + +(define all-grob-descriptions + `((Arpeggio . ( + (X-extent-callback . ,Arpeggio::width_callback) + (Y-extent-callback . #f) + (molecule-callback . ,Arpeggio::brew_molecule) + (Y-offset-callbacks . (,Staff_symbol_referencer::callback)) + (X-offset-callbacks . (,Side_position::aligned_side)) + (direction . -1) + (staff-position . 0.0) + (meta . ,(grob-description "Arpeggio" arpeggio-interface side-position-interface font-interface)) + )) + + (autoBeamSettings . ,auto-beam-settings) + + (BarLine . ( + (break-align-symbol . Staff_bar) + (glyph . "|") + (break-glyph-function . ,default-break-barline) + (barsize-procedure . ,Bar::get_staff_bar_size) + (molecule-callback . ,Bar::brew_molecule) + (visibility-lambda . ,all-visible) + (breakable . #t) + (before-line-breaking-callback . ,Bar::before_line_breaking) + ;; + ;; Ross. page 151 lists other values, we opt for a leaner look + ;; + (kern . 3.0) + (thin-kern . 3.0) + (hair-thickness . 1.6) + (thick-thickness . 6.0) + (meta . ,(grob-description "BarLine" bar-line-interface font-interface)) + )) + + (BarNumber . ( + (molecule-callback . ,Text_item::brew_molecule) + (breakable . #t) + (visibility-lambda . ,begin-of-line-visible) + (padding . 1.0) + (direction . 1) + (font-family . roman) + (font-relative-size . -1) + (meta . ,(grob-description "BarNumber" + text-interface font-interface break-aligned-interface)) + )) + + (Beam . ( + ;; todo: clean this up a bit: the list is getting + ;; rather long. + (molecule-callback . ,Beam::brew_molecule) + (thickness . 0.42) ; in staff-space, should use stafflinethick? + (before-line-breaking-callback . ,Beam::before_line_breaking) + (after-line-breaking-callback . ,Beam::after_line_breaking) + (default-neutral-direction . 1) + (dir-function . ,beam-dir-majority) + (height-quants . ,default-beam-dy-quants) + (vertical-position-quant-function . ,default-beam-y-quants) + (beamed-stem-shorten . (0.5)) + (outer-stem-length-limit . 0.2) + (slope-limit . 0.2) + (flag-width-function . ,default-beam-flag-width-function) + (space-function . ,default-beam-space-function) + (damping . 1) + (meta . ,(grob-description "Beam" beam-interface)) + )) + + (BreakAlignment . ( + (breakable . #t) + (stacking-dir . 1) + (axes 0) + (X-offset-callbacks . (,Break_align_interface::self_align_callback)) + (space-alist . ,default-break-align-space-alist) + (meta . ,(grob-description "BreakAlignment" + axis-group-interface align-interface + ) + ) + )) + + (BreakAlignGroup . ( + (axes . (0)) + (X-offset-callbacks . (,Break_align_interface::alignment_callback)) + + (meta . ,(grob-description "BreakAlignGroup" axis-group-interface)) + )) + + (BreathingSign . ( + (break-align-symbol . Breathing_sign) + (breakable . #t ) + (molecule-callback . ,Breathing_sign::brew_molecule) + (Y-offset-callbacks . (,Breathing_sign::offset_callback)) + (visibility-lambda . ,begin-of-line-invisible) + (meta . ,(grob-description "BreathingSign" break-aligned-interface)) + )) + + (Clef . ( + (molecule-callback . ,Clef::brew_molecule) + (before-line-breaking-callback . ,Clef::before_line_breaking) + (breakable . #t) + (font-family . music) + (break-align-symbol . Clef_item) + (visibility-lambda . ,begin-of-line-visible) + (Y-offset-callbacks . (,Staff_symbol_referencer::callback)) + (meta . ,(grob-description "Clef" clef-interface font-interface break-aligned-interface )) + )) + + (ChordName . ( + (molecule-callback . ,Chord_name::brew_molecule) + (after-line-breaking-callback . ,Chord_name::after_line_breaking) + (chord-name-function . ,default-chord-name-function) + (font-family . roman) + (meta . ,(grob-description "ChordName" font-interface text-interface chord-name-interface)) + )) + + (Custos . ( + (break-align-symbol . Custos) + (breakable . #t ) + (molecule-callback . ,Custos::brew_molecule) + (visibility-lambda . ,end-of-line-visible) + (style . vaticana) + (Y-offset-callbacks . (,Staff_symbol_referencer::callback)) + (meta . ,(grob-description "Custos" custos-interface staff-symbol-interface break-aligned-interface) ) + )) + + (Hairpin . ( + (molecule-callback . ,Hairpin::brew_molecule) + (thickness . 1.0) + (height . 0.6666) + + (if-text-padding . 1.0) + (width-correct . -1.0) + + (dash-thickness . 1.2) + (dash-length . 4.0) + (self-alignment-Y . 0) + (Y-offset-callbacks . (,Side_position::aligned_on_self)) + (meta . ,(grob-description "Hairpin" hairpin-interface)) + )) + + (DotColumn . ( + (axes 0 ) + (meta . ,(grob-description "DotColumn" dot-column-interface axis-group-interface)) + )) + + (Dots . ( + (molecule-callback . ,Dots::brew_molecule) + (dot-count . 1) + (staff-position . 0.0) + (Y-offset-callbacks . (,Dots::quantised_position_callback ,Staff_symbol_referencer::callback)) + (meta . ,(grob-description "Dots" font-interface dot-interface )) + )) + + (DynamicText . ( + (Y-offset-callbacks . (,Side_position::aligned_on_self)) + (molecule-callback . ,Text_item::brew_molecule) + (script-priority . 100) + (font-series . bold) + (font-family . dynamic) + (font-shape . italic) + (self-alignment-Y . 0) + (meta . ,(grob-description "DynamicText" font-interface text-interface )) + )) + + (DynamicLineSpanner . ( + (axes . ( 1)) + (padding . 0.6) + (minimum-space . 1.2) + (meta . ,(grob-description "DynamicLineSpanner" dynamic-interface axis-group-interface side-position-interface)) + )) + + (LeftEdge . ( + (break-align-symbol . Left_edge_item) + (X-offset-callbacks . (,Break_align_interface::alignment_callback)) + (breakable . #t) + (meta . ,(grob-description "LeftEdge" break-aligned-interface)) + )) + + (Fingering . ( + (molecule-callback . ,Text_item::brew_molecule) + (X-offset-callbacks . (,Side_position::centered_on_parent ,Side_position::aligned_on_self)) + (padding . 0.6) + (self-alignment-X . 0) + (font-family . number) + (font-relative-size . -3) + (font-shape . upright) + (meta . ,(grob-description "Fingering" finger-interface font-interface text-script-interface text-interface side-position-interface)) + )) + + (GraceAlignment . ( + (axes . (0)) + (horizontal-space . 1.2) + (padding . 1.0) + (before-line-breaking-callback . ,Grace_align_item::before_line_breaking) + (meta . ,(grob-description "GraceAlignment" axis-group-interface align-interface grace-alignment-interface)) + )) + + (HaraKiriVerticalGroup . ( + (Y-offset-callbacks . (,Hara_kiri_group_spanner::force_hara_kiri_callback)) + (Y-extent-callback . ,Hara_kiri_group_spanner::y_extent) + (axes 1) + (meta . ,(grob-description "HaraKiriVerticalGroup" axis-group-interface hara-kiri-group-interface)) + )) + + (LyricHyphen . ( + (thickness . 1.0) + (height . 0.4) + (minimum-length . 0.5) + (molecule-callback . ,Hyphen_spanner::brew_molecule) + (Y-extent-callback . ,Grob::point_dimension_callback) + (meta . ,(grob-description "LyricHyphen" lyric-hyphen-interface )) + )) + + (InstrumentName . ( + (breakable . #t) + (Y-offset-callbacks . (,Side_position::centered_on_parent + ,Side_position::aligned_on_self)) + (self-alignment-Y . 0) + (molecule-callback . ,Text_item::brew_molecule) + (break-align-symbol . Instrument_name) + (visibility-lambda . ,begin-of-line-visible) + (font-family . roman) + (meta . ,(grob-description "InstrumentName" font-interface text-interface break-aligned-interface)) + )) + + (KeySignature . ( + (molecule-callback . ,Key_item::brew_molecule) + (break-align-symbol . Key_item) + (visibility-lambda . ,begin-of-line-visible) + (breakable . #t) + (meta . ,(grob-description "KeySignature" key-signature-interface font-interface break-aligned-interface)) + )) + + (Accidentals . ( + (molecule-callback . ,Local_key_item::brew_molecule) + (X-offset-callbacks . (,Side_position::aligned_side)) + (direction . -1) + (left-padding . 0.2) + (right-padding . 0.4) + (meta . ,(grob-description "Accidentals" accidentals-interface font-interface side-position-interface)) + )) + + (LineOfScore . ( + (axes . (0 1)) + (meta . ,(grob-description "LineOfScore" line-of-score-interface axis-group-interface)) + )) + + (LyricExtender . ( + (molecule-callback . ,Lyric_extender::brew_molecule) + (height . 0.8) ; stafflinethickness; + (right-trim-amount . 0.5) + (Y-extent-callback . ,Grob::point_dimension_callback) + (meta . ,(grob-description "LyricExtender" lyric-extender-interface)) + )) + + (LyricText . ( + (molecule-callback . ,Text_item::brew_molecule) + (X-offset-callbacks . (,Side_position::aligned_on_self)) + (self-alignment-X . 0) + (non-rhythmic . #t) + (word-space . 0.6) + (font-family . roman) + (font-shape . upright) + (meta . ,(grob-description "LyricText" lyric-syllable-interface text-interface font-interface )) + )) + + (RehearsalMark . ( + (molecule-callback . ,Text_item::brew_molecule) + (direction . 1) + (breakable . #t) + (font-family . number) + (font-shape . upright) + (font-relative-size . 1) + (visibility-lambda . ,end-of-line-invisible) + (padding . 0.8) + (meta . ,(grob-description "RehearsalMark" mark-interface side-position-interface)) + )) + + (MultiMeasureRest . ( + (spacing-procedure . ,Multi_measure_rest::set_spacing_rods) + (molecule-callback . ,Multi_measure_rest::brew_molecule) + (staff-position . 0) + (expand-limit . 10) + (padding . 2.0) ; staffspace + (minimum-width . 12.5) ; staffspace + (font-family . number) + (font-relative-size . 1) + (meta . ,(grob-description "MultiMeasureRest" multi-measure-rest-interface font-interface )) + )) + (NoteCollision . ( + (axes 0 1) + (note-width . 1.65) + (meta . ,(grob-description "NoteCollision" + note-collision-interface axis-group-interface + )) + )) + + (NoteColumn . ( + (axes . (0 1)) + (meta . ,(grob-description "NoteColumn" axis-group-interface note-column-interface)) + )) + + (NoteHead . ( + (style . default) + (molecule-callback . ,Note_head::brew_molecule) + (Y-offset-callbacks . (,Staff_symbol_referencer::callback)) + (meta . ,(grob-description "NoteHead" + rhythmic-head-interface font-interface + note-head-interface )) + )) + (Glissando . ( + (type . line) + (gap . 0.5) + (breakable . #t) + (X-extent-callback . #f) + (Y-extent-callback . #f) + (molecule-callback . ,Line_spanner::brew_molecule) + (meta . ,(grob-description "Glissando" + line-spanner-interface)) + )) + (FollowThread . ( + (type . line) + (gap . 0.5) + (breakable . #t) + (X-extent-callback . #f) + (Y-extent-callback . #f) + (molecule-callback . ,Line_spanner::brew_molecule) + (meta . ,(grob-description "FollowThread" + line-spanner-interface)) + )) + + (NoteName . ( + (molecule-callback . ,Text_item::brew_molecule) + (font-family . roman) + (meta . ,(grob-description "NoteName" + note-name-interface font-interface + )) + )) + + (OctavateEight . ( + (self-alignment-X . 0) + (text . "8") + (visibility-lambda . ,begin-of-line-visible) + (X-offset-callbacks . (,Side_position::centered_on_parent ,Side_position::aligned_on_self)) + (Y-offset-callbacks . (,Side_position::aligned_side)) + (molecule-callback . ,Text_item::brew_molecule) + (font-shape . italic) + (font-family . roman) + (meta . ,(grob-description "OctavateEight" text-interface font-interface )) + )) + + (PaperColumn . ( + (axes 0) + (before-grace-spacing-factor . 1.2) + (before-musical-spacing-factor . 0.4) + (meta . ,(grob-description "PaperColumn" paper-column-interface axis-group-interface spaceable-element-interface)) + )) + (NonMusicalPaperColumn . ( + (axes 0) + (before-musical-spacing-factor . 1.0) + (column-space-strength . 2.0) + (meta . ,(grob-description "NonMusicalPaperColumn" paper-column-interface axis-group-interface spaceable-element-interface)) + )) + + (Rest . ( + (after-line-breaking-callback . ,Rest::after_line_breaking) + (X-extent-callback . ,Rest::extent_callback) + (Y-extent-callback . ,Rest::extent_callback) + (molecule-callback . ,Rest::brew_molecule) + (minimum-beam-collision-distance . 1.5) + (meta . ,(grob-description "Rest" + rhythmic-head-interface + rest-interface)) + )) + (RestCollision . ( + (minimum-distance . 0.75) + (meta . ,(grob-description "RestCollision" rest-collision-interface )) + )) + + (Script . ( + (molecule-callback . ,Script::brew_molecule) + (X-offset-callbacks . (,Side_position::centered_on_parent)) + (after-line-breaking-callback . ,Script::after_line_breaking) + (meta . ,(grob-description "Script" script-interface side-position-interface font-interface)) + )) + + (ScriptColumn . ( + (before-line-breaking-callback . ,Script_column::before_line_breaking) + (meta . ,(grob-description "ScriptColumn" script-column-interface)) + )) + + (Slur . ( + (molecule-callback . ,Slur::brew_molecule) + (thickness . 1.2) + (spacing-procedure . ,Slur::set_spacing_rods) + (minimum-length . 1.5) + (after-line-breaking-callback . ,Slur::after_line_breaking) + (extremity-rules . ,default-slur-extremity-rules) + (extremity-offset-alist . ,default-slur-extremity-offset-alist) + (de-uglify-parameters . ( 1.5 0.8 -2.0)) + (Y-extent-callback . ,Slur::height) + (details . ((height-limit . 2.0) (ratio . 0.333) (force-blowfit . 0.5) + (bezier-pct-c0 . -0.2) (bezier-pct-c3 . 0.000006) + (bezier-pct-out-max . 0.8) (bezier-pct-in-max . 1.2) + (bezier-area-steps . 1.0))) + (beautiful . 0.5) + (y-free . 0.75) + (attachment . (#f . #f)) + (attachment-offset . ((0 . 0) . (0 . 0))) + (slope-limit . 0.8) + (meta . ,(grob-description "Slur" slur-interface)) + )) + + (SpacingSpanner . ( + (spacing-procedure . ,Spacing_spanner::set_springs) + (stem-spacing-correction . 0.5) + (arithmetic-basicspace . 2.0) + (arithmetic-multiplier . ,(* 0.9 1.32)) + ;; assume that notes at least this long are present. + (maximum-duration-for-spacing . ,(make-moment 1 8)) + (meta . ,(grob-description "SpacingSpanner" spacing-spanner-interface)) + )) + (SpanBar . ( + (break-align-symbol . Staff_bar) + (barsize-procedure . ,Span_bar::get_bar_size) + (molecule-callback . ,Bar::brew_molecule) + (visibility-lambda . ,begin-of-line-invisible) + (X-extent-callback . ,Span_bar::width_callback) + (Y-offset-callbacks . (,Span_bar::center_on_spanned_callback)) + + (breakable . #t) + (glyph . "|") + (before-line-breaking-callback . ,Span_bar::before_line_breaking) + ;; ugh duplication! + + ;; + ;; Ross. page 151 lists other values, we opt for a leaner look + ;; + (kern . 3.0) + (thin-kern . 3.0) + (hair-thickness . 1.6) + (thick-thickness . 6.0) + (meta . ,(grob-description "SpanBar" span-bar-interface bar-line-interface )) + )) + + (StanzaNumber . ( + (breakable . #t) + (molecule-callback . ,Text_item::brew_molecule) + (break-align-symbol . Clef_item) + (visibility-lambda . ,begin-of-line-visible) + (font-family . roman) + (meta . ,(grob-description "StanzaNumber" break-aligned-interface text-interface font-interface)) + )) + + (StaffSymbol . ( + (molecule-callback . ,Staff_symbol::brew_molecule) + (staff-space . 1.0) + (line-count . 5 ) + (meta . ,(grob-description "StaffSymbol" staff-symbol-interface )) + )) + (SostenutoPedal . ( + (molecule-callback . ,Text_item::brew_molecule) + (X-offset-callbacks . (,Side_position::aligned_on_self)) + (Y-offset-callbacks . + (,Side_position::aligned_side + ,Side_position::centered_on_parent)) + (no-spacing-rods . #t) + (font-shape . italic) + (self-alignment-X . 0) + (meta . ,(grob-description "SostenutoPedal" text-interface font-interface)) + )) + + (Stem . ( + (before-line-breaking-callback . ,Stem::before_line_breaking) + (molecule-callback . ,Stem::brew_molecule) + (thickness . 0.8) + (beamed-lengths . (0.0 2.5 2.0 1.5)) + (beamed-minimum-lengths . (0.0 1.5 1.25 1.0)) + +;; Stems in unnatural (forced) direction should be shortened, +;; according to [Roush & Gourlay]. Their suggestion to knock off +;; a whole staffspace seems a bit drastical: we'll do half. + + (lengths . (3.5 3.5 3.5 4.5 5.0)) + (stem-shorten . (0.5)) + ; if stem is on middle line, choose this direction. + (default-neutral-direction . 1) + (X-offset-callbacks . (,Stem::off_callback)) + (X-extent-callback . ,Stem::dim_callback) + (meta . ,(grob-description "Stem" stem-interface font-interface)) + )) + + (StemTremolo . ( + (molecule-callback . ,Stem_tremolo::brew_molecule) + (Y-extent-callback . ,Stem_tremolo::height) + (X-extent-callback . #f) + + (beam-width . 2.0) ; staff-space + (beam-thickness . 0.42) ; staff-space + (beam-space-function . ,default-beam-space-function) + (meta . ,(grob-description "StemTremolo" stem-tremolo-interface )) + )) + + (SeparationItem . ( + (meta . ,(grob-description "SeparationItem" separation-item-interface )) + )) + (SeparatingGroupSpanner . ( + (spacing-procedure . ,Separating_group_spanner::set_spacing_rods) + (meta . ,(grob-description "SeparatingGroupSpanner" separation-spanner-interface)) + )) + + (SustainPedal . ( + (no-spacing-rods . #t) + (molecule-callback . ,Sustain_pedal::brew_molecule) + (self-alignment-X . 0) + (X-offset-callbacks . (,Side_position::aligned_on_self)) + (Y-offset-callbacks . + (,Side_position::aligned_side + ,Side_position::centered_on_parent)) + + (meta . ,(grob-description "SustainPedal" sustain-pedal-interface side-position-interface font-interface)) + )) + + ; should split in 3 + (SystemStartDelimiter . ( + (molecule-callback . ,System_start_delimiter::brew_molecule) + (after-line-breaking-callback . ,System_start_delimiter::after_line_breaking) + (collapse-height . 1.0) + (thickness . 1.6) + (arch-height . 1.5) + (arch-angle . 50.0) + (arch-thick . 0.25) + (glyph . bar-line) + (arch-width . 1.5) + (bracket-thick . 0.25) + (bracket-width . 2.0) + (Y-extent-callback . #f) + (font-family . braces) + ;; if you want to set point-size, you cannot set + ;; relative-size, as no font will be found for other + ;; sheets than 20 + ;;(font-point-size . 20) + ;;(font-relative-size . #f) + (meta . ,(grob-description "SystemStartDelimiter" system-start-delimiter-interface font-interface)) + )) + + (TextScript . ( + (molecule-callback . ,Text_item::brew_molecule) + (no-spacing-rods . #t) + (padding . 0.5) + (font-family . roman) + (font-shape . italic) + (meta . ,(grob-description "TextScript" text-script-interface text-interface side-position-interface font-interface )) + )) + (TextSpanner . ( + (molecule-callback . ,Text_spanner::brew_molecule) + (font-shape . italic) + (font-family . roman) + (type . "line") + + ;; urg, only for (de)cresc. text spanners + (if-text-padding . 1.0) + (width-correct . -1) + + (direction . 1) + (meta . ,(grob-description "TextSpanner" text-spanner-interface font-interface)) + )) + (Tie . ( + (molecule-callback . ,Tie::brew_molecule) + (spacing-procedure . ,Tie::set_spacing_rods) + (staffline-clearance . 0.35) + (details . ((ratio . 0.333) (height-limit . 1.0))) + (thickness . 1.2) + (x-gap . 0.2) + (minimum-length . 2.5) + (meta . ,(grob-description "Tie" tie-interface )) + )) + + (TieColumn . ( + (after-line-breaking-callback . ,Tie_column::after_line_breaking) + (meta . ,(grob-description "TieColumn" tie-column-interface )) + )) + + (TimeSignature . ( + (molecule-callback . ,Time_signature::brew_molecule) + (break-align-symbol . Time_signature) + (visibility-lambda . ,all-visible) + (breakable . #t) + (font-family . number) + (meta . ,(grob-description "TimeSignature" time-signature-interface font-interface)) + )) + + (TupletBracket . ( + (number-gap . 2.0) + (delta-y . 0) + (thick . 1.0) + (after-line-breaking-callback . ,Tuplet_spanner::after_line_breaking) + (molecule-callback . ,Tuplet_spanner::brew_molecule) + (font-family . roman) + (font-shape . italic) + (font-relative-size . -1) + (meta . ,(grob-description "TupletBracket" text-interface + tuplet-bracket-interface font-interface)) + )) + + (UnaChordaPedal . ( + (molecule-callback . ,Text_item::brew_molecule) + (font-shape . italic) + (no-spacing-rods . #t) + (self-alignment-X . 0) + (X-offset-callbacks . (,Side_position::aligned_on_self)) + (Y-offset-callbacks . + (,Side_position::aligned_side + ,Side_position::centered_on_parent)) + (meta . ,(grob-description "UnaChordaPedal" text-interface font-interface)) + )) + + (VoltaBracket . ( + (molecule-callback . ,Volta_spanner::brew_molecule) + + (direction . 1) + (padding . 1) + (font-style . volta) + (Y-offset-callbacks . (,Side_position::aligned_side)) + (thickness . 1.6) ; stafflinethickness + (height . 2.0) ; staffspace; + (minimum-space . 5) + (font-family . number) + (font-relative-size . -2) + (meta . ,(grob-description "VoltaBracket" volta-bracket-interface side-position-interface font-interface)) + )) + + (VerticalAlignment . ( + (axes 1) + (Y-extent-callback . ,Axis_group_interface::group_extent_callback) + (X-extent-callback . #f) + (stacking-dir . -1) + (meta . ,(grob-description "VerticalAlignment" align-interface axis-group-interface)) + )) + + (VerticalAxisGroup . ( + (axes 1) + (meta . ,(grob-description "VerticalAxisGroup" axis-group-interface)) + )) +)) + + + +; (display (map pair? all-grob-descriptions)) + diff --git a/scm/grob-property-description.scm b/scm/grob-property-description.scm new file mode 100644 index 0000000000..6d0cd6bcb4 --- /dev/null +++ b/scm/grob-property-description.scm @@ -0,0 +1,322 @@ +;;;; grob-property-description.scm -- part of generated backend documentation +;;;; +;;;; source file of the GNU LilyPond music typesetter +;;;; +;;;; (c) 1998--2000 Han-Wen Nienhuys +;;;; Jan Nieuwenhuizen + + + +(define all-backend-properties '()) + +(define (grob-property-description symbol type? description) + (set-object-property! symbol 'backend-type? type?) + (set-object-property! symbol 'backend-doc description) + (set! all-backend-properties (cons symbol all-backend-properties)) + ) + + + +;; put this in an alist? + +(grob-property-description 'X-extent-callback procedure? "procedure taking an grob and axis argument, returning a number-pair. The return value is the extent of the grob.") +(grob-property-description 'X-offset-callbacks list? "list of functions, each taking an grob and axis argument. The function determine the position relative to this grob's parent. The last one in the list is called first") +(grob-property-description 'Y-extent-callback procedure? "see @code{X-extent-callback}") +(grob-property-description 'Y-offset-callbacks list? "see @code{X-offset-callbacks}") +(grob-property-description 'after-line-breaking-callback procedure? "Procedure taking a grob as argument. +This procedure is called (using dependency resolution) after line breaking. Return value is ignored") +(grob-property-description 'align number? "the alignment of the text, 0 is horizontal, 1 is vertical") +(grob-property-description 'align-dir dir? "Which side to align? -1: left side, 0: around center of width, 1: right side") +(grob-property-description 'alignment-done boolean? "boolean to administrate whether we've done the alignment already (to ensure that the process is done only once)") +(grob-property-description 'all-elements list? "list of all grobs in this line. Needed for protecting grobs from GC.") +(grob-property-description 'arch-angle number? "") +(grob-property-description 'arch-height number? "") +(grob-property-description 'arch-thick number? "") +(grob-property-description 'arch-width number? "") +(grob-property-description 'arithmetic-basicspace number? "") +(grob-property-description 'arithmetic-multiplier number? "see arithmetic-basicspace") +(grob-property-description 'attachment pair? "cons of symbols, '(LEFT-TYPE . RIGHT-TYPE), where both types may be alongside-stem, stem, head or loose-end") +(grob-property-description 'attachment-offset pair? "cons of offsets, '(LEFT-offset . RIGHT-offset). This offset is added to the attachments to prevent ugly slurs.") +(grob-property-description 'axes list? "list of axis numbers. Should contain only one number.") +(grob-property-description 'axes list? "list of axis (number) in which this group works") +(grob-property-description 'bar-size number? "") +(grob-property-description 'bars list? "list of barline ptrs.") +(grob-property-description 'barsize-procedure procedure? "how to compute the size of a bar line") +(grob-property-description 'bass list? " musical-pitch, optional") +(grob-property-description 'beam ly-grob? "pointer to the beam, if applicable") +(grob-property-description 'beam-space-function procedure? "function returning space given multiplicity") +(grob-property-description 'beam-space-function procedure? "function returning space given multiplicity") +(grob-property-description 'beam-thickness number? "thickness, measured in staffspace") +(grob-property-description 'beam-thickness number? "thickness, measured in staffspace") +(grob-property-description 'beam-width number? "width of the tremolo sign") +(grob-property-description 'beam-width number? "width of the tremolo sign") +(grob-property-description 'beamed-lengths list? "list of stem lengths given beam multiplicity ") +(grob-property-description 'beamed-minimum-lengths list? "list of minimum stem lengths given beam multiplicity") +(grob-property-description 'beamed-stem-shorten number? "shorten beamed stems in forced direction") +(grob-property-description 'beaming number-pair? "number of beams extending to left and right") +(grob-property-description 'beams list? "list of beam ptrs.") +(grob-property-description 'beautiful number? "number that dictates when a slur should be de-uglyfied. It correlates with the enclosed area between noteheads and slurs. A value of 0.1 yields only undisturbed slurs, a value of 5 will tolerate quite high blown slurs.") +(grob-property-description 'before-grace-spacing-factor number? " stretch space this much if there are grace notes before the column") +(grob-property-description 'before-line-breaking-callback procedure? "Procedure taking grob as argument. +This procedure is called (using dependency resolution) before line breaking, but after generating discretionary items. Return value is ignored") +(grob-property-description 'before-musical-spacing-factor number? "space before musical columns (eg. taken by accidentals) get this much +stretched when they follow a musical column, in absence of grace +notes. 0.0 means no extra space (accidentals are ignored)") +(grob-property-description 'between-system-string string? "string + to dump between two systems. Useful for forcing pagebreaks") +(grob-property-description 'bounded-by-me list? "list of spanners that have this +column as start/begin point. Only columns that have grobs or act as bounds are spaced.") +(grob-property-description 'bracket-thick number? "") +(grob-property-description 'bracket-width number? "") +(grob-property-description 'break-align-symbol symbol? "the index in the spacing table (symbol) of the to be aligned item.") +(grob-property-description 'break-glyph-function procedure? "function taking glyph and break-direction, returning the glyph at a line break") +(grob-property-description 'breakable boolean? "boolean indicating if this is a breakable item (clef, barline, key sig, etc.)") +(grob-property-description 'c0-position integer? "integer indicating the position of central C") + +(grob-property-description 'center-element ly-grob? "grob which will +be at the center of the group after aligning (when using +Align_interface::center_on_element). ") + +(grob-property-description 'collapse-height number? "") +(grob-property-description 'column-space-strength number? "relative strength of space following breakable columns (eg. prefatory matter)") +(grob-property-description 'columns list? "list of paper-columns") +(grob-property-description 'columns list? " list of note-columns.") +(grob-property-description 'columns list? "list of all paper columns") +(grob-property-description 'contains-grace boolean? "Used to widen entries for grace notes.") +(grob-property-description 'control-points list? "List of 4 offsets (number-pairs) controlling the tie shape") +(grob-property-description 'control-points list? "[internal] control points of bezier curve") +(grob-property-description 'damping integer? "amount of beam slope damping should beam slope be damped? 0: no, 1: yes, 100000: horizontal beams ") +(grob-property-description 'damping number? "damping factor.") +(grob-property-description 'dash-length number? "the length of a dash") +(grob-property-description 'dash-period number? "the length of one dash + white space") +(grob-property-description 'dashed number? "[FIXME: use dash-period/dash length; see text-spanner] number representing the length of the dashes.") +(grob-property-description 'de-uglify-parameters list? "list of 3 real constants. They define the valid areas for the middle control points. Used in de_uglyfy. They are a bit empirical.") +(grob-property-description 'default-neutral-direction dir? "Where to go if we're in the middle of the staff") +(grob-property-description 'delta-y number? "amount of ascension") +(grob-property-description 'dependencies list? "list of score-grob pointers that indicate who to compute first for certain global passes") +(grob-property-description 'details list? "alist of parameters for the curve shape") +(grob-property-description 'details list? "alist containing contaning a few magic constants.") +(grob-property-description 'dir-forced boolean? "set if direction has been forced; read by Beam.") +(grob-property-description 'dir-function procedure? "function of type (count total)->direction. Default value: beam-dir-majority, also available: beam-dir-mean, beam-dir-median.") +(grob-property-description 'dir-list list? "list of stem directions, needed for optical spacing correction.") +(grob-property-description 'direction dir? "up or down, left or right?") +(grob-property-description 'direction-source ly-grob? "in case side-relative-direction is set, which grob to get the direction from ") +(grob-property-description 'dot ly-grob? "reference to Dots object.") +(grob-property-description 'dot-count integer? "number of dots") +(grob-property-description 'duration-log integer? "2-log of the notehead duration") +(grob-property-description 'duration-log integer? "log of the duration, ie. 0=whole note, 1 = half note, etc.") +(grob-property-description 'edge-height pair? "a cons that specifies the heights of the vertical egdes '(LEFT-height . RIGHT-height)") +(grob-property-description 'edge-text pair? "a cons that specifies the texts to be set at the edges '(LEFT-text . RIGHT-text)") +(grob-property-description 'elements list? " -- list of items.") +(grob-property-description 'elements list? "list of grobs (NoteColumn, +generally) participating in the collision. The +@code{rest-collision} property in @code{elements} is set +to a pointer to the collision") +(grob-property-description 'elements list? "to be aligned grobs ") +(grob-property-description 'expand-limit integer? "maximum number of measures expanded in church rests") +(grob-property-description 'extra-extent-X number-pair? "enlarge in X dimension by this much, measured in staff space") +(grob-property-description 'extra-extent-Y number-pair? "see @code{extra-extent-Y}") +(grob-property-description 'extra-offset number-pair? "pair of reals (a cons) forcing an extra offset before outputting") +(grob-property-description 'extra-space number-pair? "pair of distances") +(grob-property-description 'extra-space number-pair? "(cons LEFT RIGHT)") +(grob-property-description 'extremity-offset-alist list? "an alist (attachment stem-dir*dir slur-dir*dir) -> offset. The offset adds to the centre of the notehead, or stem.") + +(grob-property-description 'extremity-rules list? "an alist (procedure +slur dir) -> attachment to determine the attachment (see above). If +procedure returns #t, attachment is used. Otherwise, the next +procedure is tried.") +(grob-property-description 'flag-style string? "") +(grob-property-description 'flag-width-function procedure? "") +(grob-property-description 'font-family symbol? "partial font +definition: music roman braces dynamic math ...") +(grob-property-description 'font-name symbol? "partial font definition: +base name of font file FIXME: should override other partials") +(grob-property-description 'font-point-size number? "partial font definition: exact font size in points FIXME: should override font-relative-size") +(grob-property-description 'font-relative-size number? "partial font definition: the relative size, 0 is style-sheet's normal size, -1 is smaller, +1 is bigger") +(grob-property-description 'font-relative-size integer? "") +(grob-property-description 'font-series symbol? "partial font definition: medium, bold") +(grob-property-description 'font-shape symbol? "partial font definition: upright or italic") + +(grob-property-description 'font-style symbol? "a precooked set of font +definitions, eg. finger volta timesig mark script large Large +dynamic") + +(grob-property-description 'force-hshift number? "amount of +collision_note_width that overides automatic collision settings. This +is used by @ref{note-collision-interface}") + +(grob-property-description 'fraction number-pair? "") +(grob-property-description 'full-size-change boolean? "if set, don't make a change clef smaller.") + +(grob-property-description 'glyph symbol? "a string determining what (style) of glyph is typeset. Valid choices depend on the function that is reading this property. ") +(grob-property-description 'gap number? "Size of a gap in a variable symbol") +(grob-property-description 'glyph-name string? "a name of character within font") + +(grob-property-description 'grow-direction dir? "crescendo or decrescendo?") +(grob-property-description 'hair-thickness number? "thickness, measured in stafflinethickness") +(grob-property-description 'heads pair? "pair of grob pointers, pointing to the two heads of the tie. ") +(grob-property-description 'heads list? "list of note heads") +(grob-property-description 'height number? "in staffspace ") +(grob-property-description 'height-hs number? "in halfspace. Only used by Beam.") +(grob-property-description 'height-quants procedure? "function of type (beam staff-line-thickness) -> list of quants. Default value: default-beam-dy-quants. +") +(grob-property-description 'horizontal-shift integer? "integer that identifies ranking of note-column for horizontal shifting. This is used by @ref{note-collision-interface}") +(grob-property-description 'horizontal-space number? "amount of space to add after a note (in staff-space)") +(grob-property-description 'ideal-distances list? "(OBJ . (DIST . STRENGTH)) pairs") +(grob-property-description 'interfaces list? "list of symbols indicating the interfaces supported by this object. Is initialized from the @code{meta} field.") +(grob-property-description 'inversion list? " musical-pitch, optional") +(grob-property-description 'items-worth-living list? "list of interesting items. If empty in a particular system, clear that system.") +(grob-property-description 'kern number? "amount of extra white space to add before text. This is `relative'(?) to the current alignment.") +(grob-property-description 'kern number? "space after a thick line") +(grob-property-description 'left-padding number? "space left of accs") +(grob-property-description 'length number? "Stem length for unbeamed stems, only for user override") +(grob-property-description 'lengths list? "Stem length given multiplicity of flag") +(grob-property-description 'line-count integer? "Number of staff lines") +(grob-property-description 'line-thickness number? "the thickness[stafflinethickness] of the line") +(grob-property-description 'lookup symbol? "lookup method: 'value for plain text, 'name for character-name") +(grob-property-description 'magnify number? "the magnification factor. FIXME: doesn't work for feta fonts") +(grob-property-description 'maximum-duration-for-spacing moment? "space as if a duration of this type is available in this measure.") +(grob-property-description 'maximum-rest-count integer? "kill off rests so we don't more than this number left.") +(grob-property-description 'merge-differently-dotted boolean? " Merge noteheads in collisions, even if they have a different number of dots. This normal notation for some types of polyphonic music. The value of this setting is used by @ref{note-collision-interface} ") +(grob-property-description 'minimum-distance number? "minimum distance between notes and rests.") +(grob-property-description 'minimum-distances list? "list of rods (ie. (OBJ . DIST) pairs)") +(grob-property-description 'minimum-extent-X number-pair? "minimum size in X dimension, measured in staff space") +(grob-property-description 'minimum-extent-Y number-pair? "see @code{minimum-extent-Y}") +(grob-property-description 'minimum-length number? "minimum length in staffspace") + +(grob-property-description 'minimum-length number? "try to make the +hyphens at least this long. Also works as a scaling parameter for the +length") + +;; FIXME. +(grob-property-description 'minimum-space number-pair? "(cons LEFT RIGHT)") +(grob-property-description 'minimum-space number? "minimum distance that the victim should move (after padding)") + + +(grob-property-description 'minimum-width number? "minimum-width of rest symbol, in staffspace") +(grob-property-description 'molecule-callback procedure? "Function taking grob as argument, returning a Scheme encoded Molecule.") +(grob-property-description 'new-accidentals list? "list of (pitch, accidental) pairs") +(grob-property-description 'no-spacing-rods boolean? "read from grobs: boolean that makes Separation_item ignore this item (MOVE ME TO ITEM)") +(grob-property-description 'no-stem-extend boolean? "should stem not be extended to middle staff line?") +(grob-property-description 'non-default boolean? "not set because of existence of a bar?") +(grob-property-description 'note-width number? "unit for horizontal translation, measured in staff-space.") +(grob-property-description 'number-gap number? "") +(grob-property-description 'old-accidentals list? "list of (pitch, accidental) pairs") +(grob-property-description 'origin ly-input-location? "location in input file of the definition") +(grob-property-description 'outer-stem-length-limit number? "catch +suspect beam slopes, set slope to zero if outer stem is lengthened +more than this (in staffspace)") + +(grob-property-description 'padding number? "add this much extra space between objects that are next to each other") + +(grob-property-description 'parallel-beam boolean? "internal: true if there is a beam just as wide as the bracket ") +(grob-property-description 'pitches list? "list of musical-pitch") +(grob-property-description 'raise number? "height for text to be raised (a negative value lowers the text") +(grob-property-description 'right-padding number? "space right of accs") +(grob-property-description 'right-trim-amount number? "") +(grob-property-description 'script-priority number? "A sorting key that determines in what order a script is within a stack of scripts") +(grob-property-description 'self-alignment-X number? "real number: -1 = +left aligned, 0 = center, 1 right-aligned in X direction. + + Set to an grob pointer, if you want that grob to be the center. +In this case, the center grob should have this object as a +reference point. +") +(grob-property-description 'self-alignment-Y number? "like self-alignment-X but for Y axis") +(grob-property-description 'shortest-playing-duration moment? "duration of the shortest playing in that column.") +(grob-property-description 'shortest-starter-duration moment? "duration of the shortest notes that starts exactly in this column.") +(grob-property-description 'side-relative-direction dir? "if set: get the direction from a different object, and multiply by this.") +(grob-property-description 'side-support list? "the support, a list of grobs") +(grob-property-description 'slope-limit number? "set slope to zero if slope is running away steeper than this.") +(grob-property-description 'space-function procedure? "function of type multiplicity -> real (in staffspace)") +(grob-property-description 'spacing-procedure procedure? "procedure +taking grob as argument. This is called after +before-line-breaking-callback, but before the actual line breaking +itself. Return value is ignored") +(grob-property-description 'stacking-dir dir? "stack contents of grobs in which direction ?") +(grob-property-description 'staff-space number? "Amount of line leading relative to global staffspace") +(grob-property-description 'staffline-clearance number? "don't get closer than this to stafflines.") +(grob-property-description 'stem ly-grob? "pointer to the stem object.") +(grob-property-description 'stem ly-grob? "pointer to Stem object") +(grob-property-description 'stem-centered boolean? "Center stems on note heads. Useful for mensural notation") +(grob-property-description 'stem-end-position number? "Where does the stem end (the end is opposite to the support-head") +(grob-property-description 'stem-length number? "length of stem") +(grob-property-description 'stem-shorten list? "shorten stems in forced directions given flag multiplicity") +(grob-property-description 'stem-spacing-correction number? "optical correction amount.") +(grob-property-description 'stems list? "list of stem objects, corresponding to the notes that the arpeggio has to be before.") +(grob-property-description 'stretch-distance number-pair? "pair of distances") +(grob-property-description 'style symbol? "a string determining what style of glyph is typeset. Valid choices depend on the function that is reading this property. ") +(grob-property-description 'support-head ly-grob? "the note head at +one end of the stem") +(grob-property-description 'text markup? " +Scheme markup text. It is defined as follows: + +@example + +TEXT : STRING | (MARKUP SENTENCE) +MARKUP: PROPERTY | ABBREV +SENTENCE: TEXT | SENTENCE TEXT +PROPERTY: (key . value) +ABBREV: rows lines roman music bold italic named super sub text, or any font-style + +@end example + +So, TEXT is either a string, or a list of which the CAR is a MARKUP. +MARKUP is either a CONS: an grob property '(key . value) or a symbol: +a predefined abbreviation for a list of grob properties. + + +The following abbreviations are currently defined: +@table @samp +@item rows +horizontal mode: set all text on one line (default) +@item lines + vertical mode: set every text on new line +@item roman + select roman font +@item music + select feta font +@item bold + select bold series +@item italic + select italic shape +@item named + lookup by character name +@item text + plain text lookup (by character value) +@item super + superscript +@item sub + subscript +@item any font-style + finger volta timesig mmrest mark script large Large dynamic +@end table +") +(grob-property-description 'thick number? "thickness, in stafflinethickness") +(grob-property-description 'thick-thickness number? "thickness, measured in stafflinethickness") +(grob-property-description 'thickness number? "thickness, measured in stafflinethickness") +(grob-property-description 'thin-kern number? "space after a hair-line") +(grob-property-description 'forced-distance number? "forced distance for an alignment") +(grob-property-description 'threshold number-pair? "(cons MIN MAX), where MIN and MAX are dimensions in staffspace") +(grob-property-description 'transparent boolean? "This is almost the +same as setting molecule-callback to #f, but this retains the +dimensions of this grob, which means that you can erase grobs +individually. ") +(grob-property-description 'tuplet-bracket-visibility boolean-or-symbol? " +This controls the visibility of the tuplet bracket. +Setting it to false will prevent printing of the +bracket. Setting the property to #'if-no-beam will make it +print only if there is no beam associated with this tuplet bracket.") +(grob-property-description 'tuplet-number-visibility boolean-or-symbol? " +Like @code{tuplet-bracket-visibility}, but for the number.") +(grob-property-description 'type symbol? "one of: line, dashed-line or dotted-line") +(grob-property-description 'vertical-position-quant-function procedure? " +function of type (beam multiplicity dy staff-line-thickness) -> real. Default value: default-beam-y-quants, also available: beam-traditional-y-quants. +") +(grob-property-description 'visibility-lambda procedure? "a function that takes the break direction and returns a cons of booleans containing (TRANSPARENT . EMPTY)") +(grob-property-description 'when moment? "when does this column happen?") +(grob-property-description 'word-space number? "elongate left by this much (FIXME: cumbersome semantics)") +(grob-property-description 'x-gap number? "horizontal gap between notehead and tie") +(grob-property-description 'y-free number? "minimal vertical gap between slur and noteheads or stems") +(grob-property-description 'y-position number? "position of left edge") +(grob-property-description 'y-position-hs number? "in half space, position of left edge. Only used by Beam.") diff --git a/scm/interface-description.scm b/scm/interface-description.scm new file mode 100644 index 0000000000..9b0d034e51 --- /dev/null +++ b/scm/interface-description.scm @@ -0,0 +1,755 @@ +;;;; interface-description.scm -- part of generated backend documentation +;;;; +;;;; source file of the GNU LilyPond music typesetter +;;;; +;;;; (c) 1998--2000 Han-Wen Nienhuys +;;;; Jan Nieuwenhuizen + + +; should include default value? + + +;;; FIXME: naming. +;;; Score elements are called `objects' now and then, which gets +;;; rather confusing, we now have `elements', `items', `spanners' +;;; and `objects'. + + +(define (lily-interface symbol description props) + (list symbol + description + props + ) + ) + + +(define (grob-description name . interfaces) + (let* ((ifs (cons general-grob-interface interfaces)) + (props (map caddr ifs)) +; (prop-typep-pairs (map (lambda (x) (cons (car x) (cadr x))) +; (apply append props))) + (syms (map car ifs)) + ) + (list (cons 'separator "\n\n\n") ;easy printing. + (cons 'name name) + (cons 'interfaces syms) + (cons 'interface-descriptions ifs) + ; (cons 'interface-descriptions (cadr merged)) + ;; description of the grob itself? +; (cons 'properties prop-typep-pairs) + ))) + +(define general-grob-interface + (lily-interface + 'general-grob-interface + "All grobs support this" + '( + X-offset-callbacks + Y-offset-callbacks + X-extent-callback + Y-extent-callback + font-relative-size + extra-offset + interfaces + dependencies + no-spacing-rods + extra-extent-X + extra-extent-Y + minimum-extent-X + minimum-extent-Y + origin + transparent + )) + ) + +(define beam-interface + (lily-interface + 'beam-interface + "A beam. + +#'thickness= weight of beams, in staffspace + " + '( + y-position + height + flag-width-function + damping + default-neutral-direction + thickness + space-function + beamed-stem-shorten + height-quants + vertical-position-quant-function + damping + outer-stem-length-limit + slope-limit + ) + )) + +(define clef-interface + (lily-interface + 'clef-interface + "A clef sign" + '( + non-default + full-size-change + glyph + )) + ) + +(define axis-group-interface + (lily-interface + 'axis-group-interface + "a group of coupled grobs" + '( + axes + ))) + +(define note-column-interface + (lily-interface + 'note-column-interface + "Stem and noteheads combined" + '( + horizontal-shift + force-hshift + )) + ) + +(define stem-interface + (lily-interface + 'stem-interface + "A stem" + '( + thickness + beamed-lengths + beamed-minimum-lengths + stem-centered + lengths + beam + stem-shorten + duration-log + beaming + default-neutral-direction + stem-end-position + support-head + heads + direction + stem-length + style + flag-style + dir-forced + ))) + + +(define slur-interface + (lily-interface + 'slur-interface + "A slur" + '( + de-uglify-parameters + details + attachment + direction + attachment-offset + beautiful + y-free + control-points + extremity-rules + extremity-offset-alist + thickness + dashed + + ) + ) + ) + +(define side-position-interface + (lily-interface + 'side-position-interface + "Position a victim object (this one) next to other objects (the support). +#'direction = where to put the victim object (left or right?) +" + '( + side-support + direction-source + direction + side-relative-direction + minimum-space + padding + self-alignment-X + self-alignment-Y + + ) + )) + +(define accidentals-interface + (lily-interface + 'accidentals-interface + "Accidentals" + '( + left-padding + right-padding + ) + )) + +(define line-of-score-interface + (lily-interface + 'line-of-score-interface + "Super grob, parent of all: + +The columns of a score that form one line. The toplevel grob. Any +grob has a Line_of_score as both X and Y reference point. The +Paper_score contains one grob of this type. Control enters the +Grob dependency calculation from this single Line_of_score +object." + '( + between-system-string + spacing-procedure + before-line-breaking-callback + after-line-breaking-callback + all-elements + columns + ))) + +(define note-head-interface + (lily-interface + 'note-head-interface + "Note head" + '( + style + ) + )) + +(define note-name-interface + (lily-interface + 'note-name-interface + "Note name" + '( + style + ) + )) + + +(define rhythmic-head-interface + (lily-interface + 'rhythmic-head-interface + "Note head or rest" + '( + dot + stem + duration-log + ))) + +(define rest-interface + (lily-interface + 'rest-interface + "a rest" + '(style ))) + +(define tuplet-bracket-interface + (lily-interface + 'tuplet-bracket-interface + "A bracket with a number in the middle, used for tuplets." + '( + beams + columns + number-gap + delta-y + tuplet-bracket-visibility + tuplet-number-visibility + parallel-beam + thick + ) +)) + + +(define align-interface + (lily-interface + 'align-interface + " Order grobs top to bottom/left to right/right to left etc." + '( + stacking-dir + align-dir + threshold + alignment-done + center-element + elements + axes + ))) + +(define aligned-interface + (lily-interface + 'aligned-interface + "read by align-interface" + '( + minimum-space + extra-space + ))) + +(define break-aligned-interface + (lily-interface + 'break-aligned-interface + "Items that are aligned in prefatory matter" + '( + break-align-symbol + visibility-lambda + breakable + ))) + +(define chord-name-interface + (lily-interface + 'chord-name-interface + "generate a chord name" + '( pitches inversion bass))) + +(define time-signature-interface + (lily-interface + 'time-signature-interface + "A time signature, in different styles" + '( fraction style ))) + +(define bar-line-interface + (lily-interface + 'bar-line-interface + "Bar line. + +This is a request to print a special bar symbol. It replaces the +regular bar symbol with a special +symbol. The argument @var{bartype} is a string which specifies the +kind of bar to print. Options are @code{\":|\"} +@cindex \"|A@@@code{:|} +, +@code{\"|:\"} +@cindex \"|B@@@code{|:} +, @code{\":|:\"} +@cindex \"|C@@@code{:|:} +, +@code{\"||\"} +@cindex \"|D@@@code{||} +, @code{\"|.\"} +@cindex \"|E@@@code{|.} +, +@code{\".|\"} +@cindex \"|F@@@code{.|} +, and @code{\".|.\"} +@cindex \"|G@@@code{.|.} +. + +These produce, respectively, a right repeat, a left repeat, a double +repeat, a double bar, a start bar, an end bar, and a thick double bar. +If @var{bartype} is set to @code{\"empty\"} then nothing is printed, +but a line break is allowed at that spot. + +" + '( barsize-procedure kern thin-kern hair-thickness thick-thickness glyph bar-size break-glyph-function ))) + +(define hairpin-interface + (lily-interface + 'hairpin-interface + "hairpin crescendo. + +padding -- horizontal padding. This is useful if a crescendo is set next to a text like `mf' + +" + '( grow-direction thickness height padding ) + )) + +(define arpeggio-interface + (lily-interface + 'arpeggio-interface + "Functions and settings for drawing an arpeggio symbol (a wavy line left to noteheads." + '(stems) + ) + ) + +(define note-collision-interface + (lily-interface + 'note-collision-interface + "An object that handles collisions between notes with different +stem directions and horizontal shifts. Most of the interesting +properties are to be set in @ref{note-column-interface}" + '(merge-differently-dotted note-width) + )) + + +(define custos-interface + (lily-interface + 'custos-interface + "A custos is a staff context symbol that appears at the end of a + staff line with monophonic musical contents (i.e. with a single + voice). It anticipates the pitch of the first note of the following + line and thus helps the player or singer to manage line breaks + during performance, thus enhancing readability of a score. + + Custodes were frequently used in music notation until the 16th + century. There were different appearences for different notation + styles. Nowadays, they have survived only in special forms of + musical notation such as via the editio vaticana dating back to the + beginning of the 20th century. + +[TODO: add to glossary]" + + '(style) +) + ) + + + + +(define dot-interface + (lily-interface + 'dots-interface + "The dots to go with a notehead/rest. A separate interface, since they + are a party in collision resolution. + #'direction is the Direction to handle staff-line collisions in." + '(direction dot-count) + + )) + +(define font-interface + (lily-interface + 'font-interface + "Any symbol that is typeset through fixed sets of glyphs (ie. fonts)" + '(font-style font-series font-shape font-family font-name +font-point-size font-relative-size) + )) + + +(define text-interface + (lily-interface + 'text-interface + "A scheme markup text" + '(text align lookup raise kern magnify))) + +(define dot-column-interface + (lily-interface + 'dot-column-interface + "Interface that groups dots so they form a column" + '( ) + )) + +(define dynamic-interface + (lily-interface + 'dynamic-interface + "Any kind of loudness sign" + '() + )) + + +(define finger-interface + (lily-interface + 'finger-interface + "A fingering instruction" + '() + )) + +(define separation-spanner-interface + (lily-interface + 'separation-spanner-interface + "Spanner that containing @code{separation-item-interface} grobs to calculate rods" + '() + )) +(define text-script-interface + (lily-interface + 'text-script-interface + "Any text script" + '() + )) + +(define grace-alignment-interface + (lily-interface + 'grace-alignment-interface + "put grace notes in line" + '( + horizontal-space + ) + )) + +(define hara-kiri-group-interface + (lily-interface + 'hara-kiri-group-interface + " As Vertical_group_spanner, but keep track of interesting items. If + we don't contain any interesting items after linebreaking, then + gracefully commit suicide. Objective: don't disgrace Lily by + typesetting empty lines in orchestral scores." + '( items-worth-living ) +)) + +(define line-spanner-interface + (lily-interface + 'line-spanner-interface + "Generic line drawn between two objects, eg. for use with glissandi. +gap is measured in staff-spaces. " + + '(gap dash-period dash-length line-thickness type ) + )) + +(define lyric-hyphen-interface + (lily-interface + 'lyric-hyphen-interface + "A centred hyphen is a simple line between lyrics used to divide +syllables. The length of the hyphen line should stretch based on the + size of the gap between syllables." + + '( thickness height minimum-length word-space ) + )) + +(define key-signature-interface + (lily-interface + 'key-signature-interface + "A group of accidentals." + '( + c0-position + old-accidentals + new-accidentals + ))) + +(define lyric-extender-interface + (lily-interface + 'lyric-extender-interface + "The extender is a simple line at the baseline of the lyric + that helps show the length of a melissima (tied/slurred note)." + '( + word-space + height + right-trim-amount + ))) + + +(define lyric-syllable-interface + (lily-interface + 'lyric-syllable-interface + "a single piece of lyrics" + '( + word-space + ))) + + +(define mark-interface + (lily-interface + 'mark-interface + "a rehearsal mark" + '( + ))) + +(define multi-measure-rest-interface + (lily-interface + 'multi-measure-rest-interface + "A rest that spans a whole number of measures. For typesetting the +numbers, fields from font-interface may be used. + +padding is the space between number and rest. Measured in staffspace. + +" + '( columns expand-limit minimum-width padding ) + + )) + +(define paper-column-interface + (lily-interface + 'paper-column-interface + "" + + '(column-space-strength before-musical-spacing-factor +stem-spacing-correction before-grace-spacing-factor when bounded-by-me +dir-list shortest-playing-duration shortest-starter-duration +contains-grace extra-space stretch-distance )) + + ) + +(define spaceable-element-interface + (lily-interface + 'spaceable-element-interface + "An grob (generally a Paper_column) that takes part in the +spacing problem. " + '( + minimum-distances + ideal-distances + dir-list + ))) + +(define rest-collision-interface + (lily-interface + 'rest-collision-interface + "Move around ordinary rests (not multi-measure-rests) to avoid +conflicts." + '( + maximum-rest-count + minimum-distance + elements + ))) + +(define script-interface + (lily-interface + 'script-interface + "" + '( + script-priority + ))) + +(define script-column-interface + (lily-interface + 'script-column-interface + "An interface that sorts scripts according to their @code{script-priority}" + '( ))) + + +(define spacing-spanner-interface + (lily-interface + 'spacing-spanner-interface + " SPACE = arithmetic_multiplier * ( C + log2 (TIME) )) +The space taken by a note is determined by the formula + + + +where TIME is the amount of time a note occupies. The value of C is +chosen such that the smallest space within a measure is +arithmetic_basicspace: + + C = arithmetic_basicspace - log2 (mininum (SHORTEST, 1/8)) + +The smallest space is the one following the shortest note in the +measure, or the space following a hypothetical 1/8 note. Typically +arithmetic_basicspace is set to a value so that the shortest note +takes about two noteheads of space (ie, is followed by a notehead of +space): + +@example + 2*quartwidth = arithmetic_multiplier * ( C + log2 (SHORTEST) )) + + @{ using: C = arithmetic_basicspace - log2 (mininum (SHORTEST, 1/8)) @} + @{ assuming: SHORTEST <= 1/8 @} + + = arithmetic_multiplier * + ( arithmetic_basicspace - log2 (SHORTEST) + log2 (SHORTEST) ) + + = arithmetic_multiplier * arithmetic_basicspace + + @{ choose: arithmetic_multiplier = 1.0*quartwidth (why?) @} + + = quartwidth * arithmetic_basicspace + + => + + arithmetic_basicspace = 2/1 = 2 + + +If you want to space your music wider, use something like: + + arithmetic_basicspace = 4.; + +@end example" + '( + maximum-duration-for-spacing + arithmetic-basicspace + arithmetic-multiplier + + ))) + +(define staff-symbol-interface + (lily-interface + 'staff-symbol-interface + "This spanner draws the lines of a staff. The middle line is +position 0." + '( + staff-space + line-count + ))) + +(define stem-tremolo-interface + (lily-interface + 'stem-tremolo-interface + "" + '( + stem + beam-width + beam-thickness + beam-space-function + ))) + +(define separation-item-interface + (lily-interface + 'separation-item-interface + "Item that computes widths to generate spacing rods. + +Calc dimensions for the Separating_group_spanner; this has to be + an item to get dependencies correct. It can't be an grob_group + since these usually are in a different X_group +" + '( + elements + ))) + +(define sustain-pedal-interface + (lily-interface + 'sustain-pedal-interface + "" + '( + ))) +(define system-start-delimiter-interface + (lily-interface + 'system-start-delimiter-interface + "#'style can be bar-line, bracket or brace" + '(collapse-height thickness arch-height arch-angle arch-thick + arch-width bracket-thick bracket-width glyph ))) + +(define text-spanner-interface + (lily-interface + 'text-spanner-interface + "generic text spanner" + '( + dash-period + dash-length + line-thickness + edge-height + edge-text + type + ) +)) + +(define tie-interface + (lily-interface + 'tie-interface + "A tie connecting two noteheads. +direction = Forced direction for all ties" + + '( + staffline-clearance + control-points + heads + details + thickness + x-gap + direction + minimum-length + ))) + + + +(define tie-column-interface + (lily-interface + 'tie-column-interface + "that sets tie directions in a tied chord" + '(direction) + )) + +(define volta-bracket-interface + (lily-interface + 'volta-bracket-interface + "Volta bracket with number" + '( + bars + thickness + height + ))) + +(define span-bar-interface + (lily-interface + 'span-bar-interface + "" + '( + ))) + + + + diff --git a/scm/lily.scm b/scm/lily.scm index 3c065bf642..6228a482e0 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -66,9 +66,9 @@ (if (not standalone) (map (lambda (x) (eval-string (ly-gulp-file x))) '("c++.scm" - "backend-property.scm" - "translator-properties.scm" - "interface.scm" + "grob-property-description.scm" + "translator-property-description.scm" + "interface-description.scm" "beam.scm" "clef.scm" "slur.scm" @@ -77,5 +77,5 @@ "generic-property.scm" "basic-properties.scm" "chord-name.scm" - "element-descriptions.scm" + "grob-description.scm" ))) diff --git a/scm/music-property-description.scm b/scm/music-property-description.scm new file mode 100644 index 0000000000..a7f04601be --- /dev/null +++ b/scm/music-property-description.scm @@ -0,0 +1,62 @@ +;;;; music-property-description.scm -- part of generated backend documentation +;;;; +;;;; source file of the GNU LilyPond music typesetter +;;;; +;;;; (c) 1998--2000 Han-Wen Nienhuys +;;;; Jan Nieuwenhuizen + + +(define all-music-properties '()) + +(define (music-property-description symbol type? description) + (set-object-property! symbol 'music-type? type?) + (set-object-property! symbol 'music-doc description) + (set! all-music-properties (cons symbol all-music-properties)) + ) +(define (true? x) #t) + +(music-property-description 'iterator-ctor c++-function? "Function to construct music-event-iterator object for this Music") +(music-property-description 'duration duration? "") +(music-property-description 'metronome-count number? "How many beats in a minute?") +(music-property-description 'span-type symbol? "What kind of spanner should be created?") +(music-property-description 'alternatives music? "Music_sequence of alternatives for repeated music.") +(music-property-description 'articulation-type symbol? "key for scriptDefinitions alist") +(music-property-description 'bass boolean? "") +(music-property-description 'body music? "") +(music-property-description 'cautionary boolean? "") +(music-property-description 'change-to-id string? "") +(music-property-description 'change-to-type string? "") +(music-property-description 'context-id string? "") +(music-property-description 'context-type string? "") +(music-property-description 'denominator integer? "") +(music-property-description 'direction dir? "") +(music-property-description 'text-type symbol? "") +(music-property-description 'element music ) +(music-property-description 'grob-property symbol? "") +(music-property-description 'grob-value true? "") +(music-property-description 'elements list? "") +(music-property-description 'force-accidental boolean? "") +(music-property-description 'inversion boolean? "") +(music-property-description 'label string? "") +(music-property-description 'last-pitch pitch? "") +(music-property-description 'length procedure? "") +(music-property-description 'lyrics music? "") +(music-property-description 'mark-label string? "") +(music-property-description 'numerator integer? "") +(music-property-description 'one music? ""); part-combine, fixme, naming. +(music-property-description 'origin input? "") +(music-property-description 'penalty number? "") +(music-property-description 'pitch pitch? "") +(music-property-description 'pitch-alist list? "") +(music-property-description 'predicate procedure? "") +(music-property-description 'type symbol? "") +(music-property-description 'repeat-count integer? "") +(music-property-description 'span-direction dir? "") +(music-property-description 'symbol symbol? "") +(music-property-description 'symbols list? "") +(music-property-description 'tempo duration? "") +(music-property-description 'text string? "");; markup? +(music-property-description 'tremolo-type integer? "") +(music-property-description 'two music? ""); part-combine, fixme, naming. +(music-property-description 'value true? "") +(music-property-description 'what string? "") diff --git a/scm/translator-property-description.scm b/scm/translator-property-description.scm new file mode 100644 index 0000000000..866a237ef7 --- /dev/null +++ b/scm/translator-property-description.scm @@ -0,0 +1,291 @@ + +(define all-translation-properties '()) + +(define (translator-property-description symbol type? description) + (set-object-property! symbol 'translation-type? type?) + (set-object-property! symbol 'translation-doc description) + (set! all-translation-properties (cons symbol all-translation-properties)) + ) + + + +(translator-property-description 'CONTEXTNAMEMinimumVerticalExtent number-pair? "minimum vertical extent, same format as CONTEXTNAMEVerticalExtent [fixme, naming]") +(translator-property-description 'CONTEXTNAMEVerticalExtent number-pair? "hard coded vertical extent. +The format is a pair of dimensions, for example, this sets the sizes +of a staff to 10 (5+5) staffspaces high. + +@example +property Staff.StaffVerticalExtent = #(-5.0 . 5.0) +@end example + + [fixme, naming]") +(translator-property-description 'CONTEXTNAMExtraVerticalExtent number-pair? "extra vertical extent, same format +CONTEXTNAMEMinimumVerticalExtent [fixme, naming]") +(translator-property-description 'Generic_property_list list? "description of the conversion. + +Defines names and types for generic properties. These are properties +than can be plugged into the backend directly. See the init file +@file{generic-property.scm} for details. For internal use only, +deprecated. +") +(translator-property-description 'aDueText string? "text for begin of a due") +(translator-property-description 'associatedVoice string? "") +(translator-property-description 'autoBeamSettings list? " +Specifies when automatically generated beams should begin and end. The elements have the format: + +@example + + function shortest-duration-in-beam time-signature + +where + + function = begin or end + shortest-duration-in-beam = numerator denominator; eg: 1 16 + time-signature = numerator denominator, eg: 4 4 + +unspecified or wildcard entries for duration or time-signature +are given by * * + +The user can override beam begin or end time by pushing a wildcard entries +'(begin * * * *) or '(end * * * *) resp., eg: + + property Voice.autoBeamSettings push #'(end * * * *) = #(make-moment 1 4) + +The head of the list: + '( +((end * * 3 2) . ,(make-moment 1 2)) +((end 1 16 3 2) . ,(make-moment 1 4)) +((end 1 32 3 2) . ,(make-moment 1 8)) + ... + ) + +@end example") +(translator-property-description 'automaticPhrasing boolean? " If set, +the @ref{Lyric_phrasing_engraver} will match note heads of context +called Voice X to syllables from LyricsVoice called +X-. This feature is turned on by default. See the example +file @file{lyrics-multi-stanza.ly}. + +") +(translator-property-description 'automaticMelismata boolean? " If +set, \addlyrics will assume that beams, slurs and ties signal +melismata, and align lyrics accordingly. +") +(translator-property-description 'barAlways boolean? " If set to true a bar line is drawn after each note. +") +(translator-property-description 'barCheckNoSynchronize boolean? "If set, don't reset measurePosition when finding a bbarcheck. This +makes bar-checks for polyphonic music easier.") +(translator-property-description 'barNonAuto boolean? " If set to true then bar lines will not be printed + automatically; they must be explicitly created with @code{bar} + keywords. Unlike with the @code{cadenza} keyword, measures are + still counted. Bar generation will resume according to that + count if this property is set to zero. +") +(translator-property-description 'beamMelismaBusy boolean? "Signal if a beam is set when automaticMelismata is set") +(translator-property-description 'beamMelismaBusy boolean? "") +(translator-property-description 'breakAlignOrder list? "Defines the order in which +prefatory matter (clefs, key signatures) appears, eg. this puts the +key signatures after the bar lines: + +@example + \\property Score.breakAlignOrder = #'( + Span_bar + Breathing_sign + Clef_item + Staff_bar + Key_item + Time_signature + ) +@end example +") +(translator-property-description 'centralCPosition number? "Place of the central C. Usually determined by looking at clefPosition and clefGlyph.") +(translator-property-description 'chordInversion boolean? " Determines whether LilyPond should look for chord inversions when + translating from notes to chord names. Set to 1 to find + inversions. The default is 0 which does not look for + inversions.") +(translator-property-description 'clefGlyph string? "Name of the symbol within the music font") +(translator-property-description 'clefOctavation integer? "Add +this much extra octavation. Values of 7 and -7 are common.") +(translator-property-description 'clefPitches list? "an alist mapping GLYPHNAME to the position of the central C for that symbol") +(translator-property-description 'clefPosition number? "Where should the center of the symbol go?") +(translator-property-description 'combineParts boolean? "try to combine parts?") +(translator-property-description 'connectArpeggios boolean? " If +set, connect all arpeggios that are found. In this way, you can make +arpeggios that cross staffs. +") +(translator-property-description 'createKeyOnClefChange boolean? "") +(translator-property-description 'currentBarNumber integer? "this is read to determine + the number to put on the bar ") +(translator-property-description 'currentBarNumber integer? "Contains the current barnumber. This property is incremented at +every barline. +") +(translator-property-description 'currentCommandColumn ly-grob? "") +(translator-property-description 'currentMusicalColumn ly-grob? "") +(translator-property-description 'defaultBarType string? "Sets the default type of bar line. Available bar types: [FIXME] +") +(translator-property-description 'drarnChords boolean? "") +(translator-property-description 'explicitClefVisibility procedure? "visibility-lambda function for clef changes.") +(translator-property-description 'explicitKeySignatureVisibility procedure? "") +(translator-property-description 'forgetAccidentals boolean? "do +not set localKeySignature when a note alterated differently from +localKeySignature is found. + +Causes accidentals to be printed at every note instead of +remembered for the duration of a measure. +") +(translator-property-description 'graceAccidentalSpace number? "amount space to alot for an accidental") +(translator-property-description 'graceAlignPosition dir? "put the grace note before or after the main note?") +(translator-property-description 'instr markup? "see @code{instrument}") +(translator-property-description 'instrument markup? " If @code{Instrument_name_engraver} +@cindex Instrument_name_engraver + is + added to the Staff translator, then the @code{instrument} property + is used to label the first line of the staff and the @code{instr} + property is used to label subsequent lines. If the + @code{midiInstrument} property is not set, then @code{instrument} + is used to determine the instrument for MIDI output.") +(translator-property-description 'keyAccidentalOrder list? "") +(translator-property-description 'keyOctaviation boolean? "") +(translator-property-description 'keySignature list? "") +(translator-property-description 'keySignature list? "") +(translator-property-description 'localKeySignature list? "the key signature at this point in the measure") +(translator-property-description 'measureLength moment? " How long does one measure in the current time signature last?") +(translator-property-description 'measurePosition moment? " + How much of the current measure (measured in whole notes) have we had? + +Set this manually to create incomplete measures (anacrusis, upbeat), eg. at the start of +the music. +") +(translator-property-description 'melismaBusy boolean? "") +(translator-property-description 'melismaEngraverBusy boolean? "") +(translator-property-description 'midiInstrument string? "") +(translator-property-description 'noAutoBeaming boolean? " If set to true then beams are not generated automatically. +") +(translator-property-description 'noResetKey boolean? "Do not +reset local key to the value of keySignature at the start of a measure, +as determined by measurePosition. + +Do not reset the key at the start of a measure. Accidentals will be +printed only once and are in effect until overridden, possibly many +measures later. +") +(translator-property-description 'oneBeat moment? " How long does one beat in the current time signature last?") +(translator-property-description 'phrasingPunctuation string? "") +(translator-property-description 'rehearsalMark number-or-string? "") +(translator-property-description 'repeatCommands list? "This property is read to find any command of the form (volta . X), where X is a string or #f") +(translator-property-description 'repeatCommands list? "") +(translator-property-description 'scriptDefinitions list? " +Description of scripts to use. (fixme) +") +(translator-property-description 'scriptHorizontal boolean? " Put scripts left or right of note heads. Support for this is + limited. Accidentals will collide with scripts. + +") +(translator-property-description 'scriptHorizontal boolean? " Put scripts left or right of note heads. Support for this is + limited. Accidentals will collide with scripts. + +") +(translator-property-description 'skipBars boolean? " Set to true to skip the empty bars that are produced by + multimeasure notes and rests. These bars will not appear on the + printed output. If not set (the default) multimeasure + notes and rests expand into their full length, printing the appropriate + number of empty bars so that synchronization with other voices is + preserved. + +@c my @vebatim patch would help... +@example +@@lilypond[fragment,verbatim,center] +r1 r1*3 R1*3property Score.skipBars=1 r1*3 R1*3 + +@@end lilypond +@end example + +") +(translator-property-description 'slurBeginAttachment symbol? "translates to the car of grob-property 'attachment.") +(translator-property-description 'slurEndAttachment symbol? "translates to the cdr of grob-property 'attachment.") +(translator-property-description 'slurMelismaBusy boolean? "") +(translator-property-description 'slurMelismaBusy boolean? "Signal a slur if automaticMelismata is set") +(translator-property-description 'solo boolean? "set if solo is detected") +(translator-property-description 'soloADue boolean? "set Solo/A due texts?") +(translator-property-description 'soloIIText string? "text for begin of solo for voice ``two''") +(translator-property-description 'soloText string? "text for begin of solo") +(translator-property-description 'sparseTies boolean? "only create one tie per chord.") +(translator-property-description 'split-interval number-pair? "always split into two voices for contained intervals") +(translator-property-description 'squashedPosition integer? " Vertical position of +squashing.") +(translator-property-description 'staffsFound list? "list of all staff-symbols found.") +(translator-property-description 'staffsFound list? "") +(translator-property-description 'stanza string? "Stanza `number' to print at start of a verse") +(translator-property-description 'startSustain string? "") +(translator-property-description 'startUnaChorda string? "") +(translator-property-description 'stemLeftBeamCount integer? " +Specify the number of beams to draw on the left side of the next note. +Overrides automatic beaming. The value is only used once, and then it +is erased. +") +(translator-property-description 'stemRightBeamCount integer? "idem, for the right side") +(translator-property-description 'stopStartSustain string? "") +(translator-property-description 'stopSustain string? "") +(translator-property-description 'stopUnaChorda string? "") +(translator-property-description 'stz string? "") +(translator-property-description 'textNonEmpty boolean? " If set +to true then text placed above or below the staff is not assumed to +have zero width. @code{fatText} and @code{emptyText} are predefined +settings. +") +(translator-property-description 'tieMelismaBusy boolean? "") +(translator-property-description 'tieMelismaBusy boolean? "Signal ties when automaticMelismata is set") +(translator-property-description 'timeSignatureFraction number-pair? " +pair of numbers, signifying the time signature. For example #'(4 . 4) is a 4/4time signature.") +(translator-property-description 'timing boolean? " Keep administration of measure length, position, bar number, etc? +Switch off for cadenzas.") +(translator-property-description 'tremoloFlags integer? "") +(translator-property-description 'tupletInvisible boolean? " + If set to true, tuplet bracket creation is switched off +entirely. This has the same effect as setting both +@code{tupletNumberVisibility} and @code{tupletBracketVisibility} to +@code{#f}, but as this does not even create any grobs, this setting +uses less memory and time.") +(translator-property-description 'tupletSpannerDuration moment? " +Normally a tuplet bracket is as wide as the +@code{ imes} expression that gave rise to it. By setting this +property, you can make brackets last shorter. Example + +@example +@@lilypond[verbatim,fragment] +context Voice imes 2/3 @{ + property Voice.tupletSpannerDuration = #(make-moment 1 4) + [c8 c c] [c c c] +@} +@@end lilypond +@end example +") +(translator-property-description 'unirhythm boolean? "set if unirhythm is detected") +(translator-property-description 'unisilence boolean? "set if unisilence is detected") +(translator-property-description 'unison boolean? "set if unisono is detected ") +(translator-property-description 'verticalAlignmentChildCallback +procedure? "what callback to add to children of a vertical alignment. +It determines what alignment procedure is used on the alignment +itself. ") +(translator-property-description 'voltaSpannerDuration moment? "maximum duration of the volta bracket. + + Set to a duration to control the size of the brackets printed by +@code{\\alternative}. It specifies the number of whole notes duration +to use for the brackets. This can be used to shrink the length of +brackets in the situation where one alternative is very large. It may +have odd effects if the specified duration is longer than the music +given in an @code{\\alternative}. +") +(translator-property-description 'weAreGraceContext boolean? "") +(translator-property-description 'whichBar string? "This property is read to determine what type of barline to create. +Example: +@example +\\property Staff.whichBar = \"|:\" +@end example +will create a start-repeat bar in this staff only +") +(translator-property-description 'whichBar string? "") +(translator-property-description 'whichBar string? "if not set +explicitly (by property or bar), this is set according to values of +defaultBarType, barAlways, barNonAuto and measurePosition. + ")