RemixStudio

Hướng dẫn

Tab "Hiệu ứng" — Tài liệu công cụ (chuẩn đối chiếu cho audit)

Cập nhật theo code hiện tại: 2026-08-29

Tài liệu này liệt kê mọi nút, mọi tương tác, mọi phím tắt của tab Hiệu ứng, kèm điều kiện tiên quyết, kết quả mong đợi, và có undo/lưu được hay không.

Mọi câu ở đây rút từ code đã đọc (không suy đoán). Chỗ nào giao diện quảng cáo một đằng, code làm một nẻo được đánh dấu ⚠️.

Nguồn: ViewModels/EffectsLibraryViewModel.cs (thư viện), ViewModels/InspectorViewModel.cs (Inspector), ViewModels/TimelineViewModel.cs (timeline), ViewModels/SceneTreeViewModel.cs (cảnh), ViewModels/VfxModifierPanelViewModel.cs (VFX Modifiers), ViewModels/PreviewViewModel.cs (xem trước), Effects/ (engine hiệu ứng).

Tài liệu khái niệm: xem 01-Moi-lien-he-Doi-tuong-Tab-Hieu-ung.md.


0. Quy tắc chung

  1. Undo: mỗi thao tác ghi project = 1 undo entry. ⭐/cỡ thẻ là view preference → không undo, không dirty project.
  2. Multi-clip: chọn ≥2 clip trên timeline → Inspector chỉ ghi vào clip NEO (clip đầu tiên được chọn). Cảnh báo inline hiện ra khi SelectedClipCount > 1; nó nói rõ bao nhiêu clip đang chọn và điều gì thật sự sẽ xảy ra. Đây là giới hạn thiết kế, không phải bug — mỗi ô ghi nhận đúng một clipId.
  3. Khối Inspector có chủ thể: bấm clip → hiện khối clip (ẩn khối track và khối cảnh); bấm đầu track → hiện khối track (ẩn khối clip); bấm cảnh ở cây bên trái → hiện khối cảnh. Hai chủ thể cùng lúc là lỗi nối dây, không phải trạng thái người dùng gây ra.

1. Thư viện Hiệu ứng (dock trái) — 2 tab chuyên biệt

Dock trái của Module Hiệu ứng gồm hai tab chuyên biệt:

(Lưu ý: Toàn bộ Cài đặt sẵn đã được hợp nhất trực tiếp vào tab Kỹ xảo ở dock phải dưới dạng nhóm Phối sẵn (VFX Combos) và tính năng Lưu mẫu cá nhân).

# Nút / Tương tác Loại Điều kiện Ghi chú
1 Áp dụng (Apply) one-shot có effect Tạo Look + Clip + Effect, auto-select clip mới, seek tới đầu clip. Chưa có project → tạo demo
2 Kéo-thả effect xuống Track one-shot có effect + có track Tương đương Apply nhưng đặt vào track đích
3 ⭐ Yêu thích toggle có effect View preference — ghi preferences.json, KHÔNG dirty project, KHÔNG undo. Nguồn sự thật riêng (_favorites HashSet), không quét danh sách thẻ
4 Lọc theo nhóm (category chips) toggle — 6 nhóm dựng sẵn (Cơ bản · Màu sắc · Đuổi · Lấp lánh · Sóng · Tự nhiên) + tab ảnh động đã nhập
5 Tìm kiếm text input — Lọc theo DisplayName, nút xoá (×) đặt lại chuỗi tìm

Áp dụng — chi tiết:

1a. Kho hiệu ứng mã hóa (RME Library, tab 2) — 6 tương tác

Kho hiệu ứng mã hóa cung cấp bộ sưu tập 216 hiệu ứng hoạt họa phân chia theo 9 danh mục chuyên nghiệp (Chớp sáng laser, Equalizer, Hình Sin, Hình vuông tròn, Kẻ ngang dọc, Kẻ xiên, Mưa sao băng, Pháo hoa, Vòng tròn). Toàn bộ dữ liệu được bảo vệ bằng mật mã AES-256-GCM.

