The KLearnNotes2 Handbook | ||
---|---|---|
<<< Previous | Next >>> |
This section describes in detail how some things work in practice. Although it is provided here for developers, it does not present any source code; rather it describes some key ideas of this program. Therefore it may be interesting for common users too.
Note: the following description comes from 1.0 version of KLearnNotes2. In 1.1 'wise random draws', 'first run' and 'forced scheduling' was extracted to a separate class 'RandomObject'. While bellow comments remain valid, keep in mind, that exactly the same procedure is to be used in future not only for notes, but also for guitar fretboard fields random draws, notes' names random draws, clef signature random draws etc.
A: The task of speed goals in KLearnNotes2 is too encourage training for speed.
There are two factors which influence speed goal:
i.e. whether you define yourself a Prentice/a Journeyman or a Wizard; by changing level you can setup higher speed goals as you advance
it is physically more difficult to find a right button with your mouse if there are many of them active; therefore for exercises with higher number of active namebuttons speed goals are lower
In each case there are speed goals for 2 and 7 active namebuttons specified. Based on these speed goals for other active namebuttons numbers are interpolated.
for a Prentice speed goals vary from 100 answ/(10 min) for 2 active namebuttons to 80 answ/(10 min) for 7 namebuttons
for a Prentice from 300 answ/(10 min) to 200 answ/(10 min)
for a Wizard from 500 answ/(10 min) to 300 answ/(10 min)
You may setup your own speed goal progress ("a custom level"). You simply select a speed goal for 2 active namebuttons and for 7 active namebuttons. These values are linearly interpolated for intermediate numbers of active namebuttons.
Your last custom speeds are remembered even if you choose one of the preset levels. You may easily come back to them by selecting "custom" again.
Final remark: it is also more difficult to answer fast if there are more notes active. E.g. Exercise 01 is more difficult then Exercise 34: in both cases there are only "C" and "G" notes, but there are much more testnotes in the latter exercise. But there is no reason to reflect this difficulty in speed goal - this is exactly what you are training for: train until you get a good notes recognition speed for big number of notes! Progression in speed goal was introduced to account for clicking difficulty, not for note-recognition difficulty!
A: In KLearnNotes2 questions are not totally random. Rather, they are chosen in such a way, that notes difficult for the student appear more frequently.
In the following description number of testnotes (notes active in a particular test) is denoted by N.
each note has a weight W assigned according to the formula:
where OK is number of right answers about this note, WR is number of wrong answers about this note, and speed is calculated according to the formula:
that is: total number of answers about this note divided by time spent on these answers.
This means, that:
each wrong answer multiply W by 5; this makes this note more probable in futures
each right answer multiply W by 0.75; this is done to promote diversity of questions (once a note is asked about and the answer is right, this note is less probable for future)
if user answers fast about a note this note gets less probable in future;
(note, that it is not very probable that in normal usage speeds may differ by a factor 5; therefore even fast wrong answers make the note MORE probable for future); (but I consider changing the formula of speed to OK/time - giving a wrong answer would additionally slow "speed" down and increase W)
if user answers slowly about a note this note gets more probable in future;
a range (0,10000) is divided into N parts of lengths proportional to the weights W of testnotes
an integer number in range (0,10000) is selected at random; new question will be about the note to which part this number belongs to.
Example: Let us assume, that there are 3 testnotes: C, D, E.
was asked about two times; the student knows it well;
she gave right answers
both times, and both times after about 0.5 second;
speed = 2/(0.5+0.5) = 2
W = (0.75)2/2 = 9/32 = 0.28
was asked about once; the student gave right answer after 1 second;
speed = 1/1 = 1
W = (0.75)1/1 = 3/4 = 0.75
was asked about once; student know it poorly; even though she spent 2 seconds
thinking about answer, she got it wrong;
speed = 1/2
W = 51/(0.5) = 10
* | (0, | 254) | the next suggested note would be C |
* | (255, | 934) | the next suggested note would be D |
* | (935, | 10 000) | the next suggested note would be E |
if last note was C, the only notes possible for next question are E and D, and E is 13 times more probable (13 = 10 : 0.75)
if last note was D, the only notes possible for next question are E and C, and E is 35 times more probable (35 = 10 : 0.28)
if last note was E, the only notes possible for next question are C and D, and D is 2.7 times more probable (2.7 = 0.75 : 0.28)
A: Each TEST starts from a series of questions about all the testnotes (in random order, but without possibility of being repeated). Example: In Exercise 01 there are four testnotes: 'C','G','C1' and 'G1'. First few questions in an Exercise 01 test could look like this:
C - C1 - G - G1 - C1 - G1 - C1 - G1 - C - G ... C1 - C - G - G1 - C - G - C1 - G1 - C1 - G ... G - C1 - G1 - C - C1 - G1 - C - G - C - G ... |
A: This program uses an array of forced-scheduled questions. It keeps references to notes which obligatorily should be asked about in future.
If you want to see how forced-schedule array looks like, uncomment (delete //) 20th line of klearnnotes.h file: #define _KLN_SHOW_SCHEDULE I will use below example output (from stderr) generated after defining this option for Exercise01.
In the beginning of each TEST, forced-schedule array is generated.
DEBUG: MAXseria=30 noOfTestnotes=4 scheduled notes: ( X, ) (G12,*) (C16, ) ( G5, ) ( C9, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) DEBUG: USING THE SCHEDULED NOTE |
Then, noOfTestnotes=4 informs you, that there are 4 testnotes, which is true for Exercise 01.
Then real force-schedule array follows. Current question is marked by a star (*).
If there was no forced-scheduled note for this question you will see ( X* ), and a comment DEBUG: USING A RANDOM NOTE below.
If there was a forced-scheduled note for this question you will see (NOTENAME,NOTENUMBER*), and a comment DEBUG: USING THE SCHEDULED NOTE below.
Note, that NOTENUMBER is calculated as a number of a note, counting ALL notes (and not testnotes only) from the TOP. Therefore (G5,) in above example is the highest note (i.e. 'G1'), then comes (C9,) (i.e. 'C1'), (G12,) (i.e. 2nd_line-G) and finally (C16,) (i.e. middle-C).
Note, that I use question number (modulo 30) as this array index. Therefore the first question is ... the second in the first row. ;)
You see above, that the first question and three next are already scheduled due to first-run forced-scheduling described above. After answering first question right ('G') we go to the second question:
scheduled notes: ( X, ) ( X, ) (C16,*) ( G5, ) ( C9, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) DEBUG: USING THE SCHEDULED NOTE |
After answering C-G-C to next questions one gets:
DEBUG: MAXseria=30 noOfTestnotes=4 scheduled notes: ( X, ) ( X, ) ( X, ) ( G5,*) ( C9, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) DEBUG: USING THE SCHEDULED NOTE DEBUG: MAXseria=30 noOfTestnotes=4 scheduled notes: ( X, ) ( X, ) ( X, ) ( X, ) ( C9,*) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) DEBUG: USING THE SCHEDULED NOTE DEBUG: MAXseria=30 noOfTestnotes=4 scheduled notes: ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X,*) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) DEBUG: USING A RANDOM NOTE |
DEBUG: MAXseria=30 noOfTestnotes=4 scheduled notes: ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X,*) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) DEBUG: USING A RANDOM NOTE |
DEBUG: DONE UPDATING SCHEDULE TABLE; it is now: DEBUG: MAXseria=30 noOfTestnotes=4 scheduled notes: ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X,*) ( X, ) (C16, ) ( X, ) ( X, ) (C16, ) ( X, ) ( X, ) (C16, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) |
DEBUG: MAXseria=30 noOfTestnotes=4 scheduled notes: ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X,*) (C16, ) ( X, ) ( X, ) (C16, ) ( X, ) ( X, ) (C16, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) DEBUG: USING A RANDOM NOTE |
DEBUG: MAXseria=30 noOfTestnotes=4 scheduled notes: ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) (C16,*) ( X, ) ( X, ) (C16, ) ( X, ) ( X, ) (C16, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) DEBUG: USING THE SCHEDULED NOTE |
Now, let's answer all questions right until the question number 21:
DEBUG: MAXseria=30 noOfTestnotes=4 scheduled notes: ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X,*) ( X, ) (C16, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) DEBUG: USING A RANDOM NOTE |
DEBUG: DONE UPDATING SCHEDULE TABLE; it is now: DEBUG: MAXseria=30 noOfTestnotes=4 scheduled notes: (G12, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X,*) ( X, ) (C16, ) (G12, ) ( X, ) ( X, ) (G12, ) ( X, ) ( X, ) |
Now, I kept giving wrong answers. At question 30 force-scheduled array looked like this
DEBUG: MAXseria=30 noOfTestnotes=4 scheduled notes: (G12,*) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) ( X, ) DEBUG: USING THE SCHEDULED NOTE |
DEBUG: MAXseria=30 noOfTestnotes=4 scheduled notes: ( X, ) ( X, ) ( X, ) (G12,*) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) DEBUG: USING THE SCHEDULED NOTE |
DEBUG: DONE UPDATING SCHEDULE TABLE; it is now: DEBUG: MAXseria=30 noOfTestnotes=4 scheduled notes: (G12, ) ( X, ) ( X, ) ( X,*) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) DEBUG: MAXseria=30 noOfTestnotes=4 scheduled notes: (G12, ) ( X, ) ( X, ) ( X, ) (C16,*) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) (G12, ) (C16, ) (C16, ) DEBUG: USING THE SCHEDULED NOTE |
<<< Previous | Home | Next >>> |
Voice input - (un?)Common problems | devel: TODO: planned future exercises |