

Post-0.9 task list
==================

1. Restore "fix smoothing" [DONE]

2. Fix "make viable" particularly [DONE], "de-counterpoint" also

3. instrument-id problem as below

4. step-by-step editing [half-DONE]

5. test normalizeRests with restaurant.mid etc, fix other !!! items

6. lyrics don't cope with chords [not true?]

7. lilypond i/o shouldn't be using noteIsInChord [DONE]

8. When inserting a note, use the Interpret code to calculate
    a velocity for it

9. Dragging notes &c

10. Interpret gets slurs wrong [DONE]

11. Random rests in bundle at start of staff following complex MIDI import [DONE]

12. Import MIDI file -> split segments at program change (care with bank
    select!), key change, time sig change

13. Roland Variations controllers / drum banks [DONE]

14. Karaoke file (.kar) import -- and must get around to doing that
    bouncing-ball lyric thing.

15. TimeSignature::isHidden() doesn't appear to be being used in the notation
    code... ? [no, used in hlayout]

16. Test transposition options in Key signature insert following
    Pitch/NDP change to Key::convertFrom (plus usage in AnalysisTypes?)

17. Simplistic chord-recognition code & restructure ChordLabel etc to be more use

18. True page layout in notation view (i.e. current one becomes "Continuous Page") [DONE]

19. In the middle of adding 8ve up/down clef types -- do NotePixmapFactory
    stuff etc [DONE -- could do with a bit of rearrangement in clef dialog]

20. Arpeggiated chords -- can easily identify in quantize, so decorate
    appropriately

21. Performable ornaments!

22. In the middle of doing antialiasing-by-hand for slurs, ties and
    text in note pixmap factory [DONE enough for now]

23. Ordered tip-of-the-day

24. Generic file merge -- important feature [DONE]

25. Chord computations: don't include percussion tracks [DONE]

26. Chord-name ruler, raw-note ruler, etc: cache calculations in a
    segment or something [DONE -- more general optimisation found too]

27. Notation needs a plain "collapse ties" that reverts tied notes to
    their performance durations

28. Also "remove all indications"

29. Need rapid select-all and quantize from toolbar in notation view

30. Selecting sth in notation view should make that staff current

31. Quantize dialog must remember last thing you asked it to do

32. Can't ctrl-click to place cursor anywhere beyond start in
harpsichord upper in dido.rg -- why?

33. Speed up "sync devices" by storing MappedDevice lists in shared
memory?

34. Get experimental branch working correctly again [DONE]

    Some problems with experimental branch:

    * Remaps appear to be invoked from the edit view code, which seems
      like a very odd choice.  What if things change while there are no
      edit views visible?  Or if there are several, do we get several
      remaps?

    * Segment::setTrack uses weakAdd/weakRemove, which means the
      composition's refresh status won't be updated, even though it
      should be


Priorities for 0.9
==================

1. "Set connections" & basic testing of device dialog (fix to delete
   device in AlsaDriver)

2. Problems producing new devices on file load &c

3. notation bugs as reported, + getting make viable to work &c

4. (for 0.9.5) whole instrument-id problem -- if we create instruments
   at sequencer but assign their properties at gui on file load there's
   no guarantee they're even on the same devices as we think they are:
   investigate and describe problem before thinking up solution


20030129 task list for new_notation_quantization branch
=======================================================

 1. Sort out question of how to store notation timings.
    Alternatives are:

    c. Data members in Event that are preserved in plain copy
       but lost when absolute time / duration change.

    Decided on this option, but storing the "data members" as
    properties, just providing simpler accessors for them and
    some logic to remove them when the times change.  That way
    there's little overhead for events that don't have them.
    [DONE]

    Rejected alternative:

    a. Non-persistent properties.
       i.  Option to recalculate after each edit [that didn't
           originate in notation view]
       ii. Frequent use of clone() method to preserve values
           for undo etc
    b. Persistent properties as offsets from original times.
       i.  When to get rid of them?
    d. Non-persistent properties, but modify Event so that non-
       persistent properties are only lost when absolute time /
       duration change (as the data members in c).  Bad plan,
       because many non-persistent properties need to be lost
       when e.g. copying events from one segment to another.

 2. Improve ranging split-by-pitch (when top and bottom note
    go up and down, if split pitch is between them, move split
    pitch) [DONE well enough for now]

 3. Fix normalizeRests which is currently doing some things
    wrong -- "restaurant" test file from Wily Yuen's sister.
    Needs to work bar-by-bar.

 4. Restore old note-quantizer as another quantizer type.

 5. Parameterise out notation quantizer options and settings.

 6. Add configuration page for notation quantizing: when to do
    it automatically, what to do (quantizer options, collapse
    tied notes beforehand, split into ties across barlines &c
    afterwards, de-counterpoint, re-beam).

 7. More fixes to actual quantization

 8. Merge back to HEAD

 9. When inserting a note, use the Interpret code to calculate
    a velocity for it

