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
| comando | descriçã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 [Bloco | Shunt |
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:valor | cc: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> --yes | armazena 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) ouFM3_PROTECTED;pusheharvest.mjsos recusam. push= salvar na unidade: pergunte ao usuário primeiro, sempre, e diga qual slot. Executepulldo 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 executecpu.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:
linhascanais ×colunaspalavras. - Í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.jsonjunto 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
sceneas 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); usescenectl. - 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
parseGen3LiveMetersoutput_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 comBATCH=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> --yesescreve 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:
| Campo | Tap | Hold |
|---|---|---|
| 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 + i | 2630 + 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 + i | 2738 + 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 + i | 2846 + 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 + 6i | 2954 + 6i |
| rótulo personalizado, 10 caracteres + 0 | 3623 + 11i | 4811 + 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 comsendsys.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:
| Campo | Tap | Hold |
|---|---|---|
| categoria | j | 216 + j |
| função | 24 + j | 240 + j |
| modo de rótulo | 48 + j | 264 + j |
| parâmetros (6) | 72 + 6j | 288 + 6j |
| texto personalizado (11) | 432 + 11j | 696 + 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 ...ouppset ... override L V S PP|noneedita um arquivo (uma edição scriptada reproduziu o arquivo do FM3-Edit byte a byte).fcset.mjs p
...
[truncado para tradução]