É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
| commande | rô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> [Bloc | Shunt |
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:val | cc: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> --yes | stocker 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é) ouFM3_PROTECTED;pushetharvest.mjsles refusent. push= sauvegarder sur l'unité : demandez à l'utilisateur d'abord, à chaque fois, et dites quel slot. Exécutezpulldu 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écutezcpu.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 :
lignescanaux ×colsmots. - 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
sceneles é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) ; utilisezscenectl. - 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
parseGen3LiveMetersoutput_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.mjsbalaie chaque paramètre en direct et lit l'écho ;calfix.mjsdeuxiè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 avecBATCH=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 :
| Champ | Tap | Hold |
|---|---|---|
| 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 + i | 2630 + 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 + i | 2738 + 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 + i | 2846 + 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 + 6i | 2954 + 6i |
| étiquette personnalisée, 10 caractères + 0 | 3623 + 11i | 4811 + 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é avecsendsys.mjsest 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 :
| Champ | Tap | Hold |
|---|---|---|
| catégorie | j | 216 + j |
| fonction | 24 + j | 240 + j |
| mode d'étiquette | 48 + j | 264 + j |
| paramètres (6) | 72 + 6j | 288 + 6j |
| texte personnalisé (11) | 432 + 11j | 696 + 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 ...ouppset ... 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]