10. Dragging notes &c

11. Dialog to control Interpret function


20020729 task list
==================

 1. Lyrics. [DONEish]
    And a bouncing ball to track them with during playback. [STILL NOT DONE!]

 2. Better-calculated progress bars in notation view [DONEish]
    [No -- still open.  Need to manage them better across multiple
    open views of the same segment.] [DONE except for strange bug
    that leaves wait cursors active over only part of the window]

 3. User docs / help

 4. "Make Notes Viable" (inc. across bar lines) [DONE]

 5. Tempo up/down by 1bpm from-this-point keyboard accelerators?

 6. Tempo ruler usefulness: double-click to edit, click to select then
    up/down to edit?

 7. Why tempo ruler no timesigs?
 
 8. Move notes by a small distance in time in the notation view

 9. Staff connect above/below (bracketing)

10. Bar styles such as double, repeat

11. Derive velocities from dynamics

12. Make Rename Track a command

13. Text in MIDI files into document config dialog

14. Fix tuplets, plenty of bugs

15. Likewise grace notes

16. Test & debug paste types

17. NormalizeRestsCommand extents?  (See item 14 in following list)

18. Harmonizer

19. Note styles: numeric note heads, fingerings as marks, etc

20. GUI for note styles

21. Really well-organised menus

22. Some notation view menu actions into editing toolbars

23. Show/hide annotations [DONE, but need some way of indicating that
    there may be hidden annotations]

24. See http://sourceforge.net/mailarchive/message.php?msg_id=1824903

25. Tie in Paste type in notation view with the Preferences pane [DONE]

26. If you move the cursor by a whole bar (if the window is not very
    wide) or to the start or end of the segment (regardless of window
    width) the canvas doesn't always scroll to the new cursor position,
    perhaps because it decides it's too far away for a short page-scroll.
    Fix.

27. Need to make all menus with notes on them use the new NotePixmapFactory
    makeNoteMenuPixmap and makeNoteMenuLabel API, for easier pixmap creation
    and support for the preferences selection of i18n vs US note names [DONE]

28. Problem with moving cursor up/down on staff -- ctrl-click does it but
    no visible feedback? or what?

29. Make status bar show chord/tuplet mode status [DONE]

30. Finish up De-Counterpoint in notation view, fix crash in Collapse
    Equal-Pitch Notes [DONE -- test De-Counterpoint more please]

31. Merge Segments in main view [DONE] (and how should we arrange Auto-Split
    stuff on menus etc?)

32. "Delete Tracks" and "Rename Tracks" on menu in main view (latter
    kind of a dup with "make it a command"

33. We _really_ need Un-Tuplet, you can't actually carry out the operation
    at all without it. [DONEish]

34. Thoroughly scan all following task lists to find more stuff to do...


Post-0.1.5-and-a-bit task list
==============================

 1. Support for displaying and editing lyrics

 2. Ensure that text is read from MIDI files even when no notes on same track

 3. Ponder help

 4. Try actually editing some notation!  Devise a basic set of transforms
    (split/join notes etc)

    a. Tie Equal-Pitch Notes [DONE]
       Untie [DONE]
    b. Make Notes Viable

 5. Mess around with tuplets, locate and fix the many bugs there

 5a. Decide how we want to manage quantization of segments containing
     tuplets, and quantization to tuplet units

 5b. Find some way to identify tuplets in MIDI import

 6. See why accidentals appear to be wrong when not in treble clef (see paper)
    [DONE by Hans, test before closing SF bug]

 7. Things like Split Segment and Resize Segment won't work correctly
    until the Segment's moveable start/end markers are implemented.  Look
    into this. [DONE]

    TO FIX:

    -- Undo doesn't work for Split Segment [DONE?]

 7a. Make notation view support end markers [DONE with bugs]
 7b. Make matrix view support end markers [DONE with bugs]
 7c. Make file I/O support end markers [DONE]

 8. Add origin to start of hlayout, so that first bar is indented on both
    ruler and staff (preceded by staff name perhaps) [DONE]

 9. Extend Chord (in notationsets) so as to handle case where some notes
    at a given time have stem up and some have stem down (explicitly set
    by user) -- make two chords instead of one.  NotationElementList is
    now sorted by pitch, which should make this easier.  Can we assign
    stem directions sensibly for chords that begin during other chords? 
    [DONE, possibly -- fairly complicated rework of Chord/Group in progress]

10. Test and debug the Paste types from Paste... dialog

10a. Also implement Cut-&-Close [DONE]

11. Ties don't always appear (e.g. load davy.mid with viability switched
    on in MidiFile.cpp) [DONE]

