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