TheCoolHippo/fm3-syx-editor

Lire, analyser et modifier les fichiers de sauvegarde de presets Fractal FM3 (.syx) sans FM3-Edit – extraire un preset stocké via USB, lister sa grille/blocs/canaux/scènes/modificateurs et chaque paramètre de bloc, changer les valeurs, échanger les types de blocs, renommer, recibler vers un autre slot, comparer deux sauvegardes, et renvoyer le fichier dans un slot.

Qu'est-ce que fm3-syx-editor ?

Cet outil vous permet de manipuler directement les fichiers `.syx` du Fractal FM3, sans avoir besoin de FM3-Edit. Il offre des commandes pour extraire, analyser et modifier tous les aspects d'un preset : grille, blocs, canaux, scènes, modificateurs, paramètres individuels, etc. Vous pouvez également comparer deux presets, les renommer, les recibler vers un autre slot, et même pousser les modifications vers l'unité via USB. L'outil interprète les valeurs d'affichage (comme `40` Hz ou `-12` dB) et gère les échelles linéaires, logarithmiques et les énumérations. Il est conçu pour fonctionner sans FM3-Edit, en communiquant directement avec le FM3 via USB (port COM7 par défaut). Cependant, certaines opérations sont dangereuses : pousser un preset vers le FM3 écrase les données existantes et l'outil vous demandera toujours confirmation. Une vérification du processeur (CPU) est automatiquement effectuée après l'ajout de blocs lourds pour rester sous la limite des 80 %. L'outil prend en charge également les paramètres globaux (via `fm3sys.mjs`), les footswitch layouts (via `fm3fc.mjs`) et les per-preset switches (via `fm3syx.mjs pp/ppset` et `fcset.mjs pp`).

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/TheCoolHippo/fm3-syx-editor/tree/HEAD

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Éditeur .syx FM3

Un script fait tout : scripts/fm3syx.mjs. Il réutilise le codec livré avec mcp-midi-control v0.8.0, donc exécutez-le avec le node de cette installation :

N="$LOCALAPPDATA/mcp-midi-control/mcp-midi-control-v0.8.0/node.exe"
"$N" scripts/fm3syx.mjs <commande> ...

Commandes

