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