12. Deal with this strstream/stringstream thing -- fix on one or the
    other, and make sure the memory management is correct

13. Make save & reload preserve unquantized values -- see code comments

14. The NormalizeRestsCommand in notationcommands.cpp has the wrong
    undo/redo extents, because the normalization function may modify
    rests before the nominal given starting time.  Deal with this.
    Also a theoretical problem when (e.g.) inserting notes at the
    start of a bar.  Potential (nasty) solution might involve
    BasicCommand being a SegmentObserver

15. Do something cool with Randall's harmonizer (or even something
    not especially cool -- say, just generate a new segment with
    a guess at the harmony in it)

15a. Need to fix up so it has a key to work from, instead of always
    using default key!  argh!  [DONE]

15b. Finish Segments | Harmonize on main view

16. Rationalise segment editor tools into "simple" and "extended"
    as per discussion on mailing list:
    http://www.geocrawler.com/mail/thread.php3?subject=a+question%2C+was+Re%3A+%5BRosegarden-devel%5D+0.2+roadmap+-+some+thoughts&list=16004
    We now have a multifunction Select tool, meaning probably all
    the rest can become "extended"

17. Fix bugs in tempo ruler (why do timesigs often not appear?),
    make it useful, work out a good way to take out common code
    between it and ChordNameRuler, and make it able to display notes
    as well as text (e.g. <crotchet> = 120) so it can convert qpms
    to bpms in non-4/4 timesigs

17a. Add tempo ruler to main view -- should be easy, but a pain in
    the arse to follow through all the widget/signal crap [DONE]

18. Move some of the esoteric vaguely notation-related methods from
    Segment to SegmentNotationHelper [DONE]

19. Fix bug in chord-name ruler on startup of notation view -- texts
    all munged up together [DONE pretty much]

20. Find a neato way of getting an eggtimer cursor after a command has
    taken a certain amount of time to run (e.g. notationview et al
    add a timer callback in addCommandToHistory) [DONE by RWB]

21. Implement view-local properties in NotationElement [DONE but see 23]

22. Event dialog really needs to be scrollable or something [DONE by G]

