From df7d31f879f9b39c2b89390b6e1b1b23d4987e74 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Mon, 1 Feb 1999 21:19:05 +0100 Subject: [PATCH] patch::: 1.1.26.jcn2: fixjes pl 26.jcn2 - enforce {slur,tie}_x_minimum (urg, paper vars?) - tie listens to tieydirection/ydirection - bf: tie placement --- Generated by janneke@gnu.org using package-diff 0.62, >From = lilypond-1.1.26.jcn1, To = lilypond-1.1.26.jcn2 usage cd lilypond-source-dir; patch -E -p1 < lilypond-1.1.26.jcn2.diff Patches do not contain automatically generated files or (urg) empty directories, i.e., you should rerun autoconf, configure and possibly make outdirs. --state 1.1.26.jcn1 1.1.26.jcn2 ++state --- NEWS | 12 +- TODO | 2 - TODO.orig | 913 ++++++++++++++++++++++++++++++++ VERSION | 2 +- input/test/slur-mininum.ly | 11 + input/test/tie-minimum.ly | 11 + lily/include/slur.hh | 6 +- lily/include/stem.hh | 3 +- lily/include/tie-engraver.hh | 2 +- lily/include/tie.hh | 31 +- lily/slur.cc | 34 +- lily/tie-engraver.cc | 16 +- lily/tie.cc | 36 +- ly/params.ly | 8 +- mutopia/J.S.Bach/wtk1-fugue2.ly | 10 +- 15 files changed, 1029 insertions(+), 68 deletions(-) create mode 100644 TODO.orig create mode 100644 input/test/slur-mininum.ly create mode 100644 input/test/tie-minimum.ly diff --git a/NEWS b/NEWS index cb1223de2c..6a0614eeca 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,14 @@ -25.jcn2 +--- ../lilypond-1.1.26.jcn1/NEWS Mon Feb 1 17:49:32 1999 +++ b/NEWS Mon Feb 1 20:58:27 1999 +@@ -1,3 +1,8 @@ +pl 26.jcn2 + - enforce {slur,tie}_x_minimum (urg, paper vars?) + - tie listens to tieydirection/ydirection + - bf: tie placement + + pl 26.jcn1 + - tutorial fixes + - bf: OrchestralScore should do hara-kiri..25.jcn2 - bf: staffside axis init - bf: staffmargin stuff. - Timesig C fixes diff --git a/TODO b/TODO index 05425d7e6e..6c86fab73a 100644 --- a/TODO +++ b/TODO @@ -205,8 +205,6 @@ BUGS: * latex bla.tex broken (titles / \lilyfooter stuff?) - * check/set minimum slur/tie length - * msgfmt -o check? * \breathmark TeX macro diff --git a/TODO.orig b/TODO.orig new file mode 100644 index 0000000000..05425d7e6e --- /dev/null +++ b/TODO.orig @@ -0,0 +1,913 @@ +Features you cannot find in the doco as working, should be mentioned +here. + +This is an assorted collection of stuff that will be done, might be +done, or is an idea that I want to think about + +Most of the items are marked in the code as well, with full explanation. +grep for TODO and ugh/ugr/urg + +*In a piece such as the Zipoli piece in mutopia/... there is a stray +`8' over every bar line when processed by LilyPond 1.1.25. + +TODO before 1.2 + + * junk Text_def, use G_text_item in stead. + + * junk Script_def + + * fix partial measures in meaningful way. + + * fix AFM for BlueSky AFM files. + + * working notehead style. + + * add scripts to bars eg. |^"bla" + + * relative mode for mi2mu + + * uniformise recent feta contributions. + - use SCM and Molecules for {accordeon stuff, } + - bigger and fatter 4/4 C + + * make a SMOB of Atom and Molecule + + * use kerning for dynamics. + + * sort out directory stuff. + - --prefix option? + - -I option per filetype? + - kpathsea? + +************** +I also found a few bugs: + +* The examples in input/test/bar-scripts.ly and score-bar-scripts.ly + don't work. The problem seems to be that you can't define a + a score identifier and then use it in the \score block. + + + - make separate MF chars for endings of ledger lines, and calc rest of lines. + + * support_l_arr_ empty in staff-margin's G_staff_side_item + + +************ + +How can I specify a chord whose duration is longer than a whole note? + + \type ChordNames { \chord{ A1*2-min } } + +gives me a parse error. And \times doesn't work either. I can't use +a spacer note. So it seems to be impossible to have long chords of +general length. Of course, in the example above I can use \breve. +But what if I want a chord that lasts for 3 whole notes? Or what +about 2.5 whole notes? Is there a mechanism for getting this kind of +length? + + +Why does my second extender request get junked in the following: + +\score{ +< \notes \relative c''{ + a4()b()c()d c()d()b()a } + \type Lyrics \lyrics { + foo1 __ bar2. __ _4 } +> } + +It seems that \cr and \decr don't work any more. + +\score{ + \notes{ + a \cr b \rc c } + \paper{linewidth=-1.;} +} + +Gives me + +qq.ly:3:9: warning: can't find (de)crescendo to end: + a \cr + b \rc c } + + + +Use of semicolons is still rather confusing. They are obligatory +after some types of assignments and illegal after others. + + \property foo=bar illegal + foo = 3 at top level illegal + foo = 3 inside \paper obligatory + foo = \notes{ ...} top level illegal + foo = \translator{ } in \paper obligatory + +As far as I can tell, the sole accomplishment of this syntactic +irregularity is to keep the user as confused as possible. + + +I was trying to get interstaff beams to work and did this: + +\score{ +\type GrandStaff < +\type Staff=one \notes\relative c'{ + \stemup + [c8 c \translator Staff=two \stemup c c] + \translator Staff=one + \stemdown + [ b8 \translator Staff=two a8] + \translator Staff=one + c4 + } +\type Staff=two \notes{ \clef bass; s1 } +> +\paper{ + \translator{ + \GrandStaffContext + minVerticalAlign = 3.0*\staffheight; + maxVerticalAlign = 3.0*\staffheight; + } + linewidth = -1.; +} +} + +The beams are at the right angle, but they aren't in the right place. + + + +******************* + + + * fractional chord durs. + + * hang Item on Spanner + + * remove Interval dim_ from Dimension_cache and rename the struct. + + * do --safe for PS output? + + * convert-mudela --output + + * Staff_margin (with a partial measure.) + + * fix "I've been drinking too much" + + * fix pletvisibility properties: + - bracket on/off/no-bracket-when-beam + - num on/off/no-num-when-beam + + * fix: standchen. + + * junk backlinks? + + * junk text{sharp,flat,etc} + + * fix convert-mudela manpage + + * decimal point in \paper {} + + *{ \voiceone [g''8 fis'' e''] d''4 |} + and=20 + { \voicetwo d'4 d'2.*2/3 } spacing + + * tied notes for MIDI + + * sharp /flat on trills (in MIDI ??) + + * scm-ify \property values. + + * move class Lookup {} into scm + +BUGS: + + * collisions/voices \voiceone \voicetwo are broken; see + input/praeludium-fuga-E.ly + mutopia/J.S.Bach/wtk1-fugue2.ly + + * fix: text on rests: rediculous dims + + * ly2dvi + - bottomnote for ly2dvi + - deps for ly2dvi + + * fix midi output: + - default duration? duration must be not entered + explicitely on first note. + + * turn slope-damping on/off + + * c4 \! \> c4 + + * tremolo stuff + + * gallina barlines. + + * fix height of / collisions with lyrics (chords), + see input/test/vertical-text.ly; input/test/repeat.ly + + * latex bla.tex broken (titles / \lilyfooter stuff?) + + * check/set minimum slur/tie length + + * msgfmt -o check? + + * \breathmark TeX macro + + * catch GUILE errors? + + * add new glyphs to font.ly + + * formatting of input stuff. + + * \notes{ a \< b \cr } vs \notes{ a \< b \! } + + * if possible, it might be nice for a warning to appear if someone does + \translator with no name and without assigning it to an + identifier. + + * space after bars? + + * 'hinterfleisch' before bar (e.g. wtk1-fugue2)? + + * \type Voice \times 2/3 { [c8 c16 c16 c16 c16] } + + * fix singleStaffBracket + + * repeat bars: need distance after ":|" and before "|:" + + Summary of minor spelling irregularities: + - capitalization/use of underscores in property names + + * fix SkipBars -> skipBars + + * \shape 1st dim skipped? + + * fix marks/barnumbers/marginal notes + + * broken scripts: + lbheel = \script { "bheel" 0 0 -1 0 0 } + rbheel = \script { "bheel" 0 0 1 0 0 } + lbtoe = \script { "btoe" 0 0 -1 0 0 } + rbtoe = \script { "btoe" 0 0 1 0 0 } + lfheel = \script { "fheel" 0 0 -1 0 0 } + rfheel = \script { "fheel" 0 0 1 0 0 } + lftoe = \script { "ftoe" 0 0 -1 0 0 } + rftoe = \script { "ftoe" 0 0 1 0 0 } + + and also + + portato= \script { "portato" 0 -1 0 1 0 } + +STUFF + * check out legal/(c) matters for scores. + + * check out GCC signatures? + + * Align_element::padding ? + + * uniformise property names... + - ydirection <-> yDirection + - rather allow '_' in identifiers first (i.e. junk ^ and _), + and do y_direction? + - typo checks on property names? + + * use streambufs and iostream + to provide IO handling for TeX stream, mudela stream, data-file. + + * seriously buffer TeX output (do profile of writing .5 mb TeX file.) + + * strip EXEs before installing + + * zip target for binary windows dist (JBR) + + * junking \skip req in lyrics + + * Language: + - \type -> \context ? + - \translator -> ? + - fix \partial + - \bla {} vs \bla ; + - mix engraver hacking with music ? + - \once\property KEY = VAL + - \addtranslator, \removetranslator + - junk ^ and _ for scripts + - junk _ for lyrics. + - abstract grammar. + + * percussion note heads + + * mi2mu empty staffs. + + * horizontal centering of dynamics + + * \font\fontA=feta20.afm (.afm?) + + * gzip RH manpage + + * stable make/config stuff + + * $DEPENDENCIES_OUTPUT support + + * Xdvi zooming ?! Try to understand GS garbage collection. + gs: Error: /undefined in draw_beam + gs: Operand stack: + + * fix vertical alignment and stafflines + + * GrandStaff needs more work -- I want a single word + `harpsichord' to the left of the grandstaff, not one on each + stave. (Organ staff -- with separate pedal -- but common + properties may be something to think about. Of course for + organ you want to be able to give stop indications on the way + through, so the \property Voice.Instrument would be a stop, + and \property GrandStaff.instrument would be PipeOrgan...) + + * revise the Score_priority_align_engraver concept. It sucks. + + * make new VoiceOne, VoiceTwo, VoiceThree contexts with +ydirection and hshift preset + + * *.yo: fix pod manpage layout legacy + + * text-items clash with stems/beams + + * --include, -I option for ly2dvi (pass on to lily) + + * fix placement of beam-less abbrev + + * \meter 3/4; + <{\voiceone cis4. cis8 cis4 | cis4 cis cis | r1 } + {\voicetwo cis,4 r r | r2. | r1 }> | + } + + * try to use template iso MACRO(Type) + + - NEWS: ... Musical_pitch (analogous to Duration and Rhythmic_req) + think about, analogous to pitch: + * { a4 a16 } c <-- duration of c? + * < a4 b8 > c <-- duration of c? + + * \tempo 4. = 90; + + * fix audio-items (don't use (input) requests, but copy data) + + * make sure all ex's have a mudela-version + + * do rest-collisions for Multi_measure_rests as well. + + * split error/warning in error/warning/non_fatal_error + + * add a Duration_convert member to Duration_iter to set parameters. + Junk global duration settings. + + * minimum length second part broken tie + + * en-,discouraged linebreaking: + - handle DISALLOW < penalty > FORCE + - discourage breaking of slurs + + * fix variable define/lookup parser global<->paper + + * fix title/instrument placements; see input/test/title.ly + + * <\voiceone c4. \voicetwo c4> + + * add full cello suites to web site (kom op, Maarten!) + + * Rethink Time_description + * \cadenza , \meter, \grouping should all be \properties + + * rename + - measure -> bar + - abbrev -> tremolo + - abbreviation-beam -> (measured/unmeasured) tremolo + - partial -> anacrouse + + * shared lib + + * robustify Beam (in case of no stems, 32nd notes) + + * decentralised spring factory + + * move paper vars into engraver properties + + * check for groff / troff/ nroff et + + * more intelligent file searching + + * make LilyPond RPM fully relocatable + + * disable spaces in TeX stuff + + * handle ^C for tmp/file creation. + + * dots & rest collisions. + + * documentation + - introduction? + - info? + - LaTeX? + - more manpages? + + * versioning for Feta + + * the warning about the negative slur/tie length appears twice + which is irritating. + + * The `3' in the meter key is a one or two pixels too thin (at 600dpi) + in the middle: + + * the bracket is ugly (wings are too parabolic, should be more circular) + + * better hshift (dots, distance, head dependent) + + * clefs (AG): The "8" should appear closer to the actual clef, + touching it. + + * put errorlevel in Input class + + * junk nesting slurs + + * integrate midi-elts from mi2mu and lily? + + +3RD PARTY BUGS: +**************** +/* +ICE +*/ +signature S { + int foo (); +}; + +signature V { + S * s(); +}; + + +V*v(); +f () +{ + return v( )->foo (); +} + +/* + + egcs-1.1 + +foo.cc: In function `int f()': +foo.cc:6: label `b' used but not defined +*/ +void +f () +{ + bool b; + if (b && && b) + ; +} +*************** + + * make GCC warn about ctor that leaves member vars uninitialised. + + * GNU diff 2.7: diff -rN does not see a new directory with empty file + + * glibc 2.0: + + f = fopen ("/dev/null", "r") + assert (feof (f)) + +3RD PARTY PROJECTS: + + * GNU patch + - 'double-fix' mode: ignore identical fix, rather than suggest + to revert patch direction when (more or less? exactly) the same + thing is fixed + +PROJECTS + + * Scripts: + - fix position of bar number + - stack scripts in chords: + % fingering: footing: + < a-4 c-2 g-1 > < c-\ltoe e-\lheel > + - script-spacing + - slur parts as a script + - stack parameterised scripts for fingering and footing: + + * convert-mudela: + - automatically add a \version if not present. + - better parsing + - make smarter + - convert-mudela -e empty.ly + + * emacs mudela-mode + - should handle block comments too. + - handle lexer modes (\header, \melodic, \lyric) etc. + - indentation + - notenames? + - fontlock: \melodic \melodic + + * use properties for: + - plet? + - Staff_sym size + - default tempo. + - font size + - bartypes (get rid of derived Span_bar_engravers) + - cadenza mode? + + * page handling: + - PS output + - optimal pagebreaking. + + * Unicode support? -> man 7 unicode + - 16 bit Strings + - -u switch + - detect of 16/8 bit files + - examples to go with it. + + * Spring_spacer: + - write a faster Spring_spacer (without matrices if possible) + - relate energybound to linelen unitspace fontsize etc. + - used fixed point fp? + + * \header + - output header info to MIDI too. + + * a musical dictionary. See Documentation/vocabulary-*, other + languages: + - explanations + - italian + - german + - dutch + - swedish + .. ? + + * chords + - guitar chords (fret diagrams) + - other chord name styles (american(?) style) + - basso continuo + - MIDI output? + + * Debug logs: + - derive lily_stream, Dstream, texstream from ostream? + - indentable stream as baseclass for TeX stream, lily stream, Dstream. + - use dstream feature in mi2mu + - integrate IO checking into stream class + + * input converters + - NIFF? + - ABC? + - SMDL? + + * add to MIDI output: + - tempo change + - ornaments (and trills?) + - repeat/volta + - slurs + - accents + - dynamics + - account for rhythmic position in measure + - etc. + + * grace notes + - make separate class for Grace_*_engravers + (which is at Voice_gravs level) + - make encapsulated spacing problems. + + * accidentals per Voice_group + + * Output class, handles : (smallish) + - help text /(c) notice? + - version line + - warning /errors/progress + - abort on error/warning; exit status + - quiet/ignore-version options + - logfile output + + * elaborate Staff_side baseclass: + - scripts + - text + - slur start/end + + * PS + - speed up PS code. + - PS lines to .eps files + - write custom prolog + + * Output an output format independent (ofi) typeset file; and + make ofi2 TeX, MusiXTex, Display PostScript, PostScript, + Ascii... interpreters. (difficult) + + - NIFF ? + - Common Music Notation + - PostScript output (esp. Beams, Slurs, etc) + - Move all Score_elems, into libmutype.a + - SGML + + * Documentation + - Doc (C) stuff of sheet music + - a better format? SGML? TeX? Info? + - a better tutorial + + * more spanners (smallish) + - Glissando + - trill + + * Rewrite Stem, Beam and Rhythmic_grouping (hairy) + - [c8. c32 c32] + - doc on Rhythmic_grouping + - general shaving on Beam and Stem + - use plet grouping + - separate visual from rhythmic info even more + - beams over bars + + * lines: + - Ledger lines, should be separate item: Ledger_lines, Ledger_lines + - set different line sizes / thicknesses + - beam stem showthrough, inter beam sizes (french vs german style) + + * Collisions + - left/right note balls should be handled by Collision: + < \multi 2; { \stem 1; } { } > + + * Keys: + - merge key{item} & localkey{item}? + - spacing, national styles? + + * Support for TAB + - redo Notehead to allow digits as heads + - add a \tablature {} lexer mode for easy entering + + * should adjust stemlength for flag number. + + * breaking: + - caching breakpoints + - saving them + - specify number of lines + +INPUTLANGUAGE + + * c4 4 4 4 for c4 c4 c4 c4? + + * neatly (and readably) expressing concurrent + voices + + * 4 ? + + * Viola mode? + + @c c g e g + for + c g es g, + + @A c g e g + for + cis gis e gis + + * relative mode for pitch entering + + * configure pitch_byte + + * rest name configurable + +SMALLISH PROJECTS + + * limit memory usage; the full coriolan takes up too much resources. + + * fix confusing naming in Engraver vs Engraver_group_engraver (context) + + * progress when creating MIDI elts. + + * A range for context errors (eg. mark both { and }. ) + + * lyric in staff (sharpsharp in staff, text below) + + * half sharps/flats + + * write Dynamic_line (to group dynamics horizontally) + + * use Real for all y positions. + - use translate_axis( .. ,Y_AXIS) iso separate variables. + + * half-sharps, half-flats + + * adaptive accidental spacing. + + * handle EOF graciously in error messages. + + * declare notenametab? + + * midi esp.: use I32 iso int where 32 bits are needed (or assumed...) + + * stafftypes: voice names/ instrument names. + + * lily \tempo + + * C meter iso 4/4, idem for alla breve, etc. + + * textspanner: center position + + * % toe to bheel four to five + % ^_u 4_5 + % - + % --|x-- --|x-- + % --|--- --|--- + % --|--- --|--- + (where "to" is a tiny bow) + + * auxilliary file for caching info. + + * Text_crescendo + + * clean solution for staffsize in items. + + * revise calcideal + +IDEAS + + * Output data structures of Mudela in XML/SGML. + + * create libmudela, or liblily_frontend + + * move MIDI stuff (including Quantization) to a ANSI C libmidi library. + + * Spacing_request for manually adjusting spacing + + * caching breakpoints + + * used fixedpoint arithmetic for min. energy. + + * move towards incremental algorithms. + + * far fetched language ideas + - design meta-language like TeX and Metafont + - programming/macros input + + * versioning stuff (cvt mudela, mudela, etc.) + + * Klavarskribo? + + * dynamic loading of engravers? + +SMOBS: + +**************************************** +Han-Wen Nienhuys writes: + +> mcmanus@IDT.NET writes: +> > > I want different C++ objects (with scheme embedded) to be linked by +> > > C++ pointers. I want to access these other objects from the Scheme +> > > code, and I want access to these pointers from C++. +> > +> > You can do this with a combination of smob's and primitive functions, +> > though it may not be be exactly what you wanted. You would have one +> > smob for each class in your application, and then you would write a +> > primitive function that would return the objects that are linked to a +> > base object. +> +> And the smob and the C++ class are interlinked? Like +> +> class Foo_class { +> Foo_smob *smob_ptr_; +> } +> +> struct Foo_smob { +> Foo_class *class_ptr_ +> } + +Usually you can get away without having this interlinked structure. +One piece of information you need when exporting objects to scheme is +the smob tag for your class. You might store this value (a long) into +a class static variable, or a file static variable. I'll use a class +static variable in this example. + +I typically use code that works like this (untested code ahead): + +class Foo_class { + static long *Foo_smob_tag; + SCM obj; // representation as a scheme object, description comes later +} + +// call this once on startup +void init_Foo_class { + static scm_smobfuns type_rec; + + type_rec.mark = foo_mark; + type_rec.free = foo_free; + type_rec.print = foo_display; + type_rec.equalp = 0; + Foo_class::Foo_smob_tag = new int(scm_new_smob(type_rec)); +} + +When you want to export an object to scheme, you put a pointer to the +object itself in the cdr of the cell, and the tag in the car of the +cell. The code looks like this: + +// Is this a Foo? +static int +foo_p(SCM obj) +{ + return(SCM_NIMP(obj) && SCM_CAR(obj) == Foo_class::Foo_smob_tag); +} + +// given a Scheme representation, return, a C++ representation +static Foo_class * +foo_unbox(SCM obj) +{ + return((Foo_class*)SCM_CDR(obj)); +} + +// the SCM representation of the object is stored inside itself +// this will become useful when destructor gets called +static SCM +foo_box(Foo_class *foo) +{ + SCM_DEFER_INTS; + SCM_NEWCELL(foo->obj); + SCM_SETCAR(foo->obj, Foo_class::Foo_smob_tag); + SCM_SETCDR(foo->obj, (SCM)foo); + SCM_ALLOW_INTS; + return foo->obj; +} + +> C++ determines life time, so what is the strategy? + +What happens now when the destructor gets called? Lets set the cdr to +NULL, and then check for that in all of the primitive functions that +use your smob. We'll call this notion 'live'; a scheme object is +'live' if the C++ representation still exists, it's dead if the C++ +object is gone. You can still have references to dead objects in +scheme code; it's just an error to use them. This idea is stolen from +Emacs's handling of buffers ('buffer-live-p' and friends). + +Add another function, foo_live_p: + +static int +foo_live_p(SCM obj) +{ + return(foo_p(obj) && SCM_CDR(obj) != NULL); +} + +In you destructor, you need to do: + +~Foo_class() +{ + SCM_CDR(this->obj, NULL); +} + +When writing new primitives, now just check foo_live_p(). + +I hope the above helps, + +-russ + + +-- +"Even if you are on the right track, you'll get run over +if you just sit there." + --Will Rogers (1879-1935) + +*************************** + +> I am still muddling along with integrating GUILE in LilyPond, and I +> have a question. I want to replace an existing C++ implementation of +> identifier tables by GUILE's code. I've managed to replace +> +> Hash_table +> +> by +> +> Hash_table +> +> and use interning and GUILE symbols for doing the identifier lookup. +> But I'd like to use GUILE's hash tables as well, and that's were my +> question comes in: is there an interface that allows me to iterate +> through the entries of a GUILE hash table? + +I use the following, which should definitely be provided somewhere +in guile, but isn't, AFAIK: + +(define (hash-table-for-each fn ht) + (do ((i 0 (+ 1 i))) + ((= i (vector-length ht))) + (do ((alist (vector-ref ht i) (cdr alist))) + ((null? alist) #t) + (fn (car (car alist)) (cdr (car alist)))))) + +(define (hash-table-map fn ht) + (do ((i 0 (+ 1 i)) + (ret-ls '())) + ((= i (vector-length ht)) (reverse ret-ls)) + (do ((alist (vector-ref ht i) (cdr alist))) + ((null? alist) #t) + (set! ret-ls (cons (fn (car (car alist)) (cdr (car alist))) ret-ls))))) + +If you want a C version, you can run the above code through hobbit, or +tranlate it to C by hand. + +-russ + + +-- +"Whenever you find yourself on the side of the majority, it is time to +pause and reflect." + -- Mark Twain +*********************** diff --git a/VERSION b/VERSION index 7f47bf5c61..26dc282a2d 100644 --- a/VERSION +++ b/VERSION @@ -2,7 +2,7 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=1 PATCH_LEVEL=26 -MY_PATCH_LEVEL= +MY_PATCH_LEVEL=jcn2 # use the above to send patches: MY_PATCH_LEVEL is always empty for a # released version. diff --git a/input/test/slur-mininum.ly b/input/test/slur-mininum.ly new file mode 100644 index 0000000000..5144ab9dba --- /dev/null +++ b/input/test/slur-mininum.ly @@ -0,0 +1,11 @@ +\score{ + \notes\relative c''{ + \time 2/4; + c()c + c~c\break + } + \paper{ + linewidth=-1.\mm; + slur_x_minimum=40.0*\interline; + } +} diff --git a/input/test/tie-minimum.ly b/input/test/tie-minimum.ly new file mode 100644 index 0000000000..676dc2a51e --- /dev/null +++ b/input/test/tie-minimum.ly @@ -0,0 +1,11 @@ +\score{ + \notes\relative c''{ + \time 2/4; + c~c\break + c()c + } + \paper{ + linewidth=-1.\mm; + tie_x_minimum=40.0*\interline; + } +} diff --git a/lily/include/slur.hh b/lily/include/slur.hh index 30123a335b..077b5a833e 100644 --- a/lily/include/slur.hh +++ b/lily/include/slur.hh @@ -7,10 +7,8 @@ #ifndef SLUR_HH #define SLUR_HH -#include "directional-spanner.hh" -#include "lily-proto.hh" -#include "parray.hh" #include "bow.hh" +#include "rod.hh" /** A #Bow# which tries to drape itself around the stems too. @@ -33,6 +31,8 @@ protected: virtual void do_add_processing (); virtual void do_pre_processing (); virtual void do_substitute_dependency (Score_element*, Score_element*); + virtual Interval do_width () const; + Array get_rods () const; }; #endif // SLUR_HH diff --git a/lily/include/stem.hh b/lily/include/stem.hh index 34e829d634..c87555367f 100644 --- a/lily/include/stem.hh +++ b/lily/include/stem.hh @@ -46,11 +46,10 @@ class Stem : public Item { */ Direction stem_xdir_; +public: Link_array head_l_arr_; Link_array rest_l_arr_; -public: - /// how many abbrev beam don't reach stem? int beam_gap_i_; diff --git a/lily/include/tie-engraver.hh b/lily/include/tie-engraver.hh index b58101532c..15ead2f8ea 100644 --- a/lily/include/tie-engraver.hh +++ b/lily/include/tie-engraver.hh @@ -44,10 +44,10 @@ protected: virtual bool do_try_music (Music*); virtual void do_process_requests (); virtual void process_acknowledged (); + public: VIRTUAL_COPY_CONS(Translator); Tie_engraver(); - }; #endif /* CTIE_ENGRAVER_HH */ diff --git a/lily/include/tie.hh b/lily/include/tie.hh index 522203d9c0..3bca552fb2 100644 --- a/lily/include/tie.hh +++ b/lily/include/tie.hh @@ -11,6 +11,7 @@ #define TIE_HH #include "bow.hh" +#include "rod.hh" /** Connect two noteheads. @@ -18,20 +19,24 @@ class Tie : public Bow { public: - Tie (); - void set_head (Direction, Note_head*head_l); - - - VIRTUAL_COPY_CONS(Score_element); - - bool same_pitch_b_; - Drul_array head_l_drul_; + Tie (); + void set_head (Direction, Note_head*head_l); + + + VIRTUAL_COPY_CONS(Score_element); + + bool same_pitch_b_; + Drul_array head_l_drul_; protected: - virtual void do_add_processing (); - virtual void do_post_processing (); - virtual void set_default_dir(); - virtual void do_substitute_dependency (Score_element*,Score_element*); - Array get_controls () const; + virtual void do_add_processing (); + virtual void do_post_processing (); + virtual void set_default_dir(); + virtual void do_substitute_dependency (Score_element*,Score_element*); + virtual Interval do_width () const; + Array get_rods () const; + + Array get_controls () const; }; + #endif // TIE_HH diff --git a/lily/slur.cc b/lily/slur.cc index e5b9f4d88d..85de705146 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -102,7 +102,6 @@ Slur::do_post_processing () Real internote_f = interline_f / 2; // URG Real notewidth_f = paper ()->note_width () * 0.8; - Real slur_min = paper ()->get_var ("slur_x_minimum"); /* [OSU]: slur and tie placement @@ -190,21 +189,6 @@ Slur::do_post_processing () dy_f_drul_[u] += dir_ * internote_f; dy_f_drul_[d] = dy_f_drul_[(Direction)-d]; - - /* - urg, this is broken - but who *is* going to assure that dx >= slur_min? - */ -#if 0 - - if (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT] < slur_min) - { - // huh? what was this supposed to do? -// dx_f_drul_[d] -= d * slur_min -// - (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]); - dx_f_drul_[d] = dx_f_drul_[(Direction)-d] + d * slur_min; - } -#endif } } while (flip(&d) != LEFT); @@ -298,3 +282,21 @@ Slur::get_encompass_offset_arr () const return notes; } +Interval +Slur::do_width () const +{ + Real min_f = paper ()->get_var ("slur_x_minimum"); + Interval width_int = Bow::do_width (); + return width_int.length () < min_f ? Interval (0, min_f) : width_int; +} + +Array +Slur::get_rods () const +{ + Array a; + Rod r ((Single_malt_grouping_item*)encompass_arr_[0]->stem_l_->head_l_arr_[0], + (Single_malt_grouping_item*)encompass_arr_.top ()->stem_l_->head_l_arr_[0]); + r.distance_f_ += do_width ().length (); + a.push (r); + return a; +} diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc index cf9dd50f7c..9a78dd4109 100644 --- a/lily/tie-engraver.cc +++ b/lily/tie-engraver.cc @@ -93,10 +93,20 @@ Tie_engraver::do_pre_move_processing () { past_notes_pq_.insert (now_heads_[i]); } - now_heads_.clear( ); + now_heads_.clear (); + + Scalar dir (get_property ("tieydirection", 0)); + Scalar dir2 (get_property ("ydirection", 0)); + + Direction tie_dir = CENTER; + if (dir.length_i () && dir.isnum_b ()) + tie_dir = (Direction) sign (int(dir)); + else if (dir2.length_i () && dir2.isnum_b ()) + tie_dir = (Direction) sign (int (dir2)); for (int i=0; i< tie_p_arr_.size (); i++) - { + { + tie_p_arr_[i]->dir_ = tie_dir; typeset_element (tie_p_arr_[i]); } tie_p_arr_.clear (); @@ -111,8 +121,6 @@ Tie_engraver::do_post_move_processing () past_notes_pq_.delmin (); } - - ADD_THIS_TRANSLATOR(Tie_engraver); diff --git a/lily/tie.cc b/lily/tie.cc index cc68a065e3..2c418b13c7 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -64,9 +64,9 @@ Tie::do_post_processing() // URG: share code with slur! assert (head_l_drul_[LEFT] || head_l_drul_[RIGHT]); - Real notewidth = paper ()->note_width (); + // URG + Real notewidth = paper ()->note_width () * 0.8; Real interline_f = paper ()->interline_f (); - Real tie_min = paper ()->get_var ("tie_x_minimum"); /* [OSU]: slur and tie placement @@ -121,20 +121,6 @@ Tie::do_post_processing() // tie attached to outer notehead if (!head_l_drul_[d]) { - - /* - urg, this is broken - but who *is* going to assure that dx >= tie_min? - */ -#if 0 - if (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT] < tie_min) - { -// dx_f_drul_[d] -= d * tie_min -// - (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]); - dx_f_drul_[d] = dx_f_drul_[(Direction)-d] + d * tie_min; - } -#endif - dy_f_drul_[d] = dy_f_drul_[(Direction) -d]; } } @@ -165,3 +151,21 @@ Tie::do_substitute_dependency (Score_element*o, Score_element*n) head_l_drul_[RIGHT] = new_l; } +Interval +Tie::do_width () const +{ + Real min_f = paper ()->get_var ("tie_x_minimum"); + Interval width_int = Bow::do_width (); + return width_int.length () < min_f ? Interval (0, min_f) : width_int; +} + +Array +Tie::get_rods () const +{ + Array a; + Rod r ((Single_malt_grouping_item*)head_l_drul_[LEFT], + (Single_malt_grouping_item*)head_l_drul_[RIGHT]); + r.distance_f_ += do_width ().length (); + a.push (r); + return a; +} diff --git a/ly/params.ly b/ly/params.ly index b94c31d875..2840631559 100644 --- a/ly/params.ly +++ b/ly/params.ly @@ -65,7 +65,7 @@ beam_steep_slope = 0.2 / 1.0; % OSU: suggested gap = ss / 5; slur_x_gap = \interline / 5.0; -slur_x_minimum = 2.0 * \interline; +slur_x_minimum = 3.0 * \interline; slur_slope_damping = 0.5; tie_x_minimum = \slur_x_minimum; tie_x_gap = \slur_x_gap; @@ -76,9 +76,9 @@ tie_slope_damping = 0.3; slur_thickness = 1.4 * \staffline; slur_height_limit = \staffheight; -% mmm, try bit flatter slurs -% slur_ratio = 1.0 / 3.0; -slur_ratio = 0.3; +% slur_ratio = 0.3; +% try bit flatter slurs +slur_ratio = 0.25; slur_clip_ratio = 1.2; slur_clip_height = 3.0 * \staffheight; slur_clip_angle = 100.0; diff --git a/mutopia/J.S.Bach/wtk1-fugue2.ly b/mutopia/J.S.Bach/wtk1-fugue2.ly index c180b38ef4..3ae97919be 100644 --- a/mutopia/J.S.Bach/wtk1-fugue2.ly +++ b/mutopia/J.S.Bach/wtk1-fugue2.ly @@ -1,11 +1,12 @@ \header { filename = "wtk1-fugue2.ly"; - title = "Fuga a 3"; + title = "Fuga II"; + subtitle = "\\`a 3 voci"; description = "Das Wohltemperierte Clavier I, Fuga II (c-minor)"; opus = "BWV 847-Fuga"; source = "Henle's Urtext"; composer = "Johann Sebastian Bach (1685-1750)"; - enteredby = "HWN, WL"; + enteredby = "hwn, wl, jcn"; copyright = "Public Domain"; } @@ -123,7 +124,6 @@ comes = \type Voice=one \notes \relative c'' { f,16 g as4 g16 f e2 | } - bassdux = \type Voice=three \notes \relative c' { \clef bass; R1 | @@ -164,8 +164,8 @@ bassdux = \type Voice=three \notes \relative c' { d c g' g, %%30 \type Staff=bass < - {\voicethree c2 ~ | c1 ~ | c1 } - {\voicefour c,2 ~ | c1 ~ | c1 } + {\stemup c2 ~ | c1 ~ | c1 } + \type Voice=four {\stemdown c,2 ~ | c1 ~ | c1 } > } -- 2.39.5