Chapter 3. Creating new Minuet's exercises

Minuet's exercises are defined in exercise specification files, written in JSON format:

{
  "exercises": [
    {
      "name": "Intervals",
      "root": "21..104",
      "playMode": "scale",
      "children": [
        {
          "name": "Ascending Melodic Intervals",
          "children": [
            {
              "name": "Seconds",
              "options": [
                {
                  "name": "Minor Second",
                  "sequenceFromRoot": "1"
                },
                {
                  "name": "Major Second",
                  "sequenceFromRoot": "2"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

Minuet's exercise specification files contain one top-level JSON object featuring the exercises array. Such an array defines a hierarchical structure of exercises, grouped by categories. Every category/exercise has a name. Category JSON objects contain a property named children, which describes the subcategories/exercises entailed by such a category. Exercise JSON objects contain a property named options, which defines the possible answers for such an exercise. In each exercise run, Minuet randomly selects one answer among the possible ones and the student is expected to click the answer's button which corresponds to the selected answer.

Any (sub)category may define a root parameter to specify the range from which the initial interval/chord/scale's note will be randomly chosen for all exercises in this category. Such range corresponds to standards MIDI note numbers and follows the format <min-value>..<max-value>. The example presented above uses all keyboard range as possible root notes (21..104). The playMode parameter indicates how possible answers should be played: as a scale (one note after the other) or as a chord (all notes ringing out simultaneously).

Each exercise's option defines a name and the sequence of notes which should be played from the root note randomly selected in each exercise run. Such sequence of notes is defined as relative distances from the root note, describing the interval each note forms in conjunction with the root note. For example, for a major scale, the sequence of notes is "2 4 5 7 9 11 12", which respectively denotes the "whole whole half whole whole whole half" major scale structure. The sequenceFromRoot parameter may contain any notes in length. Also, Minuet's core ensures that only answers whose all notes lies within keyboard range are randomly selected.

To provide a better infrastructure for organizing a large set of exercise specification files, Minuet's core supports the use of several specification files, which are automatically merged to compose the final exercise hierarchy presented in the Navigation Menu. Exercises are correctly merged as long as different specification files use the same (sub)category name when defining exercises. For now, Minuet's provides no GUI for creating exercise specifications so that you must manually create such JSON files. Minuet's exercise specification files may be installed system-wide or locally in the minuet/exercises/ directory located in qtpaths --path GenericDataLocation