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
- Undo: mỗi thao tác ghi project = 1 undo entry. ⭐/cỡ thẻ là view preference → không undo, không dirty project.
- 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ộtclipId. - 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:
- Tab 1: Thuật toán (kho 16 hiệu ứng thuật toán dựng sẵn).
- Tab 2: Hoạt họa (RME) (kho 216+ hiệu ứng hoạt họa chuyên nghiệp mã hóa AES-256-GCM bảo vệ bản quyền, xem trước bảo mật, lọc nhóm, và mở rộng qua
.rmepack).
(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:
- Nút bấm hoặc kéo-thả →
ILookEditService.CreateLookWithClipAndEffect - Tự tạo Look mới + Clip trên track hợp lệ (hoặc tạo track mới) + gắn effect với tham số mặc định (hoặc tham số thẻ ảnh động)
- Auto-seek tới đầu clip mới (engine đứng yên → ép render 1 frame để preview hiện ngay)
- Undo được, lưu được
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ị:
- Tiêu đề hiệu ứng và biểu tượng nhận diện.
- Trạng thái hoạt động.
- Toàn bộ danh sách tham số điều khiển được nhóm gọn gàng.
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).
5a. Thư Viện Kỹ Xảo Trực Quan (Visual Card Gallery)
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à:
- Rê chuột xem trước (Hover Preview): Rê chuột qua thẻ sẽ tự động phát hoạt họa xem trước chu kỳ 65ms mô phỏng tác động thực tế của kỹ xảo.
- Thao tác 1 chạm
+ Dòng thời gian: Dưới chân mỗi thẻ là một nút tím neon trải rộng toàn thẻ. Nhấn nút hoặc Double-click vào thẻ sẽ lập tức tạo 1 Clip Kỹ Xảo tại vị trí kim Playhead trên Track Kỹ Xảo của Dòng thời gian. - Thanh lọc Danh mục (5 Category Chips):
Tất cả (14): Toàn bộ kỹ xảo đơn lẻ và phối sẵn.Phối sẵn (4): Các combo kỹ xảo đỉnh cao kết hợp nhiều thuật toán.Màu sắc (1): Mặt nạ màu (ColorMask).Không gian (4): Gương đối xứng (Mirror), Phóng to/Thu nhỏ (Zoom), Đóng khung (Border), Cuộn tròn cực (RadialWrap).Chuyển động (5): Xoay tròn (Rotate), Trôi lệch (Offset), Nhân lưới (Tile), Rung lắc (Shake), Chớp nhịp (Strobe).
5b. Kỹ Xảo Phối Sẵn (VFX Combos) & Tính Năng Lưu Mẫu
- 4 Combo Dựng Sẵn (Ship kèm App):
- Neon Glitch: Chớp tắt dồn dập (
Strobe 14Hz) + Rung giật (Shake) + Đảo màu số (ColorMask Invert). - Vortex Hào Quang: Cuộn tròn cực (
RadialWrap 0.85) + Xoay (Rotate 0.7x) + Nhịp thở (Zoom). - Kính Vạn Hoa: Đối xứng 4 góc (
Mirror Both) + Nhân lưới (Tile 2x2) + Cuộn trôi (Offset). - Nhịp Tim Cyber: Co giãn đồng bộ phách nhạc (
Zoom BeatSync) + Khung viền neon (Border).
- Neon Glitch: Chớp tắt dồn dập (
- Nút "Lưu mẫu" (Save Custom Combo VFX):
- Hiển thị trên thanh tiêu đề
Kỹ xảo đang áp dụng(icon BookmarkPlus xanh ngọc#10B981) khi có ít nhất 1 kỹ xảo đang được chọn. - Cho phép người dùng đặt tên và lưu toàn bộ chuỗi modifier hiện tại thành một thẻ Kỹ xảo mới mang nhãn "Của tôi" (User Custom) trong Thư viện Kỹ xảo để tái sử dụng cho mọi dự án.
- Hiển thị trên thanh tiê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)
- Toàn bộ các phép biến đổi hình học (Mirror, Zoom, Rotate, Offset, Tile, Shake, RadialWrap) trong
VfxPipeline.csáp dụng kỹ thuật Inverse Mapping trong không gian chuẩn hóa $(U, V) \in [0, 1]^2$ dựa trên tọa độ thực tế củaLedMask. - Bảo toàn hình học 2D tuyệt đối ngay cả khi giàn LED ma trận được đi dây ziczac serpentine phức tạp.
- Tự động fallback 1D cho các dải LED tuyến tính đơn.
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 ⚠️ |