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