# Thao tác / Nút Loại Chi tiết hoạt động
1 Rê chuột xem trước (Hover Preview) xem trước Rê chuột qua thẻ: ứng dụng giải mã luồng động trong RAM, ngắt quãng khung hình và hạ mẫu (128×128) để người dùng xem chuyển động mượt mà mà vẫn chống trích xuất bản quyền
2 Áp dụng (Apply) one-shot Bấm nút + Áp dụng trên thẻ: tạo Look + Clip trên timeline với hiệu ứng ảnh động trỏ vào nguồn rme://<ID>, seek về đầu clip
3 Kéo-thả vào Timeline drag-drop Kéo thẻ thả vào track bất kỳ trên timeline để chèn clip tại vị trí con trỏ chuột
4 Lọc theo Danh mục chip toggle Thanh chip cuộn ngang hiển thị các nhóm kèm số lượng hiệu ứng (VD: Tất cả (216), Chớp sáng laser (13), Equalizer (7)...)
5 Tìm kiếm text input Lọc tức thì theo tên hiệu ứng hoặc mã định danh (VD: RME001, laser, ...)
6 Cài gói mở rộng (.rmepack) modal / drop Bấm nút Cài gói để chọn tệp .rmepack, hoặc kéo thả tệp .rmepack trực tiếp vào bảng. Gói mới được cài vào ~/.remixstudio/library/packages/ và sẵn sàng dùng ngay mà không cần cập nhật phiên bản phần mềm

1b. Cỡ ô xem trước — 3 mức

Nút Ghi chú
Nhỏ / Vừa / Lớn View preference — ghi preferences.json, KHÔNG dirty project

2. Inspector (dock phải) — 7 lệnh + tham số

2a. Khối HIỆU ỨNG CỦA CLIP (Mô hình Tinh gọn 1 Clip 1 Hiệu ứng)

Phần mềm chuẩn hóa theo mô hình tinh gọn 1 Clip 1 Hiệu ứng: mỗi Clip trên Dòng thời gian mang đúng một hiệu ứng duy nhất để tham số trực quan, rõ ràng, không gây xung đột hay rối rắm. Khi muốn kết hợp nhiều hiệu ứng, người dùng sử dụng các Track khác nhau trên Dòng thời gian để xếp lớp.

Card hiệu ứng hiển thị:

2b. Khối THAM SỐ

Render tự động từ IEffect.Parameters (schema-driven). Mỗi thay đổi là 1 undo entry. Thanh trượt throttle ở ~16 fps (drag vẫn mượt). Ô số gõ tay có phiên gõ — FlushFieldEdits đợi 600ms idle rồi ghi MỘT undo entry cho cả chuỗi ký tự.

2c. Khối VỊ TRÍ KHUNG (Clip.StartOffset)

⚠️ 14/16 effect dựng sẵn đọc giờ TOÀN CỤC (ctx.Time) nên ô này KHÔNG đổi diện mạo của chúng. Chỉ ColorWipe (đọc Progress) và ảnh động (đọc ClipLocalTime) tôn trọng ô này. Inspector hiện ghi chú cảnh báo khi mọi effect trong clip đều bỏ qua giờ cục bộ (ShowStartOffsetNoOpHint).

Quyết định thiết kế: GIỮ NGUYÊN engine (đổi timebase = phá show cũ, không migration nào cứu được), làm UI trung thực. Cờ IEffect.HonorsClipLocalTime là cách Inspector tự hỏi — thêm effect mới đọc Progress thì hint tự tắt.

2d. Khối VÙNG CHỌN LED CỦA CLIP

