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