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
parseGen3LiveMetersoutput_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 + i | 2630 + 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 + i | 2738 + i |
| ラベルモード (Scene: 0 名前、1 番号、2 カスタム; Effect: 0 長い名前、1 短い名前、2 長い名前+チャンネル、3 短い名前+チャンネル、4 カスタム) | 1874 + i | 2846 + i |
| パラメータ、6ワード (preset/scene/layout 番号は1ベース; Effect = [block, channel]; Inc/Dec = [step, wrap, lower, upper]、step 65535 = -1) | 1982 + 6i | 2954 + 6i |
| カスタムラベル、10文字 + 0 | 3623 + 11i | 4811 + 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でもあります:
| フィールド | タップ | ホールド |
|---|---|---|
| カテゴリ | j | 216 + j |
| 機能 | 24 + j | 240 + j |
| ラベルモード | 48 + j | 264 + j |
| パラメータ (6) | 72 + 6j | 288 + 6j |
| カスタムテキスト (11) | 432 + 11j | 696 + 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
... (翻訳対象のテキストが途中で切れています)