# Nút Loại Điều kiện Ghi chú
4 Vùng chọn: Toàn bộ radio có clip Tất cả LED trong sơ đồ
5 Vùng chọn: Hình chữ nhật radio có clip Hiện ô X/Y/W/H, ô số đi qua phiên gõ
6 Vùng chọn: Theo dải LED radio có clip Hiện danh sách dải LED, ràng buộc ĐỘNG
7 Chọn LED cho clip modal có clip + có LED trên sơ đồ Bật chế độ chọn LED ngay trên Preview tab Hiệu ứng (KHÔNG nhảy sang tab Sơ đồ dây). Click/kéo khung trên preview. Tắt = ghi vào clip
8 Chọn LED cho track modal có track + có LED Tương tự nhưng ghi vào track

⚠️ Vùng chọn: Theo Collection — kiểu này tồn tại trong mô hình nhưng KHÔNG CÓ UI tạo/gán Collection từ giao diện. Mọi Collection đều rỗng. Kiểu này chỉ để đọc dự án cũ; dự án mới dùng Theo dải LED.

2e. Khối THUỘC TÍNH TRACK (chỉ hiện khi bấm đầu Track, không bấm Clip)

# Nút Loại Ghi chú
9 Bật/Tắt track (Enabled) toggle 1 undo entry
10 Solo toggle Chỉ track này phát; 1 undo entry
11 Khoá track (Locked) toggle 1 undo entry
12 Kiểu hoà trộn (Blend Mode) dropdown Normal/Add/Multiply/Screen; 1 undo entry
13 Độ mờ track (Opacity) ô số Đi qua phiên gõ (N4 fix — không còn nháy tắt giữa buổi diễn khi gõ "0.75"); 1 undo entry
14 Áp vùng chọn track cho tất cả clip one-shot Ghi vùng chọn của track xuống mọi clip trong track

2f. Khối THUỘC TÍNH CẢNH (chỉ hiện khi bấm cảnh ở cây bên trái)

Chứa bảng chỉnh "Nháy theo nhạc" (AudioPulseViewModel) — ADR-0012 D9. Là CHUYỂN CHỖ từ bảng cũ, giữ nguyên ba lớp chặn ngưỡng (pulseOff < pulseOn, strobeOff < strobeOn, pulseOn < strobeOn).


3. Timeline (dock đáy) — 21 lệnh

3a. Transport bar

# Nút Phím Loại Ghi chú
1 ▶/⏸ Phát/Tạm dừng Space toggle TỪ CHỐI kèm lý do khi scope = clip mà chưa chọn clip nào
2 ⏹ Dừng — one-shot Dừng engine + đưa playhead về 0
3 🔁 Lặp lại — toggle Loop/None; view preference (ghi đĩa)
4 🎯 Phạm vi: chỉ clip đang chọn — toggle Chọn ≥2 clip → phạm vi liền từ mép trái sớm nhất tới mép phải muộn nhất; chưa chọn clip → từ chối kèm lý do

⚠️ Output tắt mà engine chạy: banner "Output chưa bật" hiện ra khi engine chạy nhưng LiveOutputDispatcher đang chặn — nút "Bật output" ngay trên banner để sửa từ chỗ phát hiện.

3b. Zoom timeline

Nút Ghi chú
+ / − Zoom ×1.5 / ÷1.5, clamp [0.5, 20]
Vừa khung (Fit) Zoom để clip cuối cùng chiếm hết khung (theo content, không theo duration)

3c. Track

# Nút Loại Điều kiện Ghi chú
5 + Thêm Track one-shot có project 1 undo entry
6 Xoá Track one-shot có track (qua menu ngữ cảnh)

3d. Clip — menu ngữ cảnh

