CommunityProgramación y desarrollogithub.com

Editor de .syx de FM3

Lee, analiza y edita archivos de guardado de presets de Fractal FM3 (.syx) sin necesidad de FM3-Edit: extrae un preset almacenado por USB, lista su cuadrícula/bloques/canales/escenas/modificadores y cada parámetro de bloque, cambia valores, intercambia tipos de bloque, renombra, redirige a otra ranura, compara dos guardados y envía el archivo de vuelta a una ranura. Úsalo siempre que el usuario pida mirar dentro, comparar, copiar o modificar un preset de FM3 o un archivo .syx, construir un parche "por archivo", o cuando controlar FM3-Edit desde el escritorio sea demasiado lento.

¿Qué es Editor de .syx de FM3?

Este skill proporciona una suite completa de herramientas de línea de comandos para trabajar directamente con archivos de presets de Fractal FM3 (.syx) sin depender de la aplicación de escritorio FM3-Edit. Permite extraer, inspeccionar, modificar, comparar y volver a cargar presets a través de USB, ofreciendo control granular sobre cada parámetro, bloque, canal, escena, modificador y configuración MIDI. El skill se compone principalmente del script `fm3syx.mjs`, que maneja la extracción y manipulación de presets, y scripts adicionales como `fm3sys.mjs` para la configuración global del sistema, `fm3fc.mjs` para diseños de footswitch, y `cpu.mjs` para monitorear la carga de la CPU del DSP. Está verificado para trabajar con el FM3 real, garantizando que las operaciones de lectura/escritura sean byte a byte idénticas a las realizadas por FM3-Edit. El skill incluye reglas estrictas de seguridad, como la protección de ranuras, la necesidad de confirmación del usuario antes de sobrescribir datos, y la prohibición de superar el 80% de uso de CPU del DSP para evitar inestabilidad.

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

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿Qué hace Editor de .syx de FM3?

Un solo script lo hace todo: scripts/fm3syx.mjs. Reutiliza el códec incluido con mcp-midi-control v0.8.0, así que ejecútalo con el node de esa instalación:

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

Comandos

