Editor de arquivos .syx do FM3

Leia, analise e edite arquivos de preset do Fractal FM3 (.syx) sem o FM3-Edit — extraia um preset armazenado via USB, liste sua grade/blocos/canais/cenas/modificadores e cada parâmetro de bloco, altere valores, troque tipos de bloco, renomeie, redirecione para outro slot, compare dois arquivos e envie o arquivo de volta para um slot. Use sempre que o usuário pedir para inspecionar, comparar, copiar ou modificar um preset do FM3 ou arquivo .syx, criar um patch "por arquivo", ou quando controlar o FM3-Edit remotamente seria muito lento.

O que é Editor de arquivos .syx do FM3?

Esta skill fornece um editor completo de arquivos de preset do Fractal FM3 (.syx) que opera inteiramente via linha de comando, sem depender do aplicativo gráfico FM3-Edit. Ela permite que um agente de IA (como Claude Code, Cursor ou Codex) leia, analise, modifique e compare presets do FM3 diretamente, incluindo a capacidade de extrair (pull) e enviar (push) presets para o hardware por USB. A skill cobre todos os aspectos do preset: grade de blocos, canais, cenas, modificadores, parâmetros de cada bloco (com escalas lineares, logarítmicas e por pontos), nomes de cena, controles MIDI por cena, controladores de cena e até mesmo blocos de controle globais (como tempo e LFOs). Recursos avançados incluem diferenciar dois arquivos .syx parâmetro por parâmetro, trocar tipos de bloco, renomear presets, redirecionar para outro slot de preset e gerenciar layouts de footswitch (FC) com edição ao vivo sem reboot. A skill foi verificada contra o FM3-Edit real e inclui regras de segurança rigorosas, como proteção de slots específicos, verificação de CPU (nunca exceder 80%) e exigência de confirmação do usuário antes de qualquer operação de gravação (push). Ela também lida com configurações globais do sistema FM3 (banco de sistema de 197 kB) e layouts de footswitch armazenados no banco de sistema, fornecendo um conjunto completo de ferramentas para manipular o FM3 sem a interface gráfica oficial.

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

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que Editor de arquivos .syx do FM3 faz?

Um script faz tudo: scripts/fm3syx.mjs. Ele reutiliza o codec fornecido com o mcp-midi-control v0.8.0, então execute-o com o node dessa instalação:

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

Comandos