# Nút Loại Điều kiện Ghi chú
7 Chia clip (Split) one-shot có clip Chia tại playhead (nếu playhead nằm trong clip) hoặc tại giữa. Chọn ≥2 clip + right-click trên tập → lệnh vẫn về 1 clip
8 Xoá clip (Delete) one-shot có clip Chọn ≥2 clip + right-click trên tập → xoá CẢ TẬP. Toggle P bật → ripple delete
9 Nhân bản (Duplicate) one-shot có clip Chọn ≥2 clip + right-click → nhân bản CẢ TẬP
10 Đổi tên Look one-shot có clip Mở dialog nhập tên mới; chuỗi đã localize
11 Áp dụng Look ra đèn one-shot có clip Trigger live output, bypass timeline. Engine tự Start nếu đang đứng yên. Chip "look đang áp" + nút "Về timeline" là lối thoát
12 Xoá vùng chọn clip one-shot có clip Đặt vùng = null (toàn bộ LED)
13 Về timeline one-shot đang trigger look Clear triggered look, trả ActiveSource về Timeline

3e. Marker

# Nút Loại Ghi chú
14 Thêm marker one-shot (double-click ruler) Tên tự động "Marker N", N = max hậu tố + 1
15 Xoá marker one-shot (menu ngữ cảnh) Xoá theo ID ổn định

3f. Audio

# Nút Loại Ghi chú
16 Nhập Audio one-shot Mở hộp thoại chọn .wav; nhãn + kiểu tệp đã localize

3g. Phím tắt timeline

Phím Hành động
Space ▶/⏸ Phát/Tạm dừng
M Thêm Fast Marker ngay tại vị trí Playhead (đánh dấu nhịp nhanh)
Ctrl+Z / Ctrl+Shift+Z Undo / Redo (Window-level)
Delete Xoá clip/track đang chọn
Ctrl+D Nhân bản clip
Ctrl+K Command Palette — có "Chia clip đang chọn"

Vạch chia nhịp & Bắt dính (Beat Grid & Snap): Thước đo thời gian hỗ trợ hiển thị vạch chia nhịp và cơ chế bắt dính playhead/clip theo BPM. Đầu track có biểu tượng chỉ báo Khóa (Lock) và Solo trực quan.


4. Sidebar Cảnh (dock đáy, bên trái Dòng thời gian) — 4 lệnh

Cảnh được tổ chức thành Sidebar cố định bên trái Dòng thời gian (TimelineView.axaml), với vạch Accent Bar màu xanh nổi bật báo hiệu Cảnh đang mở (IsOpen == true). Bố cục này thể hiện trực quan nguyên lý 1:1: Chọn Cảnh nào ở sidebar $\rightarrow$ Dòng thời gian bên phải hiển thị toàn bộ track và clip của Cảnh đó.

# Nút Loại Điều kiện Ghi chú
1 Chọn cảnh (click hàng thẻ) one-shot — Nạp timeline của cảnh đó + đặt làm chủ thể Inspector
2 + Thêm cảnh one-shot có project Tạo cảnh rỗng mới, mở ngay, 1 undo entry
3 Đổi tên cảnh (icon ✏️) one-shot có cảnh Mở dialog nhập tên mới
4 Xoá cảnh (icon 🗑️) one-shot có cảnh Cảnh cuối cùng → cảnh báo không được xoá

Bảng chế độ (Hardware Switches): Khối gập ở đáy cột Sidebar Cảnh (ModeTableBlock), mặc định thu gọn. Khi mở ra, cho phép gán nhanh công tắc phần cứng (SW1-SW4) với từng cảnh.


5. VFX Modifiers (Kỹ xảo — dock phải, tab cạnh Thuộc tính)

Tab Kỹ xảo được thiết kế theo mô hình Thư viện Kỹ xảo Trực quan (Visual Card Gallery) kết hợp Dòng thời gian Kỹ xảo độc lập (CapCut-style Adjustment Tracks).

Mỗi kỹ xảo được trực quan hóa bằng một thẻ hoạt họa neon Cyberpunk với 16 khung hình chuyển động SkiaSharp mượt mà:

5b. Kỹ Xảo Phối Sẵn (VFX Combos) & Tính Năng Lưu Mẫu

5c. Bảng Kỹ Xảo Đang Áp Dụng (Active Modifier Stack)

