Commit Graph
21 Commits
Author SHA1 Message Date
pixaroma b15d28c294 test(text): vertical parity reference cases (single / columns+pill / uneven-center) 2026-06-10 11:21:47 +03:00
pixaroma baf9a00659 fix(preview): filename_prefix keeps Unicode (Korean) + spaces like native SaveImage
_safe_prefix flips from ASCII allowlist to Windows-illegal denylist:
only < > : " | ? * + control chars become _, everything else passes
verbatim. Adds reserved-device-name guard (CON/NUL/COM1-9/LPT1-9) and
trailing-dot/space strip per segment. All-Korean prefixes used to
dissolve to nothing -> silent 'Preview' fallback in output root; mixed
ones got mangled (te SEG st -> te_st). Traversal guards unchanged;
folder_paths' commonpath check still backs every save path.

New scripts/save_prefix_check.py locks behavior (31 cases, PREFIX PASS).
Covers save_mode=save, Save Output, Save Disk suggested name, XY Plot save.
2026-06-10 10:08:27 +03:00
pixaroma 2bbd292893 test(mute-switch): regenerate workflows with PIXAROMA_MUTE_CHAIN type 2026-05-28 10:51:07 +03:00
pixaroma b640314267 test(mute-switch): add 3-level chain + shared producer cases 2026-05-28 10:07:04 +03:00
pixaroma 8fc4bb2fd8 test(mute-switch): add text-only simple chaining workflow 2026-05-28 09:54:04 +03:00
pixaroma f77570ae6f test(mute-switch): update subtitles for v2 + add chaining workflow 2026-05-28 09:40:17 +03:00
pixaroma 21c9bc3e2e feat(mute-switch): v2 - direct-only mute + cascade through inner switches 2026-05-28 09:38:21 +03:00
pixaroma 4cabf90f99 test(mute-switch): add workflow generator for 3 test scenarios 2026-05-28 09:17:17 +03:00
pixaroma cc25c2268b feat(mute-switch): pure upstream walker + refcount mute resolver + tests 2026-05-28 08:48:40 +03:00
pixaromaandClaude Opus 4.7 a8b34d0adb fix(fx): repair fx parity script import (nodes/ collision with ComfyUI nodes.py)
The script used `from nodes._fx_adjust_engine import ...` which resolved to
ComfyUI's top-level nodes.py ("'nodes' is not a package") instead of the
plugin package. Import the engine directly off the nodes/ dir (it has no
relative imports). Gate now runs green: PARITY PASS.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 09:11:03 +03:00
pixaromaandClaude Opus 4.7 00cfe8d2cf feat(fonts): shared builtin+custom font catalog module with standalone test
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 07:43:03 +03:00
pixaroma 2f818be59f test(composer): JS<->Python FX parity harness (PARITY PASS) 2026-05-26 16:11:48 +03:00
pixaromaandClaude Opus 4.7 7fa3fb12e6 test(text-render): reference cases for simplified v2 schema
10 cases covering: plain, multi-line, italic, bg pill, rotation, letter-spacing, opacity, multi-line bg pill, right align, monospace. Drops shadow/stroke/scale cases that no longer apply. Run --regenerate to bootstrap goldens locally.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 16:40:39 +03:00
pixaromaandClaude Opus 4.7 9b67bdb2df test: text overlay parity script (run --regenerate to bootstrap goldens)
10 reference configs covering plain, multiline, italic, stroke, shadow, background pill, rotation, compound effects, letter-spacing, opacity. Goldens go under tests/text_overlay_parity_goldens/ (gitignored, regenerate locally).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 14:42:51 +03:00
pixaromaandClaude Opus 4.7 d46432a281 feat(fonts): bundle 10 free fonts for Text Overlay node
Variable fonts where available (Inter, Roboto, Montserrat, Oswald, Playfair, Lora, Caveat, JetBrains Mono), static for Bebas Neue and Anton. All SIL OFL or Apache 2.0, free for commercial use and redistribution.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 14:34:49 +03:00
pixaroma 327cf5f425 consolidate: drop basic Audio React node, rename Audio Pulse -> AudioReact Pixaroma
Removes the widgets-only Audio React Pixaroma node (PixaromaAudioReact)
and renames Audio Pulse Pixaroma's display label to 'AudioReact Pixaroma'.

