]> git.donarmstrong.com Git - lilypond.git/blob - TODO
release: 1.1.20
[lilypond.git] / TODO
1 Features you cannot find in the doco as working, should be mentioned
2 here.
3
4 This is an assorted collection of stuff that will be done, might be
5 done, or is an idea that I want to think about
6
7 Most of the items are marked in the code as well, with full explanation. 
8 grep for TODO and ugh/ugr/urg
9
10         > I have changed Mark_engraver to use the G_... classes.
11         > My implementation has the following shortcomings at the
12         > moment.
13         > 
14         > - markScriptPadding is not supported, since G_staff_side_item does not
15         >   support padding.
16         > 
17         > - markBreakPriority is not supported. 
18         > 
19         > - Mostly, you want the marks aligned with the bar lines. I don't 
20         >   really understand how to implement that feature.
21         > 
22         > - You get lots of warnings about missing 'number' and 'Large'
23
24
25         *{  \voiceone <a'4.*2/3  d''4.*2/3 fis''4.*2/3>  [g''8 fis'' e''] d''4 |}
26          and=20
27          { \voicetwo  d'4 d'2.*2/3 } spacing
28
29         * tied notes for MIDI
30
31         * sharp /flat on trills (in MIDI ??)
32
33         * scm-ify \property values.
34 - The direction of textual scripts ('^' or '_') is ignored.
35         * move class Lookup {} into scm
36
37         * read tfms too.
38
39         * update mi2mu for lilypond 1.1
40
41 BUGS:
42         * collisions/voices \voiceone \voicetwo are broken; see 
43           input/praeludium-fuga-E.ly
44           mutopia/J.S.Bach/wtk1-fugue2.ly
45
46         * fix: standchen.
47
48         * fix:  cello suites
49
50         * fix extender
51
52         * fix braces
53
54         * ly2dvi barfs on linewidth = -1.
55
56         * fix midi output.
57
58         * c4 \! \> c4
59
60         * tremolo stuff
61
62         * gallina barlines.
63
64         * fix height of / collisions with lyrics (chords), 
65            see input/test/vertical-text.ly
66
67         * repeat/volta:
68           - one volta spanner per score
69           - repeat bars span staffs
70           - placement alternative number
71
72         * latex bla.tex broken (titles / \lilyfooter stuff?)
73
74         * check/set minimum slur/tie length
75
76         * msgfmt -o check?
77
78         * \breathmark TeX macro 
79
80         * catch GUILE errors?
81
82         * add new glyphs to font.ly
83
84         * formatting of input stuff. 
85
86         * \notes{ a \< b \cr } vs \notes{ a \< b \! }
87
88         * if possible, it might be nice for a warning to appear if someone does
89         \translator with no name and without assigning it to an
90         identifier.  
91
92         * space after bars?
93
94         * 'hinterfleisch' before bar (e.g. wtk1-fugue2)?
95
96         * \type Voice \times 2/3 { [c8 c16 c16 c16 c16] }
97
98         * fix singleStaffBracket
99
100         * repeat bars: need distance after ":|" and before "|:"
101
102         Summary of minor spelling irregularities:
103         -  capitalization/use of underscores in property names
104
105         * fix SkipBars  -> skipBars
106
107         * \shape 1st dim skipped? 
108
109         * fix marks/barnumbers/marginal notes
110
111         * broken scripts:
112         lbheel = \script { "bheel" 0 0 -1  0 0 }
113         rbheel = \script { "bheel" 0 0 1 0 0 }
114         lbtoe = \script { "btoe" 0 0 -1 0 0 }
115         rbtoe = \script { "btoe" 0 0 1 0 0 }
116         lfheel = \script { "fheel" 0 0 -1  0 0 }
117         rfheel = \script { "fheel" 0 0 1 0 0 }
118         lftoe = \script { "ftoe" 0 0 -1 0 0 }
119         rftoe = \script { "ftoe" 0 0 1 0 0 }
120         
121         and also
122         
123         portato= \script { "portato" 0 -1 0 1 0 }
124
125 STUFF
126         * uniformise recent feta contributions.
127
128         * check out legal/(c) matters for scores.
129
130         * check out GCC signatures?
131
132         * Align_element::padding  ?
133
134         * uniformise property names.
135
136         * ydirection <-> yDirection
137
138         * typo checks on property names?
139
140         * use streambufs and iostream
141         to provide IO handling for TeX stream, mudela stream, data-file.
142
143         * seriously buffer TeX output (do profile of writing .5 mb TeX file.)
144
145         * strip EXEs before installing
146
147         * zip target for binary windows dist (JBR)
148
149         * junking \skip req in lyrics
150
151         * Language:
152         - \type -> \context ?
153         - \translator -> ?
154         - fix \partial 
155         - \bla {} vs \bla ; 
156         - mix engraver hacking with music ?
157         - \once\property  KEY = VAL
158         - \addtranslator, \removetranslator
159         - junk ^ and _ for scripts
160         - junk _ for lyrics.
161         - abstract grammar.
162
163         * percussion note heads
164
165         * mi2mu empty staffs.
166
167         * midi_instrument -> midiInstrument
168
169         * horizontal centering of dynamics 
170
171         * \font\fontA=feta20.afm (.afm?)
172
173         * gzip RH manpage
174
175         * stable make/config stuff
176
177         * $DEPENDENCIES_OUTPUT support
178
179         * fix weird behaviour when .AFMs/.SCMs not found.
180
181         * Xdvi zooming ?! Try to understand GS garbage collection.
182                 gs: Error: /undefined in draw_beam
183                 gs: Operand stack:
184
185         * fix vertical alignment and stafflines
186
187         * GrandStaff needs more work -- I want a single word
188         `harpsichord' to the left of the grandstaff, not one on each
189         stave.  (Organ staff -- with separate pedal -- but common
190         properties may be something to think about.  Of course for
191         organ you want to be able to give stop indications on the way
192         through, so the \property Voice.Instrument would be a stop,
193         and \property GrandStaff.instrument would be PipeOrgan...)
194
195         * revise the Score_priority_align_engraver concept.  It sucks. 
196
197         * make new VoiceOne, VoiceTwo, VoiceThree contexts with
198 ydirection and hshift preset
199
200         * *.yo: fix pod manpage layout legacy
201
202         * text-items clash with stems/beams
203
204         * --include, -I option for ly2dvi (pass on to lily)
205
206         * fix placement of beam-less abbrev
207
208         * \meter 3/4;
209         <{\voiceone cis4. cis8 cis4 | cis4 cis cis | r1 }
210          {\voicetwo cis,4 r r | r2. | r1 }> |
211         }
212
213         * try to use template<Type> iso MACRO(Type)
214
215         - NEWS: ... Musical_pitch (analogous to Duration and Rhythmic_req)
216           think about, analogous to pitch: 
217            * { a4 a16 } c <-- duration of c?
218            * <a4 b8> c <-- duration of c?
219
220         * \tempo 4. = 90;
221
222         * fix audio-items (don't use (input) requests, but copy data)
223
224         * make sure all ex's have a mudela-version
225
226         * do rest-collisions for Multi_measure_rests as well.
227
228         * split error/warning in error/warning/non_fatal_error
229
230         * add a Duration_convert member to Duration_iter to set parameters.
231         Junk global duration settings. 
232  
233         * deps for ly2dvi
234
235         * minimum length second part broken tie
236  
237         * en-,discouraged linebreaking: 
238           - handle DISALLOW < penalty > FORCE
239           - discourage breaking of slurs
240
241         * multibar rest
242           - symbol(s)
243
244         * fix variable define/lookup parser global<->paper
245
246         * fix title/instrument placements; see input/test/title.ly
247
248         * <\voiceone c4. \voicetwo c4>
249
250         * add full cello suites to web site (kom op, Maarten!)
251
252         * Rethink Time_description
253           * \cadenza , \meter, \grouping should all be \properties
254
255         * rename
256           - measure -> bar
257           - abbrev -> tremolo
258           - abbreviation-beam -> (measured/unmeasured) tremolo
259           - partial -> anacrouse
260
261         * shared lib
262
263         * robustify Beam (in case of no stems, 32nd notes)
264
265         * decentralised spring factory
266
267         * move paper vars into engraver properties
268
269         * check for groff / troff/ nroff et
270
271         * more intelligent file searching
272         - make LilyPond RPM fully relocatable
273
274         * nicen examples:
275         - break-up heavily-nested score blocks
276
277         * disable spaces in TeX stuff
278         
279         * handle ^C for tmp/file creation.
280
281         
282         * dots & rest collisions.
283
284         * documentation
285         - introduction?
286         - info?
287         - LaTeX?
288         - more manpages?
289
290         * versioning for Feta
291
292         * the warning about the negative slur/tie length appears twice
293         which is irritating.
294
295         * The `3' in the meter key is a one or two pixels too thin (at 600dpi)
296         in the middle:
297
298         * the bracket is ugly (wings are too parabolic, should be more circular)
299
300         * better hshift (dots, distance, head dependent)
301
302         * clefs (AG): The "8" should appear closer to the actual clef,
303           touching it.
304
305         * put errorlevel in Input class
306
307         * junk nesting slurs
308
309         * integrate midi-elts from mi2mu and lily?
310
311         * score-bar-scripts
312         FMR: Free memory read:
313           * This is occurring while in:
314                 Bar_column::do_substitute_dependency(Score_element*,Score_element*) [bar
315         -column.cc:29]
316                 Score_element::unlink() [score-elem.cc:383]
317                 Paper_score::set_breaking(const Array<Column_x_positions>&) [p-score.cc:
318         150]
319                 Paper_score::calc_breaking() [p-score.cc:189]
320                 Paper_score::process() [p-score.cc:203]
321                 Score::run_translator(Music_output_def*) [score.cc:117]
322           * Reading 4 bytes from 0x65d3a0 in the heap.
323           * Address 0x65d3a0 is 160 bytes into a freed  block at 0x65d300 of 208 bytes.
324           * This block was allocated from:
325                 malloc         [rtlib.o]
326                 __builtin_new  [libgcc.a]
327                 Span_score_bar::clone()const [span-score-bar.hh:20]
328                 Item::copy_breakable_items() [item.cc:69]
329                 Item::do_breakable_col_processing() [item.cc:89]
330                 Score_element::calcalute_dependencies(int,int,void(Score_element::*)()*)
331          [score-elem.cc:171]
332           * There have been 22 frees since this block was freed from:
333                 free           [rtlib.o]
334                 __builtin_delete [libgcc.a]
335                 Span_score_bar::~Span_score_bar() [span-score-bar.hh:18]
336                 Paper_score::set_breaking(const Array<Column_x_positions>&) [p-score.cc:
337         156]
338                 Paper_score::calc_breaking() [p-score.cc:189]
339                 Paper_score::process() [p-score.cc:203]
340         Postprocessing elements... 
341         TeX output to score-bar-scripts.tex...
342
343
344 3RD PARTY BUGS:
345
346         * make GCC warn about ctor that leaves member vars  uninitialised.
347
348         * redhat (v?) graphical install bomb-out?
349
350         * GNU diff 2.7: diff -rN does not see a new directory with empty file
351
352         * GNU patch 2.1: <must find simple example> if patch chokes on a
353           hunk, or on allegedly unsorted hunks in a diff, it may stop 
354           without a trace of failure (create .rej file, print error or 
355           dump core) and just ignore any further diffs.
356
357         * glibc 2.0:
358
359           f = fopen ("/dev/null", "r")
360           assert (feof (f))
361
362 3RD PARTY PROJECTS:
363
364         * GNU indent: handle C++
365
366         * GNU patch 
367           - 'double-fix' mode: ignore identical fix, rather than suggest 
368             to revert patch direction when (more or less? exactly) the same 
369             thing is fixed
370
371 PROJECTS
372
373         * Scripts:
374         - fix position of bar number
375         - stack scripts in chords:
376           % fingering:        footing:
377             < a-4 c-2 g-1 >   < c-\ltoe e-\lheel >
378         - script-spacing
379         - slur parts as a script
380         - stack parameterised scripts for fingering and footing:
381
382         * convert-mudela:
383         - automatically add  a \version if not present.
384         - better parsing
385         - make smarter
386         - convert-mudela -e empty.ly
387
388         * emacs mudela-mode
389         -  should handle block comments too.
390         -  handle lexer modes (\header, \melodic, \lyric) etc.
391         -  indentation
392         -  notenames?
393         -  fontlock: \melodic \melodic
394
395         * use properties for:
396         - plet?
397         - Staff_sym size
398         - default tempo.
399         - font size
400         - bartypes (get rid of derived Span_bar_engravers)
401         - cadenza mode? 
402
403         * page handling:
404         - PS output
405         - optimal pagebreaking.
406
407         * Unicode support? -> man 7 unicode
408         - 16 bit Strings
409         - -u switch
410         - detect of 16/8 bit files
411         - examples to go with it.
412
413         * Spring_spacer:
414         - write a faster Spring_spacer (without matrices if possible)
415         - relate energybound to linelen unitspace fontsize etc.
416         - used fixed point fp?
417
418         * \header
419         - output header info to MIDI too.
420
421         * a musical dictionary. See Documentation/vocabulary-*, other
422         languages:
423         - explanations
424         - italian
425         - german
426         - dutch
427         - swedish
428          .. ?
429
430         * chords
431         - guitar chords (fret diagrams)
432         - other chord name styles (american(?) style)
433         - basso continuo
434         - MIDI output?
435
436         * Debug logs:
437         - derive lily_stream, Dstream, texstream from ostream?
438         - indentable stream as baseclass for TeX stream, lily stream, Dstream.
439         - use dstream feature in mi2mu
440         - integrate IO checking into stream class
441
442         * input converters
443         - NIFF?
444         - ABC? 
445         - SMDL?
446
447         * add to MIDI output:
448         - tempo change
449         - ornaments (and trills?)
450         - repeat/volta
451         - slurs
452         - accents
453         - dynamics
454         - account for rhythmic position in measure
455         - etc.
456
457         * grace notes
458         - make separate class for Grace_*_engravers 
459         (which is at Voice_gravs level)
460         - make encapsulated spacing problems.
461
462         * accidentals per Voice_group
463
464         * Output class, handles : (smallish)
465         - help text /(c) notice?
466         - version line
467         - warning /errors/progress
468         - abort on error/warning; exit status
469         - quiet/ignore-version options
470         - logfile output
471
472         * piano staff
473
474         * elaborate Staff_side baseclass:
475         - scripts
476         - text
477         - slur start/end
478
479         * PS 
480         - speed up PS code.
481         - PS lines to .eps files
482         - write custom prolog
483
484
485         * Output an output format independent (ofi) typeset file; and 
486           make ofi2 TeX, MusiXTex, Display PostScript, PostScript,
487           Ascii... interpreters. (difficult)
488
489         - NIFF ?
490         - Common Music Notation
491         - PostScript output (esp. Beams, Slurs, etc)
492         - Move all Score_elems, into libmutype.a
493         - SGML
494
495         * Documentation
496         - Doc (C) stuff of sheet music
497         - a better format?  SGML?  TeX?  Info?
498         - a better tutorial
499
500         * more spanners (smallish)
501         - Glissando
502         - trill
503
504         * Rewrite Stem, Beam and Rhythmic_grouping (hairy)
505         - [c8. c32 c32]
506         - doc on Rhythmic_grouping
507         - general shaving on Beam and Stem
508         - use plet grouping
509         - separate visual from rhythmic info even more
510         - beams over bars
511
512         * lines:
513         - Ledger lines, should be separate item: Ledger_lines, Ledger_lines
514         - set different line sizes / thicknesses
515         - beam stem showthrough, inter beam sizes (french vs german style)
516
517         * Collisions
518         - left/right note balls should be handled by Collision:
519         < \multi 2; { \stem 1; <b c> } { <f as b> } >
520
521         * Keys:
522         - merge key{item} & localkey{item}?
523         - spacing, national styles?
524
525         * Support for TAB
526         - redo Notehead to allow digits as heads
527         - add a \tablature {} lexer mode for easy entering
528
529         * should adjust stemlength for flag number.
530
531         * breaking:
532         - caching breakpoints
533         - saving them
534         - specify number of lines
535
536         * markers
537
538 INPUTLANGUAGE
539
540         * c4 4 4 4 for c4 c4 c4 c4?
541
542         * neatly (and readably) expressing concurrent
543         voices
544
545         * <c f a>4 ?
546
547         * Viola mode?
548
549                 @c c g e g 
550         for
551                 c g es g, 
552
553                 @A c g e g
554         for
555                 cis gis e gis
556
557         * relative mode for pitch entering
558
559         * configure pitch_byte
560
561         * rest name configurable
562
563 SMALLISH PROJECTS
564
565         * limit memory usage; the full coriolan takes up too much resources.
566
567         * fix confusing naming in Engraver vs Engraver_group_engraver (context)
568
569         * progress when creating MIDI elts.
570
571         * A range for context errors (eg. mark both { and }. )
572
573         * lyric in staff  (sharpsharp in staff, text below)
574
575         * half sharps/flats
576
577         * write Dynamic_line (to group dynamics horizontally)
578
579         * use Real for all y positions.
580         - use translate_axis( .. ,Y_AXIS)  iso separate variables.
581
582         * half-sharps, half-flats
583
584         * adaptive accidental spacing.
585
586         * handle EOF graciously in error messages.
587
588         * really centered whole rest
589
590         * centered multi-bar-rest
591
592         * declare notenametab?
593
594         * midi esp.: use I32 iso int where 32 bits are needed (or assumed...)
595
596         * stafftypes: voice names/ instrument names.
597
598         * lily \tempo
599
600         * C meter iso 4/4, idem for alla breve, etc.
601
602         * textspanner: center position
603
604         *   % toe to bheel   four to five
605             %   ^_u            4_5  
606             %     -                           
607             %  --|x--         --|x--
608             %  --|---         --|---
609             %  --|---         --|---
610           (where "to" is a tiny bow)
611
612         * auxilliary file for caching info.
613
614         * Text_crescendo
615
616         * clean solution for staffsize in items.
617
618         * revise calcideal
619
620 IDEAS
621
622         * Output data structures of Mudela in XML/SGML.
623
624         * create libmudela, or liblily_frontend
625
626         * move MIDI stuff (including Quantization) to a ANSI C libmidi library.
627
628         * use an embedded language: Python, Scheme
629         for:
630                 - Score_elems
631                 - Translators
632
633         * y -dims in internote? Staff-space? X-dimensions?
634
635         * Spacing_request for manually adjusting spacing
636
637         * caching breakpoints
638
639         * used fixedpoint arithmetic for min. energy.
640
641         * move towards incremental algorithms.
642
643         * far fetched language ideas
644         - design meta-language like TeX and Metafont
645         - programming/macros input
646
647         * versioning stuff (cvt mudela, mudela, etc.)
648
649         * Klavarskribo?
650
651         * dynamic loading of engravers? 
652
653 SMOBS:
654
655 ****************************************
656 Han-Wen Nienhuys <hanwen@cs.uu.nl> writes:
657
658 > mcmanus@IDT.NET writes:
659 > > > I want different C++ objects (with scheme embedded) to be linked by
660 > > > C++ pointers.  I want to access these other objects from the Scheme
661 > > > code, and I want access to these pointers from C++.
662 > > 
663 > > You can do this with a  combination of smob's and primitive functions,
664 > > though it may not be  be exactly what you wanted.   You would have one
665 > > smob  for each class in  your application, and then  you would write a
666 > > primitive function that would return the objects  that are linked to a
667 > > base object.
668
669 > And the smob and the C++ class are interlinked?  Like
670
671 >       class Foo_class {
672 >               Foo_smob *smob_ptr_;
673 >       }
674
675 >       struct Foo_smob {
676 >               Foo_class *class_ptr_
677 >       }
678
679 Usually you can get away without having this interlinked structure.
680 One piece of information you need when exporting objects to scheme is
681 the smob tag for your class.  You might store this value (a long) into
682 a class static variable, or a file static variable.  I'll use a class
683 static variable in this example.
684
685 I typically use code that works like this (untested code ahead):
686
687 class Foo_class {
688     static long *Foo_smob_tag;
689     SCM obj; // representation as a scheme object, description comes later
690 }
691
692 // call this once on startup
693 void init_Foo_class {
694     static scm_smobfuns type_rec;
695
696     type_rec.mark = foo_mark;
697     type_rec.free = foo_free;
698     type_rec.print = foo_display;
699     type_rec.equalp = 0;
700     Foo_class::Foo_smob_tag = new int(scm_new_smob(type_rec));
701 }
702
703 When you want to export an object to scheme, you put a pointer to the
704 object itself in the cdr of the cell, and the tag in the car of the
705 cell.  The code looks like this:
706
707 // Is this a Foo?
708 static int
709 foo_p(SCM obj)
710 {
711     return(SCM_NIMP(obj) && SCM_CAR(obj) == Foo_class::Foo_smob_tag);
712 }
713
714 // given a Scheme representation, return, a C++ representation
715 static Foo_class *
716 foo_unbox(SCM obj)
717 {
718     return((Foo_class*)SCM_CDR(obj));
719 }
720
721 // the SCM representation of the object is stored inside itself
722 // this will become useful when destructor gets called
723 static SCM
724 foo_box(Foo_class *foo)
725 {
726     SCM_DEFER_INTS;
727     SCM_NEWCELL(foo->obj);
728     SCM_SETCAR(foo->obj, Foo_class::Foo_smob_tag);
729     SCM_SETCDR(foo->obj, (SCM)foo);
730     SCM_ALLOW_INTS;
731     return foo->obj;
732 }
733
734 > C++ determines life time, so what is the strategy?
735
736 What happens now when the destructor gets called?  Lets set the cdr to
737 NULL, and then check for that in all of the primitive functions that
738 use your smob.  We'll call this notion 'live'; a scheme object is
739 'live' if the C++ representation still exists, it's dead if the C++
740 object is gone.  You can still have references to dead objects in
741 scheme code; it's just an error to use them.  This idea is stolen from
742 Emacs's handling of buffers ('buffer-live-p' and friends).
743
744 Add another function, foo_live_p:
745
746 static int
747 foo_live_p(SCM obj)
748 {
749     return(foo_p(obj) && SCM_CDR(obj) != NULL);
750 }
751
752 In you destructor, you need to do:
753
754 ~Foo_class()
755 {
756     SCM_CDR(this->obj, NULL);
757 }
758
759 When writing new primitives, now just check foo_live_p().
760
761 I hope the above helps,
762
763 -russ
764
765
766 --
767 "Even if you are on the right track, you'll get run over 
768 if you just sit there."  
769              --Will Rogers (1879-1935)
770
771 ***************************