23. View-local event properties:

    a. Add view-local prefix generation to EditView [DONE]

    b. Make NotationProperties a class stored in NotationView rather
       than a namespace [DONE]

    c. Update references to now-view-local properties in gui/ [DONE]

    d. Put a LegatoQuantizer in NotationView and pass it around instead
       of getting it from the Composition (so as to make it use
       view-local property prefixes) [DONE]

    e. Remove SegmentNotationHelper::quantize, move functionality
       to NotationHLayout using view-local properties [DONE]

    f. Modify SegmentNotationHelper so as not to use its own legato
       quantizer:
       i. Most of the uses should really be using the segment's quantizer
       ii. Other uses could... I dunno... have a quantizer passed in?
           (check where they're called from)
       [DONE -- examined all uses and persuaded myself that it's okay
       to use the default legato quantizer from the composition for them]

    g. Remove NOTE_TYPE/DOTS & TUPLET_NOMINAL_DURATION from BaseProperties
       [DONE -- removed NOTE_TYPE/DOTS, realised TUPLET_NOMINAL_DURATION
       should be in BaseProperties after all and not view-local]

    h. Make currently-static properties in NotationProperties also
       be view-local, and update culprits (mostly NotationSets) to
       use the view-local versions [NOT GOING TO DO]

24. Oops.. since I "fixed" the ChordNameRuler so it's not all squashed
    up, I've lost the other rulers in the notation view completely.
    Revert and fix correctly. [DONE]

25. Work out why inter1.mid renders incorrectly in notation [DONE -- rests
    too short to display but still allocated space in the layout pass]

26. Tempo dialog:

    a. Flatten out so as not to use QButtonGroup (need to change usage
       of selected()) but put buttons directly in parent QGroupBox with
       the labels [DONE]

    b. Add explanatory "There are no {previous,other} tempo changes"
       label, and make unavailable options disabled rather than hidden
       [DONE]

    c. Add "Change tempo from start of this bar" option [DONE]

    d. Rework texts [DONE]

27. Event quantize command needs to be able to be constructed with
    an EventSelection argument, and to operate by quantizing in
    turn each of the contiguous sequences of events in that selection
    [DONE]

28. "Add Time Signature" should be on Edit menu of main screen; adding
    a timesig from the transport or undoing a time sig change doesn't
    update notation windows [DONE]

29. Add "Lengthen notes" and "shorten notes" transforms to notation view.
    No!  Make note tools _change the length of a note_ if clicked directly
    onto it.  What excitement. [DONE]

30. More code documentation, including documenting the iterator-
    invalidation semantics of Segment and SegmentNotationHelper methods

31. Finish Note Styles:

    a. Remove "built-in" styles, remove the "Custom" from "CustomNoteStyle";
       indeed, ideally switch from "NoteStyle and derived CustomNS" to
       "NoteStyle and external XML parsing class". [DONE]

    b. Add capability to specify the charname for a note head directly
       (using the Unicode-or-other name, not the pixmap file name) [DONE]

    c. Look up Unicode names for any other chars we have in the "standard"
       shape list, see if they're in feta

    d. Add capability to specify that the note head is rendered from text
       found in a string or integer property; add "fingering" (or "fret"?)
       notehead that gets its value from a specific hardcoded property;
       add a menu option to set that property [better done through some
       staff-related means rather than styles?]

    e. Also add an option to show fingerings as marks instead of heads
       [??]

    f. Make other bits of notation code use styles as well, for things
       like number of beams/flags and whether to draw the stem.  P'raps
       remove those methods from Note and see what breaks.  We could
       have a method in NoteStyleFactory or somewhere that returns the
       correct style for a given event (looking up the style property)
       [DONE]

    g. GUI for all this...

32. Add Slashes to notes menu -- 1, 2, 3, 4, or none.  Worry about
    playback aspect later [DONE]

33. Consider YA menu reorganisation: stuff now in Groups to spread out
    across Notes instead?  Or go for Groups and Notes instead of G, N
    and Transforms?

34. Add toolbars with note/transformation buttons duplicating stuff
    on some of the above menus

35. Add "rescale" to main view: stretch or squash a segment by a
    given ratio of note lengths [DONE]

35a. Also add something like "Auto Split" that splits segments on
     empty bars, clef changes or time sig changes [DONE]

35a.i. And have a dialog with options: split after (n) bars of
    silence? after time sig change? after clef change? after key
    change?

35b. And perhaps a "collapse" option

36. Add configuration parameters for notation:

    a. Default font [DONE, needs tidying]

    b. Default size [DONE, needs tidying]

    c. Default smoothing [DONE]

    d. Default stretch [DONE]

    e. Follow playback (perhaps this should be on a playback page
       along with similar options for other views)

    f. Insert notes notation-style (with ties) or matrix-style? [DONE]

    g. Auto-beam on insert [DONE]

    h. Collapse rests after erase [DONE]
    
    i. Default style [DONE except for wiring the damn thing up in insert code]

37. Add Show/Hide Annotations; make it easier to edit an annotation,
    and possible to move and resize them

38. Show notes whose exact time/duration don't match the quantized
    time duration (i.e. notes on which the quantizer has actually
    done something) in green [DONE]

39. Grace note strategy.  We aim to place all grace notes at the same
    time (and the same time as their main note), using some other
    property to order them.  I think perhaps we should store their
    durations in a property other than the event's basic duration, too.
    -- update: not sure this will work, modifying an event's absolute
    time at performance time seems like a bad idea; perhaps better go
    for other approach (storing performance time/duration) [DONE kinda]


Post-0.1.4 task list
====================

 1. Support for displaying lyrics and random text from MIDI files

 2. Ponder help

 3. Implement "Collapse Notes" and inverse (see notes on paper)

 4. Tuplet GUI -- but how? [basics DONE, still many issues remaining]

 4a. Decide how we want to manage quantization of segments containing
     tuplets, and quantization to tuplet units

 4b. Find some way to identify tuplets in MIDI import

 5. See why accidentals appear to be wrong when not in treble clef (see paper)

 6. Things like Split Segment and Resize Segment won't work correctly
    until the Segment's moveable start/end markers are implemented.  Look
    into this.

 7. Add origin to start of hlayout, so that first bar is indented on both
    ruler and staff (preceded by staff name perhaps)

 8. Extend Chord (in notationsets) so as to handle case where some notes
    at a given time have stem up and some have stem down (explicitly set
    by user) -- make two chords instead of one.  NotationElementList is
    now sorted by pitch, which should make this easier.  Can we assign
    stem directions sensibly for chords that begin during other chords? 

 9. As well as existing Paste menu function, add "Paste..." that gives
    options for pasting in a gap (as currently), opening a new gap to
    paste into, and overlaying (possibly even overlaying with ties
    versus overlaying raw), and allows you to choose one of these as
    the default paste function.  [DONEish, needs some work]  Also
    implement Cut-&-Close, Paste as New Segment [DONE through segment
    canvas], etc.

10. Create clef dialog with transposition options (maintain pitches,
    transpose entirely, transpose octaves only) [DONE]

11. Ties don't always appear (e.g. load davy.mid with viability switched
    on in MidiFile.cpp)

