Communityコーディング&開発github.com

TheCoolHippo/fm3-syx-editor

Fractal FM3プリセット保存ファイル(.syx)をFM3-Editなしで読み取り、解析、編集します。USB経由で保存済みプリセットを取得し、グリッド/ブロック/チャンネル/シーン/モディファイアと各ブロックパラメータを一覧表示し、値の変更、ブロックタイプの交換、名前変更、別スロットへの再ターゲット、2つの保存ファイルの差分比較、ファイルをスロットに書き戻すことができます。ユーザーがFM3プリセットまたは.syxの内部確認、比較、コピー、変更を依頼したとき、ファイルベースでパッチを構築するとき、またはデスクトップ制御によるFM3-Editの操作が遅すぎるときに使用します。

fm3-syx-editor とは?

このスキルは、Fractal FM3ギタープロセッサのプリセット保存ファイル(.syx)を、公式エディターであるFM3-Editを必要とせずに完全に操作するためのコマンドラインツール群です。単一のスクリプト`scripts/fm3syx.mjs`を中心に、USB経由でのプリセットの取得(pull)と書き込み(push)、プリセット内部の全ブロックパラメータの一覧表示と変更、ブロックタイプの交換、シーン名やプリセット名の変更、別スロットへの再ターゲット、2つの保存ファイル間の詳細な差分比較など、網羅的な機能を提供します。さらに、グローバル設定(System)やフットスイッチレイアウト(FC)の編集、ライブでのCPU負荷監視、シーンMIDIの編集など、高度な操作にも対応しています。このスキルは、FM3-Editを介さずに直接FM3と通信するため、複数のプリセットをまたいだバッチ処理や、プログラムによる精密なプリセット編集を高速に行いたい開発者やパワーユーザーに最適です。内部動作として、.syxファイルのバイナリ構造(ヘッダー、圧縮チャンク、フッター)を完全に解析・再構築し、パラメータ値はFM3-Editの表示と一致するようにキャリブレーションデータを用いて変換されます。

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

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

FM3 .syx エディタ

すべての処理を行うスクリプトは1つです: scripts/fm3syx.mjs。これは mcp-midi-control v0.8.0 に同梱されているコーデックを再利用しているため、そのインストール先の node で実行してください:

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

コマンド

