Minuet's exercises are defined in JSON specification files. The app loads all available files at startup and merges them into the visible exercise tree.
{
"exercises": [
{
"name": "Intervals",
"root": "29..69",
"playMode": "scale",
"userMessage": "Hear the interval and choose your answer",
"numberOfSelectedOptions": 1,
"_icon": "minuet-intervals-symbolic.svg",
"children": [
{
"name": "Ascending melodic intervals",
"and-tags": ["interval", "ascending"],
"children": [
{
"name": "Seconds",
"or-tags": ["2"],
"description": "Practice identifying ascending melodic seconds by ear."
}
]
}
]
}
]
}
The top-level object contains an exercises array. Each item in that array is
either a category or an exercise leaf. Categories use children to define the
next level of the tree.
Useful fields include:
namegives every node its visible label.rootlimits the note range used to generate the prompt.playModeselects scale, chord, or rhythm playback.userMessagecustomizes the instruction shown to the user.numberOfSelectedOptionscontrols how many answers may be correct._iconsets the icon shown in the drawer and exercise browser.and-tagsandor-tagshelp group and filter related nodes.descriptiongives the browser a short explanation for the node.optionsdescribes answer choices for a leaf exercise.sequenceFromRootdefines the note offsets for melodic answers.templateis used by rhythm exercises to render notation.
The app merges files that share the same category names, so separate specification files can
contribute to one visible hierarchy. Install them system-wide or place them in
minuet/exercises/ under the generic data location returned by
qtpaths .
--paths GenericDataLocation