{
  "schemaVersion": 1,
  "module": "prof_guidance_morceaux",
  "targetScoreIds": [
    "Mozart_PetiteSonate"
  ],
  "parameters": {
    "lecture_continue": [
      {
        "parameterId": "reading_time_start_seconds",
        "label": "Temps de départ lecture continue",
        "cycle": "Initiation",
        "modeCode": "continuous_notes",
        "defaultValue": 3.0,
        "minValue": 1.0,
        "maxValue": 6.0,
        "unit": "s",
        "source": "guidance",
        "comment": "Valeur de départ proposée par le prof."
      },
      {
        "parameterId": "reading_time_start_seconds",
        "label": "Temps de départ lecture continue",
        "cycle": "Cycle 1",
        "modeCode": "continuous_notes",
        "defaultValue": 2.0,
        "minValue": 1.0,
        "maxValue": 6.0,
        "unit": "s",
        "source": "guidance",
        "comment": ""
      },
      {
        "parameterId": "reading_time_start_seconds",
        "label": "Temps de départ lecture continue",
        "cycle": "Cycle 2",
        "modeCode": "continuous_notes",
        "defaultValue": 2.0,
        "minValue": 1.0,
        "maxValue": 6.0,
        "unit": "s",
        "source": "guidance",
        "comment": ""
      },
      {
        "parameterId": "reading_time_start_seconds",
        "label": "Temps de départ lecture continue",
        "cycle": "Cycle 3",
        "modeCode": "continuous_notes",
        "defaultValue": 1.5,
        "minValue": 1.0,
        "maxValue": 6.0,
        "unit": "s",
        "source": "guidance",
        "comment": ""
      },
      {
        "parameterId": "reading_time_validation_seconds",
        "label": "Seuil validation lecture continue",
        "cycle": "Initiation",
        "modeCode": "continuous_notes",
        "defaultValue": 2.0,
        "minValue": 1.0,
        "maxValue": 6.0,
        "unit": "s",
        "source": "guidance",
        "comment": "Objectif : lire avant le prof."
      },
      {
        "parameterId": "reading_time_validation_seconds",
        "label": "Seuil validation lecture continue",
        "cycle": "Cycle 1",
        "modeCode": "continuous_notes",
        "defaultValue": 2.0,
        "minValue": 1.0,
        "maxValue": 6.0,
        "unit": "s",
        "source": "guidance",
        "comment": ""
      },
      {
        "parameterId": "reading_time_validation_seconds",
        "label": "Seuil validation lecture continue",
        "cycle": "Cycle 2",
        "modeCode": "continuous_notes",
        "defaultValue": 1.5,
        "minValue": 1.0,
        "maxValue": 6.0,
        "unit": "s",
        "source": "guidance",
        "comment": ""
      },
      {
        "parameterId": "reading_time_validation_seconds",
        "label": "Seuil validation lecture continue",
        "cycle": "Cycle 3",
        "modeCode": "continuous_notes",
        "defaultValue": 1.0,
        "minValue": 1.0,
        "maxValue": 6.0,
        "unit": "s",
        "source": "guidance",
        "comment": ""
      },
      {
        "parameterId": "reading_time_max_seconds",
        "label": "Temps maximum avant remédiation note par note",
        "cycle": "all",
        "modeCode": "continuous_notes",
        "defaultValue": 6.0,
        "minValue": 1.0,
        "maxValue": 10.0,
        "unit": "s",
        "source": "guidance",
        "comment": "Si “Pas encore” à cette valeur : proposer Lecture note par note, pas encore Lecture de notes."
      },
      {
        "parameterId": "correction_duration_seconds",
        "label": "Durée correction nom + touche allumée",
        "cycle": "all",
        "modeCode": "continuous_notes",
        "defaultValue": 2.0,
        "minValue": 1.0,
        "maxValue": 3.0,
        "unit": "s",
        "source": "guidance",
        "comment": "Déjà validé dans le code : nom de note + touche allumée."
      }
    ],
    "note_par_note": [
      {
        "parameterId": "note_by_note_enabled",
        "label": "Lecture note par note disponible comme remédiation",
        "cycle": "all",
        "modeCode": "note_by_note",
        "defaultValue": 1.0,
        "minValue": null,
        "maxValue": null,
        "unit": "bool",
        "source": "guidance",
        "comment": "Étape interne au morceau avant l’exercice Lecture de notes ciblé."
      },
      {
        "parameterId": "note_by_note_before_note_reading",
        "label": "Proposer note par note avant Lecture de notes",
        "cycle": "all",
        "modeCode": "note_by_note",
        "defaultValue": 1.0,
        "minValue": null,
        "maxValue": null,
        "unit": "bool",
        "source": "guidance",
        "comment": "Évite d’éjecter automatiquement l’élève vers un autre module."
      }
    ],
    "tempo": [
      {
        "parameterId": "tempo_ladder_levels",
        "label": "Nombre de paliers tempo",
        "cycle": "all",
        "modeCode": "notes_with_rhythm/play_with_rhythm",
        "defaultValue": 9.0,
        "minValue": 5.0,
        "maxValue": 9.0,
        "unit": "levels",
        "source": "calculated",
        "comment": "Paliers calculés à partir de Tmin, Tdef, Tmax du morceau."
      },
      {
        "parameterId": "rhythm_reading_start_level",
        "label": "Niveau tempo départ lecture avec rythme",
        "cycle": "all",
        "modeCode": "notes_with_rhythm",
        "defaultValue": 5.0,
        "minValue": 1.0,
        "maxValue": 9.0,
        "unit": "level",
        "source": "guidance",
        "comment": "Niveau 5 = Tdef si l’échelle est centrée sur Tdef."
      },
      {
        "parameterId": "rhythm_reading_validation_level",
        "label": "Niveau validation lecture avec rythme",
        "cycle": "all",
        "modeCode": "notes_with_rhythm",
        "defaultValue": 5.0,
        "minValue": 1.0,
        "maxValue": 9.0,
        "unit": "level",
        "source": "guidance",
        "comment": "À ajuster plus tard selon cycle si besoin."
      },
      {
        "parameterId": "play_rhythm_start_level",
        "label": "Niveau tempo départ jeu avec rythme",
        "cycle": "all",
        "modeCode": "play_with_rhythm",
        "defaultValue": 5.0,
        "minValue": 1.0,
        "maxValue": 9.0,
        "unit": "level",
        "source": "guidance",
        "comment": "Démarrage à Tdef."
      },
      {
        "parameterId": "play_MD_MG_target_level",
        "label": "Objectif mains séparées",
        "cycle": "all",
        "modeCode": "play_with_rhythm",
        "defaultValue": 9.0,
        "minValue": 5.0,
        "maxValue": 9.0,
        "unit": "level",
        "source": "guidance",
        "comment": "MD/MG : tenter d’aller au plus près de Tmax selon limites de l’élève."
      },
      {
        "parameterId": "play_ME_validation_level",
        "label": "Validation ME par partie",
        "cycle": "all",
        "modeCode": "play_with_rhythm",
        "defaultValue": 5.0,
        "minValue": 1.0,
        "maxValue": 9.0,
        "unit": "level",
        "source": "guidance",
        "comment": "ME validée à Tdef."
      },
      {
        "parameterId": "full_piece_ME_validation_level",
        "label": "Validation morceau entier ME",
        "cycle": "all",
        "modeCode": "play_with_rhythm",
        "defaultValue": 5.0,
        "minValue": 1.0,
        "maxValue": 9.0,
        "unit": "level",
        "source": "guidance",
        "comment": "Quand morceau entier est joué à Tdef, on peut travailler vers Tmax."
      },
      {
        "parameterId": "full_piece_ME_target_level",
        "label": "Objectif final morceau entier",
        "cycle": "all",
        "modeCode": "play_with_rhythm",
        "defaultValue": 9.0,
        "minValue": 5.0,
        "maxValue": 9.0,
        "unit": "level",
        "source": "guidance",
        "comment": "Tmax = objectif musical/final."
      }
    ],
    "subdivisions": [
      {
        "parameterId": "subdivisions_if_available",
        "label": "Activer subdivisions si disponibles",
        "cycle": "all",
        "modeCode": "notes_with_rhythm/play_with_rhythm",
        "defaultValue": 1.0,
        "minValue": null,
        "maxValue": null,
        "unit": "bool",
        "source": "score JSON",
        "comment": "Ne s’applique que si le morceau/mode supporte les subdivisions."
      },
      {
        "parameterId": "subdivisions_on_difficulty",
        "label": "Subdivisions activées si Pas encore",
        "cycle": "all",
        "modeCode": "play_with_rhythm",
        "defaultValue": 1.0,
        "minValue": null,
        "maxValue": null,
        "unit": "bool",
        "source": "guidance",
        "comment": "À intégrer pour MD, MG et ME."
      }
    ],
    "ME": [
      {
        "parameterId": "return_to_separate_hands_on_difficulty",
        "label": "Retour MD/MG si ME difficile",
        "cycle": "all",
        "modeCode": "play_with_rhythm",
        "defaultValue": 1.0,
        "minValue": null,
        "maxValue": null,
        "unit": "bool",
        "source": "guidance",
        "comment": "Si ME reste difficile, revenir aux mains séparées puis reprendre ME."
      }
    ]
  },
  "steps": [
    {
      "stepTemplateId": "listen_piece",
      "order": 10,
      "block": "intro",
      "scope": "piece",
      "repeatStrategy": "once",
      "handStrategy": "none",
      "modeCode": "listen_piece",
      "uiModeLabel": "Écoute du morceau",
      "normalStep": true,
      "visibleInGuidedList": false,
      "questionId": "",
      "settingKind": "",
      "settingStart": "",
      "validationRule": "",
      "tempoSource": "",
      "tempoLevelStart": 0,
      "subdivisionPolicy": "none",
      "instructionText": "Écoute d’abord le morceau pour savoir ce que tu vas apprendre.",
      "instructionAudioPath": "audio/morceaux/instructions/listen_piece.ogg",
      "audioRequired": true,
      "nextNormalTemplateId": "",
      "ifDifficultyTemplateId": "",
      "comment": "Non lié aux modes d’exercice."
    },
    {
      "stepTemplateId": "prepare_score",
      "order": 20,
      "block": "intro",
      "scope": "piece",
      "repeatStrategy": "once",
      "handStrategy": "none",
      "modeCode": "prepare_score",
      "uiModeLabel": "Préparer la partition",
      "normalStep": true,
      "visibleInGuidedList": false,
      "questionId": "",
      "settingKind": "",
      "settingStart": "",
      "validationRule": "",
      "tempoSource": "",
      "tempoLevelStart": 0,
      "subdivisionPolicy": "none",
      "instructionText": "Prépare ta partition papier. Tu peux aussi continuer sans l’imprimer.",
      "instructionAudioPath": "audio/morceaux/instructions/prepare_score.ogg",
      "audioRequired": true,
      "nextNormalTemplateId": "",
      "ifDifficultyTemplateId": "",
      "comment": ""
    },
    {
      "stepTemplateId": "part_hand_note_by_note",
      "order": 90,
      "block": "part_hand",
      "scope": "part",
      "repeatStrategy": "on_remediation",
      "handStrategy": "MD_MG",
      "modeCode": "note_by_note",
      "uiModeLabel": "Lecture note par note",
      "normalStep": false,
      "visibleInGuidedList": false,
      "questionId": "q_note_by_note_success",
      "settingKind": "",
      "settingStart": "",
      "validationRule": "",
      "tempoSource": "",
      "tempoLevelStart": 0,
      "subdivisionPolicy": "none",
      "instructionText": "On va reprendre note par note, sans pression. Avance à ton rythme.",
      "instructionAudioPath": "audio/morceaux/instructions/part_hand_note_by_note.ogg",
      "audioRequired": true,
      "nextNormalTemplateId": "",
      "ifDifficultyTemplateId": "",
      "comment": "Remédiation interne avant l’exercice Lecture de notes."
    },
    {
      "stepTemplateId": "part_hand_continuous",
      "order": 100,
      "block": "part_hand",
      "scope": "part",
      "repeatStrategy": "each_part_each_existing_hand",
      "handStrategy": "MD_MG",
      "modeCode": "continuous_notes",
      "uiModeLabel": "Lecture continue des notes",
      "normalStep": true,
      "visibleInGuidedList": false,
      "questionId": "q_continuous_success",
      "settingKind": "",
      "settingStart": "",
      "validationRule": "",
      "tempoSource": "",
      "tempoLevelStart": 0,
      "subdivisionPolicy": "none",
      "instructionText": "Essaie de lire les notes avant le prof. Recommence autant de fois que tu veux. Quand tu veux faire le point, appuie sur le prof.",
      "instructionAudioPath": "audio/morceaux/instructions/part_hand_continuous.ogg",
      "audioRequired": true,
      "nextNormalTemplateId": "",
      "ifDifficultyTemplateId": "",
      "comment": "Dupliqué pour MD puis MG si la main existe."
    },
    {
      "stepTemplateId": "part_hand_rhythm_reading",
      "order": 110,
      "block": "part_hand",
      "scope": "part",
      "repeatStrategy": "each_part_each_existing_hand",
      "handStrategy": "MD_MG",
      "modeCode": "notes_with_rhythm",
      "uiModeLabel": "Lecture avec le rythme",
      "normalStep": true,
      "visibleInGuidedList": false,
      "questionId": "q_rhythm_reading_success",
      "settingKind": "",
      "settingStart": "",
      "validationRule": "",
      "tempoSource": "",
      "tempoLevelStart": 0,
      "subdivisionPolicy": "keep_or_enable_on_difficulty",
      "instructionText": "Essaie de lire les notes en même temps que le prof. Recommence autant de fois que tu veux. Quand tu veux faire le point, appuie sur le prof.",
      "instructionAudioPath": "audio/morceaux/instructions/part_hand_rhythm_reading.ogg",
      "audioRequired": true,
      "nextNormalTemplateId": "",
      "ifDifficultyTemplateId": "",
      "comment": ""
    },
    {
      "stepTemplateId": "part_hand_play_rhythm",
      "order": 120,
      "block": "part_hand",
      "scope": "part",
      "repeatStrategy": "each_part_each_existing_hand",
      "handStrategy": "MD_MG",
      "modeCode": "play_with_rhythm",
      "uiModeLabel": "Jeu avec le rythme",
      "normalStep": true,
      "visibleInGuidedList": false,
      "questionId": "q_play_rhythm_success",
      "settingKind": "",
      "settingStart": "",
      "validationRule": "",
      "tempoSource": "",
      "tempoLevelStart": 0,
      "subdivisionPolicy": "enable_on_difficulty",
      "instructionText": "Essaie de jouer en même temps que le prof. Recommence autant de fois que tu veux. Quand tu veux faire le point, appuie sur le prof.",
      "instructionAudioPath": "audio/morceaux/instructions/part_hand_play_rhythm.ogg",
      "audioRequired": true,
      "nextNormalTemplateId": "",
      "ifDifficultyTemplateId": "",
      "comment": "MD/MG : viser progressivement vers Tmax, avec subdivisions si besoin."
    },
    {
      "stepTemplateId": "part_ME_play_rhythm",
      "order": 200,
      "block": "part_ME",
      "scope": "part",
      "repeatStrategy": "each_part",
      "handStrategy": "ME",
      "modeCode": "play_with_rhythm",
      "uiModeLabel": "Jeu ME avec le rythme",
      "normalStep": true,
      "visibleInGuidedList": false,
      "questionId": "q_ME_success",
      "settingKind": "",
      "settingStart": "",
      "validationRule": "",
      "tempoSource": "",
      "tempoLevelStart": 0,
      "subdivisionPolicy": "enable_on_difficulty",
      "instructionText": "Essaie de jouer les deux mains en même temps que le prof. Recommence autant de fois que tu veux.",
      "instructionAudioPath": "audio/morceaux/instructions/part_ME_play_rhythm.ogg",
      "audioRequired": true,
      "nextNormalTemplateId": "",
      "ifDifficultyTemplateId": "",
      "comment": "ME validé à Tdef ; si difficile, revenir à MD/MG seules."
    },
    {
      "stepTemplateId": "full_piece_ME_play_rhythm",
      "order": 300,
      "block": "full_piece",
      "scope": "piece",
      "repeatStrategy": "once_after_all_parts",
      "handStrategy": "ME",
      "modeCode": "play_with_rhythm",
      "uiModeLabel": "Morceau entier ME",
      "normalStep": true,
      "visibleInGuidedList": false,
      "questionId": "q_ME_success",
      "settingKind": "",
      "settingStart": "",
      "validationRule": "",
      "tempoSource": "",
      "tempoLevelStart": 0,
      "subdivisionPolicy": "enable_on_difficulty",
      "instructionText": "Essaie de jouer le morceau entier en même temps que le prof. Recommence autant de fois que tu veux.",
      "instructionAudioPath": "audio/morceaux/instructions/full_piece_ME_play_rhythm.ogg",
      "audioRequired": true,
      "nextNormalTemplateId": "",
      "ifDifficultyTemplateId": "",
      "comment": "Validation à Tdef, puis travail final vers Tmax."
    },
    {
      "stepTemplateId": "final_tempo_work",
      "order": 310,
      "block": "full_piece",
      "scope": "piece",
      "repeatStrategy": "optional_after_Tdef",
      "handStrategy": "ME",
      "modeCode": "play_with_rhythm",
      "uiModeLabel": "Morceau entier — objectif tempo final",
      "normalStep": true,
      "visibleInGuidedList": false,
      "questionId": "q_ME_success",
      "settingKind": "",
      "settingStart": "",
      "validationRule": "",
      "tempoSource": "",
      "tempoLevelStart": 0,
      "subdivisionPolicy": "enable_on_difficulty",
      "instructionText": "On va maintenant essayer de se rapprocher du tempo final, sans pression.",
      "instructionAudioPath": "audio/morceaux/instructions/final_tempo_work.ogg",
      "audioRequired": true,
      "nextNormalTemplateId": "",
      "ifDifficultyTemplateId": "",
      "comment": "Travail vers Tmax quand morceau entier est déjà réussi à Tdef."
    },
    {
      "stepTemplateId": "studio",
      "order": 400,
      "block": "after_piece",
      "scope": "piece",
      "repeatStrategy": "optional",
      "handStrategy": "none",
      "modeCode": "studio",
      "uiModeLabel": "Studio d’enregistrement",
      "normalStep": true,
      "visibleInGuidedList": false,
      "questionId": "",
      "settingKind": "",
      "settingStart": "",
      "validationRule": "",
      "tempoSource": "",
      "tempoLevelStart": 0,
      "subdivisionPolicy": "none",
      "instructionText": "Tu peux maintenant t’enregistrer en studio pour t’écouter.",
      "instructionAudioPath": "audio/morceaux/instructions/studio.ogg",
      "audioRequired": true,
      "nextNormalTemplateId": "",
      "ifDifficultyTemplateId": "",
      "comment": ""
    },
    {
      "stepTemplateId": "concert_live",
      "order": 500,
      "block": "after_piece",
      "scope": "piece",
      "repeatStrategy": "optional_if_final_validated",
      "handStrategy": "none",
      "modeCode": "concert_live",
      "uiModeLabel": "Concert live",
      "normalStep": true,
      "visibleInGuidedList": false,
      "questionId": "",
      "settingKind": "",
      "settingStart": "",
      "validationRule": "",
      "tempoSource": "",
      "tempoLevelStart": 0,
      "subdivisionPolicy": "none",
      "instructionText": "Quand tu es prêt, tu peux faire ton concert live.",
      "instructionAudioPath": "audio/morceaux/instructions/concert_live.ogg",
      "audioRequired": true,
      "nextNormalTemplateId": "",
      "ifDifficultyTemplateId": "",
      "comment": ""
    }
  ],
  "questions": {
    "q_note_by_note_success": {
      "questionId": "q_note_by_note_success",
      "modeCode": "note_by_note",
      "questionText": "As-tu réussi à lire les notes une par une ?",
      "questionAudioPath": "audio/morceaux/questions/q_note_by_note_success.ogg",
      "responses": [
        {
          "responseCode": "unknown_notes",
          "responseText": "Trop difficile, je n’ai pas encore appris ces notes",
          "actionRuleId": "ar_note_by_note_unknown_notes",
          "displayOrder": 1,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "yes",
          "responseText": "Oui",
          "actionRuleId": "ar_note_by_note_yes",
          "displayOrder": 2,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "not_yet",
          "responseText": "Pas encore",
          "actionRuleId": "ar_note_by_note_not_yet",
          "displayOrder": 3,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "exit_guided",
          "responseText": "Quitter le mode guidé",
          "actionRuleId": "ar_exit_guided",
          "displayOrder": 4,
          "comment": "Réponses standardisées pour garder l’interface simple."
        }
      ]
    },
    "q_continuous_success": {
      "questionId": "q_continuous_success",
      "modeCode": "continuous_notes",
      "questionText": "As-tu réussi à lire les notes avant le prof ?",
      "questionAudioPath": "audio/morceaux/questions/q_continuous_success.ogg",
      "responses": [
        {
          "responseCode": "unknown_notes",
          "responseText": "Trop difficile, je n’ai pas encore appris ces notes",
          "actionRuleId": "ar_unknown_notes_offer_note_by_note",
          "displayOrder": 1,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "yes",
          "responseText": "Oui",
          "actionRuleId": "ar_continuous_yes",
          "displayOrder": 2,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "not_yet",
          "responseText": "Pas encore",
          "actionRuleId": "ar_continuous_not_yet",
          "displayOrder": 3,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "exit_guided",
          "responseText": "Quitter le mode guidé",
          "actionRuleId": "ar_exit_guided",
          "displayOrder": 4,
          "comment": "Réponses standardisées pour garder l’interface simple."
        }
      ]
    },
    "q_rhythm_reading_success": {
      "questionId": "q_rhythm_reading_success",
      "modeCode": "notes_with_rhythm",
      "questionText": "As-tu réussi à lire les notes en même temps que le prof ?",
      "questionAudioPath": "audio/morceaux/questions/q_rhythm_reading_success.ogg",
      "responses": [
        {
          "responseCode": "unknown_notes",
          "responseText": "Trop difficile, je n’ai pas encore appris ces notes",
          "actionRuleId": "ar_unknown_notes_offer_note_by_note",
          "displayOrder": 1,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "yes",
          "responseText": "Oui",
          "actionRuleId": "ar_rhythm_reading_yes",
          "displayOrder": 2,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "not_yet",
          "responseText": "Pas encore",
          "actionRuleId": "ar_rhythm_reading_not_yet",
          "displayOrder": 3,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "exit_guided",
          "responseText": "Quitter le mode guidé",
          "actionRuleId": "ar_exit_guided",
          "displayOrder": 4,
          "comment": "Réponses standardisées pour garder l’interface simple."
        }
      ]
    },
    "q_play_rhythm_success": {
      "questionId": "q_play_rhythm_success",
      "modeCode": "play_with_rhythm",
      "questionText": "As-tu réussi à jouer en même temps que le prof ?",
      "questionAudioPath": "audio/morceaux/questions/q_play_rhythm_success.ogg",
      "responses": [
        {
          "responseCode": "unknown_notes",
          "responseText": "Trop difficile, je n’ai pas encore appris ces notes",
          "actionRuleId": "ar_unknown_notes_offer_note_by_note",
          "displayOrder": 1,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "yes",
          "responseText": "Oui",
          "actionRuleId": "ar_play_rhythm_yes",
          "displayOrder": 2,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "not_yet",
          "responseText": "Pas encore",
          "actionRuleId": "ar_play_rhythm_not_yet",
          "displayOrder": 3,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "exit_guided",
          "responseText": "Quitter le mode guidé",
          "actionRuleId": "ar_exit_guided",
          "displayOrder": 4,
          "comment": "Réponses standardisées pour garder l’interface simple."
        }
      ]
    },
    "q_ME_success": {
      "questionId": "q_ME_success",
      "modeCode": "play_with_rhythm",
      "questionText": "As-tu réussi à jouer les deux mains ensemble ?",
      "questionAudioPath": "audio/morceaux/questions/q_ME_success.ogg",
      "responses": [
        {
          "responseCode": "unknown_notes",
          "responseText": "Trop difficile, je n’ai pas encore appris ces notes",
          "actionRuleId": "ar_unknown_notes_offer_note_by_note",
          "displayOrder": 1,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "yes",
          "responseText": "Oui",
          "actionRuleId": "ar_play_ME_yes",
          "displayOrder": 2,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "not_yet",
          "responseText": "Pas encore",
          "actionRuleId": "ar_play_ME_not_yet",
          "displayOrder": 3,
          "comment": "Réponses standardisées pour garder l’interface simple."
        },
        {
          "responseCode": "exit_guided",
          "responseText": "Quitter le mode guidé",
          "actionRuleId": "ar_exit_guided",
          "displayOrder": 4,
          "comment": "Réponses standardisées pour garder l’interface simple."
        }
      ]
    }
  },
  "actions": {
    "ar_exit_guided": {
      "actionRuleId": "ar_exit_guided",
      "modeCode": "any",
      "responseCode": "exit_guided",
      "condition": "always",
      "actionType": "exit_guided_mode",
      "settingTarget": "none",
      "settingChange": "none",
      "nextSettingSource": "",
      "tempoUnitChange": "keep",
      "nextStepPolicy": "exit_guided",
      "messageText": "",
      "messageAudioPath": "audio/morceaux/actions/ar_exit_guided.ogg",
      "offerText": "",
      "fallbackActionRuleId": "",
      "comment": ""
    },
    "ar_unknown_notes_offer_note_by_note": {
      "actionRuleId": "ar_unknown_notes_offer_note_by_note",
      "modeCode": "any",
      "responseCode": "unknown_notes",
      "condition": "currentMode != note_by_note",
      "actionType": "offer_help_choices",
      "settingTarget": "mode",
      "settingChange": "switch",
      "nextSettingSource": "part_hand_note_by_note",
      "tempoUnitChange": "keep",
      "nextStepPolicy": "stay_current_step",
      "messageText": "",
      "messageAudioPath": "audio/morceaux/actions/ar_unknown_notes_offer_note_by_note.ogg",
      "offerText": "",
      "fallbackActionRuleId": "",
      "comment": "Ne pas envoyer directement vers Lecture de notes."
    },
    "ar_note_by_note_unknown_notes": {
      "actionRuleId": "ar_note_by_note_unknown_notes",
      "modeCode": "note_by_note",
      "responseCode": "unknown_notes",
      "condition": "always",
      "actionType": "offer_help_choices",
      "settingTarget": "route",
      "settingChange": "targeted_note_reading",
      "nextSettingSource": "",
      "tempoUnitChange": "keep",
      "nextStepPolicy": "stay_current_step",
      "messageText": "",
      "messageAudioPath": "audio/morceaux/actions/ar_note_by_note_unknown_notes.ogg",
      "offerText": "",
      "fallbackActionRuleId": "",
      "comment": "Après la remédiation interne, Lecture de notes devient pertinente."
    },
    "ar_note_by_note_yes": {
      "actionRuleId": "ar_note_by_note_yes",
      "modeCode": "note_by_note",
      "responseCode": "yes",
      "condition": "always",
      "actionType": "validate_and_next",
      "settingTarget": "mode",
      "settingChange": "return",
      "nextSettingSource": "part_hand_continuous",
      "tempoUnitChange": "keep",
      "nextStepPolicy": "go_next_step",
      "messageText": "",
      "messageAudioPath": "audio/morceaux/actions/ar_note_by_note_yes.ogg",
      "offerText": "",
      "fallbackActionRuleId": "",
      "comment": "Retour à l’étape normale."
    },
    "ar_note_by_note_not_yet": {
      "actionRuleId": "ar_note_by_note_not_yet",
      "modeCode": "note_by_note",
      "responseCode": "not_yet",
      "condition": "always",
      "actionType": "offer_help_choices",
      "settingTarget": "none",
      "settingChange": "keep",
      "nextSettingSource": "",
      "tempoUnitChange": "keep",
      "nextStepPolicy": "stay_current_step",
      "messageText": "",
      "messageAudioPath": "audio/morceaux/actions/ar_note_by_note_not_yet.ogg",
      "offerText": "",
      "fallbackActionRuleId": "",
      "comment": ""
    },
    "ar_continuous_yes": {
      "actionRuleId": "ar_continuous_yes",
      "modeCode": "continuous_notes",
      "responseCode": "yes",
      "condition": "currentReadingTime <= validationReadingTime",
      "actionType": "validate_and_next",
      "settingTarget": "reading_time_seconds",
      "settingChange": "keep",
      "nextSettingSource": "",
      "tempoUnitChange": "keep",
      "nextStepPolicy": "go_next_step",
      "messageText": "",
      "messageAudioPath": "audio/morceaux/actions/ar_continuous_yes.ogg",
      "offerText": "",
      "fallbackActionRuleId": "",
      "comment": "Le défi 1s peut rester optionnel selon cycle."
    },
    "ar_continuous_not_yet": {
      "actionRuleId": "ar_continuous_not_yet",
      "modeCode": "continuous_notes",
      "responseCode": "not_yet",
      "condition": "currentReadingTime >= maxReadingTime",
      "actionType": "switch_to_remediation",
      "settingTarget": "mode",
      "settingChange": "switch",
      "nextSettingSource": "part_hand_note_by_note",
      "tempoUnitChange": "keep",
      "nextStepPolicy": "stay_current_step",
      "messageText": "",
      "messageAudioPath": "audio/morceaux/actions/ar_continuous_not_yet.ogg",
      "offerText": "",
      "fallbackActionRuleId": "",
      "comment": "À 6s : proposer note par note avant Lecture de notes."
    },
    "ar_rhythm_reading_yes": {
      "actionRuleId": "ar_rhythm_reading_yes",
      "modeCode": "notes_with_rhythm",
      "responseCode": "yes",
      "condition": "currentTempoLevel >= validationTempoLevel",
      "actionType": "validate_and_next",
      "settingTarget": "tempo_level",
      "settingChange": "keep",
      "nextSettingSource": "",
      "tempoUnitChange": "keep",
      "nextStepPolicy": "go_next_step",
      "messageText": "",
      "messageAudioPath": "audio/morceaux/actions/ar_rhythm_reading_yes.ogg",
      "offerText": "",
      "fallbackActionRuleId": "",
      "comment": ""
    },
    "ar_rhythm_reading_not_yet": {
      "actionRuleId": "ar_rhythm_reading_not_yet",
      "modeCode": "notes_with_rhythm",
      "responseCode": "not_yet",
      "condition": "currentTempoLevel <= 1",
      "actionType": "offer_free_practice",
      "settingTarget": "tempo_level",
      "settingChange": "keep",
      "nextSettingSource": "",
      "tempoUnitChange": "subdivisions_if_available",
      "nextStepPolicy": "stay_current_step",
      "messageText": "",
      "messageAudioPath": "audio/morceaux/actions/ar_rhythm_reading_not_yet.ogg",
      "offerText": "",
      "fallbackActionRuleId": "",
      "comment": ""
    },
    "ar_play_rhythm_yes": {
      "actionRuleId": "ar_play_rhythm_yes",
      "modeCode": "play_with_rhythm",
      "responseCode": "yes",
      "condition": "hand in MD/MG and currentTempoLevel >= targetHandTempoLevel",
      "actionType": "validate_and_next",
      "settingTarget": "tempo_level",
      "settingChange": "keep",
      "nextSettingSource": "",
      "tempoUnitChange": "keep",
      "nextStepPolicy": "go_next_step",
      "messageText": "",
      "messageAudioPath": "audio/morceaux/actions/ar_play_rhythm_yes.ogg",
      "offerText": "",
      "fallbackActionRuleId": "",
      "comment": ""
    },
    "ar_play_rhythm_not_yet": {
      "actionRuleId": "ar_play_rhythm_not_yet",
      "modeCode": "play_with_rhythm",
      "responseCode": "not_yet",
      "condition": "hand in MD/MG and currentTempoLevel <= 1",
      "actionType": "offer_free_practice",
      "settingTarget": "tempo_level",
      "settingChange": "keep",
      "nextSettingSource": "",
      "tempoUnitChange": "subdivisions_if_available",
      "nextStepPolicy": "stay_current_step",
      "messageText": "",
      "messageAudioPath": "audio/morceaux/actions/ar_play_rhythm_not_yet.ogg",
      "offerText": "",
      "fallbackActionRuleId": "",
      "comment": ""
    },
    "ar_play_ME_yes": {
      "actionRuleId": "ar_play_ME_yes",
      "modeCode": "play_with_rhythm",
      "responseCode": "yes",
      "condition": "hand == ME and currentTempoLevel < play_ME_validation_level",
      "actionType": "apply_settings_and_repeat",
      "settingTarget": "tempo_level",
      "settingChange": "harder",
      "nextSettingSource": "next_higher_tempo_level",
      "tempoUnitChange": "keep",
      "nextStepPolicy": "stay_current_step",
      "messageText": "",
      "messageAudioPath": "audio/morceaux/actions/ar_play_ME_yes.ogg",
      "offerText": "",
      "fallbackActionRuleId": "",
      "comment": ""
    },
    "ar_play_ME_not_yet": {
      "actionRuleId": "ar_play_ME_not_yet",
      "modeCode": "play_with_rhythm",
      "responseCode": "not_yet",
      "condition": "hand == ME and repeatedDifficulty",
      "actionType": "return_to_separate_hands",
      "settingTarget": "mode",
      "settingChange": "return_MD_MG",
      "nextSettingSource": "part_hand_play_rhythm",
      "tempoUnitChange": "subdivisions_if_available",
      "nextStepPolicy": "go_previous_separate_hands",
      "messageText": "",
      "messageAudioPath": "audio/morceaux/actions/ar_play_ME_not_yet.ogg",
      "offerText": "",
      "fallbackActionRuleId": "",
      "comment": "Retour MD puis MG seules si ME reste difficile."
    }
  },
  "generationRules": [
    {
      "ruleid": "gr_parts",
      "description": "Pour chaque partie du morceau, créer les étapes standard.",
      "inputfromscorejson": "parts, measures, hands",
      "outputguidedsteps": "part_hand_continuous, part_hand_rhythm_reading, part_hand_play_rhythm, part_ME...",
      "comment": "Ne pas ressaisir les parties dans cet Excel."
    },
    {
      "ruleid": "gr_hands",
      "description": "Créer MD/MG seulement si la main existe dans la partie.",
      "inputfromscorejson": "hand presence",
      "outputguidedsteps": "MD/MG steps",
      "comment": ""
    },
    {
      "ruleid": "gr_note_by_note",
      "description": "Créer la lecture note par note comme étape de remédiation appelée si besoin.",
      "inputfromscorejson": "notes in part/hand",
      "outputguidedsteps": "part_hand_note_by_note",
      "comment": "Pas forcément visible dans le parcours normal."
    },
    {
      "ruleid": "gr_subdivisions",
      "description": "Activer subdivisions seulement si disponibles dans le morceau/mode.",
      "inputfromscorejson": "supportsSubdivisions",
      "outputguidedsteps": "tempoUnit/subdivision flags",
      "comment": "S’applique aux lectures avec rythme et jeux avec rythme."
    },
    {
      "ruleid": "gr_ME_return",
      "description": "Si difficulté répétée en ME, générer une file de retour MD puis MG puis ME.",
      "inputfromscorejson": "current ME step + part",
      "outputguidedsteps": "returnSeparateHandsQueue",
      "comment": "Évite d’insister trop tôt sur ME."
    }
  ],
  "overrides": [],
  "copiedAssets": [
    "audio/morceaux/actions/ar_continuous_not_yet.ogg",
    "audio/morceaux/actions/ar_continuous_yes.ogg",
    "audio/morceaux/actions/ar_exit_guided.ogg",
    "audio/morceaux/actions/ar_note_by_note_not_yet.ogg",
    "audio/morceaux/actions/ar_note_by_note_unknown_notes.ogg",
    "audio/morceaux/actions/ar_note_by_note_yes.ogg",
    "audio/morceaux/actions/ar_play_ME_not_yet.ogg",
    "audio/morceaux/actions/ar_play_ME_yes.ogg",
    "audio/morceaux/actions/ar_play_rhythm_not_yet.ogg",
    "audio/morceaux/actions/ar_play_rhythm_yes.ogg",
    "audio/morceaux/actions/ar_rhythm_reading_not_yet.ogg",
    "audio/morceaux/actions/ar_rhythm_reading_yes.ogg",
    "audio/morceaux/actions/ar_unknown_notes_offer_note_by_note.ogg",
    "audio/morceaux/instructions/concert_live.ogg",
    "audio/morceaux/instructions/final_tempo_work.ogg",
    "audio/morceaux/instructions/full_piece_ME_play_rhythm.ogg",
    "audio/morceaux/instructions/guided_general_instruction.ogg",
    "audio/morceaux/instructions/guided_general_reminder_short.ogg",
    "audio/morceaux/instructions/listen_piece.ogg",
    "audio/morceaux/instructions/part_ME_play_rhythm.ogg",
    "audio/morceaux/instructions/part_hand_continuous.ogg",
    "audio/morceaux/instructions/part_hand_note_by_note.ogg",
    "audio/morceaux/instructions/part_hand_play_rhythm.ogg",
    "audio/morceaux/instructions/part_hand_rhythm_reading.ogg",
    "audio/morceaux/instructions/prepare_score.ogg",
    "audio/morceaux/instructions/studio.ogg",
    "audio/morceaux/questions/q_ME_success.ogg",
    "audio/morceaux/questions/q_continuous_success.ogg",
    "audio/morceaux/questions/q_note_by_note_success.ogg",
    "audio/morceaux/questions/q_play_rhythm_success.ogg",
    "audio/morceaux/questions/q_rhythm_reading_success.ogg"
  ],
  "missingAssets": []
}