コマンド説明
pull <slot> <out.syx>FM3から保存済みプリセットをUSB経由で読み出します (FM3-Edit不要)
info <file>スロット番号、名前、シーン、グリッド行、チャンネル別ブロックタイプ、シーンチャンネル/バイパス、モディファイアを表示
params <file> <Block[#n]> [ch]ブロックの全パラメータ(名前、生の値、表示値)を表示
get <file> <Block> <ch> <PARAM>1つの値を取得
set <in> <out> <Block> <ch> <PARAM> <val> ...val = FM3に表示される表示値 (40 Hz、-12 dB、3.5)、オプション名 (post、"Analog Stereo")、または raw:N
scenename <in> <out> <1-8> <name>シーン名を設定 (31文字)
cell <in> <out> <row> <col> [Block|Shunt|empty] [from=1,2|none]グリッドセル + そのセルに接続する行(ケーブル)。行/列はFM3-Editと同様に1ベース
add <in> <out> <row> <col> <Block[#n]> [from=1,2]FM3のデフォルト値 (defaults/<eid>.bin) を使用して新しいブロックを追加
midi <in> <out> <scene> [pc:ch:val|cc:ch:num:val|-]...1つのシーンのシーンMIDI行を編集。add ... MIDI (eid 190、グリッドケーブルなし)でブロックを追加します。検証済み: 再構築されたプリセットはFM3-Edit保存とバイト単位で同一であり、シーン変更とプリセットロードでテスト済み
midishow <file>全シーンのシーンMIDI行を表示
remove <in> <out> <Block[#n]>ブロックを削除 (グリッドセル + レコード)
scenectl <in> <out> <1-4> <%> [x8]シーンコントローラー1-4の値をシーンごとに設定 (1つの値 = 全8シーン)
mods <file> [all] / mod <in> <out> <1-32> FIELD=val ...32個のモディファイアを編集: CTRLID(ソース名)、EFFECTID(ブロック)、PARAM(パラメータ名)、MIN/MAX/STARTPT/MIDPT/ENDPT(N%または生の値)、SLOPE、DAMPING、AUTOENGAGE、PCRESET、SCALE、OFFSET…
type <in> <out> <Block> <ch> <name> / types <Block>ブロックタイプの交換/一覧表示 (Amp、Reverb、Drive、Delay、Chorus、Comp、Filter、Flanger、Phaser、Wah、Tremolo)
rename <in> <out> <name>プリセット名を変更
slot <in> <out> <N>ファイルのターゲットスロットをNに変更 (ヘッダー + チェックサム)
diff <a> <b>パラメータごとの差分を名前で表示
learn <file> <Block> <ch> <PARAM> <display>calib.json に生の値から表示値へのキャリブレーションポイントを追加
node cpu.mjs [preset]読み込まれているプリセットのリアルタイムCPU(DSP)負荷を、FM3-Editと同様に表示 (プリセットが指定された場合は先に切り替えます)。80%以上で終了コード2
push <file> --yesファイルをそのヘッダー内のスロットに保存

PARAM = カタログ名 (PITCH_FEEDBACK1、または単に FEEDBACK1) または FM3-Edit のラベル (Feedback 1)。 Block#2 はその名前の2番目のブロックを選択します (Return#2)。

ルール (絶対に破らないこと)

  • 保護スロット: それらを scripts/fm3-local.json ({"protected":[383]}、git-ignore対象) または FM3_PROTECTED にリストします。push と harvest.mjs はそれらを拒否します。
  • push = 本体への保存: 毎回ユーザーに確認し、どのスロットかを伝えてください。 最初にターゲットスロットの pull を実行して、上書きされるもののバックアップを作成してください。
  • FM3ポート (COM7、FM3_PORTで上書き可能) は排他的です: 最初にFM3-Editを閉じるか、設定 > 通信を一時停止 を使用してください。mcp-midi-controlサーバーがそれを保持していてはいけません。
  • FCブロック (エフェクトID 199) をプローブしないでください。
  • CPU: Fractal社は80%を超えないように推奨しています。 すべての add + push の後、プリセットをロードして cpu.mjs を実行してください。 80%以上の場合は、維持する前にブロックを削除/簡略化してください。重いブロック (Amp、Cab、Pitch、Reverb) は一度に1つずつ追加してください。
  • コピーに対して作業してください (set in out)。プルしたオリジナルは変更しないでください。

ファイルの構造 (2026-11-03 検証済み)

  • .syx = 0x77 ヘッダー (バイト6-7 = スロット番号(14ビット)、バイト11 = XORチェックサム) + 8 × 0x78 チャンク (圧縮パッチ、CRCチェック) + 0x79 XOR フッター。FM3プリセット1つあたり24,680バイト。 コーデックは書き込みのたびに再圧縮し、CRCとフッターを再計算します。
  • 解凍されたボディ: ブロックチェーン。各ブロックにはヘッダー (23ワード: シーンチャンネル、シーンバイパスなど) があり、その後にチャンネルごとのパラメータ配列: rows チャンネル × cols ワード。
  • ワードインデックス = FM3 paramId − 6 (paramIdは fractal-midi/dist/gen3/fm3 から取得、FM3-Editから抽出)。Amp (drive/bass/mid/treble/master/presence/depth)、Pitch (shift/pan/feedback/mix/level/splice)、Delay (time) で確認済み。ParamId 0-5 はヘッダーワード17-22に位置します (同じ式が機能します)。
  • 値は生のuint16 0..65534 (ライブワイヤーと同じ)ですが、整数パラメータはプレーンな整数として保存される場合があります: タイプ/モデル、列挙型、テンポ分割、セミトーン (符号付き: 12 = +12、0 = 0)。
  • スケールはFM3-Editで確認 (2026-11-03)、calib.json に正規のスクリプトの横に保存:
    • 線形: パーセント、bipolar_percent、ノブ0-10、Pitch feedback 0..100%、Pitch detune −50..+50 ct、レベル −80..+20 dB (52427 = 0 dB)、Delay FEED −100..+100%。
    • 対数: Hz = min・(max/min)^(raw/65534) カタログのdisplayMin/Maxを使用 (Pitch high cut 200..20000 Hz、42631 = 4000 Hz)。スクリプトは単位が hz の場合にこれを自動的に行います。
    • ポイント: Delay TIME 2044 = 500 ms; Reverb TIME 2034 = 3.20 s、5085 = 7.85 s。
    • テンポ列挙型 (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 (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はid+1を表示、29 = "30: 2x12 Texas Star")、AUTO_ALIGN raw:1。 未知のスケール? 生の値を推測して設定し、pushし、FM3-Editで読み取り、ポイントを追加します (learn)。
  • ブロックヘッダー: ワード −1 = シーン1のチャンネル、ワード 0..6 = シーン2-8のチャンネル (0=A..3=D)、 ワード 7..14 = シーン1-8のバイパス (1 = バイパス)。scene コマンドでこれらを編集します。
  • FM3はプッシュされたダンプをそのヘッダー内のスロットに直接保存します (追加の保存は不要)。

カバレッジ (2026-11-03)

  • コントロールブロック = コントローラーメニュー全体 (テンポ、LFO 1/2、ADSR 1/2、シーケンサー、エンベロープ、マニュアル1-5、シーンコントローラー): ファミリー CONTROLLERS、eid 2、130 パラメータ × 4 チャンネル、グリッドの直後 (ボディ 0x1c4)。他のブロックと同様に編集: set f out Control A TEMPO raw:120 (テンポ = プレーンなBPM)、params f Control A。コーデックのシーンコントローラーオフセットは間違っています (9ワードずれ)。scenectl を使用してください。
  • FM3-EditでFM3上で検証済み: シーン名、グリッドセル/ケーブル、add/remove、モディファイア (mod 2 CTRLID="LFO 1A" EFFECTID=Delay PARAM=MIX MIN=10% MAX=40% でDelayミックスが動いた)、シーンコントローラー、テンポ。
  • ライブ出力メーター (サブ 0x2E parseGen3LiveMeters output_left/right) は信号がないとランダムな値を返します: 使用不可。シーンのラウドネスは代わりにUSB再アンプ録音で測定する必要があります。
  • scales.json: FM3自身の表示テキストに対してキャリブレーションされた34ブロックファミリーの1,390パラメータ (calibrate.mjs が各パラメータをライブでスイープしエコーを読み取ります; calfix.mjs で2パス目)。連続パラメータは線形/対数近似または補間されます。列挙型は名前を双方向にマッピングします。calib.json (手動チェック済み) が優先されます。 カバーされていないもの: テキストのないパラメータ (一部のMIX/グラフパラメータ、73エントリが空)、Plex (FM3が配置を拒否)。
  • ボディ内のすべてのレコード = eid ワード + 5 ワード + 23ワードのヘッダー + cols×rows ワード。順序: 32 MOD レコード (eid 3..34 = モディファイア 1..32)、ブロック、次に eid 201 と eid 200 (プリセットごとのフットスイッチデータ、1525 ワード: 読み取り専用知識、ライブでプローブしないでください)。コーデックはサイズでブロックに名前を付け、いくつかを誤って識別します (Input/Output が Vol/Pan/PEQ として表示されます)。fm3syx がそれらを再ラベル付けします。
  • グリッドにのみ配置されたブロックは、すべてのパラメータが 0 (レベル −80 dB) で現れます: 常に add を使用してください。これにより、FM3から収集されたデフォルトレコードが挿入されます (harvest.mjs <scratchSlot> <restore.syx> [eids]、BATCH=1 で1バッチあたり1ブロック: 一度に多くの重いブロックを配置するとFM3がフリーズしたことがあります)。
  • 一度も保存されていないスロット (<EMPTY>) は、コーデックがデコードできない別のコンテナを使用します: 一度保存した後にプルしてください。

FM3-Editなしで動作

ここにあるものはすべて、USB経由でFM3と直接通信します (デフォルトはCOM7、ポートが変更された場合はFM3_PORTを設定): pull、push、switch.mjs、cpu.mjs、fm3ctl.mjs (シーン選択、ルーパーボタン)、levels.py (USB録音によるシーンラウドネス)。FM3-Editは必要ありません。以下の手順で変更を確認できます: push → 再度 pull → cmp/diff (0バイト = FM3が送信されたものを正確に保存した) → switch.mjs <other> の後に switch.mjs <slot> でロード → cpu.mjs (< 80%)。FM3-Editはスキル構築中に結果を目視確認するためにのみ使用されました。

グローバル (セットアップ) 設定 — fm3sys.mjs + sendsys.mjs (2026-11-03 検証済み)

グローバル設定はプリセット内にはありません。それらは197kB、66フレームのシステムバンク全体として移動します。node pullsystem.mjs <out.syx> で読み取ります (FM3-Editは閉じていること、読み取り専用、リクエスト関数 0x43 (Fractal-Botが送信するもの、USBPcapで2026-11-06にキャプチャ。出力はFractal-Botの FM3-<date>-system+gb+fc.syx とバイト単位で同一))。バンクは2つのコピーを保持します (ワード 0.. と 32768..、それぞれ独自のヘッダーとCRCを持つ)。FM3は古い方のコピーに書き込み、コピー+14874の保存カウンターを増やします。そのため、最新のコピーは交互になります。fm3sys.mjs と fm3fc.mjs はすべての編集を両方のコピーに書き込みます。

  • フォーマット: fn 0x51 ヘッダー、64 × fn 0x52 チャンク (2バイトのインデックス + 1024ワード、1ワードあたり3セプテット)、fn 0x53 フッター (すべてのワードのXOR)。非圧縮。ワード 0 = 0x1008、ワード 1 = 0xAA55、ワード 2 = CRC-CCITT (多項式 0x1021、初期値 0xAA55) バイト8 .. 8+ワード3に対して、ワード 3 = データ長 (29760)。 GLOBAL カタログパラメータ p = ワード 4 + p (IN1_SOURCE 61、MIDI_CHAN 68 (0ベース)、LINEFREQ 112、DISPLAY_OFFSET 72…)。
  • fm3sys.mjs get <file> IN1_SOURCE / set <in> <out> IN1_SOURCE 1 / diff a b / check file (CRC、フッター、フレームチェックサムを修正。変更のないラウンドトリップはバイト単位で同一)。
  • MIDI/リモートテーブル (2026-11-05 に書き込み、読み返し、MC8テストで検証済み): バイパス ワード 138 + ブロックID、チャンネル ワード 394 + ブロックID、エクスターナル n ワード 1305 + n; 128 = なし。fm3sys.mjs setword <in> <out> <word> <raw>... で編集。モディファイアソース エクスターナル 6..16 = id 19..29。
  • sendsys.mjs <file> --yes はバンク全体を書き込みます (FM3はフレームごとに fn 0x64 コード 0 で応答)。テスト済み: Display Offset 1 → 0 をファイルで変更し、その後新しいバックアップが送信されたファイルと正確に一致しました。
  • ルール: 常に新しいバックアップから開始してください (すべてのグローバル設定 + FCレイアウトを保持)。送信前にユーザーに確認してください。元のバックアップを復元できるように保持してください。他のリクエストコードをプローブしないでください。

フットスイッチレイアウト — fm3fc.mjs (保存) + fcset.mjs (ライブ) (2026-11-08 検証済み)

8つのレイアウト + マスターレイアウトはシステムバンク内にあるため、FCブロックのプローブは不要です。 スイッチインデックス i = レイアウト × 12 + ビュー × 3 + スイッチ (0ベース; レイアウト 8 = マスターレイアウト)。コピー内のオフセット:

フィールドタップホールド
カテゴリ (0 未割り当て、1 バンク、2 プリセット、3 シーン、4 エフェクト、5 ユーティリティ、6 レイアウト、7 コントロールスイッチ、8 ルーパー、9 プリセット別、10 ビュー、11 セットリスト、12 曲、13 曲セクション)1658 + i2630 + i
機能 (FM3-Editメニュー順: Utility 0 Tuner 1 Tap Tempo 2 Amp Level+Save 3 Reveal Hold 4 Scene Level+Save; Effect 0 Bypass 1 Chan Select 2 Chan Toggle 3 Chan Inc/Dec)1766 + i2738 + i
ラベルモード (Scene: 0 名前、1 番号、2 カスタム; Effect: 0 長い名前、1 短い名前、2 長い名前+チャンネル、3 短い名前+チャンネル、4 カスタム)1874 + i2846 + i
パラメータ、6ワード (preset/scene/layout 番号は1ベース; Effect = [block, channel]; Inc/Dec = [step, wrap, lower, upper]、step 65535 = -1)1982 + 6i2954 + 6i
カスタムラベル、10文字 + 03623 + 11i4811 + 11i
レイアウト名は 1370 + 32 × レイアウト; 色は 6000 + i (0 デフォルト、1 赤、2 オレンジ…)。
エフェクトブロック番号は、隠しエントリを含むアルファベット順の内部リストに従います。テーブルは fm3fc.mjs 内にあります (検証済み: 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> [layout] はすべてのスイッチを一覧表示します。set <in> <out> <layout> <view> <switch> tap=Effect param="Wah 1" ... は両方のコピーを編集します。sendsys.mjs で送信されたファイルは保存されますが、実行中のFM3は電源再投入までレイアウトをRAMに保持します (その前のシステム保存は編集を上書きします)。
  • ライブ、再起動不要: FM3-Editはブロック199の1つのパラメータを fn 0x01 サブ 0x09 で編集します: F0 00 01 74 11 01 09 00 47 01 <pid lo> <pid hi> <float32 を5セプテット、LSBファースト> 00 00 00 00 <xor> F7。 パラメータID = 保存されたオフセット − 1658 (タップカテゴリ i、タップ機能 108 + i、タップパラメータ 324 + 6i + k、ホールドカテゴリ 972 + i、タップラベルモード 216 + i); テキストエリアからIDは+276シフト: タップカスタムテキスト 2241 + 11i (文字ごとに1パラメータ、値 = 文字コード、終端以降は0)、色 4618 + i。 fcset.mjs text <layout> <view> <switch> <TEXT> [mode=N] はスイッチの名前をライブで変更します。fcset.mjs <pid> <value> ... はキャプチャされたメッセージをバイト単位で再構築します。FM3は変更を即座に適用し、自分で保存します。FM3-EditからUSBPcapでキャプチャされました。
  • 既知のパラメータIDのみをSETしてください。ブロック199へのGET (サブ 0x1a/0x1b) を、FM3-Editが使用するのを見たことがないIDに対して送信しないでください: 未知のFCパラメータを読み取るとFM3がフリーズしました。

プリセット別スイッチ — fm3syx.mjs pp/ppset (ファイル) + fcset.mjs pp (ライブ) (2026-11-08 検証済み)

これらはプリセット自体の中にあります: レコード eid 200、データ = レコード開始 + 23ワード。そこからのオフセット (j = PP番号 − 1) は、ブロック200上のライブパラメータIDでもあります:

フィールドタップホールド
カテゴリj216 + j
機能24 + j240 + j
ラベルモード48 + j264 + j
パラメータ (6)72 + 6j288 + 6j
カスタムテキスト (11)432 + 11j696 + 11j

レイアウトオーバーライドテーブルは 960 + i (i = レイアウト × 12 + ビュー × 3 + スイッチ、値 = PP − 1、65535 = なし)。色 1069 + j。 コードはレイアウトと同じです (テーブルは fcmap.mjs 内)。

  • fm3syx.mjs pp <file> はそれらを一覧表示します。ppset <in> <out> <PP> key=value ... または ppset ... override L V S PP|none はファイルを編集します (スクリプト化された編集はFM3-Editのファイルをバイト単位で再現しました)。
  • fcset.mjs p

... (翻訳対象のテキストが途中で切れています)

関連スキル