Глава 3. Создание новых упражнений Minuet

Упражнения Minuet определены в файлах спецификации упражнений, написанных в формате JSON:

{
  "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 содержат один JSON-объект верхнего уровня с массивом exercises. Такой массив определяет иерархическую структуру упражнений, сгруппированную по категориям. Каждой категории и упражнению присвоено имя. Категория объектов JSON содержит свойство children, которое описывает подкатегории и упражнения, связанные с такой категорией. Упражнения объектов JSON содержат свойство options, определяющее возможные ответы на эти упражнения. В каждом запущенном упражнении Minuet случайным образом выбирает один ответ среди всех возможных, и ожидается, что обучающийся нажмёт кнопку, соответствующую этому ответу.

Любая (под)категория может быть определена параметром root, указывающим диапазон, из которого будет случайным образом выбираться начальный интервал, аккорд или нота гаммы для всех упражнений этой категории. Такой диапазон соответствует стандартам номеров нот MIDI и имеет формат <min-value>..<max-value>. В приведённом выше примере в качестве возможных основных нот используется весь диапазон клавиш (21..104). Параметр playMode определяет, как должны воспроизводиться возможные ответы: как scale (одна нота за другой) или как chord (все ноты воспроизводятся одновременно).

Параметр каждого упражнения определяет имя и последовательность нот, которые должны воспроизводиться, начиная с основной ноты, выбранной случайным образом в каждом цикле упражнений. Такая последовательность нот определена как относительное расстояние от основной ноты, описывающее интервал, который каждая нота образует в сочетании с основной нотой. Например, для мажорной гаммы последовательность нот составит «2 4 5 7 9 11 12», что соответственно обозначает структуру «целая целая половина целая целая целая половина» мажорной гаммы. Параметр sequenceFromRoot может содержать ноты любой длины. Более того, структура Minuet гарантирует, что случайным образом выбираются только те ответы, которые находятся в пределах диапазона клавиш.

Чтобы обеспечить лучшую организацию большого набора файлов спецификаций упражнений, структура Minuet поддерживает использование нескольких файлов спецификации, которые автоматически объединяются для составления окончательной иерархии упражнений, отображаемой в меню навигации. Упражнения корректно объединяются, если разные файлы спецификаций используют одно и то же имя (под) категории при определении упражнений. На данный момент Minuet не предоставляет графический интерфейс для созданий спецификаций, поэтому пользователю придётся вручную создавать такие файлы JSON. Файлы спецификации упражнений Minuet возможно установить системно или локально в папке minuet/exercises/, расположенной в qtpaths --paths GenericDataLocation.