12. Deal with this strstream/stringstream thing -- fix on one or the
    other, and make sure the memory management is correct

13. Quantizer: deal with these dynamically-generated PropertyNames;
    they really slow things down [DONE] -- also make save & reload
    preserve unquantized values (and now new requirement for beamed
    group id/type)

14. Investigate fucked-up rests after MIDI import (e.g. davy.mid).
    Call getDurationListForInterval for an interval of 160 starting
    at 1280 after a 4/4 time sig, and it returns 1,7,7,7,7,7,7,7,7,
    7,7,7,7,15,60.  Why?  We need to make it avoid returning values
    less than 60 (shortest note) where at all possible.  See test.C.
    [DONE kinda]

15. Work out why clicking on a segment with the SegmentSelector or
    SegmentMover without moving it still causes a move command to
    happen, and stop it [DONE]

16. The NormalizeRestsCommand in notationcommands.cpp has the wrong
    undo/redo extents, because the normalization function may modify
    rests before the nominal given starting time.  Deal with this.
    Also a theoretical problem when (e.g.) inserting notes at the
    start of a bar.  Potential (nasty) solution might involve
    BasicCommand being a SegmentObserver

17. Give timesigs more room before the following note [DONE]

18. We have this "Auto-Beam after Insert" option now, but actually
    what we want is not just on/off but on/off/sometimes.  The
    sometimes case, which should be the default, would be to auto-
    beam if we're inserting into a bar that has no beamed groups 
    following the insertion point and that has no tuplet groups at
    all. [DONE except that we've now lost the "on" case]

19. Do something cool with Randall's harmonizer (or even something
    not especially cool -- say, just generate a new segment with
    a guess at the harmony in it)

20. Take some of the add-time-sig stuff in NotationView out into
    the command object so we can use the same command object and
    dialog when editing the transport's time sig [DONE]