comandoqué hace
pull <ranura> <salida.syx>lee un preset ALMACENADO del FM3 a través de COM7 (sin FM3-Edit)
info <archivo>ranura, nombre, escenas, filas de cuadrícula, tipos de bloque por canal, escena de canal/bypass, modificadores
params <archivo> <Bloque[#n]> [can]cada parámetro de un bloque: nombre, palabra bruta, valor mostrado
get <archivo> <Bloque> <can> <PARAM>un valor
set <entrada> <salida> <Bloque> <can> <PARAM> <val> ...val = valor mostrado como lo muestra el FM3 (40 Hz, -12 dB, 3.5), un nombre de opción (post, "Analog Stereo") o raw:N
scenename <entrada> <salida> <1-8> <nombre>nombre de escena (31 caracteres)
cell <entrada> <salida> <fila> <col> [Bloque|Shunt|vacío] [desde=1,2|ninguno]celda de cuadrícula + qué filas la alimentan (cables). Filas/columnas basadas en 1 como FM3-Edit
add <entrada> <salida> <fila> <col> <Bloque[#n]> [desde=1,2]nuevo bloque con los valores predeterminados del propio FM3 (defaults/<eid>.bin)
midi <entrada> <salida> <escena> [pc:can:val|cc:can:num:val|-]...Filas MIDI de escena de una escena; añade el bloque con add ... MIDI (eid 190, sin cable de cuadrícula). Verificado: un preset reconstruido era byte a byte idéntico a un guardado de FM3-Edit, y probado en cambio de escena y carga de preset
midishow <archivo>Filas MIDI de escena de todas las escenas
remove <entrada> <salida> <Bloque[#n]>elimina un bloque (celdas de cuadrícula + registro)
scenectl <entrada> <salida> <1-4> <%> [x8]Controlador de Escena 1-4 valor por escena (un valor = las 8 escenas)
mods <archivo> [todos] / mod <entrada> <salida> <1-32> CAMPO=val ...los 32 modificadores: CTRLID (nombre de fuente), EFFECTID (bloque), PARAM (nombre de parámetro), MIN/MAX/STARTPT/MIDPT/ENDPT (N% o bruto), SLOPE, DAMPING, AUTOENGAGE, PCRESET, SCALE, OFFSET…
type <entrada> <salida> <Bloque> <can> <nombre> / types <Bloque>intercambia / lista tipos (Amp, Reverb, Drive, Delay, Chorus, Comp, Filter, Flanger, Phaser, Wah, Tremolo)
rename <entrada> <salida> <nombre>nombre del preset
slot <entrada> <salida> <N>redirige el archivo a la ranura N (encabezado + suma de verificación)
diff <a> <b>diferencias por parámetro, por nombre
learn <archivo> <Bloque> <can> <PARAM> <mostrar>añade un punto de calibración bruto→mostrado a calib.json
node cpu.mjs [preset]carga en vivo de CPU (DSP) del preset cargado, como lo muestra FM3-Edit (cambia primero si se da un preset). Código de salida 2 al 80 % o más
push <archivo> --yesalmacena el archivo en la ranura de su encabezado

PARAM = nombre de catálogo (PITCH_FEEDBACK1, o solo FEEDBACK1) o la etiqueta de FM3-Edit (Feedback 1). Bloque#2 elige el segundo bloque con ese nombre (Return#2).

Reglas (nunca romper)

  • Ranuras protegidas: listarlas en scripts/fm3-local.json ({"protected":[383]}, git-ignorado) o FM3_PROTECTED; push y harvest.mjs las rechazan.
  • push = guardar en la unidad: preguntar al usuario primero, cada vez, y decir qué ranura. Ejecuta pull de la ranura de destino primero para tener una copia de seguridad de lo que se sobrescribe.
  • El puerto FM3 (COM7, FM3_PORT lo anula) es exclusivo: cierra FM3-Edit o usa Configuración > Pausar Comunicaciones primero; ningún servidor mcp-midi-control puede retenerlo.
  • Nunca sondear el bloque FC (id de efecto 199).
  • CPU: Fractal dice nunca por encima del 80 %. Después de cada add + push, carga el preset y ejecuta cpu.mjs; al 80 % o más, elimina/simplifica bloques antes de mantenerlo. Añade bloques pesados (Amp, Cab, Pitch, Reverb) uno a la vez.
  • Trabaja sobre copias (set entrada salida): mantén el original extraído intacto.

Cómo se construye el archivo (verificado 2026-11-03)

  • .syx = encabezado 0x77 (bytes 6-7 = ranura como 14 bits, byte 11 = suma de verificación XOR) + 8 × fragmentos 0x78 (parche comprimido, verificado por CRC) + pie de página XOR 0x79. 24,680 bytes por preset de FM3. El códec re-comprime y recalcula CRC + pie de página en cada escritura.
  • Cuerpo descomprimido: cadena de bloques; cada bloque tiene un encabezado (23 palabras: canales de escena, bypass de escena, …) luego un array de parámetros por canal: filas canales × cols palabras.
  • Índice de palabra = FM3 paramId − 6 (paramIds de fractal-midi/dist/gen3/fm3, extraídos de FM3-Edit). Verificado en Amp (drive/bass/mid/treble/master/presence/depth), Pitch (shift/pan/feedback/mix/level/splice) y Delay (time). ParamIds 0-5 viven en las palabras 17-22 del encabezado (la misma fórmula funciona).
  • Los valores son uint16 brutos 0..65534 (igual que el cable en vivo), EXCEPTO los parámetros enteros almacenados como enteros simples: tipos/modelos, enums, divisiones de tempo, semitonos (con signo: 12 = +12, 0 = 0).
  • Escalas verificadas en FM3-Edit (2026-11-03), almacenadas en calib.json junto al script canónico:
    • lineal: porcentaje, bipolar_porcentaje, perilla 0-10, feedback de Pitch 0..100 %, desafinación de Pitch −50..+50 ct, niveles −80..+20 dB (52427 = 0 dB), FEED de Delay −100..+100 %.
    • log: Hz = min·(max/min)^(raw/65534) usando displayMin/Max del catálogo (corte alto de Pitch 200..20000 Hz, 42631 = 4000 Hz). El script hace esto automáticamente para la unidad hz.
    • puntos: TIME de Delay 2044 = 500 ms; TIME de Reverb 2034 = 3.20 s, 5085 = 7.85 s.
    • enum de tempo (DTEMPO/TEMPO): 0 Ninguno, 11 1/8, 12 1/8 con puntillo, 13 1/4 tresillo, 14 1/4, 15 1/4 con puntillo.
    • TYPE de Pitch (paramId 0): 8 = Crystal Echoes. Tipo de Delay = DELAY_MODEL (no 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 muestra id+1, 29 = "30: 2x12 Texas Star"), AUTO_ALIGN raw:1. ¿Escala desconocida? Establece una estimación bruta, pulsa, lee FM3-Edit, añade el punto (learn).
  • Encabezado de bloque: palabra −1 = canal de escena-1, palabras 0..6 = escenas 2-8 canal (0=A..3=D), palabras 7..14 = bypass de escenas 1-8 (1 = puenteado); el comando scene las edita.
  • El FM3 almacena un volcado enviado directamente en la ranura de su encabezado (sin guardado adicional).

Cobertura (2026-11-03)

  • Bloque de control = todo el menú Controladores (tempo, LFO 1/2, ADSR 1/2, secuenciador, envolvente, Manual 1-5, Controladores de Escena): familia CONTROLLERS, eid 2, 130 parámetros × 4 canales, justo después de la cuadrícula (cuerpo 0x1c4). Edítalo como cualquier bloque: set f out Control A TEMPO raw:120 (tempo = BPM simple), params f Control A. El desplazamiento del controlador de escena del códec es incorrecto (desviado por 9 palabras); usa scenectl.
  • Verificado en el FM3 en FM3-Edit: nombres de escena, celdas/cables de cuadrícula, add/remove, modificador (mod 2 CTRLID="LFO 1A" EFFECTID=Delay PARAM=MIX MIN=10% MAX=40% hizo que la mezcla de Delay se moviera), Controladores de Escena, tempo.
  • Medidor de salida en vivo (sub 0x2E parseGen3LiveMeters output_left/right) devuelve valores aleatorios sin señal: no utilizable. El volumen de la escena debe medirse mediante grabación USB de re-amplificación.
  • scales.json: 1,390 parámetros de 34 familias de bloques calibrados contra el texto mostrado del propio FM3 (calibrate.mjs barre cada parámetro en vivo y lee el eco; calfix.mjs segunda pasada). Los parámetros continuos se ajustan lin/log o se interpolan; los enums mapean nombres en ambos sentidos. calib.json (verificado a mano) tiene prioridad. No cubiertos: parámetros sin texto (algunos parámetros MIX/gráfico, 73 entradas vacías), Plex (el FM3 se negó a colocarlo).
  • Cada registro en el cuerpo = palabra eid + 5 palabras + encabezado de 23 palabras + palabras de cols×filas. Orden: 32 registros MOD (eid 3..34 = modificadores 1..32), los bloques, luego eid 201 y eid 200 (datos de footswitch por preset, 1525 palabras: conocimiento de solo lectura, nunca sondearlo en vivo). El códec nombra los bloques por tamaño y algunos los obtiene incorrectamente (Input/Output mostrados como Vol/Pan/PEQ); fm3syx los reetiqueta.
  • Un bloque puesto solo en la cuadrícula aparece con TODOS los parámetros en 0 (nivel −80 dB): usa siempre add, que inserta el registro predeterminado extraído del FM3 (harvest.mjs <ranuraScratch> <restaurar.syx> [eids], un bloque por lote con BATCH=1: colocar muchos bloques pesados a la vez congeló el FM3 una vez).
  • Una ranura nunca guardada (<EMPTY>) usa otro contenedor que el códec no puede decodificar: extráela después de un almacenamiento.

Funciona sin FM3-Edit

Todo aquí habla con el FM3 directamente a través de USB (COM7 por defecto, configura FM3_PORT si el puerto cambió): pull, push, switch.mjs, cpu.mjs, fm3ctl.mjs (selección de escena, botones de looper), levels.py (volumen de escena por grabación USB). NO se necesita FM3-Edit. Verifica un cambio sin él: push → pull de nuevo → cmp/diff (0 bytes = el FM3 almacenó exactamente lo que se envió) → switch.mjs <otro> luego switch.mjs <ranura> para cargarlo → cpu.mjs (< 80 %). FM3-Edit solo se usó mientras se construía el skill, para verificar los resultados.

Configuración Global (Setup) — fm3sys.mjs + sendsys.mjs (verificado 2026-11-03)

Los globales no están en los presets. Viajan como un banco de sistema completo de 197 kB, 66 tramas. Léelo con node pullsystem.mjs <salida.syx> (FM3-Edit cerrado, solo lectura, solicitud fn 0x43 como enviada por Fractal-Bot, capturado por USBPcap 2026-11-06; salida byte a byte idéntica a un FM3-<fecha>-system+gb+fc.syx de Fractal-Bot). El banco contiene dos copias (palabras 0.. y 32768.., cada una con su propio encabezado y CRC). El FM3 escribe la copia MÁS ANTIGUA e incrementa un contador de guardado en copia + 14874, por lo que la copia más reciente alterna. fm3sys.mjs y fm3fc.mjs escriben cada edición en ambas copias.

  • Formato: encabezado fn 0x51, 64 × fragmentos fn 0x52 (índice de 2 bytes + 1024 palabras, 3 septetos por palabra), pie de página fn 0x53 (XOR de todas las palabras). NO comprimido. Palabra 0 = 0x1008, palabra 1 = 0xAA55, palabra 2 = CRC-CCITT (poli 0x1021, init 0xAA55) sobre los bytes 8 .. 8 + palabra 3, palabra 3 = longitud de datos (29760). Parámetro p del catálogo GLOBAL = palabra 4 + p (IN1_SOURCE 61, MIDI_CHAN 68 (basado en 0), LINEFREQ 112, DISPLAY_OFFSET 72…).
  • fm3sys.mjs get <archivo> IN1_SOURCE / set <entrada> <salida> IN1_SOURCE 1 / diff a b / check archivo (corrige CRC, pie de página y sumas de verificación de tramas; un viaje de ida y vuelta sin cambios es byte a byte idéntico).
  • Tablas MIDI/Remoto (verificado 2026-11-05 mediante una escritura, una lectura de retorno y pruebas MC8): Palabra de bypass 138 + id de bloque, Palabra de canal 394 + id de bloque, Palabra de Externo n 1305 + n; 128 = ninguno. Edita con fm3sys.mjs setword <entrada> <salida> <palabra> <raw>.... Fuentes de modificador Externo 6..16 = ids 19..29.
  • sendsys.mjs <archivo> --yes escribe todo el banco (el FM3 responde fn 0x64 código 0 por trama). Probado: Display Offset 1 → 0 por archivo, luego una copia de seguridad fresca coincidió exactamente con el archivo enviado.
  • Reglas: siempre comenzar desde una copia de seguridad RECIENTE (contiene todos los globales + diseños FC); preguntar al usuario antes de enviar; mantener la copia de seguridad original para restaurar. Nunca sondear otros códigos de solicitud.

Diseños de Footswitch — fm3fc.mjs (almacenado) + fcset.mjs (en vivo) (verificado 2026-11-08)

Los 8 diseños + Diseño Maestro están en el banco del sistema, por lo que no se necesita sondear bloques FC. El índice de interruptor i = diseño × 12 + vista × 3 + interruptor (basado en 0; diseño 8 = Diseño Maestro). Desplazamientos en una copia:

CampoTapHold
categoría (0 No asignado, 1 Banco, 2 Preset, 3 Escena, 4 Efecto, 5 Utilidad, 6 Diseño, 7 Control Switch, 8 Looper, 9 Por-Preset, 10 Vista, 11 Lista de canciones, 12 Canción, 13 Sección de canción)1658 + i2630 + i
función (orden del menú FM3-Edit: Utilidad 0 Afinador 1 Tap Tempo 2 Nivel de Amp+Guardar 3 Revelar Mantener 4 Nivel de Escena+Guardar; Efecto 0 Bypass 1 Seleccionar Canal 2 Alternar Canal 3 Incrementar/Decrementar Canal)1766 + i2738 + i
modo de etiqueta (Escena: 0 Nombre, 1 Número, 2 Personalizado; Efecto: 0 Nombre Largo, 1 Nombre Corto, 2 Nombre Largo + Canal, 3 Nombre Corto + Canal, 4 Personalizado)1874 + i2846 + i
parámetros, 6 palabras (número de preset/escena/diseño basado en 1; Efecto = [bloque, canal]; Inc/Dec = [paso, envolvente, inferior, superior], paso 65535 = -1)1982 + 6i2954 + 6i
etiqueta personalizada, 10 caracteres + 03623 + 11i4811 + 11i
Nombres de diseño en 1370 + 32 × diseño; color en 6000 + i (0 predeterminado, 1 rojo, 2 naranja…).
Los números de bloque de efecto siguen una lista interna alfabética con entradas ocultas; la tabla está en fm3fc.mjs
(verificado: 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 <sistema.syx> [diseño] lista cada interruptor; set <entrada> <salida> <diseño> <vista> <interruptor> tap=Effect param="Wah 1" ... edita ambas copias. Un archivo enviado con sendsys.mjs se almacena pero el FM3 en ejecución mantiene sus diseños en RAM hasta un ciclo de apagado (y cualquier guardado de sistema anterior a eso sobrescribe la edición).
  • En vivo, sin reinicio: FM3-Edit edita un parámetro del bloque 199 con fn 0x01 sub 0x09: F0 00 01 74 11 01 09 00 47 01 <pid lo> <pid hi> <float32 como 5 septetos, LSB primero> 00 00 00 00 <xor> F7. Id de parámetro = desplazamiento almacenado − 1658 (tap categoría i, tap función 108 + i, tap parámetros 324 + 6i + k, hold categoría 972 + i, tap modo etiqueta 216 + i); desde el área de texto los ids se desplazan en +276: tap texto personalizado 2241 + 11i (un parámetro por carácter, valor = código de carácter, 0 después del final), color 4618 + i. fcset.mjs text <diseño> <vista> <interruptor> <TEXTO> [mode=N] renombra un interruptor en vivo. fcset.mjs <pid> <valor> ... reconstruye los mensajes capturados byte por byte; el FM3 aplica el cambio de inmediato y lo guarda por sí mismo. Capturado con USBPcap desde FM3-Edit.
  • Solo ESTABLECER ids de parámetros conocidos. Nunca enviar GETs (sub 0x1a/0x1b) al bloque 199 para ids que no hayas visto usar a FM3-Edit: leer parámetros FC desconocidos congeló un FM3.

Interruptores por preset — fm3syx.mjs pp/ppset (archivo) + fcset.mjs pp (en vivo) (verificado 2026-11-08)

Están en el propio preset: registro eid 200, datos = inicio de registro + 23 palabras. Los desplazamientos desde allí (j = número PP − 1) también son los ids de parámetros en vivo en el bloque 200:

CampoTapHold
categoríaj216 + j
función24 + j240 + j
modo de etiqueta48 + j264 + j
parámetros (6)72 + 6j288 + 6j
texto personalizado (11)432 + 11j696 + 11j

Tabla de anulación de diseño en 960 + i (i = diseño × 12 + vista × 3 + interruptor, valor = PP − 1, 65535 = ninguno); color 1069 + j. Los códigos son los mismos que los diseños (tablas en fcmap.mjs).

  • fm3syx.mjs pp <archivo> los lista; ppset <entrada> <salida> <PP> clave=valor ... o ppset ... override L V S PP|none edita un archivo (una edición scripteada reprodujo el archivo de FM3-Edit byte por byte).
  • fcset.mjs p

Skills relacionados