Why: the editor-driven node fully supersedes the widgets-only one.
Shipping two nodes that share an engine but differ only in UX is more
confusing than helpful. Safe to delete since nothing was published with
the basic node.

What changed (user-facing):
- 'Audio Pulse' renamed to 'AudioReact' everywhere users look (display
  name, button label, editor title, modal text, error messages, README,
  CLAUDE.md docs, parity harness).
- Old basic 'Audio React Pixaroma' node removed.

What stayed for compatibility:
- Internal Python class name PixaromaAudioStudio (workflow class_type).
- File paths js/audio_studio/, nodes/node_audio_studio.py.
- Server route /pixaroma/api/audio_studio/, on-disk audio_studio/<id>/.
- DOM id pixaroma-audio-studio-editor + CSS prefix pix-as-.
- Engine file _audio_react_engine.py (its name happens to match the new
  product name now).
- node.properties.audioStudioState cfg key.

REQUIRES COMFYUI RESTART to pick up the deleted module + new display name.
2026-04-27 22:00:42 +03:00
pixaroma f79ce83094 rename: Audio Studio Pixaroma -> Audio Pulse Pixaroma (display only)
User-facing strings only — display name in NODE_DISPLAY_NAME_MAPPINGS,
button label, editor title, modal text, help text, error messages,
README, CLAUDE.md, and historical design/plan docs.

Internal identifiers unchanged for compatibility:
- Python class PixaromaAudioStudio (saved workflow class_type)
- node.properties.audioStudioState (saved cfg key)
- File / directory paths (js/audio_studio/, nodes/node_audio_studio.py)
- Server route /pixaroma/api/audio_studio/upload + on-disk
  input/pixaroma/audio_studio/<id>/ layout
- DOM id pixaroma-audio-studio-editor + CSS prefix pix-as-
- JS class AudioStudioEditor
2026-04-27 20:27:26 +03:00
pixaroma fcde79aaeb audio_studio: parity script now calls engine.generate_video directly
Cleaner entry point for the parity test — no need to instantiate a
PixaromaAudioReact node or load node_audio_react.py at all. The engine
is the public API; the node was just a thin wrapper that constructs
Params from kwargs.

Goldens unchanged (same math, same Params shape). 64/64 OK confirms
byte-identity.
2026-04-27 14:36:01 +03:00
pixaroma 8a2a168141 audio_react: extract helpers (bandpass / envelope / onset / aspect) to engine
Mechanical move — helpers now live in nodes/_audio_react_engine.py and the
node imports them. Parity check confirms byte-identical output.

Also updates scripts/audio_parity_check.py to load node_audio_react.py via
a synthetic 'nodes' package so the new \`from ._audio_react_engine import ...\`
relative imports resolve correctly.
2026-04-27 13:23:19 +03:00
pixaroma 3e84f1bceb audio_studio: A1 review cleanups (drop unused import, thread fps, document tolerances)
Code-review feedback from Task A1:
- Drop unused `import math` (nothing in the file references it).
- Thread `fps` into synthesize_audio() instead of hardcoding 30 — keeps
  audio.fps and shared_params.fps drift-free if either ever changes.
- Add startup assert that audio.fps == shared_params.fps so a manifest
  edit-mistake fails fast instead of silently relocating onset spikes.
- Document why np.random.RandomState (not default_rng) is required.
- Document the kwarg-contract fragility on render_frames.
- Add JSON-comment keys explaining the two tolerance fields — the
  pre_refactor=0.0 is deferred-use (A3-A6), the python_release=1.0
  intentionally covers PyTorch float-precision drift across releases.

Diff still passes 64/64 OK, exit 0.
2026-04-27 13:14:07 +03:00
pixaroma 66ba006450 audio_studio: add parity test script + 64 pre-refactor golden frames
These goldens lock the current PixaromaAudioReact output. Running the
parity script after the upcoming engine extraction must produce zero diffs
-- that's the regression test for the refactor.
2026-04-27 12:59:27 +03:00