{
  "schemaVersion": 1,
  "moduleId": "studio_concerts",
  "moduleTitle": "Studio & Concerts",
  "buildOutput": "studio_concerts/studio_concerts.json",
  "rules": {
    "moduleEntryLabel": "Studio & Concerts",
    "studioAccess": "anytime",
    "studioAttempts": "unlimited",
    "studioSaveMode": "manual",
    "maxStudioTakesPerPiece": 5,
    "studioShare": "saved_only_discreet",
    "concertAccess": "final_step_me_success",
    "concertAttemptsPerPiecePerDay": 1,
    "concertSave": "strongly_proposed",
    "concertShare": "visible",
    "defaultHallByCycle": true,
    "allowChallengeHall": true,
    "playByHeartRequired": false,
    "recordApplause": false,
    "default_applause_volume": "audio",
    "default_teacher_voice_volume": "audio",
    "volume_min": "audio",
    "volume_max": "audio",
    "persist_volume_settings": "audio"
  },
  "halls": [
    {
      "hallId": "studio_01",
      "title": "Studio d’enregistrement",
      "mode": "studio",
      "defaultCycle": "Tous",
      "levelOrder": 0,
      "imagePath": "halls/studio_01.webp",
      "isChallengeHall": false,
      "welcomeApplauseKey": "",
      "finalApplauseKey": "",
      "introVoiceKey": "studio_intro",
      "overlayDarkness": 0.25,
      "notes": "Fond 1920×1080 du studio. Accès libre, aucune logique de salle."
    },
    {
      "hallId": "hall_01",
      "title": "Salle communale",
      "mode": "concert",
      "defaultCycle": "Initiation",
      "levelOrder": 1,
      "imagePath": "halls/hall_01_salle_communale.webp",
      "isChallengeHall": false,
      "welcomeApplauseKey": "applause_small_welcome",
      "finalApplauseKey": "applause_small_final",
      "introVoiceKey": "concert_intro",
      "overlayDarkness": 0.3,
      "notes": "Salle conseillée pour les morceaux Initiation."
    },
    {
      "hallId": "hall_02",
      "title": "Petit théâtre",
      "mode": "concert",
      "defaultCycle": "Cycle 1",
      "levelOrder": 2,
      "imagePath": "halls/hall_02_petit_theatre.webp",
      "isChallengeHall": false,
      "welcomeApplauseKey": "applause_medium_welcome",
      "finalApplauseKey": "applause_medium_final",
      "introVoiceKey": "concert_intro",
      "overlayDarkness": 0.3,
      "notes": "Salle conseillée pour le Cycle 1."
    },
    {
      "hallId": "hall_03",
      "title": "Grande salle",
      "mode": "concert",
      "defaultCycle": "Cycle 2",
      "levelOrder": 3,
      "imagePath": "halls/hall_03_grande_salle.webp",
      "isChallengeHall": false,
      "welcomeApplauseKey": "applause_large_welcome",
      "finalApplauseKey": "applause_large_final",
      "introVoiceKey": "concert_intro",
      "overlayDarkness": 0.32,
      "notes": "Salle conseillée pour le Cycle 2."
    },
    {
      "hallId": "hall_04",
      "title": "Grande scène",
      "mode": "concert",
      "defaultCycle": "Cycle 3",
      "levelOrder": 4,
      "imagePath": "halls/hall_04_stade.webp",
      "isChallengeHall": true,
      "welcomeApplauseKey": "applause_stadium_welcome",
      "finalApplauseKey": "applause_stadium_final",
      "introVoiceKey": "concert_intro",
      "overlayDarkness": 0.35,
      "notes": "Salle Cycle 3 ou défi volontaire pour les niveaux inférieurs."
    }
  ],
  "audio": {
    "applause_small_welcome": {
      "audioKey": "applause_small_welcome",
      "category": "applause",
      "audioPath": "audio/applause_small_welcome.ogg",
      "defaultDurationMs": 2500,
      "includeInRecording": false,
      "notes": "Applaudissement d’accueil petite salle.",
      "defaultVolume": 0.8,
      "volumeGroup": "applause"
    },
    "applause_small_final": {
      "audioKey": "applause_small_final",
      "category": "applause",
      "audioPath": "audio/applause_small_final.ogg",
      "defaultDurationMs": 3500,
      "includeInRecording": false,
      "notes": "Applaudissement final petite salle.",
      "defaultVolume": 0.8,
      "volumeGroup": "applause"
    },
    "applause_medium_welcome": {
      "audioKey": "applause_medium_welcome",
      "category": "applause",
      "audioPath": "audio/applause_medium_welcome.ogg",
      "defaultDurationMs": 3000,
      "includeInRecording": false,
      "notes": "Accueil théâtre moyen.",
      "defaultVolume": 0.8,
      "volumeGroup": "applause"
    },
    "applause_medium_final": {
      "audioKey": "applause_medium_final",
      "category": "applause",
      "audioPath": "audio/applause_medium_final.ogg",
      "defaultDurationMs": 4500,
      "includeInRecording": false,
      "notes": "Final théâtre moyen.",
      "defaultVolume": 0.8,
      "volumeGroup": "applause"
    },
    "applause_large_welcome": {
      "audioKey": "applause_large_welcome",
      "category": "applause",
      "audioPath": "audio/applause_large_welcome.ogg",
      "defaultDurationMs": 3500,
      "includeInRecording": false,
      "notes": "Accueil grande salle.",
      "defaultVolume": 0.8,
      "volumeGroup": "applause"
    },
    "applause_large_final": {
      "audioKey": "applause_large_final",
      "category": "applause",
      "audioPath": "audio/applause_large_final.ogg",
      "defaultDurationMs": 5500,
      "includeInRecording": false,
      "notes": "Final grande salle.",
      "defaultVolume": 0.8,
      "volumeGroup": "applause"
    },
    "applause_stadium_welcome": {
      "audioKey": "applause_stadium_welcome",
      "category": "applause",
      "audioPath": "audio/applause_stadium_welcome.ogg",
      "defaultDurationMs": 4000,
      "includeInRecording": false,
      "notes": "Accueil stade / grande scène.",
      "defaultVolume": 0.8,
      "volumeGroup": "applause"
    },
    "applause_stadium_final": {
      "audioKey": "applause_stadium_final",
      "category": "applause",
      "audioPath": "audio/applause_stadium_final.ogg",
      "defaultDurationMs": 6500,
      "includeInRecording": false,
      "notes": "Final stade / grande scène.",
      "defaultVolume": 0.8,
      "volumeGroup": "applause"
    }
  },
  "voices": {
    "module_intro": {
      "voiceKey": "module_intro",
      "screenKey": "home",
      "audioPath": "audio/module_intro.ogg",
      "referenceText": "Bienvenue dans Studio & Concerts. Enregistre-toi, écoute tes progrès, puis monte sur scène quand tu es prêt.",
      "autoPlay": true,
      "notes": "Accueil du module.",
      "defaultVolume": 1.0,
      "volumeGroup": "teacher_voice"
    },
    "studio_intro": {
      "voiceKey": "studio_intro",
      "screenKey": "studio_home",
      "audioPath": "audio/studio_intro.ogg",
      "referenceText": "Bienvenue dans le studio. Ici, tu peux t’enregistrer librement, et recommencer autant de fois que tu veux.",
      "autoPlay": true,
      "notes": "Mode libre, rassurant.",
      "defaultVolume": 1.0,
      "volumeGroup": "teacher_voice"
    },
    "concert_intro": {
      "voiceKey": "concert_intro",
      "screenKey": "concert_home",
      "audioPath": "audio/concert_intro.ogg",
      "referenceText": "Bienvenue sur scène. Prépare ton morceau : ton concert va commencer.",
      "autoPlay": true,
      "notes": "Introduction concert live.",
      "defaultVolume": 1.0,
      "volumeGroup": "teacher_voice"
    },
    "concert_locked": {
      "voiceKey": "concert_locked",
      "screenKey": "concert_locked",
      "audioPath": "audio/concert_locked.ogg",
      "referenceText": "Le concert live sera disponible quand tu auras réussi le morceau en entier mains ensemble. En attendant, le studio reste ouvert.",
      "autoPlay": true,
      "notes": "Quand le morceau n’est pas finalisé.",
      "defaultVolume": 1.0,
      "volumeGroup": "teacher_voice"
    },
    "concert_done_today": {
      "voiceKey": "concert_done_today",
      "screenKey": "concert_locked",
      "audioPath": "audio/concert_done_today.ogg",
      "referenceText": "Ton concert du jour est terminé. Tu pourras refaire un concert officiel demain. En attendant, le studio reste ouvert.",
      "autoPlay": true,
      "notes": "Limite une tentative par morceau et par jour.",
      "defaultVolume": 1.0,
      "volumeGroup": "teacher_voice"
    },
    "by_heart": {
      "voiceKey": "by_heart",
      "screenKey": "concert_play_mode",
      "audioPath": "audio/play_by_heart.ogg",
      "referenceText": "Le vrai défi de la scène : jouer ton morceau par cœur.",
      "autoPlay": false,
      "notes": "Choix par cœur.",
      "defaultVolume": 1.0,
      "volumeGroup": "teacher_voice"
    },
    "with_score": {
      "voiceKey": "with_score",
      "screenKey": "concert_play_mode",
      "audioPath": "audio/play_with_score.ogg",
      "referenceText": "Tu peux aussi jouer avec ta partition papier. Place-la devant toi et pose la tablette à côté du piano.",
      "autoPlay": false,
      "notes": "Choix avec partition papier.",
      "defaultVolume": 1.0,
      "volumeGroup": "teacher_voice"
    },
    "recording_started": {
      "voiceKey": "recording_started",
      "screenKey": "recording",
      "audioPath": "audio/recording_started.ogg",
      "referenceText": "C’est à toi. Joue ton morceau jusqu’au bout.",
      "autoPlay": false,
      "notes": "Optionnel, juste avant ou après le silence.",
      "defaultVolume": 1.0,
      "volumeGroup": "teacher_voice"
    },
    "studio_saved": {
      "voiceKey": "studio_saved",
      "screenKey": "studio_end",
      "audioPath": "audio/studio_saved.ogg",
      "referenceText": "Ta prise studio est sauvegardée dans Mon espace.",
      "autoPlay": false,
      "notes": "Après sauvegarde volontaire.",
      "defaultVolume": 1.0,
      "volumeGroup": "teacher_voice"
    },
    "concert_saved": {
      "voiceKey": "concert_saved",
      "screenKey": "concert_end",
      "audioPath": "audio/concert_saved.ogg",
      "referenceText": "Bravo, ton concert est sauvegardé dans Mon espace.",
      "autoPlay": false,
      "notes": "Après sauvegarde concert.",
      "defaultVolume": 1.0,
      "volumeGroup": "teacher_voice"
    }
  },
  "texts": {
    "module_title": "Studio & Concerts",
    "module_subtitle": "Enregistre-toi, écoute tes progrès, puis monte sur scène quand tu es prêt.",
    "studio_title": "Studio d’enregistrement",
    "studio_description": "Enregistre-toi librement, réécoute ta prise et recommence autant de fois que tu veux.",
    "concert_title": "Concert live",
    "concert_description": "Joue ton morceau en conditions de scène. Une seule tentative officielle par morceau et par jour.",
    "concert_locked": "Le concert live sera disponible quand tu auras réussi le morceau en entier mains ensemble. En attendant, le studio reste ouvert pour t’entraîner.",
    "concert_done_today": "Ton concert du jour est terminé. Tu pourras refaire un concert officiel demain. En attendant, le studio reste ouvert pour t’entraîner.",
    "hall_recommended": "Salle conseillée",
    "hall_challenge": "Défi",
    "play_mode_question": "Comment veux-tu jouer ton concert ?",
    "by_heart_title": "Je joue par cœur",
    "by_heart_description": "Le vrai défi de la scène : tu joues sans regarder la partition.",
    "with_score_title": "Je joue avec ma partition papier",
    "with_score_description": "Place ta partition devant toi et pose la tablette à côté du piano.",
    "ready_title": "Prépare-toi",
    "ready_description": "Quand tu es prêt, appuie sur le bouton. Le rideau va s’ouvrir.",
    "recording_hint": "Enregistrement en cours",
    "studio_end_title": "Ta prise studio est terminée",
    "concert_end_title": "Bravo, ton concert est terminé"
  },
  "textMeta": {
    "module_title": {
      "screenKey": "home",
      "notes": "Titre du bouton/module."
    },
    "module_subtitle": {
      "screenKey": "home",
      "notes": "Sous-titre général."
    },
    "studio_title": {
      "screenKey": "home",
      "notes": "Carte d’entrée Studio."
    },
    "studio_description": {
      "screenKey": "home",
      "notes": "Description Studio."
    },
    "concert_title": {
      "screenKey": "home",
      "notes": "Carte d’entrée Concert."
    },
    "concert_description": {
      "screenKey": "home",
      "notes": "Description Concert."
    },
    "concert_locked": {
      "screenKey": "concert_locked",
      "notes": "Message non punitif."
    },
    "concert_done_today": {
      "screenKey": "concert_locked",
      "notes": "Tentative déjà faite aujourd’hui."
    },
    "hall_recommended": {
      "screenKey": "hall_select",
      "notes": "Label de la salle par défaut."
    },
    "hall_challenge": {
      "screenKey": "hall_select",
      "notes": "Mention pour salle supérieure au cycle."
    },
    "play_mode_question": {
      "screenKey": "concert_play_mode",
      "notes": "Écran choix par cœur / partition."
    },
    "by_heart_title": {
      "screenKey": "concert_play_mode",
      "notes": "Bouton / carte."
    },
    "by_heart_description": {
      "screenKey": "concert_play_mode",
      "notes": "Description."
    },
    "with_score_title": {
      "screenKey": "concert_play_mode",
      "notes": "Bouton / carte."
    },
    "with_score_description": {
      "screenKey": "concert_play_mode",
      "notes": "Description."
    },
    "ready_title": {
      "screenKey": "concert_ready",
      "notes": "Écran rideau fermé."
    },
    "ready_description": {
      "screenKey": "concert_ready",
      "notes": "Écran rideau fermé."
    },
    "recording_hint": {
      "screenKey": "recording",
      "notes": "Texte discret pendant le jeu."
    },
    "studio_end_title": {
      "screenKey": "studio_end",
      "notes": "Fin studio."
    },
    "concert_end_title": {
      "screenKey": "concert_end",
      "notes": "Fin concert."
    }
  },
  "buttons": {
    "open_studio": {
      "buttonKey": "open_studio",
      "label": "Studio d’enregistrement",
      "screenKey": "home",
      "styleRole": "primary",
      "notes": "Entrée vers le studio."
    },
    "open_concert": {
      "buttonKey": "open_concert",
      "label": "Concert live",
      "screenKey": "home",
      "styleRole": "gold",
      "notes": "Entrée vers le concert live."
    },
    "by_heart": {
      "buttonKey": "by_heart",
      "label": "Je joue par cœur",
      "screenKey": "concert_play_mode",
      "styleRole": "gold",
      "notes": "Choix de jeu par cœur."
    },
    "with_score": {
      "buttonKey": "with_score",
      "label": "Je joue avec ma partition papier",
      "screenKey": "concert_play_mode",
      "styleRole": "secondary",
      "notes": "Choix avec partition papier."
    },
    "ready": {
      "buttonKey": "ready",
      "label": "Je suis prêt",
      "screenKey": "concert_ready",
      "styleRole": "gold",
      "notes": "Démarre le déroulé du concert."
    },
    "start_recording": {
      "buttonKey": "start_recording",
      "label": "Démarrer",
      "screenKey": "studio_ready",
      "styleRole": "green",
      "notes": "Démarrer un enregistrement studio."
    },
    "finish": {
      "buttonKey": "finish",
      "label": "Fin",
      "screenKey": "recording",
      "styleRole": "danger_soft",
      "notes": "Arrête l’enregistrement. Gros bouton très visible."
    },
    "listen": {
      "buttonKey": "listen",
      "label": "Réécouter",
      "screenKey": "end",
      "styleRole": "secondary",
      "notes": "Relire la prise temporaire ou sauvegardée."
    },
    "retry": {
      "buttonKey": "retry",
      "label": "Recommencer",
      "screenKey": "end",
      "styleRole": "secondary",
      "notes": "Studio : illimité. Concert : renvoie plutôt vers studio ou demain."
    },
    "keep_take": {
      "buttonKey": "keep_take",
      "label": "Garder cette prise",
      "screenKey": "studio_end",
      "styleRole": "green",
      "notes": "Sauvegarde volontaire d’une prise studio."
    },
    "save_concert": {
      "buttonKey": "save_concert",
      "label": "Sauvegarder mon concert",
      "screenKey": "concert_end",
      "styleRole": "green",
      "notes": "Sauvegarde concert fortement proposée."
    },
    "share": {
      "buttonKey": "share",
      "label": "Partager",
      "screenKey": "concert_end",
      "styleRole": "gold",
      "notes": "Visible pour concert. Discret pour studio sauvegardé."
    },
    "go_studio": {
      "buttonKey": "go_studio",
      "label": "Aller au studio",
      "screenKey": "concert_end",
      "styleRole": "secondary",
      "notes": "Après concert ou concert verrouillé."
    },
    "back": {
      "buttonKey": "back",
      "label": "Retour",
      "screenKey": "all",
      "styleRole": "secondary",
      "notes": "Retour écran précédent."
    }
  },
  "flow": [
    {
      "mode": "concert",
      "stepOrder": 10,
      "stepKey": "curtain_closed",
      "screenState": "curtain",
      "durationMs": 0,
      "audioRule": "voice",
      "audioKey": "",
      "voiceKey": "concert_intro",
      "recordAction": "none",
      "overlayTextKey": "ready_description",
      "notes": "Rideau fermé, bouton Je suis prêt."
    },
    {
      "mode": "concert",
      "stepOrder": 20,
      "stepKey": "curtain_open",
      "screenState": "hall",
      "durationMs": 1500,
      "audioRule": "none",
      "audioKey": "",
      "voiceKey": "",
      "recordAction": "none",
      "overlayTextKey": "",
      "notes": "Transition simple rideau fermé → salle pour V1."
    },
    {
      "mode": "concert",
      "stepOrder": 30,
      "stepKey": "welcome_applause",
      "screenState": "hall",
      "durationMs": 0,
      "audioRule": "hall_welcome_applause",
      "audioKey": "",
      "voiceKey": "",
      "recordAction": "none",
      "overlayTextKey": "",
      "notes": "Durée prise dans concert_audio selon la salle."
    },
    {
      "mode": "concert",
      "stepOrder": 40,
      "stepKey": "silence_before_record",
      "screenState": "hall",
      "durationMs": 1200,
      "audioRule": "none",
      "audioKey": "",
      "voiceKey": "",
      "recordAction": "none",
      "overlayTextKey": "",
      "notes": "Silence court avant le départ."
    },
    {
      "mode": "concert",
      "stepOrder": 50,
      "stepKey": "start_recording",
      "screenState": "recording",
      "durationMs": 0,
      "audioRule": "optional_voice",
      "audioKey": "",
      "voiceKey": "recording_started",
      "recordAction": "start",
      "overlayTextKey": "recording_hint",
      "notes": "Début enregistrement du jeu uniquement."
    },
    {
      "mode": "concert",
      "stepOrder": 60,
      "stepKey": "recording",
      "screenState": "recording",
      "durationMs": 0,
      "audioRule": "none",
      "audioKey": "",
      "voiceKey": "",
      "recordAction": "recording",
      "overlayTextKey": "recording_hint",
      "notes": "L’élève joue, bouton Fin visible."
    },
    {
      "mode": "concert",
      "stepOrder": 70,
      "stepKey": "stop_recording",
      "screenState": "hall",
      "durationMs": 0,
      "audioRule": "none",
      "audioKey": "",
      "voiceKey": "",
      "recordAction": "stop",
      "overlayTextKey": "",
      "notes": "Arrêt immédiat quand l’élève appuie sur Fin."
    },
    {
      "mode": "concert",
      "stepOrder": 80,
      "stepKey": "final_applause",
      "screenState": "hall",
      "durationMs": 0,
      "audioRule": "hall_final_applause",
      "audioKey": "",
      "voiceKey": "",
      "recordAction": "none",
      "overlayTextKey": "",
      "notes": "Applaudissements finaux hors enregistrement."
    },
    {
      "mode": "concert",
      "stepOrder": 90,
      "stepKey": "end_screen",
      "screenState": "concert_end",
      "durationMs": 0,
      "audioRule": "none",
      "audioKey": "",
      "voiceKey": "",
      "recordAction": "none",
      "overlayTextKey": "concert_end_title",
      "notes": "Réécouter / Sauvegarder / Partager / Retour."
    },
    {
      "mode": "studio",
      "stepOrder": 10,
      "stepKey": "studio_home",
      "screenState": "studio",
      "durationMs": 0,
      "audioRule": "voice",
      "audioKey": "",
      "voiceKey": "studio_intro",
      "recordAction": "none",
      "overlayTextKey": "studio_description",
      "notes": "Accueil studio."
    },
    {
      "mode": "studio",
      "stepOrder": 20,
      "stepKey": "start_recording",
      "screenState": "recording",
      "durationMs": 0,
      "audioRule": "none",
      "audioKey": "",
      "voiceKey": "",
      "recordAction": "start",
      "overlayTextKey": "recording_hint",
      "notes": "L’élève démarre quand il veut."
    },
    {
      "mode": "studio",
      "stepOrder": 30,
      "stepKey": "recording",
      "screenState": "recording",
      "durationMs": 0,
      "audioRule": "none",
      "audioKey": "",
      "voiceKey": "",
      "recordAction": "recording",
      "overlayTextKey": "recording_hint",
      "notes": "Bouton Fin visible."
    },
    {
      "mode": "studio",
      "stepOrder": 40,
      "stepKey": "stop_recording",
      "screenState": "studio_end",
      "durationMs": 0,
      "audioRule": "none",
      "audioKey": "",
      "voiceKey": "",
      "recordAction": "stop",
      "overlayTextKey": "studio_end_title",
      "notes": "Fin de prise studio."
    },
    {
      "mode": "studio",
      "stepOrder": 50,
      "stepKey": "end_screen",
      "screenState": "studio_end",
      "durationMs": 0,
      "audioRule": "none",
      "audioKey": "",
      "voiceKey": "",
      "recordAction": "none",
      "overlayTextKey": "studio_end_title",
      "notes": "Réécouter / Recommencer / Garder cette prise / Retour."
    }
  ],
  "assetsManifest": [
    {
      "assetType": "image",
      "assetKey": "curtain_01",
      "sourcePath": "halls/curtain_01.webp",
      "format": "webp",
      "sizeOrDuration": "1920×1080 px",
      "notes": "Rideau début enregistrement",
      "exists": true
    },
    {
      "assetType": "image",
      "assetKey": "studio_01",
      "sourcePath": "halls/studio_01.webp",
      "format": "webp",
      "sizeOrDuration": "1920×1080 px",
      "notes": "Fond du studio.",
      "exists": true
    },
    {
      "assetType": "image",
      "assetKey": "hall_01",
      "sourcePath": "halls/hall_01_salle_communale.webp",
      "format": "webp",
      "sizeOrDuration": "1920×1080 px",
      "notes": "Salle communale.",
      "exists": true
    },
    {
      "assetType": "image",
      "assetKey": "hall_02",
      "sourcePath": "halls/hall_02_petit_theatre.webp",
      "format": "webp",
      "sizeOrDuration": "1920×1080 px",
      "notes": "Petit théâtre.",
      "exists": true
    },
    {
      "assetType": "image",
      "assetKey": "hall_03",
      "sourcePath": "halls/hall_03_grande_salle.webp",
      "format": "webp",
      "sizeOrDuration": "1920×1080 px",
      "notes": "Grande salle / auditorium.",
      "exists": true
    },
    {
      "assetType": "image",
      "assetKey": "hall_04",
      "sourcePath": "halls/hall_04_stade.webp",
      "format": "webp",
      "sizeOrDuration": "1920×1080 px",
      "notes": "Stade / grande scène.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "applause_small_welcome",
      "sourcePath": "audio/applause_small_welcome.ogg",
      "format": "ogg",
      "sizeOrDuration": "≈2.5 s",
      "notes": "Accueil petite salle.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "applause_small_final",
      "sourcePath": "audio/applause_small_final.ogg",
      "format": "ogg",
      "sizeOrDuration": "≈3.5 s",
      "notes": "Final petite salle.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "applause_medium_welcome",
      "sourcePath": "audio/applause_medium_welcome.ogg",
      "format": "ogg",
      "sizeOrDuration": "≈3 s",
      "notes": "Accueil théâtre.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "applause_medium_final",
      "sourcePath": "audio/applause_medium_final.ogg",
      "format": "ogg",
      "sizeOrDuration": "≈4.5 s",
      "notes": "Final théâtre.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "applause_large_welcome",
      "sourcePath": "audio/applause_large_welcome.ogg",
      "format": "ogg",
      "sizeOrDuration": "≈3.5 s",
      "notes": "Accueil grande salle.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "applause_large_final",
      "sourcePath": "audio/applause_large_final.ogg",
      "format": "ogg",
      "sizeOrDuration": "≈5.5 s",
      "notes": "Final grande salle.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "applause_stadium_welcome",
      "sourcePath": "audio/applause_stadium_welcome.ogg",
      "format": "ogg",
      "sizeOrDuration": "≈4 s",
      "notes": "Accueil stade.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "applause_stadium_final",
      "sourcePath": "audio/applause_stadium_final.ogg",
      "format": "ogg",
      "sizeOrDuration": "≈6.5 s",
      "notes": "Final stade.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "module_intro",
      "sourcePath": "audio/module_intro.ogg",
      "format": "ogg",
      "sizeOrDuration": "voix prof",
      "notes": "Accueil module.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "studio_intro",
      "sourcePath": "audio/studio_intro.ogg",
      "format": "ogg",
      "sizeOrDuration": "voix prof",
      "notes": "Accueil studio.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "concert_intro",
      "sourcePath": "audio/concert_intro.ogg",
      "format": "ogg",
      "sizeOrDuration": "voix prof",
      "notes": "Accueil concert.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "concert_locked",
      "sourcePath": "audio/concert_locked.ogg",
      "format": "ogg",
      "sizeOrDuration": "voix prof",
      "notes": "Concert verrouillé.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "concert_done_today",
      "sourcePath": "audio/concert_done_today.ogg",
      "format": "ogg",
      "sizeOrDuration": "voix prof",
      "notes": "Concert déjà fait aujourd’hui.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "play_by_heart",
      "sourcePath": "audio/play_by_heart.ogg",
      "format": "ogg",
      "sizeOrDuration": "voix prof",
      "notes": "Choix par cœur.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "play_with_score",
      "sourcePath": "audio/play_with_score.ogg",
      "format": "ogg",
      "sizeOrDuration": "voix prof",
      "notes": "Choix partition papier.",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "concert_saved",
      "sourcePath": "audio/concert_saved.ogg",
      "format": "ogg",
      "sizeOrDuration": "voix prof",
      "notes": "Sauvegarde enregistrement concert",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "recording_started",
      "sourcePath": "audio/recording_started.ogg",
      "format": "ogg",
      "sizeOrDuration": "voix prof",
      "notes": "Démarrage enregistrement",
      "exists": true
    },
    {
      "assetType": "audio",
      "assetKey": "studio_saved",
      "sourcePath": "audio/studio_saved.ogg",
      "format": "ogg",
      "sizeOrDuration": "voix prof",
      "notes": "Sauvegarde enregistrement studio",
      "exists": true
    }
  ],
  "copiedAssets": [
    "audio/applause_large_final.ogg",
    "audio/applause_large_welcome.ogg",
    "audio/applause_medium_final.ogg",
    "audio/applause_medium_welcome.ogg",
    "audio/applause_small_final.ogg",
    "audio/applause_small_welcome.ogg",
    "audio/applause_stadium_final.ogg",
    "audio/applause_stadium_welcome.ogg",
    "audio/concert_done_today.ogg",
    "audio/concert_intro.ogg",
    "audio/concert_locked.ogg",
    "audio/concert_saved.ogg",
    "audio/module_intro.ogg",
    "audio/play_by_heart.ogg",
    "audio/play_with_score.ogg",
    "audio/recording_started.ogg",
    "audio/studio_intro.ogg",
    "audio/studio_saved.ogg",
    "halls/curtain_01.webp",
    "halls/hall_01_salle_communale.webp",
    "halls/hall_02_petit_theatre.webp",
    "halls/hall_03_grande_salle.webp",
    "halls/hall_04_stade.webp",
    "halls/studio_01.webp"
  ]
}