20a. Why is the notation view's time sig dialog now getting the
     wrong default time sig? (i.e. it's always 4/4) [DONE]

21. Load test_tuplets, open score editor, then on segment editor
    extend the first segment to the same length as the second -- blam!
    [DONE I think]

22. Rationalise segment editor tools into "simple" and "extended"
    as per discussion on mailing list:
    http://www.geocrawler.com/mail/thread.php3?subject=a+question%2C+was+Re%3A+%5BRosegarden-devel%5D+0.2+roadmap+-+some+thoughts&list=16004

23. Final bar in a notation staff doesn't seem to resize correctly
    when things are inserted into it [DONE I think]

24. Make tempo/timesig ruler a la text ruler, add it to segment view

25. Sometimes timesigs (in notation) appear before the start of
    the staff.  Find a reliable test case and thrash it (I think it
    happens when the timesig is in the middle of another event)

26. Look at davy.mid -- notes beyond the ends of the staffs because (?)
    they aren't a full bar long [DONE]

27. Click 'n drag notes to make sounds [DONE]

28. Why aren't breve & semibreve appearing on notationview toolbar? [DONE]

29. Why doesn't Select All Segments work? [DONE]

30. Move some of the esoteric vaguely notation-related methods from
    Segment to SegmentNotationHelper


20020301 task list (based on outstanding items from post-0.1.3 list below)
==================

 1. Support for displaying lyrics and random text from MIDI files

 2. Ponder help

 3. Implement "Collapse Notes" and inverse (see notes on paper)

 4. Tuplet GUI -- but how?

 5. See why accidentals appear to be wrong when not in treble clef (see paper)

 6. Speed up NotationHLayout::scanStaff (delay is possibly in
    the NotePixmapFactory::getXXXWidth methods) [DONE via Randall's
    patch, item 13]

 7. Compound commands such as move-many-segments, insert-key-everywhere
    [basic compound commands DONE, insert-key-everywhere DONE, need to
    deal with signal flow from segmentcanvas to trackeditor for
    move-many-segments; refresh is likely to be dreadfully slow for now]
 
 7a. Refresh for segment commands in edit views [DONEish]

 7b. Things like Split Segment and Resize Segment won't work correctly
    until the Segment's moveable start/end markers are implemented.  Look
    into this.

 7c. Refinements needed for Paste in notationcommands: we need to work
    out extent affected by removeRests so as to work out the end of the
    section to save; we also need to provide a way for the notation view
    to discover whether a paste did (or will) succeed [DONE]

 8. Add origin to start of hlayout, so that first bar is indented on both
    ruler and staff (preceded by staff name perhaps)

 9. Extend Chord (in notationsets) so as to handle case where some notes
    at a given time have stem up and some have stem down (explicitly set
    by user) -- make two chords instead of one.  NotationElementList is
    now sorted by pitch, which should make this easier.  Can we assign
    stem directions sensibly for chords that begin during other chords? 

10. As well as existing Paste menu function, add "Paste..." that gives
    options for pasting in a gap (as currently), opening a new gap to
    paste into, and overlaying (possibly even overlaying with ties
    versus overlaying raw), and allows you to choose one of these as
    the default paste function.  [DONEish, needs some work]  Also
    implement Cut-&-Close.

11. Add choice of start-from-here or start-from-start-of-bar to time
    signature dialog. [DONE]

12. Create clef dialog with transposition options (maintain pitches,
    transpose entirely, transpose octaves only)

13. Merge Randall's optimisations to layout [DONE except for LinedStaff
    changes.  Might rework the API a bit, as it's still a bit rough
    because of the change to not using -1 as a special timeT value]

14. Why no rest-inserter menu? [DONE]

15. Ties don't always appear (e.g. load davy.mid with viability switched
    on in MidiFile.cpp)

16. Parameterise property names for quantizer [DONE]

17. Deal with this strstream/stringstream thing -- fix on one or the
    other, and make sure the memory management is correct

18. Run the test program -- wrong performance duration for first of
    group of four "tied" notes right at the end of the test program [DONE]

19. Quantizer: deal with these dynamically-generated PropertyNames;
    they really slow things down [DONE] -- also make save & reload
    preserve unquantized values (and now new requirement for beamed
    group id/type)

20. Investigate fucked-up rests after MIDI import (e.g. davy.mid)

21. Work out why clicking on a segment with the SegmentSelector or
    SegmentMover without moving it still causes a move command to
    happen, and stop it

22. The NormalizeRestsCommand in notationcommands.cpp has the wrong
    undo/redo extents, because the normalization function may modify
    rests before the nominal given starting time.  Deal with this.


Post-0.1.3 task list (superseding older ones)
====================

 1. Text, lyrics etc -- something like LoopRuler that places lyrics
    on a toggleable non-vertical-scrolling area at the top or
    bottom?  Place chord names on the same kind of area?  [DONE for chordnames]

 1a. Support for lyrics and random text from MIDI files

 2. Ponder help

 3. Implement "Collapse Notes" and inverse (see notes on paper)

 4. Tuplet GUI -- but how?

 5. See why accidentals appear to be wrong when not in treble clef (see paper)

 6. Speed up NotationHLayout::scanStaff (delay is possibly in
    the NotePixmapFactory::getXXXWidth methods)

 7. Work on signals/refresh for modifications other than BasicCommand ones
    [DONE]

 7a. Compound commands such as move-many-segments, insert-key-everywhere
 
 7b. Refresh for segment commands in edit views

 7c. Things like Split Segment and Resize Segment won't work correctly
    until the Segment's moveable start/end markers are implemented.  Look
    into this.

 8. Bring LoopRuler into NotationView [DONE apart from some work from G]

8a. Rework SegmentItem so as to make its bar units align with LoopRuler [DONE]

