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