Khi chọn một clip kỹ xảo trên Timeline: | # | Tương tác | Loại | Điều kiện | Chi tiết hoạt động | |---|---|---|---|---| | 1 | Thêm vào Dòng thời gian | one-shot | — | Bấm + Dòng thời gian trên thanh toolbar hoặc thẻ card để đúc clip tại Playhead | | 2 | Lưu mẫu (icon BookmarkPlus) | modal | có modifier trong stack | Nhập tên và lưu cấu hình chuỗi modifier thành thẻ Combo mới | | 3 | Bypass mắt (Bật/Tắt) | toggle | có modifier | Bật hoặc tạm tắt modifier mà không cần xoá | | 4 | BeatSync (♪) | toggle | có modifier | Đồng bộ chu kỳ dao động (Zoom, Shake, Strobe...) theo nhịp đập BPM của dự án | | 5 | Thanh trượt Mix (0-100%) | slider | có modifier | Hòa trộn tuyến tính giữa pixel gốc và pixel sau khi biến đổi | | 6 | ↑ Lên / ↓ Xuống | one-shot | modifier không ở đầu/cuối | Đổi thứ tự thực thi trong pipeline (tích luỹ từ trên xuống) | | 7 | × Xoá modifier | one-shot | có modifier | Gỡ modifier khỏi stack (hỗ trợ Undo/Redo) |

5d. Thuật Toán Bảo Toàn Không Gian 2D (Spatial Nearest-Neighbor Mapping)


6. Preview (trung tâm) — xem trước

Tương tác Ghi chú
Xem trước realtime Hiện LED theo bố cục sơ đồ dây, cập nhật theo engine
Tách cửa sổ Mở preview riêng
Chọn LED trên preview Khi Inspector bật chế độ "Chọn LED cho clip/track"

7. Danh sách hiệu ứng dựng sẵn (16 effect)

TypeId Nhóm HonorsClipLocalTime
builtin.solid Cơ bản ❌ (màu tĩnh — không liên quan)
builtin.gradient Cơ bản ❌
builtin.rainbow Màu sắc ❌
builtin.breath Màu sắc ❌
builtin.chase Đuổi ❌
builtin.comet Đuổi ❌ 💎
builtin.wipe Đuổi ✅ (ColorWipe — effect duy nhất dựng sẵn dùng Progress)
builtin.stripes Đuổi ❌
builtin.sparkle Lấp lánh ❌
builtin.twinkle Lấp lánh ❌
builtin.strobe Lấp lánh ❌
builtin.wave Sóng ❌
builtin.radial Sóng ❌ 💎
builtin.plasma Sóng ❌ 💎
builtin.fire Tự nhiên ❌ 💎
builtin.noise Tự nhiên ❌

💎 = Phù hiệu kim cương (cờ tĩnh, không khoá/gác gì — dành chỗ cho quy hoạch sau).

❌ HonorsClipLocalTime = false nghĩa là ô "Vị trí khung" trong Inspector KHÔNG đổi diện mạo effect đó. Inspector hiện ghi chú cảnh báo khi tất cả effect trong clip đều bỏ qua (ShowStartOffsetNoOpHint).


8. Danh sách gap đã xử lý (từ audit 2026-08-29)

# Gap Trạng thái
HU-G1 Tài liệu HDSD thiếu mô tả nút/lệnh cho tab Hiệu ứng ✅ TÀI LIỆU NÀY
HU-G2 Hành vi multi-clip Inspector không trong tài liệu ✅ §0 mục 2
HU-G3 14/16 effect bỏ qua ClipLocalTime ✅ §2c + §7 (bảng chi tiết)
HU-G4 Collection chưa có UI ✅ §2d cảnh báo ⚠️
HU-G5 BPM/TAP đã gỡ, hệ quả ✅ §3g cảnh báo ⚠️

Nguồn: docs/HDSD/HIEU-UNG-CONG-CU.md trong kho mã — bản web sinh lúc dựng ảnh.