8b. Make signals work from LoopRuler in NotationView [DONE]

8c. Ditch StaffRuler [DONE]

8d. Add origin to start of hlayout, so that first bar is indented on both
    ruler and staff (preceded by staff name perhaps)

 9. Extend Chord (in notationsets) so as to handle case where some notes
    at a given time have stem up and some have stem down (explicitly set
    by user) -- make two chords instead of one.  NotationElementList is
    now sorted by pitch, which should make this easier.  Can we assign
    stem directions sensibly for chords that begin during other chords? 

10. Key signature GUI [DONE]

10a. Implement Transpose Rest of Staff and Insert Into All Tracks options
     on key signature GUI  [DONE]

10b. Look at refresh in NotationView: create a 2-bar-or-more empty segment,
    put some notes in 2nd bar, add a keysig to start of 1st bar.  The notes
    are changed according to keysig settings but aren't refreshed in this
    view.  Works for clefs though.  [DONE]

10c. Look at transpose in key/notation types?  Big negative pitch values?
    [DONE]

11. Rework Composition's bar methods so that truncate argument is no
    longer requested, assuming truncate = false always.
    Rename getBarRange(timeT) to getBarRangeForTime or something.
    We should then be able to substantially simplify getBarRange so as
    never to need to refer to the barSegment at all, only to time sigs.
    Ultimately we may find the barSegment isn't needed in any method,
    but this could take some testing. [DONE]

12. Potential bit of rejigging: make NotationRulerScale into a
    LayoutRulerScale that likes any sort of HorizontalLayoutEngine,
    and move it into rulerscale.h and then move that into base/.
    If we also make the HorizontalLayoutEngine use composition-wide
    bar numbers (with getFirstVisibleBar() and getLastVisibleBar())
    then we may be able to simplify things significantly in the end. [DONE]

13. Deal with potential infinite loop in notationstaff.cpp:303 and on [DONE]

14. Deal with potential infinite (or just very very slow) loop in
    SegmentNotationHelper::autoBeam when importing schumann.mid [DONE]

15. As well as existing Paste menu function, add "Paste..." that gives
    options for pasting in a gap (as currently), opening a new gap to
    paste into, and overlaying (possibly even overlaying with ties
    versus overlaying raw), and allows you to choose one of these as
    the default paste function.  Also implement Cut-&-Close.

Post-0.1.1 task list
====================

 !! Sometimes when you load glazunov.rose, the quantizer appears to be
 misbehaving -- it looks like it has maxDots equal to zero, and the
 legato slider is set to somewhere in the middle.  Why?

 !! Load glazunov.mid and open the first staff: it crashes with an
 attempt to get the LegatoDuration property on an event that doesn't
 have it.  Why?  [DONE -- but what on earth is that hemidemi rest
 doing in the middle of the staff?]

 !! Segment should barf meaningfully if getComposition without composition
 [No, it shouldn't]

 1. Sort out true legato quantization [DONE]

 2. Display real bar numbers and proportional bar durations on track
 canvas [DONE]

 3. Tuplets [DONE, apart from GUI to create them...]

 4. Text, lyrics etc -- need to talk about this, there are various
 possible ways to do it

 5. Slurs [DONE]

 6. Add time sig support to RG2.1 import [DONE]

 7. Ponder undo [DONE -- needs constant updating though]

 8. Ponder help

 9. Speed up MIDI import, particularly for files with lots of short rests
    [DONE]

10. Finish notationcanvasview stuff -- leger line position marker,
    setting up the correct dimensions for the markers from the staff
    [DONE]

11. Complete the plugging-in and testing of the notationview
    position-pointer stuff [DONE]

12. Investigate why making a beamed group doesn't always work (not all
    notes end up beamed)

13. Restore correct note stem lengths to beamed groups (following
    change to which note in a chord is primary) [DONE]

14. Why does it crash when I try to delete a slur?  Sure, deleting
    slurs probably isn't implemented yet, but that doesn't excuse
    crashing. [DONE, I think]

15. Various optimisations to render and relayout -- for example, the
    positionChord thing in notationhlayout will probably help somewhat,
    and we can do things like only repositioning on staffs other than
    the one on which a change happened from the start of the same bar
    as the one the change happened in, and ceasing repositioning
    afterwards if a position hasn't changed [DONE]

15a. Optimise NotationStaff::setLines and do "the
     positionChord thing in notationhlayout" [DONE]

