devel: TODO/ideas for future

Below you will find key ideas for future development. For planned structure of future exercises - see TODO_exercises. Things, which are either sorted out (see kln2-devel) or are to be done soon, or are small enough are marked [[NOW!]].


################################
###   I. Music theory/instruments
################################

- accidentals (sharps, flats)				[[NOW!]]
  kind of stupid when just training notes names ("press shift when you 
  see #", sigh); but already at piano it does make much sense

- finish piano keyboard widget and finish 		[[NOW!]]
	piano-key-to-note-name exercise

- guitar fretboard
        - how to sort this out? by pitch ? by fretboard point?
        - selecting tuning and number of strings

- teach key signatures
   * order of sharps/ order of flats
        (exercise1: two lines of buttons(no staff):
                    drag letters to unscramble the order
         exercise2: sharps/flats are shown on staff on right pitch, but in
                    wrong order: sort it out
         exercise3; place N sharps/flats on staff)
   * name key signature (both Major and minor)
   * find notes between which there is one-semitone separation
   * find tonic and dominant notes for a key (and variations: this is
        tonic - find a key)

  + the same, with answering with piano/fretboard rather than names/staff  

- teach major/minor chords writing in staff and recognition
- theory help (what is the order of sharps/flats etc.)

- extra clefs: tenor and alto				[[NOW!]]
- maybe: the grand staff?

################################
###  II. KLearnNotes2 - kinds of exercises
################################

- finish implementation of Exercise class so that 	[[NOW!]]
	both direction exercises were usable;

- move the staff from Kln2 class to a separate class; 	[[NOW!]]

- the staff: enable "select-from-visible-notes" and "find-invisible-note" modes
- using this, exercise in another direction with all testnotes visible:
	user can see all testnotes;
        one button gets highlighted and she has to click on all notes with
        it's name (if OK a note gets green, if wrong a note gets red + label
        comments with no.of remaining notes of this name);
        user answers until she marks all the right notes;
 NOTE: this is probably simpler than notes' name recognition
        and might be suggested as an introductory exercise for each
        testnotes set;
        simpler, because user can click e.g. every second note (C-G-C-G)

- the staff: enable few notes displayed one-by-one and a sequence exercise
        - that is: highlight possibilities and scrolling

- custom testnotes & set of testnotes saved
  (individual testnotes selection and individually auto-design test)
   WHY? if an user makes mistakes about particular notes it may be beneficial
        if the program designs for her a special exercise to train these notes
DANGER: user may make mistakes about a note only in particular combinations
        (e.g. after a note which is far away in the staff); thus these custom
        exercises may not actually address what really is a problem here
details:
	LESSON structure save/restore/add etc. can be tested on note-to-name
        	EXERCISE in 'names of notes' SUBJECT
	therefore we need to
	* add individual testnotes selection
	* add individual auto-designed tests
	* custom-lesson add (to combo and to draws-pool) and save
        	- saving should be in plain text
	        - it should have SUBJECT and EXERCISE identifiers

- decreasing time of pauses between questions and increasing note's speed 
   in the game exercise					[[NOW!]]
   WHY? this should improve dynamics of tests and motivate user to work
        on speed/automatic answers
  WHAT? two kinds of exercises: without time decrease (introductory) and
        with one (maybe)
DANGER: don't over-do; this should not change Kln2 to a mission-impossible
        program



################################
### III. Technical improvements
################################

- finish tse3: ALSA & aRts				[[NOW!]]

- pitch input - based on console guitar tuners;		[[NOW!]]
        the best I found is gtune-0.10, but it is not GPL-ed :(
        if no other good choice - write to authors of gtune
        to ask for permission to use the code

        and add guitar tuner too

- voice recognition: enable only what's active			[[NOW!]]
- voice recognition: extra commands "note C/D.../H on/off"	[[NOW!]]
- mixer interface common to voice recognition and all midi output and 
	pitch input
	+maybe a louder/quieter buttons or volume sliders to a toolbar
  non-modal "mixer" popup dialog
        * master volume
        * midi volume
        * mic volume
        * i-gain

- zoom in/out items in MenuOptions; make sure all widgets are run-time
	scalable					[[NOW!]]

- load a sequence of notes from a midi file (tse3!)
- using this: sequence reading exercise:
        few notes visible in the staff;
        user has to click names of the notes in right order;
        correct names should be shown under the staff as she types
        (in red if you type wrong, in green if right)
- maybe: the same the other way around: 
      note's name (not randomly selected, but from a file) and a range of 
      the staff gets highlighted;
      user is to click on notes location (which would make the note appear);


################################
###  IV. Small but worth remembering of
################################

- add tooltips and whatis-es to voice recognition dialogs	[[NOW!]]
- add a choice of turning interface translations off or even a choice
        of all available translations


################################
###      Maybe, but maybe not:
################################
- move timer to canvas, change it to countdown with red background
       when negative
- use QCursor when over active areas? Eg. over a note.


################################
################################
There is an important issue. Kdelibs are a very nifty extension to qt.
But, while qt has a M$Windows version, kdelibs don't. 
If we ever port to M$Windows we could use wxWindows (which is a lot of work)
or mswindows qt (if trolltech will allow for this). To make the other option
easier, it is better not to use too much of kdelibs. :(

So for now: don't use kdelibs if you can do with qt widgets only.

Which parts of kdelibs might be useful?
* KKeyChooser/KKeyDialog
* KListViewItem-s for voice lists
* maybe use KTabCtl instead of 'KDialogBase(Tabbed' in dModelEditor?
        - this emits a signal tabSelected(int pagenumber) when the
        user selects one of the tabs!
* maybe use KWizard instead of KDialogBase in dVoiceMicroSetup?
* note: KImageEffect can create gradients, blending two images,
        fading, rotating and many other;
        there is also a KPixmapEffect
* use KStdAccel for Help/Save etc.