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