commanderôle
pull <slot> <out.syx>lire un preset STOCKÉ depuis le FM3 via COM7 (sans FM3-Edit)
info <fichier>slot, nom, scènes, lignes de grille, types de blocs par canal, canal/scène bypass, modificateurs
params <fichier> <Bloc[#n]> [ch]tous les paramètres d'un bloc : nom, mot brut, valeur affichée
get <fichier> <Bloc> <ch> <PARAM>une valeur
set <entrée> <sortie> <Bloc> <ch> <PARAM> <val> ...val = valeur affichée comme le FM3 la montre (40 Hz, -12 dB, 3.5), un nom d'option (post, "Analog Stereo"), ou raw:N
scenename <entrée> <sortie> <1-8> <nom>nom de scène (31 caractères)
`cell <entrée> [BlocShunt
add <entrée> <sortie> <ligne> <col> <Bloc[#n]> [from=1,2]nouveau bloc avec les défauts du FM3 (defaults/<eid>.bin)
`midi <entrée> <scène> [pc:ch:valcc:ch:num:val
midishow <fichier>Lignes MIDI de toutes les scènes
remove <entrée> <sortie> <Bloc[#n]>supprimer un bloc (cellules de grille + enregistrement)
scenectl <entrée> <sortie> <1-4> <%> [x8]Valeur du Contrôleur de scène 1-4 par scène (une valeur = les 8 scènes)
mods <fichier> [all] / mod <entrée> <sortie> <1-32> CHAMP=val ...les 32 modificateurs : CTRLID (nom source), EFFECTID (bloc), PARAM (nom param), MIN/MAX/STARTPT/MIDPT/ENDPT (N% ou brut), SLOPE, DAMPING, AUTOENGAGE, PCRESET, SCALE, OFFSET…
type <entrée> <sortie> <Bloc> <ch> <nom> / types <Bloc>échanger / lister les types (Amp, Reverb, Drive, Delay, Chorus, Comp, Filter, Flanger, Phaser, Wah, Tremolo)
rename <entrée> <sortie> <nom>nom du preset
slot <entrée> <sortie> <N>recibler le fichier vers le slot N (en-tête + somme de contrôle)
diff <a> <b>différences par paramètre, par nom
learn <fichier> <Bloc> <ch> <PARAM> <affichage>ajouter un point d'étalonnage brut→affichage dans calib.json
node cpu.mjs [preset]charge CPU (DSP) en direct du preset chargé, comme FM3-Edit l'affiche (bascule d'abord si un preset est donné). Code de sortie 2 à 80 % ou plus
push <fichier> --yesstocker le fichier dans le slot de son en-tête

PARAM = nom catalogue (PITCH_FEEDBACK1, ou juste FEEDBACK1) ou l'étiquette FM3-Edit (Feedback 1). Bloc#2 sélectionne le deuxième bloc de ce nom (Return#2).

Règles (ne jamais enfreindre)

  • Slots protégés : listez-les dans scripts/fm3-local.json ({"protected":[383]}, git-ignoré) ou FM3_PROTECTED ; push et harvest.mjs les refusent.
  • push = sauvegarder sur l'unité : demandez à l'utilisateur d'abord, à chaque fois, et dites quel slot. Exécutez pull du slot cible d'abord pour avoir une sauvegarde de ce qui est écrasé.
  • Le port FM3 (COM7, remplacé par FM3_PORT) est exclusif : fermez FM3-Edit ou utilisez Réglages > Pause Communications d'abord ; aucun serveur mcp-midi-control ne peut le tenir.
  • Ne jamais sonder le bloc FC (effect id 199).
  • CPU : Fractal dit jamais au-dessus de 80 %. Après chaque add + push, chargez le preset et exécutez cpu.mjs ; à 80 % ou plus, retirez/simplifiez les blocs avant de le garder. Ajoutez les blocs lourds (Amp, Cab, Pitch, Reverb) un par un.
  • Travaillez sur des copies (set entrée sortie) : gardez l'original extrait intact.

Comment le fichier est construit (vérifié 2026-11-03)

  • .syx = en-tête 0x77 (octets 6-7 = slot en 14 bits, octet 11 = somme de contrôle XOR) + 8 × 0x78 morceaux (patch compressé, vérifié CRC) + pied de page 0x79 XOR. 24 680 octets par preset FM3. Le codec re-compresse et recalcule CRC + pied de page à chaque écriture.
  • Corps décompressé : chaîne de blocs ; chaque bloc a un en-tête (23 mots : canaux de scène, bypass de scène, …) puis un tableau de paramètres par canal : lignes canaux × cols mots.
  • Index de mot = FM3 paramId − 6 (paramIds de fractal-midi/dist/gen3/fm3, extrait de FM3-Edit). Vérifié sur Amp (drive/bass/mid/treble/master/presence/depth), Pitch (shift/pan/feedback/mix/level/splice) et Delay (time). Les paramIds 0-5 vivent dans les mots d'en-tête 17-22 (même formule fonctionne).
  • Les valeurs sont des uint16 bruts 0..65534 (comme le fil live), SAUF les paramètres entiers stockés comme des entiers simples : types/modèles, énumérations, divisions de tempo, semitons (signés : 12 = +12, 0 = 0).
  • Échelles vérifiées dans FM3-Edit (2026-11-03), stockées dans calib.json à côté du script canonique :
    • linéaire : pourcentage, bipolar_percent, bouton 0-10, Pitch feedback 0..100 %, Pitch detune −50..+50 ct, niveaux −80..+20 dB (52427 = 0 dB), Delay FEED −100..+100 %.
    • log : Hz = min·(max/min)^(raw/65534) en utilisant displayMin/Max du catalogue (Pitch high cut 200..20000 Hz, 42631 = 4000 Hz). Le script fait cela automatiquement pour l'unité hz.
    • points : Delay TIME 2044 = 500 ms ; Reverb TIME 2034 = 3.20 s, 5085 = 7.85 s.
    • énumération tempo (DTEMPO/TEMPO) : 0 None, 11 1/8, 12 1/8 dot, 13 1/4 trip, 14 1/4, 15 1/4 dot.
    • Pitch TYPE (paramId 0) : 8 = Crystal Echoes. Delay type = DELAY_MODEL (pas DELAY_TYPE) : 13 = Ambient Stereo, 2 = Analog Mono, 24 = Wandering Delays (types Delay).
    • Cab → DynaCab : CABINET_MODE raw:1 + DYNACAB_TYPE1/2 raw:<id> (types DynaCab ; FM3-Edit montre id+1, 29 = "30: 2x12 Texas Star"), AUTO_ALIGN raw:1. Échelle inconnue ? Définissez une estimation brute, poussez, lisez FM3-Edit, ajoutez le point (learn).
  • En-tête de bloc : mot −1 = canal scène-1, mots 0..6 = canaux scènes 2-8 (0=A..3=D), mots 7..14 = bypass scènes 1-8 (1 = bypassé) ; la commande scene les édite.
  • Le FM3 stocke un dump poussé directement dans le slot de son en-tête (pas de sauvegarde supplémentaire).

Couverture (2026-11-03)

  • Bloc de contrôle = tout le menu Controllers (tempo, LFO 1/2, ADSR 1/2, séquenceur, enveloppe, Manuel 1-5, Contrôleurs de scène) : famille CONTROLLERS, eid 2, 130 paramètres × 4 canaux, juste après la grille (corps 0x1c4). Éditez-le comme n'importe quel bloc : set f out Control A TEMPO raw:120 (tempo = BPM simple), params f Control A. Le décalage du contrôleur de scène du codec est faux (décalé de 9 mots) ; utilisez scenectl.
  • Vérifié sur le FM3 dans FM3-Edit : noms de scène, cellules/câbles de grille, add/remove, modificateur (mod 2 CTRLID="LFO 1A" EFFECTID=Delay PARAM=MIX MIN=10% MAX=40% a fait bouger le mix Delay), Contrôleurs de scène, tempo.
  • Mètre de sortie live (sub 0x2E parseGen3LiveMeters output_left/right) renvoie des valeurs aléatoires sans signal : pas utilisable. La sonie de scène doit être mesurée par un enregistrement USB de re-amp à la place.
  • scales.json : 1 390 paramètres de 34 familles de blocs étalonnés par rapport au texte affiché du FM3 lui-même (calibrate.mjs balaie chaque paramètre en direct et lit l'écho ; calfix.mjs deuxième passe). Les paramètres continus sont ajustés lin/log ou interpolés ; les énumérations mappent les noms dans les deux sens. calib.json (vérifié manuellement) l'emporte sur lui. Non couverts : paramètres sans texte (certains paramètres MIX/graphiques, 73 entrées vides), Plex (le FM3 a refusé de le placer).
  • Chaque enregistrement dans le corps = mot eid + 5 mots + en-tête 23 mots + mots cols×lignes. Ordre : 32 enregistrements MOD (eid 3..34 = modificateurs 1..32), les blocs, puis eid 201 et eid 200 (données de footswitch par preset, 1525 mots : connaissance en lecture seule, ne jamais sonder en direct). Le codec nomme les blocs par taille et en obtient certains de travers (Input/Output affichés comme Vol/Pan/PEQ) ; fm3syx les re-étiquette.
  • Un bloc placé uniquement dans la grille apparaît avec TOUS les paramètres à 0 (niveau −80 dB) : utilisez toujours add, qui insère l'enregistrement par défaut récolté du FM3 (harvest.mjs <scratchSlot> <restore.syx> [eids], un bloc par lot avec BATCH=1 : placer plusieurs blocs lourds à la fois a gelé le FM3 une fois).
  • Un slot jamais sauvegardé (<EMPTY>) utilise un autre conteneur que le codec ne peut pas décoder : extrayez-le après un stockage.

Fonctionne sans FM3-Edit

Tout ici parle au FM3 directement via USB (COM7 par défaut, définissez FM3_PORT si le port a changé) : pull, push, switch.mjs, cpu.mjs, fm3ctl.mjs (sélection de scène, boutons du looper), levels.py (sonie de scène par enregistrement USB). FM3-Edit n'est PAS nécessaire. Vérifiez un changement sans lui : push → pull à nouveau → cmp/diff (0 octets = le FM3 a stocké exactement ce qui a été envoyé) → switch.mjs <autre> puis switch.mjs <slot> pour le charger → cpu.mjs (< 80 %). FM3-Edit a seulement été utilisé lors de la construction de la compétence, pour vérifier visuellement les résultats.

Réglages globaux (Setup) — fm3sys.mjs + sendsys.mjs (vérifié 2026-11-03)

Les globaux ne sont pas dans les presets. Ils voyagent comme une banque système entière de 197 ko, 66 trames. Lisez-la avec node pullsystem.mjs <out.syx> (FM3-Edit fermé, lecture seule, requête fn 0x43 comme envoyée par Fractal-Bot, capturée par USBPcap 2026-11-06 ; sortie identique octet pour octet à un FM3-<date>-system+gb+fc.syx de Fractal-Bot). La banque contient deux copies (mots 0.. et 32768.., chacune avec son propre en-tête et CRC). Le FM3 écrit la copie la PLUS ANCIENNE et augmente un compteur de sauvegarde à copie + 14874, donc la copie la plus récente alterne. fm3sys.mjs et fm3fc.mjs écrivent chaque édition dans les deux copies.

  • Format : en-tête fn 0x51, 64 × morceaux fn 0x52 (index 2 octets + 1024 mots, 3 septets par mot), pied de page fn 0x53 (XOR de tous les mots). PAS compressé. Mot 0 = 0x1008, mot 1 = 0xAA55, mot 2 = CRC-CCITT (poly 0x1021, init 0xAA55) sur les octets 8 .. 8 + mot 3, mot 3 = longueur des données (29760). Paramètre de catalogue GLOBAL p = mot 4 + p (IN1_SOURCE 61, MIDI_CHAN 68 (base 0), LINEFREQ 112, DISPLAY_OFFSET 72…).
  • fm3sys.mjs get <fichier> IN1_SOURCE / set <entrée> <sortie> IN1_SOURCE 1 / diff a b / check fichier (corrige CRC, pied de page et sommes de contrôle des trames ; un aller-retour inchangé est identique octet pour octet).
  • Tables MIDI/Remote (vérifié 2026-11-05 par une écriture, une relecture et des tests MC8) : Mot Bypass 138 + id bloc, Mot Canal 394 + id bloc, External n mot 1305 + n ; 128 = aucun. Éditez avec fm3sys.mjs setword <entrée> <sortie> <mot> <brut>.... Sources de modificateurs External 6..16 = ids 19..29.
  • sendsys.mjs <fichier> --yes écrit la banque entière (le FM3 répond fn 0x64 code 0 par trame). Testé : Display Offset 1 → 0 par fichier, puis une nouvelle sauvegarde correspondait exactement au fichier envoyé.
  • Règles : commencez toujours par une sauvegarde FRAÎCHE (elle contient tous les globaux + dispositions FC) ; demandez à l'utilisateur avant d'envoyer ; gardez la sauvegarde originale pour restaurer. Ne jamais sonder pour d'autres codes de requête.

Dispositions de footswitch — fm3fc.mjs (stocké) + fcset.mjs (live) (vérifié 2026-11-08)

Les 8 dispositions + Disposition Maître sont dans la banque système, donc aucun sondage du bloc FC n'est nécessaire. L'index de switch i = disposition × 12 + vue × 3 + switch (base 0 ; disposition 8 = Disposition Maître). Décalages dans une copie :

ChampTapHold
catégorie (0 Non assigné, 1 Banque, 2 Preset, 3 Scène, 4 Effet, 5 Utilitaire, 6 Disposition, 7 Switch de contrôle, 8 Looper, 9 Par preset, 10 Vue, 11 Setlist, 12 Chanson, 13 Section de chanson)1658 + i2630 + i
fonction (ordre du menu FM3-Edit : Utilitaire 0 Accordeur 1 Tap Tempo 2 Niveau Amp+Sauvegarder 3 Révéler Hold 4 Niveau Scène+Sauvegarder ; Effet 0 Bypass 1 Sélecteur Canal 2 Bascule Canal 3 Inc/Dec Canal)1766 + i2738 + i
mode d'étiquette (Scène : 0 Nom, 1 Numéro, 2 Personnalisé ; Effet : 0 Nom long, 1 Nom court, 2 Nom long + Canal, 3 Nom court + Canal, 4 Personnalisé)1874 + i2846 + i
paramètres, 6 mots (numéro de preset/scène/disposition base 1 ; Effet = [bloc, canal] ; Inc/Dec = [pas, wrap, inférieur, supérieur], pas 65535 = -1)1982 + 6i2954 + 6i
étiquette personnalisée, 10 caractères + 03623 + 11i4811 + 11i
Noms de disposition à 1370 + 32 × disposition ; couleur à 6000 + i (0 défaut, 1 rouge, 2 orange…).
Les numéros de bloc d'effet suivent une liste interne alphabétique avec des entrées cachées ; le tableau est dans fm3fc.mjs
(vérifié : Amp 1 0, Cab 1 1, Chorus 1 2, Comp 1 4, Delay 1 7, Drive 1 9, Drive 2 10, Enhance 1 11, Filter 1 17,
Flanger 1 21, Gate 1 25, GEQ 1 27, In 2 30, MultDly 1 38, Phaser 1 45, Pitch 1 47, Plex 1 48, Reverb 1 51,
Rotary 1 53, TremPan 1 57, Vol/Pan 1 59, Vol/Pan 2 60, Wah 1 61).
  • fm3fc.mjs show <system.syx> [disposition] liste chaque switch ; set <entrée> <sortie> <disposition> <vue> <switch> tap=Effect param="Wah 1" ... édite les deux copies. Un fichier envoyé avec sendsys.mjs est stocké mais le FM3 en cours conserve ses dispositions en RAM jusqu'à un cycle d'alimentation (et toute sauvegarde système avant cela écrase l'édition).
  • Live, pas de redémarrage : FM3-Edit édite un paramètre du bloc 199 avec fn 0x01 sub 0x09 : F0 00 01 74 11 01 09 00 47 01 <pid lo> <pid hi> <float32 en 5 septets, LSB en premier> 00 00 00 00 <xor> F7. L'id du paramètre = décalage stocké − 1658 (catégorie tap i, fonction tap 108 + i, paramètres tap 324 + 6i + k, catégorie hold 972 + i, mode étiquette tap 216 + i) ; à partir de la zone de texte, les ids sont décalés de +276 : texte personnalisé tap 2241 + 11i (un paramètre par caractère, valeur = code du caractère, 0 après la fin), couleur 4618 + i. fcset.mjs text <disposition> <vue> <switch> <TEXTE> [mode=N] renomme un switch en direct. fcset.mjs <pid> <valeur> ... reconstruit les messages capturés octet par octet ; le FM3 applique le changement immédiatement et le sauvegarde lui-même. Capturé avec USBPcap depuis FM3-Edit.
  • Ne définissez QUE les ids de paramètres connus. N'envoyez jamais de GET (sub 0x1a/0x1b) vers le bloc 199 pour des ids que vous n'avez pas vus FM3-Edit utiliser : la lecture de paramètres FC inconnus a gelé un FM3.

Switches par preset — fm3syx.mjs pp/ppset (fichier) + fcset.mjs pp (live) (vérifié 2026-11-08)

Ils sont dans le preset lui-même : enregistrement eid 200, données = début d'enregistrement + 23 mots. Les décalages à partir de là (j = numéro PP − 1) sont également les ids de paramètres live sur le bloc 200 :

ChampTapHold
catégoriej216 + j
fonction24 + j240 + j
mode d'étiquette48 + j264 + j
paramètres (6)72 + 6j288 + 6j
texte personnalisé (11)432 + 11j696 + 11j

Table de remplacement de disposition à 960 + i (i = disposition × 12 + vue × 3 + switch, valeur = PP − 1, 65535 = aucun) ; couleur 1069 + j. Les codes sont les mêmes que les dispositions (tableaux dans fcmap.mjs).

  • fm3syx.mjs pp <fichier> les liste ; ppset <entrée> <sortie> <PP> clef=valeur ... ou ppset ... override L V S PP|none édite un fichier (une édition scriptée a reproduit le fichier de FM3-Edit octet pour octet).
  • fcset.mjs p

…

[Section tronquée pour la traduction]

Skills associés