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