comandodescrição
pull <slot> <saida.syx>lê um preset ARMAZENADO do FM3 pela COM7 (sem FM3-Edit)
info <arquivo>slot, nome, cenas, linhas da grade, tipos de bloco por canal, cena canal/bypass, modificadores
params <arquivo> <Bloco[#n]> [ch]cada parâmetro de um bloco: nome, palavra bruta, valor exibido
get <arquivo> <Bloco> <ch> <PARAM>um valor
set <entrada> <saida> <Bloco> <ch> <PARAM> <valor> ...valor = valor exibido como o FM3 mostra (40 Hz, -12 dB, 3.5), um nome de opção (post, "Analog Stereo") ou raw:N
scenename <entrada> <saida> <1-8> <nome>nome da cena (31 caracteres)
`cell [BlocoShunt
add <entrada> <saida> <linha> <coluna> <Bloco[#n]> [de=1,2]novo bloco com os padrões do próprio FM3 (defaults/<eid>.bin)
`midi [pc:ch:valorcc:ch:num:valor
midishow <arquivo>Linhas MIDI de cena de todas as cenas
remove <entrada> <saida> <Bloco[#n]>exclui um bloco (células da grade + registro)
scenectl <entrada> <saida> <1-4> <%> [x8]Valor do Controlador de Cena 1-4 por cena (um valor = todas as 8 cenas)
mods <arquivo> [all] / mod <entrada> <saida> <1-32> CAMPO=valor ...os 32 modificadores: CTRLID (nome da fonte), EFFECTID (bloco), PARAM (nome do parâmetro), MIN/MAX/STARTPT/MIDPT/ENDPT (N% ou bruto), SLOPE, DAMPING, AUTOENGAGE, PCRESET, SCALE, OFFSET...
type <entrada> <saida> <Bloco> <ch> <nome> / types <Bloco>troca / lista tipos (Amp, Reverb, Drive, Delay, Chorus, Comp, Filter, Flanger, Phaser, Wah, Tremolo)
rename <entrada> <saida> <nome>nome do preset
slot <entrada> <saida> <N>redireciona o arquivo para o slot N (cabeçalho + checksum)
diff <a> <b>diferenças por parâmetro, por nome
learn <arquivo> <Bloco> <ch> <PARAM> <exibicao>adiciona um ponto de calibração bruto→exibição para calib.json
node cpu.mjs [preset]carga de CPU (DSP) ao vivo do preset carregado, como mostra o FM3-Edit (muda primeiro se um preset for fornecido). Código de saída 2 a 80% ou mais
push <arquivo> --yesarmazena o arquivo no slot em seu cabeçalho

PARAM = nome do catálogo (PITCH_FEEDBACK1, ou apenas FEEDBACK1) ou o rótulo do FM3-Edit (Feedback 1). Bloco#2 seleciona o segundo bloco com esse nome (Return#2).

Regras (nunca quebrar)

  • Slots protegidos: liste-os em scripts/fm3-local.json ({"protected":[383]}, ignorado pelo git) ou FM3_PROTECTED; push e harvest.mjs os recusam.
  • push = salvar na unidade: pergunte ao usuário primeiro, sempre, e diga qual slot. Execute pull do slot de destino primeiro para ter um backup do que será sobrescrito.
  • A porta do FM3 (COM7, FM3_PORT sobrescreve) é exclusiva: feche o FM3-Edit ou use Configurações > Pausar Comunicações primeiro; nenhum servidor mcp-midi-control pode mantê-la.
  • Nunca investigue o bloco FC (id de efeito 199).
  • CPU: Fractal diz nunca acima de 80%. Após cada add + push, carregue o preset e execute cpu.mjs; a 80% ou mais, remova/simplifique blocos antes de mantê-lo. Adicione blocos pesados (Amp, Cab, Pitch, Reverb) um de cada vez.
  • Trabalhe em cópias (set entrada saida): mantenha o original extraído intacto.

Como o arquivo é construído (verificado em 2026-11-03)

  • .syx = cabeçalho 0x77 (bytes 6-7 = slot como 14 bits, byte 11 = XOR checksum) + 8 × 0x78 chunks (patch compactado, verificado por CRC) + rodapé 0x79 XOR. 24.680 bytes por preset do FM3. O codec recompacta e recalcula CRC + rodapé em cada gravação.
  • Corpo descompactado: cadeia de blocos; cada bloco tem um cabeçalho (23 palavras: canais de cena, bypass de cena, ...) então um array de parâmetros por canal: linhas canais × colunas palavras.
  • Índice da palavra = FM3 paramId − 6 (paramIds de fractal-midi/dist/gen3/fm3, minerados do FM3-Edit). Verificado em Amp (drive/bass/mid/treble/master/presence/depth), Pitch (shift/pan/feedback/mix/level/splice) e Delay (time). ParamIds 0-5 vivem nas palavras do cabeçalho 17-22 (a mesma fórmula funciona).
  • Valores são uint16 brutos 0..65534 (mesmo do fio ao vivo), EXCETO parâmetros inteiros armazenados como ints simples: tipos/modelos, enums, divisões de andamento, semitons (com sinal: 12 = +12, 0 = 0).
  • Escalas verificadas no FM3-Edit (2026-11-03), armazenadas em calib.json junto ao script canônico:
    • linear: percentual, bipolar_percent, knob 0-10, feedback Pitch 0..100%, detune Pitch −50..+50 ct, níveis −80..+20 dB (52427 = 0 dB), FEED Delay −100..+100%.
    • log: Hz = min·(max/min)^(raw/65534) usando o displayMin/Max do catálogo (high cut Pitch 200..20000 Hz, 42631 = 4000 Hz). O script faz isso automaticamente para unidade hz.
    • pontos: TIME Delay 2044 = 500 ms; TIME Reverb 2034 = 3.20 s, 5085 = 7.85 s.
    • enum de andamento (DTEMPO/TEMPO): 0 Nenhum, 11 1/8, 12 1/8 pontuado, 13 1/4 tercina, 14 1/4, 15 1/4 pontuado.
    • TYPE Pitch (paramId 0): 8 = Crystal Echoes. Tipo Delay = DELAY_MODEL (não 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 mostra id+1, 29 = "30: 2x12 Texas Star"), AUTO_ALIGN raw:1. Escala desconhecida? Defina um palpite bruto, envie, leia do FM3-Edit, adicione o ponto (learn).
  • Cabeçalho do bloco: palavra −1 = canal da cena-1, palavras 0..6 = canais das cenas 2-8 (0=A..3=D), palavras 7..14 = bypass das cenas 1-8 (1 = bypass); o comando scene as edita.
  • O FM3 armazena um dump enviado diretamente no slot em seu cabeçalho (sem salvar extra).

Cobertura (2026-11-03)

  • Bloco de controle = o menu inteiro de Controladores (tempo, LFO 1/2, ADSR 1/2, sequenciador, envelope, Manual 1-5, Controladores de Cena): família CONTROLLERS, eid 2, 130 parâmetros × 4 canais, logo após a grade (corpo 0x1c4). Edite-o como qualquer bloco: set f out Control A TEMPO raw:120 (tempo = BPM simples), params f Control A. O deslocamento do controlador de cena do codec está errado (fora por 9 palavras); use scenectl.
  • Verificado no FM3 no FM3-Edit: nomes de cena, células/cabos da grade, add/remove, modificador (mod 2 CTRLID="LFO 1A" EFFECTID=Delay PARAM=MIX MIN=10% MAX=40% fez o mix Delay se mover), Controladores de Cena, tempo.
  • Medidor de saída ao vivo (sub 0x2E parseGen3LiveMeters output_left/right) retorna valores aleatórios sem sinal: não utilizável. A intensidade da cena deve ser medida por gravação USB re-amp.
  • scales.json: 1.390 parâmetros de 34 famílias de blocos calibrados contra o texto de exibição do próprio FM3 (calibrate.mjs varre cada parâmetro ao vivo e lê o eco; calfix.mjs` segunda passagem). Parâmetros contínuos são ajustados lin/log ou interpolados; enums mapeiam nomes em ambos os sentidos. calib.json (verificado manualmente) ganha dele. Não coberto: parâmetros sem texto (alguns parâmetros MIX/gráfico, 73 entradas vazias), Plex (o FM3 se recusou a colocá-lo).
  • Cada registro no corpo = palavra eid + 5 palavras + cabeçalho de 23 palavras + palavras colunas×linhas. Ordem: 32 registros MOD (eid 3..34 = modificadores 1..32), os blocos, então eid 201 e eid 200 (dados de footswitch por preset, 1525 palavras: conhecimento somente leitura, nunca investigue ao vivo). O codec nomeia blocos por tamanho e acerta alguns errados (Input/Output mostrados como Vol/Pan/PEQ); fm3syx os renomeia.
  • Um bloco colocado apenas na grade aparece com TODOS os parâmetros em 0 (nível −80 dB): sempre use add, que insere o registro padrão coletado do FM3 (harvest.mjs <slotRascunho> <restaurar.syx> [eids], um bloco por lote com BATCH=1: colocar muitos blocos pesados de uma vez congelou o FM3 uma vez).
  • Um slot nunca salvo (<EMPTY>) usa outro contêiner que o codec não pode decodificar: extraia-o após um armazenamento.

Funciona sem FM3-Edit

Tudo aqui conversa com o FM3 diretamente via USB (COM7 por padrão, defina FM3_PORT se a porta mudou): pull, push, switch.mjs, cpu.mjs, fm3ctl.mjs (seleção de cena, botões do looper), levels.py (intensidade da cena por gravação USB). FM3-Edit NÃO é necessário. Verifique uma alteração sem ele: push → pull novamente → cmp/diff (0 bytes = o FM3 armazenou exatamente o que foi enviado) → switch.mjs <outro> então switch.mjs <slot> para carregá-lo → cpu.mjs (< 80%). O FM3-Edit foi usado apenas durante a construção da skill, para inspecionar resultados.

Configurações globais (Setup) — fm3sys.mjs + sendsys.mjs (verificado em 2026-11-03)

Globais não estão em presets. Eles viajam como um banco de sistema inteiro de 197 kB, 66 quadros. Leia-o com node pullsystem.mjs <saida.syx> (FM3-Edit fechado, somente leitura, solicitação fn 0x43 como enviado por Fractal-Bot, capturado por USBPcap em 2026-11-06; saída byte-idêntica a um Fractal-Bot FM3-<data>-system+gb+fc.syx). O banco contém duas cópias (palavras 0.. e 32768.., cada uma com seu próprio cabeçalho e CRC). O FM3 escreve a cópia MAIS ANTIGA e incrementa um contador de salvamento na cópia + 14874, então a cópia mais nova alterna. fm3sys.mjs e fm3fc.mjs escrevem cada edição em ambas as cópias.

  • Formato: cabeçalho fn 0x51, 64 × chunks fn 0x52 (índice de 2 bytes + 1024 palavras, 3 septetos por palavra), rodapé fn 0x53 (XOR de todas as palavras). NÃO compactado. Palavra 0 = 0x1008, palavra 1 = 0xAA55, palavra 2 = CRC-CCITT (poli 0x1021, init 0xAA55) sobre bytes 8 .. 8 + palavra 3, palavra 3 = comprimento dos dados (29760). Parâmetro p do catálogo GLOBAL = palavra 4 + p (IN1_SOURCE 61, MIDI_CHAN 68 (baseado em 0), LINEFREQ 112, DISPLAY_OFFSET 72…).
  • fm3sys.mjs get <arquivo> IN1_SOURCE / set <entrada> <saida> IN1_SOURCE 1 / diff a b / check arquivo (corrige CRC, rodapé e checksums de quadro; uma viagem de ida e volta inalterada é byte-idêntica).
  • Tabelas MIDI/Remote (verificado em 2026-11-05 por uma gravação, uma leitura de volta e testes MC8): Palavra de Bypass 138 + id do bloco, Palavra de Canal 394 + id do bloco, Palavra External n 1305 + n; 128 = nenhum. Edite com fm3sys.mjs setword <entrada> <saida> <palavra> <raw>.... Fontes de modificador External 6..16 = ids 19..29.
  • sendsys.mjs <arquivo> --yes escreve o banco inteiro (FM3 responde fn 0x64 código 0 por quadro). Testado: Display Offset 1 → 0 por arquivo, então um backup fresco correspondeu exatamente ao arquivo enviado.
  • Regras: sempre comece de um backup NOVO (ele contém todos os globais + layouts FC); pergunte ao usuário antes de enviar; mantenha o backup original para restaurar. Nunca investigue outros códigos de solicitação.

Layouts de footswitch — fm3fc.mjs (armazenado) + fcset.mjs (ao vivo) (verificado em 2026-11-08)

Os 8 layouts + Layout Mestre estão no banco de sistema, então nenhuma investigação do bloco FC é necessária. Índice do switch i = layout × 12 + view × 3 + switch (baseado em 0; layout 8 = Layout Mestre). Deslocamentos em uma cópia:

CampoTapHold
categoria (0 Não atribuído, 1 Banco, 2 Preset, 3 Cena, 4 Efeito, 5 Utilitário, 6 Layout, 7 Control Switch, 8 Looper, 9 Por Preset, 10 View, 11 Setlist, 12 Música, 13 Seção de Música)1658 + i2630 + i
função (Ordem do menu FM3-Edit: Utilitário 0 Tuner 1 Tap Tempo 2 Amp Level+Save 3 Reveal Hold 4 Scene Level+Save; Efeito 0 Bypass 1 Chan Select 2 Chan Toggle 3 Chan Inc/Dec)1766 + i2738 + i
modo de rótulo (Cena: 0 Nome, 1 Número, 2 Personalizado; Efeito: 0 Nome Longo, 1 Nome Curto, 2 Nome Longo + Canal, 3 Nome Curto + Canal, 4 Personalizado)1874 + i2846 + i
parâmetros, 6 palavras (número de preset/cena/layout baseado em 1; Efeito = [bloco, canal]; Inc/Dec = [passo, wrap, inferior, superior], passo 65535 = -1)1982 + 6i2954 + 6i
rótulo personalizado, 10 caracteres + 03623 + 11i4811 + 11i
Nomes de layout em 1370 + 32 × layout; cor em 6000 + i (0 padrão, 1 vermelho, 2 laranja...).
Números de bloco de efeito seguem uma lista interna alfabética com entradas ocultas; a tabela está em 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> [layout] lista cada switch; set <entrada> <saida> <layout> <view> <switch> tap=Efeito param="Wah 1" ... edita ambas as cópias. Um arquivo enviado com sendsys.mjs é armazenado, mas o FM3 em execução mantém seus layouts na RAM até um ciclo de energia (e qualquer salvamento de sistema antes disso sobrescreve a edição).
  • Ao vivo, sem reboot: FM3-Edit edita um parâmetro do bloco 199 com fn 0x01 sub 0x09: F0 00 01 74 11 01 09 00 47 01 <pid lo> <pid hi> <float32 como 5 septetos, LSB primeiro> 00 00 00 00 <xor> F7. Id do parâmetro = deslocamento armazenado − 1658 (tap categoria i, tap função 108 + i, tap parâmetros 324 + 6i + k, hold categoria 972 + i, tap modo de rótulo 216 + i); da área de texto os ids são deslocados em +276: tap texto personalizado 2241 + 11i (um parâmetro por caractere, valor = código do caractere, 0 após o fim), cor 4618 + i. fcset.mjs text <layout> <view> <switch> <TEXTO> [mode=N] renomeia um switch ao vivo. fcset.mjs <pid> <valor> ... reconstrói as mensagens capturadas byte a byte; o FM3 aplica a mudança imediatamente e a salva sozinho. Capturado com USBPcap do FM3-Edit.
  • Apenas DEFINA ids de parâmetros conhecidos. Nunca envie GETs (sub 0x1a/0x1b) para o bloco 199 para ids que você não viu o FM3-Edit usar: ler parâmetros FC desconhecidos congelou um FM3.

Switches por preset — fm3syx.mjs pp/ppset (arquivo) + fcset.mjs pp (ao vivo) (verificado em 2026-11-08)

Eles estão no próprio preset: registro eid 200, dados = início do registro + 23 palavras. Deslocamentos a partir daí (j = número PP − 1) são também os ids de parâmetro ao vivo no bloco 200:

CampoTapHold
categoriaj216 + j
função24 + j240 + j
modo de rótulo48 + j264 + j
parâmetros (6)72 + 6j288 + 6j
texto personalizado (11)432 + 11j696 + 11j

Tabela de substituição de layout em 960 + i (i = layout × 12 + view × 3 + switch, valor = PP − 1, 65535 = nenhum); cor 1069 + j. Os códigos são os mesmos dos layouts (tabelas em fcmap.mjs).

  • fm3syx.mjs pp <arquivo> os lista; ppset <entrada> <saida> <PP> chave=valor ... ou ppset ... override L V S PP|none edita um arquivo (uma edição scriptada reproduziu o arquivo do FM3-Edit byte a byte).
  • fcset.mjs p

...

[truncado para tradução]

Habilidades Relacionadas