16. Fix staff ruler so it's owned by the staff (and works in page mode);
    fix bar-at-end-of-row in page mode; switch to doubles instead of
    ints in notationhlayout x-coord calculations [DONE]

17. Fix storage for bars, time sigs, tempo events in Composition
    (new Segment-a-like as per email) [DONE]

18. Real-time timestamps only in mapped classes [moved to rwb]

19. XML files to use absoluteTime attribute instead of resync element;
    add an offset attribute giving time between end of last event and
    start of this one; make XML output actually use them [DONE, I think]

20. Fix ties, which are currently not appearing every time they should [DONE]

21. Do start index thing in Segment:

    "- we add a setSegmentStartIndex method in Composition
     - we move Segment::setStartIndex() to protected" [DONE]



Task list from 18/19th August meetings
======================================

Aim: "to make it apparent that the notation editor has the potential
to be nicer than those in most of the other applications out there".

References in round brackets are to 0.1_planned_features.txt.

 1. Merge rests on insertion [DONE]

 2. General split-on-insert [DONE, cleanup and some fixes needed]

 3. Auto-beaming on input [DONE]

 4. More than one track per editing window (for 0.1, I think it only
 has to be possible to display these tracks, we don't necessarily have
 to make editing work for any beyond the first).  Issue: particularly
 for layering work, things will be very difficult if the tracks have
 bar lines that are not at the same absolute time. (B8)

    4a. Basic data-structure stuff for NotationView to have multiple
    staffs, one track per staff [DONE]

    4b. Fix up Composition's cunning code for keeping time signatures
    in check between different Tracks by taking into account the
    starting time of the Track (or is absolute time now counted from
    the start of the whole piece? [YES, so DONE])

    4c. Modify NotationHLayout so layout() can work on multiple staffs
    at once -- needs sync track? coping with partial bars at start and
    end?  Need to think about this. [DONE]

    4d. Finish NotationView by making it possible to receive and
    locate mouse events across all staffs [DONEish]

 4.5. Handling events read from MIDI that don't quantize viably --
 using multiple tied notes (makeNoteViable).  Also handling tied
 events on conversion to MIDI [DONEish]

 5. Making key, clef and time signature appear in correct order [DONE]

 6. Beaming selected area (dependent on Guillaume's doing selection)
 [Selection has been POSTPONED]

 7. Various subtle improvements to notation layout, for example moving
 long notes to the right to be more central in their space (A9) [mostly DONE]

 8. Improvements to insert/split code in TrackNotationHelper --
 avoiding splitting rests when they're inserted over shorter notes,
 improving duration-list code to place the rests it suggests in a
 better order (e.g. after a quaver note, use quaver + crotchet rather
 than crotchet + quaver) [DONE in general], avoid using dotted rests
 in most cases [DONE avoiding double-dots anyway]

 9. Work out why clefs, keys and timesigs are all squashed up some of
 the time [DONE]

 10. Work out why clef isn't being properly taken into account on
 insertion

 11. Work out why RG2.1 import is getting the wrong pitches [DONE]

 12. Investigate curious case of the missing notes in playback [blamed
 on aRts for now]

 13. Work out why note stems sometimes don't reach their beams
 
 Throughout: Code documentation


Older task list
===============

D * Take a careful look at the situations in which accidentals
    do and don't appear, and make sure they're correct.

D * Handle the principle of hiding an accidental if it's already
    appeared once within the same bar.

gl * Make it possible to insert dotted notes and notes with
    accidentals. (May need help from Guillaume on the Qt side.)

D? * Tidy up the way notes and chords are drawn -- for example,
    notes with accidentals currently "eat" some of the space
    before them; chords with second intervals should have one
    notehead shifted (RG2.1 does this imperfectly but well
    enough for our purposes); chords usually have too long
    stems (a note on its own should have a stem longer than
    the length a chord stem extends from the notehead nearest
    its tail).

D * Add basic support for beamed groups
 
D * Make beam code cope properly with partial beams

D * Make sure clef/key/time-signature combinations appear
    in the correct order (this will probably be a real hack,
    just as it is in RG2.1, because it's very difficult to
    enforce an order in storage and much simpler to choose
    the order when assigning x-coordinates).

D * Sort out XML format so as to make bools unambiguous: the
    winning representation appears to be

      <event type="note" duration="minim">
      <property name="pitch" int="50"/>
      <property name="NoteStalkUp" bool="false"/>
      </event>

