]> git.donarmstrong.com Git - lilypond.git/blob - CHANGES
ef5141e5be04ef465052e7dcea9a163414682fee
[lilypond.git] / CHANGES
1
2 1.3.84
3 ======
4
5 * pmx2ly, PMX to LilyPond conversion. Succesfully converts barsant.pmx.
6
7 * musedata2ly, a Musedata to LilyPond convertor. Succesfully converts
8 wtk1-fugue2
9
10 * bugfixes for dynamics: make sure that dynamic alignments encompass
11 the dynamics they support, and that any columns they attach to aren't
12 prematurely killed.
13
14 * bugfix: make sure \time gets noticed early enough.
15
16 1.3.83
17 ======
18
19 * small doc updates.
20
21 * Cleanups related to barline handling:
22
23   - Removed Translator_group::get_simple_translator (), and -
24
25   - use properties to communicate about barlines and time sigs. (NOTE:
26     by default a time-signature of 4/4 is printed.)
27
28   - fix repeat bar behavior.
29
30
31 * cleaned up Directional_element_interface
32
33 * add name field to score-elements.
34
35 * comment in some unprotects for Music in parser. Should bring down
36   cpu time and plug some leaks.
37
38 * robustness fixes for etf2ly, tuplets, grace notes. 
39
40 1.3.82
41 ======
42
43 * engraver.ly: cleanups.
44
45 * etf2ly: robustness fixes, handle mac files as well.
46
47 * Smobified Translator and Translator_group, junked
48 Translator_group_identifier.
49
50 * \pushproperty and \popproperty withing \translator, similar to
51 predefining \property, ie.
52
53         \translator { [...] \pushproperty [..] }
54         \translator { [...] \popproperty [..] }
55
56 (these \pushes and \pops are delayed until instantiation, so if you do
57
58
59         \score {
60                 \pushproperty #'basicFooProperties #'bla #VALUE1
61                 \context Voice { \pushproperty #'basicFooProperties #'bar #VALUE2
62                         [..]
63                 }
64         }
65
66 then the setting for basicFooProperties contains both (bla . VALUE1)
67 and (bar . VALUE2).
68
69 * allow \pushproperty #'symbol [..] as well as \pushproperty #'(symbol1 symbol2 ... )
70
71 1.3.81.jcn1
72 ===========
73
74 * Activated regex for windows.
75
76 * New guile-1.4 patch for cross windows build.
77
78 * Added configure messages for metapost checking.
79
80 1.3.81
81 ======
82 1.3.80.gp1
83 ==========
84
85 * Added property LyricVoice.associatedVoice to enable switching associated
86   voice mid-stream. Association still defaults to context name.
87
88 1.3.80.hwn1
89 ===========
90
91 * \pushproperty, \popproperty: property settings with less memory
92 cost. See input/test/pushproperty.ly and Documentation/hacking. Note:
93 syntax is most likely only temporary.
94
95 1.3.80.jcn1
96 ===========
97
98 * (Line-)broken slurs now have vertical trend.
99
100 * Better length for broken ties: no invisibly short ties.  Now ties may
101   collide with time signatures, though.
102
103 * Don't typeset unfinished spanners, but kill them.
104
105 * Added two FAQs (Mats)
106
107 * Made workaround guile-1.4.1 backward incompatible (scm_)eval change.
108   Note that we must use (scm_)eval2 to remain backwards compatible with
109   guile < 1.4.1 snapshot.
110
111 * Reincluded 79.jcn2 fix
112
113 1.3.80
114 ======
115
116 1.3.79.jcn5
117 ===========
118
119 * Created Thread_devnull_engraver and Voice_devnull_engraver iso
120   single A2_devnull_engraver in Thread context.  It seems however
121   that the hack in A2_devnull_engraver works better.
122
123 * Coriolan fixes.
124
125 * Slur attachment fix for chords where case slurdir != stemdir.
126
127 * Made various fixes for (line-)broken slurs.
128
129 * Fixed slur_height (), which fixes most ugly slurs (Yeah!).
130
131 * Fixed some silly url reversals in FAQ.
132
133 * Finished Coriolan music entry (again); entered second viola part.
134
135 * Updated Coriolan to use part combiner on Voice level for wind parts
136   and on Staff level for violi and bassi.
137
138 * Part-combiner now uses duration inquiry, which fixes rhythm-related
139   bugs in determining solo/a2.  Also, rests are taken into account.
140
141 * Another crude fix for almost unexplainable (with a gdb that dumps
142   core on ly_display_scm) all-zero control points slurs.
143
144 * Fixed slurs that crossed through stems and note heads.  Note
145   that beautifying of ugly slurs is still broken.
146
147 * Made crude fixes slurs don't crash, bezier still crashes on
148   infinitely steep slurs (eg flauti-part *with* slur_engraver).
149
150 1.3.79.gp1
151 ==========
152
153 * Replaced empty melisma score element with a property
154
155 * Renamed Voice_alist_entry -> Syllable_group in lyric-phrasing-engraver
156
157 1.3.79.uu1
158 ==========
159
160 * fixed y-position of whole rest
161
162 * fixed sustainPedalPadding
163
164 * etf2ly: articulation, lyrics.
165
166 1.3.79
167 ======
168
169 * etf2ly.py: Finale to LilyPond conversion.
170
171 1.3.78.jcn4
172 ===========
173
174 * Made simple fix to get part-combiner to recognise different rhythms
175
176 * Unhardcoded part combiner and a2-engraver; introduced properties
177   splitInterval, soloADue, soloText, soloIIText, aDueText.
178
179 * Fixed part combiner's too-late problem (Dankje!)
180
181 * Fixed a2-devnull-engraver, a2-engraver.
182
183 * Renamed part combiner music names to "one", "two".
184
185 * Cleaned up decision making in part combiner, renamed to "solo"/"unison"
186
187 1.3.77.mb1
188 ==========
189
190 * Minor documentation updates
191
192 * Mark_engraver: has been broken since .73, fixed!
193
194 1.3.78
195 ======
196
197 * Added a devnull engraver, that junks (notehead) requests of the second
198   stem when combined parts are in unison (a2).
199
200 * Part-combine iterator identifies Soli and A2 parts in threads by 
201   looking at rhythm and pitches.  It switches Voice context automagically,
202   and communicates current state using a2/solo/solo2 properties.
203
204 * Simple A2_engraver (`a due) prints `a2/Solo/Solo II.  Soli seem to
205   arrive one request late.
206
207 * First try at combining parts: part-combine*
208
209 * fixed problem with HaraKiri
210
211 * fixed problem with dynamicDirection
212
213 * fixed problem with nonEmptyText 
214
215 * `Fixed' chord notation, as per request of David Arnold, ie, 
216    Added a chord-name-mode, that only displays chord names
217    when there's a change in the chord-name-scheme, Also, a chord
218    name should always be displayed after a line break.  See
219
220        input/test/drarn-chords.ly
221
222 * Reverted duration-iter change in midi2ly, moved printing of options.
223
224 * warning bugfix in lexer.ll (Mats Bengtsson)
225
226 1.3.77
227 ======
228
229 * Midi2ly bugfix: handle durations longer than longa.  These can occur
230   because of lengthened notes when using --no-rests.
231
232 * Midi2ly: output `new' \key syntax, and updated version number.
233
234 * Midi2ly bugfix: don't correct quantised durations, don't use tuplets, 
235   double dots etc. when user doesn't want them.  It probably used to
236   work like this, a long time ago.  For some unknown reason, all
237   corrections made by Duration_convert were junked if the corrected
238   duration != exact duration.  Duh.
239
240 * Midi2ly: added a new option: --no-rests.
241
242 * Update of mudela-book (Tom Cato Amundsen)
243  - --read-lys option, now you can do:
244         mudela-book file.texi
245         convert-mudela
246         mudela-book --read-lys
247  - --outdir=DIR will put ALL output into DIR
248  - @mudela[filename="myfilename"]{c d e f g}
249  - --force-mudela-fontsize
250  - ignore mudela inside @ignore @end ignore
251
252 1.3.76.gp1
253 ==========
254
255 * Lyric_phrasing_engraver now catches lyric extenders and correctly
256   terminates them under the last note of a melisma.
257
258 * Lyric word spacing code changed to fix hyphen alignment.
259
260 * Other minor tidying up of Lyric_phrasing_engraver and related code.
261
262 1.3.76
263 ======
264
265 * Lyric_phrasing_engraver now adjusts for melisma.  (Glen Prideaux).
266
267 * Mudela-book fix for Windows95 (Mark Hindley)
268
269 * Debian update (Anthony Fok)
270
271 * Added beam melisma for when automaticMelismata and noAutoBeaming are both
272   #t (primarily for hymns).  Courtesy Glen Prideaux.
273
274 * Bugfix: .pfa dependency on $(outdir)/mfplain.mem
275
276 1.3.75.mb1
277 ==========
278
279 * stepmake/stepmake/metapost-rules.make: Put all generated files
280   in mf/out/.
281
282 * Added paper variable interscoreline to determine the score line
283   spacing, see input/test/vertical-extent.ly.
284   Cleaned up the lilyponddefs.tex inclusion scheme.
285
286 1.3.75
287 ======
288
289 1.3.74.gp1
290 ==========
291
292 * Improved default handling of Lyric_phrasing_engraver and made it on by 
293 default.
294
295 * Beginnings of a stanza number engraver (\property LyricVoice.stanza = 
296 #"1:" etc.)
297
298 * fixed bug in script.cc so fermata (and other scripts) get flipped 
299 correctly when they are above the staff.
300
301 1.3.74.jcn2
302 ===========
303
304 * Reincluded simple code for including tfm.[1-5] into search path.
305   Configure with --disable-kpathsea to enable this kludge.
306
307 1.3.74.jcn1
308 ===========
309
310 * Updated input/test/banter-chords.ly German H/B example.
311
312 * Updated nl.po.
313
314 * Have configure check for kpathsea library and functions.  Made kpathsea
315   support optional for now.
316
317 * Bugfix: halved width of tremolo-beams.
318  
319 * Included compilation fix for guile-1.3.4 (Anthony).
320
321 * Added: chord inversion and base to regtest.
322
323 * Fixed: Chord names that were broken by pl73.
324
325 * Fixed: Chord inversions that were broken by pl72.
326
327 * Resurrected ascii-script output, for debugging purposes.
328
329 * Included compilation fix for scm-hash.cc (Han-Wen).
330
331
332 1.3.74
333 ======
334
335 * Small bugfix: also do a deep copy on  submusices
336
337 * Fixed:  \autochange doesn't crash anymore.
338
339 * Cleanup, documentation and enforcement of smob interfaces in
340 LilyPond.  We distinguish between SIMPLE_SMOBS and SMOBS (objects that
341 have self_scm_)
342
343 * Glen Prideaux lyric phrasing engraver. See
344 input/test/lyric-phrasing.ly
345
346 1.3.73
347 ======
348 * Removed \interscoreline after the last line, prevents some
349 empty pages. (patch by Mats Bengtsson)
350
351 * Smobified Music, junked associated identifiers. Use Scheme list to
352 store Music_sequence.  Removed const declarations from
353 Music_iterators.  Added a mutable and immutable property list to
354 Music.  Use music property for all Scheme values in Music.  Created
355 and fixed a load of Garbage Collection bugs.
356
357 * Changed number font to allow automatic .mf creation.
358
359 * Output place of definition as \special{src:LOCATION}. See FAQ for
360 explanation how to use.
361
362 * Schemified Local_key_item and fixed minor bug with accidentals.
363
364 * new Japanese .po file.
365
366 * Bugfix for broken tie direction
367
368 * Bugfix for bar at beginning of line break
369
370 1.3.72
371 ======
372
373 * Robustness fix for minimise_least_squares ()
374
375 * cleanups of Slur_bezier_bow, removed Bezier_bow.
376
377 * cleanup of Tie. Changed Tie into interface. Made ties flatter by default.
378
379 * changed SCM_UNDEFINED to SCM_UNSPECIFIED for return values that go
380 back into Scheme.
381
382 * changed SCM_UNSPECIFIED to SCM_EOL for undefined element
383 properties. This makes initializing list properties redundant.
384
385 * removed idiotic code for including tfm.[1-5] into search path.
386
387 * fixed problem with tuplet placement for cross staff tuplets.
388
389 1.3.71
390 ======
391 * Small cleanups to bring down  compile time and binary ensmallment.
392
393 * Made Lookup into a smob, and use guile alist iso. an STL map.
394
395 * Changed repeated music semantics for relative octave: each
396 alternative takes its inital octave from the body.
397
398 * Fixed: parser accepts booleans for property values as well.
399
400 * Added Scarlatti sonata test file to input/
401
402 * kpathsea support, courtesy Carsten Block <carsten.block@gmx.de> 
403
404 1.3.70
405 ======
406 * Fixed: long standing problem in optical-illusion code.
407
408 * Fixed: stop beam if stem *has* a beam in auto-beam-engraver. 
409
410 * Made interface of Multi_measure_rest, System_start_delimiter,
411 Spacing_spanner, Separating_group_spanner, Beam, Slur and
412 Rhythmic_head.
413
414 * Use properties for minimum distances and spring parameters.  Move
415 spacing related functions from Paper_column into Spaceable_element.
416
417 * Removed most Paper_column typecasts.
418
419 1.3.69
420 ======
421
422 * Cleanup auto-beam-engraver: use properties for retrieving timing
423 information.
424
425 * Fixed: Multi measure rests don't cause crashes.
426
427 * Fixed: don't invoke Hara_kiri::consider_suicide too early.
428
429 * Fixed: property engraver.  
430
431 * Fixed: don't crash on multiple ties.
432
433 * Cleanups of Beam, should also be a little faster.  
434
435 * Reunite properties and pointers. In implementation we make a
436 distinction between mutable and immutable properties
437
438 * Add {has|set}_interface () static methods to interface classes.
439
440 * Made Side_position_interface and Staff_symbol_interface an all
441 statics class, and stripped _interface suffix.
442
443 * Make Align_interface and Axis_group_interface an all-statics class 
444
445 * Rhythmic_head, Staff_symbol, Grace_align_item, Break_align_item,
446 Bar, Span_bar are now interfaces, Staff_bar was removed. Use a
447 callback for determining barsize.
448
449 * Removed all GLUE_SCORE_ELEMENT callbacks. 
450
451 * Added test for repeats to trip.ly
452
453 1.3.68
454 ======
455
456 * ly2dvi: changed back to original semantics of latexheaders.
457
458 * Stem_tremolo, Crescendo, Hara_kiri_group_spanner, Tuplet_spanner,
459 Volta_spanner changed into interface.
460
461 * Related cleanups for Tie, Tie_column cleanups.
462
463 * Made Time_signature, Single_malt_grouping_item, Script_column,
464 Chord_name, Dot_column, Breathing_sign, Key_item type into interface.
465
466 * Removed const declaration from callback arguments.
467
468 * Pagebreak support. See input/test/between-systems.ly
469
470 * Fixed a problem with accidentals in combination with
471 non-nil key signatures.
472
473 1.3.67
474 ======
475
476 * Use callbacks for augmentation dot positioning.
477
478 * Removed types Note_head and Rest
479
480 * Cleanup of slur.cc: use common reference points in a sane manner.
481
482 1.3.66
483 ======
484
485 * Corrected text sizes in paper*.ly (Mats Bengtsson)
486
487 1.3.65.uu1
488 ==========
489
490 * Dots, Collision, Rest_collision removed as separate Score_element type.
491
492 * Stem and Note_column accept only one rest.
493
494 * Use offset callback in Stem to resolve rest/beam collisions.
495
496 * Put the value of new  local key signature (accidentals) back into a property.
497
498 * Set molecule-callback for notename item.
499
500 1.3.65.jcn2
501 ===========
502
503 * Added some comments to new slur code.
504
505 * Removed some ugly interstaff slur code, interstaff slurs at line-break
506   are still broken.
507
508 * Slur bugfix: 16th beams are also beams.
509
510
511 1.3.65
512 ======
513
514 * Bugfix: translate volta spanner at start of line.
515
516 * Changed directional_element() calls to instantiations
517 of Directional_element_interface.
518
519 * Removed Dynamic_line_spanner, and cleaned up Dynamic_engraver.
520
521 * Removed Staff_info type. Information about columns is now transferred
522 via currentMusicalColumn and currentCommandColumn.
523
524
525 1.3.64.jcn2
526 ============
527
528 * Made slur attachment position user settable; properties:
529 slurBeginAttachment slurEndAttachment, values: 'head 'stem
530 'along-side-stem.  See input/test/slur-attachment.ly and ophee-slurs.ly.
531
532 * Fixed slur attachment positions, added missing rule and use simple
533 default starting positions for attachments.
534
535 * Started rewrite of slur ending code, interstaff slurs are broken for
536 now.
537
538 * Fixed download URL of the webpage.
539
540 * Moved direction.cc to flower/.
541
542 1.3.64
543 ======
544
545 * Lyrics centered on notehead.
546
547 * Various bugfixes hyphen-spanner.
548
549 * Bugfix: set appropriate callbacks for Note_head. This fixes 
550 problems with dots.
551
552 * Removed Clef_item as score-element derived type.
553
554 * Updated config.sub and config.guess
555
556 * Bugfix: allow linebreaks on beamed grace notes.
557
558 1.3.61.jcn2
559 ===========
560
561 * Included dutch po-update based on submitted 1.3.57 nl.po
562
563 * Added "Development" link to website, now that "Home" is a relative link.
564
565 * Bugfix: use deep copies for resetting keys.
566
567 * Assorted typing erors in procedure names in ly/engraver.ly
568
569 1.3.62
570 ======
571
572 * Made callbacks from Score_element::before_line_breaking() and
573 Score_element::after_line_breaking()
574
575 * Fixed website; backlinks should work again.
576
577 * Removed --ignore-version option. Added --verbose option.
578
579 1.3.61
580 ======
581
582 * Webpage hacking
583
584 1.3.60.hwn1
585 ===========
586
587 * Junk int_identifier, real_identifier. Merged Midi_def_identifier and
588 Paper_def_identifier.
589
590 * Fixed bug with spanning barlines in combination with Hara-Kiri staffs.
591
592 * Cleaned up Text_item, Hyphen_spanner, Lyric_extender and
593 Sustain_pedal and reduced them to an Score_element interface (they are
594 no longer Score_element derived types).
595
596 * Some instances of brew_molecule routines have moved out of
597 Score_element, and are now called scheme_molecule.
598
599 * Moved lots of parameters from ly/params.ly to ly/engraver.ly
600
601 1.3.59.hwn1
602 ===========
603
604 * Removed String_identifier, and use the type system of GUILE instead.
605
606 * Fixed \key PITCH MODALITY syntax. The modality argument is now
607 mandatory, a rule in convert-mudela has been added.
608
609 * Cleaned up  buildscripts/ directory: removed obsolete scripts.
610
611 * Use Scheme_hash_table for identifier Scopes.  Scheme_hash_table is
612 based on STL and should be faster than hash_table.
613
614
615 1.3.59.jcn1
616 ===========
617
618 * Fixed scm_un/protect_object for guile-1.3.4 and 1.3.5 snapshots,
619   in the process reduced number of protect/unprotect calls.  With
620   guile-1.3.5 snapshot, memory usage has decreased by 1/5th, now
621   just 10% above the 1.2 level.  Also, Lily's a bit faster.
622
623 * Fixed make diff bug in stepmake to be able to make this diff :-)
624
625 1.3.58.hwn1
626 ===========
627
628 * Rewrote key sig support.  Now key signature can also be controlled
629 by setting keySignature and localKeySignature properties, eg.
630
631         \property keySignature = #'((2 . -1) ( 4 . -1) (6 . -1))
632
633 sets a key signature of `es ges bes' (an unusual key signature).
634
635 Keys are internally represented as transpositions of the c-major
636 scale. Printing the key signature for a scale is done by filtering out
637 all non-natural accidentals.
638
639 * Removed support for \keysignature, and \key something \minor; Newkey
640 is now obsolete.
641
642 1.3.58.jcn3
643 ===========
644
645 * Fixed pedal items (hw)
646
647 * Changed configure option tex-tmfdir to tmf-path now accepting multiple
648   tfm directories.  Automated links to cmr and amstex tfm font directories.
649
650 * Replaced one scm_assoc () u-turn slipped through jcn1
651
652 * various GUILE 1.3.5 compile fixes
653
654 * Added `Ped' as a compound symbol font and removed silly scheme kerning.
655
656 * Replaced some scheme assoc u-turns with scm_assoc ()
657
658 * Ran po-update (mostly because of new ja contribution).
659
660 1.3.57.jcn2
661 ===========
662
663 * Cleaned-up scheme list to text conversion for Chord_name and 
664 fixed horizontal kerning.
665
666 * Added examples for american (slashed o) and jazz (black triangle),
667   see input/test/{american-chords.ly,jazz-chords.ly}
668
669 * Made guile-1.3.5 compile fixes
670
671 1.3.57.uu1
672 ==========
673
674 * Fixed typo in Dots::do_brew_molecule (); this fixes the disappearing
675 dots problem.
676
677 * Rewrote key signature administration; now Scheme is used; Octave and
678 Key have been junked in favor of Newkey.
679
680 * japanese .po file included (thanks, Japanese team!)
681
682 1.3.57
683 ======
684
685 * Fixed several forgotten molecule-callbacks 
686
687 * Fixed first clef in score; now F clefs are also possible.
688
689 1.3.56.mb1
690 =========
691  
692 * Updated FAQ with two useful GDB macros.
693
694 * Several fixes in the documentation.
695
696 1.3.55.jcn1
697 ===========
698
699 * Made (dutch) po-update
700
701 1.3.56
702 ===========
703
704 * Molecules are now generated via callbacks exclusively; most calls to
705 set_elt_property ("transparent", SCM_BOOL_T) have been replaced by suicide().
706
707 1.3.55
708 ======
709
710 * Experimental property collapse for most score-elements.  (notable
711 exceptions: Scripts, pedals). Change all Score_element constructors to
712 take a basic-property list. The suffix of a property list may be
713 shared by several score-elements, for instance all default G-clefs in
714 a score share the following settings
715   
716            (breakable . #t)
717            (break-align-symbol . Clef_item)
718            (visibility-lambda . ,begin-of-line-visible) 
719
720 This should reduce memory usage further. 
721
722 * Magically fixed the disappearing Lyrics problem.
723
724 * Removed used_b_ field from Score_element.  
725
726 * Massive search-replace patch: store pointers and properties
727 separately, in preparation of property collapse.
728
729
730 1.3.54
731 ======
732
733 * Bugfix: don't crash on tuplet spanners that don't contain any notes.
734
735 * Cleanup of Dimension_cache: removed a few redundant
736 fields. Slightly lower memory usage (32 bytes per
737 score-element). Dimension_cache is now a `dumb' struct again.
738
739 * Add array index to priority field of text scripts to ensure that
740 order is unique, and sensible.
741
742 * Added an element count statistic.
743
744 1.3.53
745 ======
746
747 * russian.po (thank you, August.)
748
749 * Small cleanups in Molecule interface 
750
751 * Spacing related elements perform suicide after calculating
752 distances.  This saves a some memory, approximately 2 to 5 % ?
753
754 * Small cleanups in line breaking: Paper_column stores springs and
755 rods in only one place now.  All fields relating to energy have been
756 removed
757
758 * Don't generate all output Scheme in memory, but evaluate to output
759 file immediately.  This will reduce memory usage a little.
760
761 * Use STL's map  for Dictionary template
762
763 * Substitute pointers on element properties of the root Line_of_score
764 as well.
765
766 * Added toplevel doc target, to support building doc with --srcdir
767
768 * Removed cygwin build stuff; updated versions at:
769
770      http://appel.dyndns.org/lilypond/gnu-windows/cross
771
772 * Fixed lily.scm to handle incipits (thanks, Mats)
773
774
775 1.3.52
776 ======
777
778 * Made bugfix in smob handling: delete the C-part of freed smobs and
779 be honest about amount of allocation and deletion, so that GUILE
780 doesn't overestimate the amount of memory available.
781
782 * Faq update: nicer blank note paper, courtesy Mats Bengtsson.
783
784 * Bugfix: don't crash on durations that are not a power of 2.
785
786 * Build manpages during `make all' 
787  
788 * Bugfix: don't do absolute comparisons in Polynomial::clean ().
789
790 * Bugfix: set visibility-lambda for key signature created by
791 createKeyOnClefChange. Fixes disappearing key signatures. 
792
793 * Bugfix: make System_start_delimiter of bar-line type invisible when
794 it spans only one staff.
795
796 1.3.51
797 ======
798
799 * Item cleanups.  Copying items and rearranging pointers are done in
800 separate passes, which makes the code cleaner. This fixes a problem
801 with some items not disappearing from hara-kiri staffs.
802
803 * Use Scheme for Key_item data members. 
804
805 * Don't use regex in chord-names.scm under windows; hybrid chordnames
806 user+calculated will be partly broken.
807
808 1.3.50
809 ======
810
811 * Junked Shift_tuple from collision; Now it uses SCM.
812
813 * Bugfix of documentation and test-file of tuplet.
814
815 * Bugfix type string of repeated music is copied. This fixes declared
816 tremolos.
817
818 * Junked various cruft from lily.scm
819
820 * Use interfaces symbols instead of C++ class-name for assigning generic
821 element properties.
822
823 * Junked Dictionary from Piano_pedal_engraver and
824 Piano_pedal_performer.
825
826 * Introduced boolean element property no-spacing-rods: ignore this
827 item for hard constraints.
828
829 * Bugfix: added sanitised TeX fragment in faq.texi
830
831 * Bugfix: merge equal Bar_reqs
832
833 1.3.48.uu1
834 ==========
835
836 * Small fixes for \cresc and \endcresc
837
838 * Release properties of unbroken spanners & items after doing
839 handle_broken_smobs (); should conserve a little memory.
840
841 * Fixed handling of orphaned score-elements. Any element that does
842 not have its Line_of_score as a ancestor in both directions, is silently
843 removed from the output.  This guarantees that programming errors
844 don't result in coredumps from Dimension_cache::common_refpoint ():
845 element->line_l () is always a common reference point.
846
847 * Bugfix: set visibility-lambda of clef and octavation-8 explicitly
848 for default case.  Now the octavation 8 is not printed at every
849 barline.
850
851 1.3.48.mb1
852 ===========
853
854 * Changed noteHeadStyle properties to symbols, for example
855   \property Voice.noteHeadStyle = #'cross
856
857 1.3.47.jcn3
858 ===========
859
860 * Rewrite of chord-name production in scheme.  There are two major styles
861   now, banter and american.  To get american style, use
862
863       \property ChordNames.chordNameStyle = "american"
864  
865   Most anything should be possible now.  See input/test/american-chords.ly
866
867 * Added isinf check to configure.in, and isinf macro from guile to
868   bezier.cc; solaris has no isinf ().
869
870 * Fixed star-spangled-banner with not-so-nice \bar "|." fix.  Almost
871   perfect now.
872
873 * Added output property to regression test.
874
875 * Fixed warning of creating existing outdir.
876
877 * Added `Mark' interface to text-items that are marks (thanks, HW).
878
879 1.3.48
880 ======
881 1.3.47.mb2
882 ===========
883
884 * Corrected glossary.tely
885
886 * Corrected \mark font handling. feta-nummer font only of the 
887   string is all numeric.
888
889 * Implemented noteHeadStyle lookup in Guile. Reintroduced the style
890   "harmonic" and added "baroque" (normal note shapes except for 
891   brevis and longa which are square).
892
893 * Simplified ly2dvi using the power of the geometry package.
894
895 * Improved heuristic size calculation of TeX macros. Handles e.g.
896   "\\u{a}", "\\"{o}" and "\\^{u}" correctly.
897
898 1.3.47.hwn1
899 ===========
900
901 * Bugfix: don't hang on zero-duration.
902
903 * Various glossary updates (thanks, Christian)
904
905 1.3.47
906 ======
907
908 1.3.46.jcn2
909 ===========
910
911 * Drastically reduced vertical space used by headers/footers, when using
912   ly2dvi.  See input/test/fill-a4.ly.
913
914 * Fixed bug with colons appearing on repeat span-bars.
915
916 * Added Bar_number_engraver to standard Score context
917
918 * Construct octavation scripts in the clef-engraver; this fixes the
919 hara-kiri + clef8 problem
920
921 1.3.46
922 ======
923
924 1.3.45.jcn2
925 ===========
926
927 * Fixed chord-name customisation and made small chord-name build fixes.
928
929 * Accidentals with chord-names smaller and as superscript.
930
931 * Do some extra footify (works only once) while making html docs.  
932
933 1.3.45.hwn1
934 ===========
935
936 * Debian patch (Thanks Anthony)
937
938 * Rewrote Bar_number_engraver and Mark_engraver and removed
939 Bar_script_engraver as baseclass. Both Bar_number_engraver and
940 Mark_engraver are simpler and more robust.
941
942 * Fixed precedence of \property verticalDirection and dynamicDirection
943
944 * Fixed keys without barlines 
945
946 * Fixed StaffGroups: removing `\consistsend "Axis_group_engraver"'
947 puts alignment in function again
948
949 * Fixed StaffGroup + GrandStaff combination.
950
951 * Music is now mandatory as the first thing in a \score{} block
952
953 1.3.45
954 ======
955 1.3.44.jcn2
956 ===========
957
958 * Implemented una-chorda and sostenuto piano pedals in performer and engraver.
959
960 * Added Properties textScriptWordSpace and chordNameWordSpace.
961
962 * Junked old lyrics in star-spangled-banner.
963
964 * Added a Piano_pedal_engraver.
965
966 * Removed some empty files.
967
968 * Created piano pedal symbols: * - . P e d.
969
970 * Fixed ps-to-pfa.py to handle multiple unfills.
971
972 * Moved accordion symbols out of feta-script to end of font.
973
974 * Bugfix: don't create tfm's, pfa's etc of feta-test fonts.
975
976 * Fixed blot_diameter for small resolutions.
977
978 1.3.43
979 ======
980
981 * Put global element list into Line_of_score, instead of
982 Paper_score. post processing (the stage after line breaking) is now
983 truly done per-system, and we got rid of an ugly hack to get font
984 handling OK.
985
986 * Bugfix: set the group-interface of System_start_delimiter.
987
988 * Cleanups of Break_algorithm and derived classes, Move
989 broken_col_range () to Line_of_score, remove Paper_score::col_l_arr_
990
991 * Bugfix for accordion symbols.
992
993 * Various patches to prevent crashing when do_brew_molecule gets
994 called before after_line_breaking (). This was a problem in Spanner
995 classes mostly.
996
997 1.3.43
998 ======
999
1000 1.3.42.jcn3
1001 ===========
1002
1003 * Made a quick try at piano pedal performer, damper pedal only.
1004
1005 * mf/feta-accordion.mf: Fixed strange turning paths.
1006
1007 * mf/feta-beugel.mf: Fixed infinity errors.
1008
1009 * Use a more discriptive name for windows setup.zip.
1010
1011 * mf/GNUmakefile: Have logs as last target, so that normally, they're 
1012 not made twice.
1013
1014 * stepmake/stepmake/metafont-rules.make: Don't remove the .log files.
1015 The logs are a target, removing them retriggers make.
1016
1017 * stepmake/stepmake/metapost-rules.make: Remove the correct log and tfm
1018 files, ie the ones that clutter the source directory, not the target logs.
1019
1020 * Windows distribution: faked symlink for cmtfm.  Setup.zip should now be
1021 standalone; ie, no need for Cygnus' usertools anymore.
1022
1023 1.3.42.jbr1
1024 ===========
1025   
1026 * Documentation/ntweb: Updated angels.ly to match current syntax.
1027 Also updated index.texi.
1028
1029 1.3.42.uu1
1030 ==========
1031
1032 * Change all occurances of Staff_margin_engraver to
1033 Instrument_name_engraver, add a convert-mudela rule
1034
1035 * Change status == busy assert into programming error
1036
1037 1.3.42
1038 ======
1039
1040 1.3.41.jcn3
1041 ===========
1042
1043 * Lots of fixes to windows distribution scripts.
1044
1045 * Added configuration features --program-prefix, --program suffix.
1046
1047 * lily/my-lily-parser.cc (get_chord): Bugfix, don't use deleted pitch.
1048 This fixes inversions c/g and bass additions d/+c on chords.
1049
1050 1.3.41.mb1
1051 ==========
1052
1053 * Avoid that xxxXXXVerticalExtent is used for empty HaraKiriStaff
1054   lines.
1055
1056 1.3.41.hwn1
1057 ===========
1058
1059 * Debian patches (thanks Anthony!)
1060
1061 * Use symbols for prefatory matter spacing. Do not use the typename
1062 for looking up item pairs in the table, but read element property
1063 break-align-symbol
1064
1065 * Instrument_name_engraver, uses break alignment instead of
1066 side-position.
1067
1068 * System_start_delimiter_engraver, System_start_delimiter, uses a
1069 spanner for the braces/brackets at the left of the system. Remove all
1070 old Span_score_bar engravers.
1071
1072 * Removed Base_span_bar_engraver::use_prority_b_, and moved
1073 Base_span_bar_engraver into Span_bar_engraver.
1074
1075 1.3.40.jcn3
1076 ===========
1077
1078 * mutopia/Coriolan/violino-2.ly: Bugfix: wrong pitch.
1079
1080 * input/test: Removed stale AutoStaffSwitch examples.
1081
1082 * mutopia/E.Satie: Fixed gnossiene-4, doing \autochange.  Removed
1083 stale copy of gnossiene-4.
1084
1085 * buildscripts/make-cygwin-cross.sh: Made some small .zip package fixes.
1086
1087 * make/lilypond.spec.in: Made some bugfixes for _prefix, preparations
1088 for cross-building to Cygwin.
1089
1090 * buildscripts/make-cygwin-cross.sh: Now using rpm packages.
1091
1092 1.3.40.hwn2
1093 ===========
1094
1095 * added \property XXXMinimumVerticalExtent, \property XXXExtraVerticalExtent
1096
1097 * New_chord_tremolo_engraver: make tremolo beams from
1098
1099         \repeat "tremolo" NUMBER <Music-expression>
1100
1101 Removed support for "old-style" tremolos.
1102
1103 * Add a convert-mudela function for the conversion "\key A;" to "\key a; 
1104
1105 * Read \property measurePosition within the engraver code, instead of
1106 looking up the Timing_translator.
1107
1108 * star-spangled-banner.ly: add Bar_engraver to LyricsVoice 
1109
1110 * Changed all .fly and .sly files to .ly files.  Propose to dump .fly
1111 and .sly.
1112
1113 1.3.40
1114 ======
1115
1116 1.3.39.jbr1
1117 ===========
1118
1119 * buildscripts/mf-to-table.py: feta dep files are now opened with write
1120   binary option.  This avoids carriage return linefeed problems and
1121   windows while not affecting unix.
1122
1123 * Documentation/hacking.texi: Fixed a texinfo syntax error
1124
1125 * stepmake/bin/package-zip32.sh: Fixed or Removed some legacy, 1.2.x,
1126   directory paths.
1127
1128 * Documentation/ntweb/index.texi: Fixed broken links, added 1.3.39 links.
1129
1130 1.3.39.hwn1
1131 ===========
1132
1133 * Glossary updates by Christian Mondrup.
1134
1135 * Bugfix: use generic properties in lyrics too. This fixes the
1136 \property textStyle for lyrics.
1137
1138 * Score_element::preset_extent(), used by \property
1139 XXXVerticalExtent, so hard code the size of a vertical group. 
1140
1141 * Don't fix up reference points for originals of broken
1142 spanners. Fixes spurious "orphaned score-element" warnings.
1143
1144 * buildscripts/make-cygwin-cross.sh: Use rx-1.5 instead of regex (Jeffrey).
1145
1146 * scm/lily.scm: Fixed check for Windows: by default don't use scm regex.
1147
1148 * Documentation/ntweb/guile-1.3.4-gnu-windows.patch: Significantly smaller
1149 patch for guile.
1150
1151 * buildscripts/make-cygwin-cross.sh: Compile native package GNU regex,
1152 which should fix Windows problems with guile.  Also added input directory
1153 to zip file.
1154
1155 * stepmake/aclocal.m4: Added decent checking for version of guile, and 
1156 fixed warning message.
1157
1158 * lily/lexer.ll (My_lily_lexer): Bugfix: lookup chordmodifiers in the
1159 chord-modifier table (not in the pitch list).
1160
1161 1.3.39
1162 ======
1163
1164 1.3.38.hwn2
1165 ===========
1166
1167 * General cleanups of My_lily_parser. 
1168
1169 * Start of a Chord_tremolo_iterator for the `\repeat 4 "tremolo"'
1170 syntax.
1171
1172 * Moved Score_element::do_space_processing out of the dependency
1173 mechanism.
1174
1175 * Use Scheme for notename tables.  Removed uppercase letters for low
1176 octave notes. Removed Notename_table.
1177
1178 * Fixed core dump with declared "\key  ; "
1179
1180 * Extra robustness warning for Side_position_interface::aligned_on_self ()
1181
1182 * Extra robustness: make sure that first and last columns are breakable.
1183         
1184 1.3.38.jcn4
1185 ===========
1186
1187 * stepmake/aclocal.m4: Added support for cross-compiling with guile.
1188
1189 * buildscripts/make-cygwin-cross.sh: A try at dropping cygwin1.dll
1190  dependency by using mingw.  Compiling guile is too much to ask
1191  for mingw, though.  Also:
1192  - rename python scripts .py (request from Alain)
1193  - install native packages under their own, separate root. (Alain)
1194
1195 * lily.scm: Don't use regex module when running on
1196 Windows. (Shamus)
1197
1198 * lily/staff-margin-engraver.cc (acknowledge_element): If
1199 possible, hang y-axis of margin script to span-bar.  This fixes
1200 vertical placement of margin scripts attached to staff groups.
1201
1202 * help2man-rules.make: Fixes for generating manpages by copying
1203 and for building using --scrdir.
1204
1205 * stepmake/stepmake/generic-targets.make: Preserve date stamp of
1206 config.h, version.hh files file when copying.
1207
1208 * buildscripts/make-cygwin-cross.sh: made number of fixes:
1209         - add `Cygnus/' prefix to directories in .zip-file too.
1210         - package guile too.
1211         - don't link to cygwin1.dll
1212
1213 * stepmake/stepmake/install-targets.make: bugfix, don't fail if directory
1214   is not emty when uninstalling.
1215         
1216 * stepmake/stepmake/generic-targets.make: added man target.
1217
1218 * buildscripts/make-cygwin-cross.sh: new script for cross-building cygwin
1219   development tools and lilypond executable.
1220
1221 * Documentation/ntweb/lilypond-manpages.patch: provide pre-built
1222   manpages, so that make doesn't fail on help2man trying to execute
1223   a GNU/windows executable.     
1224
1225 * Documentation/ntweb/guile-1.3.4-gnu-windows.patch: new patch for
1226   guile-1.3.4.  
1227
1228 * flower/libc-extension.cc (memmem): cygwin compile fix.
1229
1230 1.3.38
1231 ======
1232
1233 1.3.37.hwn1
1234 ===========
1235
1236 * (generic-property.scm) added \property tieDash to set dashing on
1237 ties.
1238
1239 * Removed  ly_eval_str(), we should use scm_eval (Scm_object).
1240
1241 * Removed scm_to_array (), array_to_scm (), associated junk. Reverted
1242 undocumented .29 patch that made Bezier::control_ into an
1243 Array<Offset>.  Added some comments documenting the reasons for the
1244 changes.
1245
1246 * Revert generic-property.scm of .37 fix, fix the real problem in
1247 property-engraver.cc: use the right symbol to check if element
1248 property is already set.
1249
1250 1.3.37.jcn2
1251 ===========
1252
1253 * Fixed srcdir build, so that you can do:
1254
1255       tar xzf releases/lilypond-x.y.z
1256       mkdir <build>
1257       cd <build>
1258       ../lilypond-x.y.z/configure
1259       make
1260
1261   as with any other gnu package.  All build output goes to <build>/out.
1262
1263 * Changed and fixed use of different configurations, and different output
1264   directories.  Finally, you can use different configurations alongside
1265   eachother.  From make/stepmake.make:
1266
1267       # Use alternate configurations alongside eachother:
1268       #
1269       #     ./configure --enable-configsuffix=debug
1270       #     make conf=debug
1271       #
1272       # uses config-debug.make and config-debug.h; output goes to out-debug.
1273       #
1274
1275       # Use same configuration, but different output directory:
1276       #
1277       #     make out=www
1278       #
1279       # uses config.make and config.h; output goes to out-www.
1280       #
1281
1282
1283 * Fixed performance of (de)crescendi.
1284
1285 * Better documentation for arithmetic_multiplier and arithmetic_basicspace
1286   in params.ly.
1287
1288 * Added instrument-equaliser for MIDI output, see scm/midi.scm, and
1289   properties midiMinimumVolume, midiMaximumVolume, ranges [0,1].
1290
1291 * Changed absolute midi volume settings into factor of full scale.
1292
1293 * Fixed another dynamic-line-spanner bug, it gets hairy.
1294
1295 * Added warning for spanners that are not fully contained in parent spanner.
1296
1297
1298 1.3.37
1299 ======
1300 1.3.36.hwn1
1301 ===========
1302
1303 * Abstract Align_element into Align_interface. Removed
1304 Axis_align_{item,spanner}, Align_element, Super_element, all multiple
1305 inheritance in the backend.
1306
1307 * new Gade score, INSTALL.texi fixes (thanks, Mats)
1308
1309 * Removed Item::hpos_f (), Score_element::{get,set}_real ()
1310
1311 * comments detailing properties for Axis_group_interface,
1312 Side_position_interface, Score_element, Item and Spanner
1313
1314 1.3.36.jcn3
1315 ===========
1316
1317 * Fixed vertical dimensions of elements in dynamic line spanner by adding
1318   axis-group to dynamic line spanner.
1319
1320 * Bugfix: line-spanner lasts always full duration of (de)crescendi.
1321
1322 * Bugfix: broken (de)crescendi on a dynamic-line-spanner.
1323
1324 * Bugfix: compilation dynamic-engraver.
1325
1326 * Added and updated a faq about postscript and ghostscript.
1327
1328 * Fixed order of slurVerticalDirection verticalDirection in
1329   generic-property.scm.  Similar fixes for Stem, Tie, etc.
1330
1331 * Added a Text_engraver to GraceContext.  Maybe it was removed on
1332   purpose: scripts on grace notes seem broken, they appear on the
1333   main note.
1334
1335 * Bugfix: volume effect of (de)crescendi was sometimes wrong way round.
1336
1337 1.3.36
1338 ======
1339 1.3.35.hwn1
1340 ===========
1341
1342 * textEmptyDimension changed into textNonEmpty, default: off,
1343 ie. texts don't occupy space.
1344
1345 * Use STL map for Lookup::lookup_p_tab_p_
1346
1347 * Abstracted Axis_group_element into Axis_group_interface, and removed
1348 Axis_group_element. This eliminates some multiple inheritance in the
1349 backend
1350
1351 1.3.35.jcn1
1352 ===========
1353
1354 * Added minimum-space property to Side_position_interface.  Used in
1355   positioning of Volta_spanner: voltaMinimumSpace.
1356
1357 * Fixed and cleaned-up volta-spanner.
1358
1359 * Moved directional-element.cc -> directional-element-interface.cc
1360
1361 * Renamed all `process_requests' to `process_music', which fixes
1362   midi performance.
1363
1364 * Fixed dimensions (more x-y interchanges) of brace, bracket and
1365   volta-spanner.
1366
1367 * Half-assed fix to get similar vertical placement of orphaned vs.
1368   line-spanned dynamic elements.
1369
1370 * Added property bracketCollapseHeight: the minimal size of a staff bracket
1371   that will be typeset.  Smaller brackets will not be displayed.  This
1372   fixes the (in 1.3.x reintroduced) funny duck-beak-bracket-bug (sorry).
1373
1374 * Removed some dissonant chords from Coriolan
1375
1376 1.3.35
1377 ======
1378
1379 * Removed Documentation/programmer directory 
1380
1381 1.3.34.jcn3
1382 ===========
1383
1384 * Small enhancements to Staff_margin_engraver:
1385    - by default, the marginScript left aligns the text
1386    - to set the text style, use property marginScriptTextStyle
1387    - to change the alignment, use property marginScriptHorizontalAlignment
1388      (centred and right alignment require manual padding settings).
1389
1390 * Print a friendly message if the manual pages failed to build.
1391
1392 * Bugfix: dynamicDirection now overrides verticalDirection setting.
1393
1394 * Warning messages and nl.po
1395
1396 * Fixed vertical alignment for all dynamic items and (reluctantly)
1397   reinstated old directional behaviour for orphaned dynamics.
1398
1399 * Finished maximumRestCount property.
1400
1401 1.3.34
1402 ======
1403 1.3.33.hwn2
1404 ===========
1405
1406 * Print key without setting key, syntax "\key ;". General cleanups of
1407 key-item.
1408
1409 * Add paragraph tags in HTML output of mudela-book.  Music fragment
1410 don't run into the text anymore.
1411
1412 * Bugfix: don't align the first line of text. (Lookup::text ()).
1413
1414 * Abstract away data members of Axis_group_element, Align_element
1415
1416
1417 1.3.33.jcn3
1418 ===========
1419
1420 * Added helpful properties instrumentScriptPadding/instrScriptPadding for
1421   Staff_margin_engraver.
1422
1423 * Removed some empty files, substituted (c) 1999 occurrences.
1424
1425 * Added \property maximumRestCount.  It will prevent showing (or actually:
1426   moving in case of a collision) more than maximumRestCount similar rests.
1427   WIP!
1428
1429 * Rewrote Staff_margin_engraver.  Staff margin texts now hang on a new
1430   breakable item: Left_edge_item.
1431
1432 * Fixed vertical alignment for dynamic elements.  Orphaned dynamic items
1433   (not supported by a Dynamic_line_spanner) still collide with Staff,
1434   although they now have staff support, which was supposed to fix this.
1435
1436 * Fixed Staff_margin_engraver for "instrument", "instr" is still broken.
1437
1438 * Dynamic elements are only put in a Dynamic_line_spanner if there
1439   actually is more than one adjacent note-column with a dynamic.
1440   This breaks the fine looks of all dynamics, again :-)
1441
1442
1443
1444
1445 1.3.33
1446 ======
1447
1448 1.3.32.hwn3
1449 ===========
1450
1451 * Experiment: use STL map for Scheme_hash_table; Is there a speedup?
1452
1453 * Bugfix: print brace iso. bracket for Piano / GrandStaff
1454
1455 * Change naming: change do_post_processsing into after_line_breaking,
1456 do_pre_processsing into before_line_breaking and do_process_requests
1457 into do_process_music.
1458
1459 * Bugfix in hash-table.hh: do quadratic probing, and not cubic probing.
1460
1461 * Display property name for type error.
1462
1463 * Cleanups for Dynamic_engraver and Dynamic_line_spanner.
1464
1465 * Warn if last column in score is musical. Helps catch programming errors.
1466
1467 * Spanner::spanned_drul_ now is private. 
1468
1469 * Rewrote some bar code: moved molecule functions out of Lookup.
1470
1471 1.3.32.jcn3
1472 ===========
1473
1474 * Embedded newlines in text items are now allowed.  This helps avoiding
1475   TeX-hacking in some cases.  See input/test/coriolan-margin.ly
1476
1477 * Fixed stupid x-y interchange bug for staff-bracket.  This fixes
1478   placement of staff-brackets.
1479
1480 * Fixed bracket/arch-thickness interchange bug, and made bracket a bit
1481   thinner.
1482
1483 * Fixed slur/bezier-beautiful name mismatch.  This should fix the steep
1484   slurs that were apparently reintroduced in 1.3.29.
1485
1486 * Made some small fixes to Coriolan.
1487
1488 * Removed duplicate lily/output-property-engraver.hh.
1489
1490 * Removed optional use of vanilla spanner in Dynamic_engraver.
1491
1492 * Fixed (measured) tremolo for Stem and Beam. Merged declarations
1493   stem-engraver.hh and chord-tremolo-engraver.hh into their .cc
1494   implementation file.  Also fixed looks of Chord tremolo, input and
1495   implementation is still ugly.
1496
1497 * Added *.yy and *.ll to TAGS, to that tags-find-replace doesn't omit
1498   parser and lexer.
1499
1500 1.3.31.mb1
1501 =========
1502
1503 * Fixed \specialkey and \normalkey. Updated documentation.
1504
1505 1.3.32
1506 ======
1507 1.3.31.jcn5
1508 ===========
1509
1510 * Fixed and cleaned-up Dynamic_engraver.  Optionionally uses vanilla
1511   spanner instead of Dynamic_line_spanner.
1512
1513 * Made gcc-2.95 compile fix in libc-extension.
1514
1515 * Various fixes to Coriolan, score starts to look acceptable.
1516
1517 * Moved optional text of crescendo into Crescendo spanner.  Fixed horizontal
1518   and vertical alignment of dynamics.
1519
1520 * Added new text crescendo spanners to Coriolan and made some fixes.
1521   If you're using timidity, use the -EO option to prevent notes get
1522   stuck.  I'm not sure whose fault this is, Lily's MIDI output may be
1523   stretching the standard a bit.
1524
1525 * Adjacent dynamic markings are now grouped on a horizontal line, but it's
1526   not perfect yet: they're always below the staff and no horizontal spacing
1527   is done.  Also, character metrics of dynamics are still not used.
1528   See: input/test/crescendi.ly and input/test/dyn-line.ly
1529
1530 * Cleaned up Span_dynamic_performer.
1531
1532 1.3.31
1533 ======
1534 1.3.30.mb1
1535 =========
1536
1537 * Fixed the page layout, reintroducing space for the header and
1538   trying to keep piece titles on the same page as the piece.
1539   The header and footer can now contain several lines.
1540
1541 1.3.30.jcn3
1542 ===========
1543
1544 * Lily now also performs crescendi and decrescendi in MIDI output:
1545   Span_dynamic_performer in a slightly crappy way.
1546
1547 * Added preliminary support for crescendi/decrescendi other than `hairpins',
1548   eg: `cresc. poco `a poco -- -- --'
1549
1550 * Made MIDI tie performance fix.
1551
1552 1.3.30.jcn2
1553 ===========
1554
1555 * Lily now performs absolute dynamics in MIDI output.
1556
1557 * Included David's comments on opus47 in TODO.
1558
1559 1.3.30.jcn1
1560 ===========
1561
1562 * More Coriolan: flute-1,2; oboe-1,2; clarinet-1,2; 
1563   fixes and remainder french horn-1,2; trombone-1,2;
1564   fagotto-1,2; timpani; and several fixes.
1565   
1566 1.3.30.uu1
1567 ==========
1568
1569 * Remove some old doco from programmer/ and put on personal homepage.
1570
1571 * Removed union-find from flower library.
1572
1573 * Only quantise tie horizontal part inside the staff.
1574
1575 1.3.30
1576 ======
1577 1.3.29.hwn1
1578 ===========
1579
1580 * Report type errors for \property. Helps with converting 1.2 input
1581
1582 * Use Scheme for Align_element; fixed graceAlignPosition 
1583 and removed \property alignmentReference in the process.
1584
1585 * Use generic properties for lyrics too.  This fixes \property
1586 Lyrics.textStyle
1587
1588
1589 * Add relative distance for constraints between non-column items.
1590
1591 * Automatic \marks: use "\mark ; ". The mark numbers or letters are
1592 increased automatically.
1593
1594 * Translators now only change properties of their own context. This
1595 removes the 2nd argument to Translator::get_property()
1596
1597 * Bugfix for Metapost mode
1598
1599 1.3.29.uu1
1600 ==========
1601
1602 * Updates of glossary  (Christian Mondrup)
1603
1604 * Bugfix with bar number placement
1605
1606 * Moved links to bibliography/ and misc/ to main index.
1607
1608 1.3.29
1609 ======
1610
1611 * Moved Slur-specific code from Bezier_bow to Slur and Slur_bezier_bow.
1612   Slurs are now calculated just once.
1613
1614 * Bezier_bow gets constants from paper.  Still no sensible solution for
1615   magic asymmetry gradient step constants.
1616
1617 * Reinstantiated tangent-controls, more flexible than ever.  You can choose
1618   between area asymmetry and tangent-controls.  My guess is, tangent controls
1619   will be junked in 1.3.30.
1620
1621 * Slur area: only look at x-gradient.
1622
1623 * Added credits for some symbols of as5/9 fonts.
1624
1625 * Bugfix: don't make almost flat slurs, change in de-uglyfy slur.  
1626
1627 * Bugfix: midi2ly put out recent version (ugh).
1628
1629 1.3.28.hwn2
1630 ===========
1631
1632 * Bugfix: don't forget to process staffSpace and numberOfStaffLines
1633 properties.
1634
1635 * Removed Gade score. To appear (shortly?) on Mutopia. 
1636
1637 * Make Bar_script_engraver look for typeVisibilityFunction (eg
1638 property barNumberVisibilityFunction). Changed the names of the Scheme
1639 functions to be understandable. See input/test/bar-script-visibility.ly
1640
1641 * rewrite of class Molecule. It has now reached the ultimate quality
1642 plateau. All molecule data is now shared.
1643
1644 1.3.28
1645 ======
1646
1647 * Update of the glossary by Christian Mondrup 
1648
1649 * Moved horn-concerto-3 out of tarball to private website, removed
1650 W.A.Mozart subdirectory.
1651
1652 1.3.27.hwn1
1653 ===========
1654
1655 * Bugfix: don't make giant ties if the horizontal part of tie is near
1656 the center.
1657
1658 * Small optimizations to be a little more careful with mem usage. 
1659
1660 * Website change: put all examples in one directory.
1661
1662 * Removed Atom as a separate type.  Now use SCM, and since we use
1663 function composition, Atoms are immutable, so they don't have to be
1664 copied. This makes life easier, hopefully this is quicker and uses
1665 less memory.
1666
1667 1.3.27.jcn1
1668 ===========
1669
1670 * Bezier_bow: minimise_enclosed_area
1671
1672 1.3.27
1673 ======
1674
1675 1.3.26.hwn4
1676 ===========
1677
1678 * Tuplet-spanner slope calculation now looks better on tupletted rests
1679 (patch courtesy Laurent Martelli)
1680
1681 * Bugfix (Staff_performer::new_instrument_str ()) check type of
1682 \property "instrument"
1683
1684 * New mechanism for breaking lines: do not copy & prune the element
1685 property list separately, but combine these steps. Dramatically
1686 reduces memory usage for large scores.
1687
1688 1.3.27
1689 ======
1690 1.3.26.jcn2
1691 ===========
1692
1693 * Bugfix: font used in volta-spanner calculation.
1694
1695 * Added simple selection list to webpage, inspired by sawmill.
1696  
1697 * Devised kludge for ascii 5 character font pitches.
1698  
1699 * Substitutions: interline, 1997,1998, @stack.nl and small typo fixes.
1700
1701 1.3.26.hwn1
1702 ===========
1703
1704 * Plug memory leaks related to Moment:
1705   - Spacing_engraver::do_pre_move_processing ()
1706   - make_rational ()/make-rational
1707   - Paper_column::Paper_column ()
1708
1709 * Plug memory leak in Paper_outputter::output_{String,Real,int}_def()
1710
1711 * Plug memory leak in Score_engraver::set_columns ()
1712
1713 * Plug memory leak in Scheme_hash_table::set()
1714
1715 * Plug memory leak in Score_element::molecule_extent ()
1716
1717 * Bugfix: don't crash if a slur doesn't span anything.
1718
1719 * Bugfix: don't crash if doing beams without a staff symbol.
1720
1721 * Generic element property setting:
1722
1723         \outputproperty #predicate #'symbol = #value
1724
1725 Will set the element property symbol to value, for any elements that
1726 return true for PREDICATE.  This allows you to virtually tweak *ANY*
1727 property of the output. Example in input/test/generic-output-property.ly
1728
1729 1.3.26
1730 ======
1731
1732 * lilypond as as2ly: --help and --version to stdout.  Regular identify 
1733   to stderr.  This fixes help2man's manpage generation.
1734
1735 * configure: substitute full path for perl and guile in scripts.
1736
1737 * Added ascii slur and volta.  There seems to be a Lily bug in volta placement.
1738
1739 * Bugfix: default font now user settable
1740
1741 * as2text: handle plain ascii font, read from stdin, you can now do:
1742
1743   echo "\time 4/4; g''1 g2 g4. g8" | lilypond -f as -i init-as.fly - | as2text
1744
1745 1.3.25.hwn1
1746 ===========
1747
1748 * Bugfix: second half of broken ties now are displayed again.
1749
1750 * Bugfix: add clef to the support of 8 text in the G_8 clefs. Center
1751 it horizontally on the clef.
1752
1753 * Added Tie_column spanner. Ties in tied chords now get proper directionsa.
1754
1755 * Bugfix: unbroken repeat barlines now work, eg. |:
1756
1757 * Added Request_iterator to make more flexible constructions possible.
1758
1759 1.3.25
1760 ======
1761 * as2text: catch missing font/character errors, added default font, set text.
1762
1763 * New ascii fonts and glyphs: as5 as-numeral4 as-braces9
1764
1765 * Ascii output, minimal support:
1766   - AsciiScript Fonts: mf/*.af
1767   - Init files: ly/*-as.*ly 
1768   - AsciiScript translation to text: scripts/as2text.scm
1769   - input/test/as.fly input/test/as1.fly
1770   - Output support: lily/lily.scm
1771   - Try:
1772       lilypond -f as -i init-as.fly input/test/as.fly
1773       as2text as.as
1774
1775 1.3.24.hwn1
1776 ===========
1777
1778 * The horizontal part of ties will avoid collision with staff lines.
1779
1780 * Plugged memory leak: don't protect Atom function.
1781
1782 * Lookup cleanups. Made lots of functions static. Moved some code out
1783 of Lookup.
1784
1785
1786
1787 1.3.24.hwn1
1788 ===========
1789
1790 * Bugfix: ly2dvi.py exits succesfully when encountering --help and
1791 does not delete any of the file_ly*.tex.
1792
1793 * Added header and footer support in ly2dvi.py
1794
1795 1.3.24
1796 ======
1797
1798 * Added a ROADMAP file explaining the source directory layout.
1799
1800 * Minor tweak in the feta 6 and 9 numeral
1801  
1802 * Moved files from lib/ to flower/
1803
1804 * Removed Note_head_side class.
1805
1806 * Updated the webpage to be a little more chatty. 
1807
1808 * Small Local_key_engraver optimization: only lookup timing engraver once.
1809
1810 * Fixed dashed slurs
1811
1812 * Rewrite of Slur code.  Be much more picky about slur shapes. We try
1813 to offset the slur instead of bending it too much
1814
1815 * Look at stem directions for tie direction.
1816
1817 * Compound multimeasure rests. Put measures_i_ variable in an element
1818 property.  Made the symbol a lot wider.
1819
1820 * Time signature small cleanups.
1821
1822 1.3.22.hwn2
1823 ===========
1824
1825 * Symbols opposite to stem (eg marcato) now get the proper glyph in up
1826 version.
1827
1828 * Breathing marks now have a direction by default.
1829
1830 * Do set generic script properties.
1831
1832 * Also put tuplet brackets under notes.
1833
1834 * Score_element_info: only store origin of element, but not the path
1835 to parent translators. Saves a little memory, and removes some complexity.
1836
1837
1838 1.3.22.hwn1
1839 ===========
1840
1841 * Autobeaming in time sigs that don't have 1/4 beats fixed.
1842
1843 * (De)crescendi should now work. (Thanks Michael)
1844
1845 * Better error reporting for conflicting time signatures.
1846
1847 * Line_number_engraver: output locations of note head
1848 definitions. Very handy when entering complicated scores.
1849
1850 * Rewrote multi measure rest support: now they are entered as spanners
1851 (\commandspanrequest \start "rest"). RXXXX is an abbreviation for
1852
1853   { \commandspanrequest \start "rest"
1854     SXXXX
1855     \commandspanrequest \stop "rest"
1856   }
1857
1858 * Removed support of percent style repetitions. 
1859
1860 * Put texts outside the staff.
1861
1862 1.3.21.mb1
1863 ==========
1864 * Getopt bugfix: don't assert on certain errors.
1865
1866 * ly2dvi: Remove unnecessary space for the page headers.
1867
1868 * Bugfix convert-mudela
1869
1870 1.3.21.hwn1
1871 ===========
1872
1873 * Bugfix in lilypond-mode.el: eval-buffering now uses file name and
1874 not buffer name.
1875
1876 * Scrapped tupletVisibility property. Now use tupletNumberVisibility,
1877 tupletBracketVisibility, with Scheme value #t, #f or 'if-no-beam.
1878 \property tupletInvisible will stop all tuplet spanner creation.
1879
1880 * Don't go berserk if tuplet spanner is on only one column.
1881
1882 * Use SCMs & Smobs for Molecules & atoms.  This uses less
1883 scm_(un)protect_object () calls, so the output stage should be faster.
1884
1885 * Added \property tupletSpannerDuration, to make multiple tuplet signs
1886 with one \times.
1887
1888 * Some programming Errors in spacing are now caught. Lily does not
1889 hang when encountering degenerate springs.
1890
1891 * Allow beams to start and end over rests
1892
1893 1.3.19.hwn2
1894 ===========
1895 * Fix disappearing clefs when clefs are not printed with a barline.
1896
1897 1.3.20.jcn2
1898 ==========
1899
1900 * SCM properties beamHeight and beamVerticalposition now use half-spaces:
1901   input/test/beam-control.fly
1902 * Added \context Voice to .fly and .sly; the default \context Staff is almost
1903   never what you expect
1904 * Fixed decision for .sly/.fly in lilypond-mode.
1905
1906 1.3.19.hwn1
1907 ==========
1908
1909 * Clean up font-metric hierarchy, use Adobe AFM code to parse AFM files.
1910 Cleanup mf-to-table.py
1911
1912 * Fixed embarassing slur bug.
1913
1914 1.3.19.jcn1
1915 ==========
1916
1917 * lilypond-mode.el: guess init file for lily-*-region, lily-mode-map bindings
1918
1919 1.3.18.uu2
1920 ==========
1921
1922 * lilypond-mode.el for emacs supersedes mudela-mode.el 
1923
1924 * Tuplet spanners don't collide with encompassing notes. 
1925
1926 * Gobbled Adobe parseAFM* code, for future use.
1927
1928 * Big 1999 to 2000 search/replace.
1929
1930 * Big interline to staff_space search/replace for mf files.
1931
1932 * Removed Bow class, and split code into Tie and Slur
1933
1934 * Don't put scripts on grace notes.
1935
1936 * Font_metric uses SCM for name field.
1937
1938 * Various compilation fixes.
1939
1940 1.3.17.jcn2
1941 ===========
1942
1943 * Bugfix: beams with less than one (visible) stem
1944
1945 * small fixes to pa.ly
1946
1947 1.3.17.jcn1
1948 ===========
1949
1950 * Fixed bug that made multi-measure rest barnumber counts go wild.
1951 (even more scm2int/int2scm mixups!)
1952
1953 * mutopia/J.S.Bach/pa.ly: organ score (for my father)
1954
1955 * small fix to mutopia/J.S.Bach/Duette/violino-ii.ly
1956
1957 1.3.17.hwn2
1958 ===========
1959
1960 * Remove Paper_def calls in bezier-bow.cc
1961
1962 * Remove data members of Tuplet_spanner,  Volta_spanner
1963
1964 * hang_on_clef, property hangOnClef removed
1965
1966 * Bar::type_str_ mode into element property `glyph'. Use a Scheme
1967 function to determine breaking behavior.
1968
1969 * More Scheme typechecking.
1970
1971 * Be strict about the difference between strings and symbols for conversion.
1972
1973 * Fixed bug that made 1st line offset to right fixed. Bugfix courtesy
1974 Laurent Martelli.
1975
1976 * Partial French translation, courtesy Laurent Martelli.
1977
1978 * Small corrections in NL translation. 
1979
1980 1.3.17.hwn1
1981 ===========
1982
1983 * Added mensural note heads (noteHeadStyle = "mensural") Additionally,
1984 we have a longa note head.  noteHeadStyle = "harmonic" is not
1985 supported anymore. (for now, that is)  
1986
1987 * Reference manual update. Document \properties with examples
1988
1989 * fix mudela-book --help
1990
1991 * Use element properties for Text_item::text_str_, Clef_item::symbol_,
1992 Key_item::c0_position_
1993
1994 * Clef_engraver general cleanup. Use alists (\property
1995 supportedClefTypes, clefPitches) for clef types.
1996
1997 * Use progress_indication () for progress. Don't include <iostream.h> directly 
1998 Don't include <string.h>, <math.h> from headers.
1999
2000
2001 1.3.16.hwn1
2002 ===========
2003
2004 * \property stemCentered (boolean): centers stem on note head. See
2005 input/test/stem-centered.ly
2006
2007 * input/trip.ly, small test of lots of features.
2008
2009 * \property Staff.collisionMergeDotted: merge equal noteheads
2010 with different dot count. See input/test/collision-merge-dotted.fly
2011
2012 * Dotted rest bugfix 
2013
2014 * Don't crash if a slur does not span any notes.
2015
2016 * Volta repeats fixed.
2017
2018 * cleanup of Note_heads_engraver
2019
2020 * removed dots_i_ member of Dots
2021
2022 1.3.16.jcn1
2023 ===========
2024 * Fixed cross staff slurs.  It seems that cross-staff sign
2025   was swapped.
2026
2027 1.3.15.hwn1
2028 ===========
2029
2030 * Fixed bug in stem code.  Stem in chords works again.  Small
2031 stem cleanups.
2032
2033 * Use element properties for Staff_symbol.
2034
2035 * \property sparseTies (boolean).  Only make one tie in the
2036 middle for tied chords.
2037
2038 * Junked Directional_spanner, Column_info.
2039 Directional_element now is element interface `Directional_element_interface'
2040
2041 * cleanup: use to_boolean () iso. gh_boolean_p && gh_bool2scm
2042
2043 pl 15.jcn4
2044         - removed old notename2scm conversion
2045         - beam-dir-algorithm through scm
2046         - bfs paper-scm
2047 gv      - bf: knee-stemlengths
2048
2049 pl 15.jcn3
2050         - moved poor man's stem arrays to scm
2051         
2052 pl 15.jcn2
2053         - beam quanting using scm lists
2054
2055 pl 14.hwn1jcn1
2056         - chord-name uses scm members
2057         - bfs: knee with different mults, interstaff knee, auto-knee
2058
2059 **********
2060 pl 14.hwn1
2061         - specialize duration.cc for lily, move out of lib/
2062         - stem cleanup
2063         - more SCM typechecking
2064         - stafflineleading -> staff_space
2065         - bf: rod distances.
2066         - junk some unused code.
2067         
2068 pl 13.hwn2
2069         - paper/score column cleanups. Junk Score_column type
2070
2071 pl 13.hwn1
2072         - Bezier_bow/Bezier cleanups
2073         - bf: rest under beam.
2074         
2075 pl 13.jcn2
2076         - untangled Chord_name (item) and Chord (list-of-pitches)
2077         
2078 pl 13.jcn1
2079         - bezier-bow fix
2080
2081 **********
2082 pl 12.hwn1
2083         - polynomial.hh
2084         - bf: generic properties
2085         - quantise_iv () fix.
2086         - bezier cleanup
2087         - class Polynomial 
2088         - use smobs for font metric tables/hashes.
2089         - nl.po bf
2090
2091 **********
2092 pl 11.jcn3
2093         - small beam fixes (interstaff knees still broken)
2094
2095 pl 11.hwn1
2096         - bf: dots
2097         - bf: harmonic note heads
2098         - revise stem, notehead, rest
2099
2100 pl 11.jcn2
2101         - included missing scm,ly updates
2102         - bf: urg to_dir () takes scm..
2103         - bf's: if (Foo b = bar != 1)
2104         - beam cleanup
2105
2106 *********
2107 pl 10.uu1
2108         - various small bfs
2109         - bf: alignment reversed
2110         - Staff_symbol_referencer -> Staff_symbol_referencer_interface
2111         - bf: staccato pos
2112         - Knee fixes (thanks, Jan)
2113
2114 pl 10.jcn2
2115         - fixes for invisible beamed stems
2116         - removed steminfo from properties, don't cache Stem_info
2117
2118 pl 10.jcn1
2119         - steminfo to properties
2120         - dropped internote dim for stem-beams
2121
2122 *********
2123 pl 9.hwn1
2124         - abstracting Staff_symbol_referencer to an interface.
2125         - quantised_position for staccato dots.
2126         - standchen fixes
2127         - junk Score_element::do_{width,height}: set callbacks directly.
2128         - merge Score_element, Graphical_element
2129         - merge Axis_group_element, Graphical_axis_group
2130         - junk pointer fields from Score_element derived classes
2131         - junk obsolete do_substitute_dependency code.
2132
2133 **********
2134
2135 pl 8.hwn2
2136         - staff-support for Crescendi.
2137         - padding for accidentals.
2138         - cascading offset callbacks
2139
2140 pl 8.hwn1
2141         - note-head-side 
2142         - naming Staff_sidify -> Side_position_interface
2143
2144 ***********
2145
2146 pl 7.mb1
2147         - bf: timeSignatureStyle works again
2148
2149 pl 7.hwn1
2150         - Dirk Latterman key/mmrest patches
2151         - Offset callbacks in Dimension_cache
2152         - Junked Staff_side_*
2153         - Staff_sidify: interface class.
2154         - prelude-{1,2} fixes.
2155
2156 ***********
2157 pl 6.uu2
2158         - bf: PS font selecting.
2159
2160 pl 6.uu1
2161         - bf: ls-latex
2162         - mudela-book --no-pictures
2163         - bf: ly2dvi
2164         - convert-mudela: beamAuto moment syntax. 
2165
2166 pl 6.jcn3
2167         - fixed scm output
2168
2169 pl 6.jcn2
2170         - half-baken ly-gulp-file in scm
2171         - resurrected scm output through guile
2172
2173 pl 5.mb1
2174         - bf: version of init.sly, init.fly
2175         - Clarify necessary version of texinfo
2176         - bf: texi files, minor errors and syntax compatible with 
2177           older makeinfo
2178
2179 pl 6.jcn1
2180         - bf: scm output
2181
2182 *******
2183
2184 pl 5.hwn2
2185         - Bach preludes: mutopification
2186         - dots are Directional_element too; use \property dotDirection
2187         - moved some stuff out of Lookup
2188         - bf: dots
2189         - font selection mechanics changed.
2190
2191 pl 5.uu1
2192         - bf: smob allocation (thanks David!)
2193
2194 pl 5.hwn1
2195         - junked \shape. Now use #'margin-shape 
2196         - timing: one_beat -> \property beatLength
2197         - bf convert-mudela
2198
2199 ************
2200
2201 pl 4.uu1
2202         - input/test/ \property fixes.
2203         - gcc 2.95 fix
2204
2205 pl 4.hwn1
2206         - Break_align_engraver,
2207         break align order from  \property breakAlignOrder
2208         - junked Score_priority_engraver
2209         - moved Time_description into Timing_translator
2210         - use properties for timing, see input/test/timing.fly
2211         * removed \cadenza ; now use \property Score.timing
2212         * \property measurePosition
2213         * \property measureLength
2214         * \property currentBarNumber
2215         - Note_name_engraver , \context NoteNames
2216
2217
2218 pl 4.jcn1
2219         - junked some chord guessing code
2220         - bf: lookup size (-1) for chord-name accidentals
2221         - bf: ly2dvi's MFINPUTS setting
2222
2223 *************
2224 pl 2.jcn3
2225         - chords:
2226           * Chord is item
2227           * junked TeX hacking
2228           * configurable with styled strings from scm
2229           * fixes: dim, /no X, tonic != C
2230
2231 pl 2.jcn2
2232         - chords from  scm 
2233
2234
2235 pl 3.hwn2
2236         - visibility-lambdas into default elt properties SCM.
2237         - clef types in SCM
2238         - verticalDirection properties now in SCM.
2239
2240 pl 3.hwn1
2241         - move position_i_ into Staff_symbol_referencer
2242         - move dir_ into Directional_element baseclass
2243
2244 ****************
2245
2246 pl 2.hwn1
2247         - bf: dynamic style.
2248         - prepare to move dir_ into SCM. 
2249
2250 pl 2.jcn2
2251         - chord fixes: 
2252            * inversion request: no inversion guessing for chord entry
2253            * bass request: c/+b to add bass note not part of chord
2254            * -dim modifier works on all thirds
2255            * colon iso dash as tonic/modifier-additions separator
2256            * C:m5- displays as "Cdim"
2257            * C:m5-7- displays as "Co"
2258
2259 pl 2.jcn1
2260         - moved bracket vars to params
2261         - reverted broken lilypond-devel
2262
2263 *************
2264 pl 1.uu1
2265         - David's patches:
2266         * mfplain.mp detection
2267         * Graphical_element::common_refpoint() robuster.
2268         * fixes for mudela-mode.el
2269         - Dirk's patches:
2270         * key signature placement,
2271         * tied accidentals.
2272
2273 pl 1.hwn2
2274         - extra-offset elt property.
2275         - junked Chord_tremolo
2276
2277 pl 1.hwn1
2278         - changed calling convention for {get,set,remove}_elt_property()
2279         - rm'd some mutopia examples.
2280
2281 *******
2282 pl 0.hwn2,1
2283       - Generic properties and Property_engraver. Moved most of the
2284 properties.
2285
2286 0.lu1
2287         - resurrected midi2ly
2288
2289 0.jcn1
2290         - bf: lyrics lexer
2291         - reverted mup2ly revert
2292
2293 pl 3.uu1:
2294         - frontport of 1.2.17 patches.
2295
2296 **********
2297
2298 1.3.0:
2299
2300 pl 15.hwn2
2301         - loads of bfs.
2302
2303 pl x.jcn3
2304         - another workaround: reset buffer state for scm_ftell ()
2305         - workaround for broken scm_ftell ()
2306
2307 pl 15.hwn1
2308         - \properties are now SCM s, junk Scalar type
2309         - use SCM for strings in parser.
2310         - Moment derived from Rational. Moment may be smobified.
2311
2312 pl 15.jcn4
2313         - direct #... to scm parser  (Thanks to Gary Houston)
2314