Skip to content

Commit 922a330

Browse files
committed
Merge release 1.6.5
2 parents c7e426d + 087db0a commit 922a330

44 files changed

Lines changed: 3584 additions & 194 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎docs/Features/Project-Persistence.md‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ Projects are stored in a local folder you choose:
9393
```
9494
MyProject/
9595
+-- project.json # Main project file
96+
+-- project.autosave.json # Fallback when browser FSA cannot update project.json
9697
+-- .keys.enc # Encrypted API keys (auto-saved with project)
9798
+-- Raw/ # Auto-copied media files (portable)
9899
| +-- Interview_01.mp4
@@ -170,6 +171,8 @@ There are two save modes in the current branch:
170171
1. **Continuous save** (default): `projectLifecycle.ts` subscribes to the media, timeline, FlashBoard, dock, and download-related stores, marks the project dirty, and writes the project after a short debounce. Keyframe changes flush more aggressively.
171172
2. **Interval save**: `Toolbar.tsx` can still run a timer-based autosave loop. In this mode, the timer creates a backup first and then saves the project.
172173

174+
Project JSON writes are serialized so continuous save, interval save, manual save, and page-unload flushes do not open overlapping writers for the same file. If Chromium's File System Access API cannot create the temporary swap file for `project.json`, the current state is written to `project.autosave.json`; project load prefers that file when it is newer than `project.json`.
175+
173176
### Autosave Configuration
174177
Access via **Settings -> General** for save mode, plus **File -> Autosave** for the interval controls:
175178

@@ -324,11 +327,13 @@ interface ProjectFile {
324327
- Composition view state per composition (playhead, zoom, scroll, in/out points)
325328
- Media panel column order and name width
326329
- Transcript language preference
327-
- Global MIDI state: enabled flag and transport bindings (`Play / Pause`, `Stop`)
330+
- Global MIDI state: enabled flag, transport bindings (`Play / Pause`, `Stop`), parameter mappings, mapping ranges, and invert flags
328331
- View toggles: thumbnails, waveforms, proxy, transcript markers
329332
- Changelog preferences (`showChangelogOnStartup`, `lastSeenChangelogVersion`)
330333
- Export panel state: live export settings, named export presets, and the selected preset
331334

335+
Temporary camera `NO KF` live offsets are intentionally not saved. They only affect the current preview session while the stored camera keyframes remain the project source of truth.
336+
332337
### Other Persisted Panels
333338
- YouTube panel state is saved in `project.json`
334339
- FlashBoard workspace state is saved in `project.json` when boards exist
@@ -337,6 +342,7 @@ interface ProjectFile {
337342
| Location | Contents |
338343
|----------|----------|
339344
| `project.json` | Main project data |
345+
| `project.autosave.json` | FSA fallback copy used when `project.json` cannot be updated directly |
340346
| `.keys.enc` | Encrypted API keys |
341347
| `Backups/` | Auto-backup files |
342348
| `Raw/` | Copied media files |

‎docs/Features/UI-Panels.md‎

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,11 +179,12 @@ MasterSelects currently exposes 17 dockable panel types, plus the Slot Grid over
179179
### MIDI Mapping Panel
180180

181181
- Open from `View -> Panels -> MIDI Mapping`
182-
- Shows all currently assigned MIDI notes in one list
183-
- Includes global transport bindings, per-marker bindings, and Slot Grid trigger bindings
182+
- Shows all currently assigned MIDI notes and control-change bindings in one list
183+
- Includes global transport bindings, per-marker bindings, Slot Grid trigger bindings, and property parameter bindings
184184
- Each row shows the note, target, and resulting command behavior
185-
- Click any mapping card to trigger the assigned action and preview what the MIDI note does
185+
- Click any transport, marker, or slot mapping card to trigger the assigned action and preview what the MIDI note does
186186
- `Edit` opens inline controls for manual channel/note changes and marker reassignment
187+
- Parameter mappings expose inline `Min` / `Max` range inputs plus an `Invert` toggle
187188
- `Learn` and `Clear` remain available directly from the panel
188189
- Marker bindings support `Jump To Marker`, `Play From Marker`, and `Jump To Marker And Stop`
189190
- Slot bindings can be created from the Slot Grid filled-slot context menu, which opens this panel with a pending `Listening...` mapping
@@ -347,6 +348,14 @@ The unified Properties panel adapts its tabs to the selected clip type and to sl
347348
| **Splat effector** | Transform, Effector |
348349
| **Slot Grid clip** | Slot Clip |
349350

351+
### Camera Transform Controls
352+
353+
- Camera clips expose `Nav Mode` controls at the top of the Transform tab.
354+
- `FPS` switches preview navigation between orbit-style look and FPS-style look.
355+
- `NO KF` keeps existing camera keyframes active during playback, but routes preview navigation and MIDI camera-look input into temporary live offsets instead of writing new camera keyframes.
356+
- Live `NO KF` offsets are added on top of the keyframed camera pose for preview control and are cleared when `NO KF` is turned off.
357+
- Live `NO KF` offsets are not saved to the project and are ignored for export renders, so the stored camera animation remains the source of truth.
358+
350359
### Solid Clip Behavior
351360

352361
- Solid clips show a color picker bar above the tabs
@@ -415,9 +424,11 @@ MIDI Control (N devices)
415424
### Mapping Overview
416425

417426
- `View -> Panels -> MIDI Mapping` opens the dedicated mapping panel
418-
- The panel lists all assigned transport and marker bindings
427+
- The panel lists all assigned transport, marker, slot, and parameter bindings
419428
- Clicking a binding previews the exact trigger path without needing a physical MIDI note
429+
- Parameter bindings can be range-adjusted and inverted directly in the mapping panel
420430
- Empty-state guidance points back to Settings and the marker right-click menu
431+
- Right-click a numeric parameter name in the Properties panel to open its MIDI menu and learn or clear a MIDI note/CC binding. Right-clicking the numeric value itself still resets the value to its default. Learned CC values map across the parameter's configured range and then use the same edit path as manual changes.
421432

422433
---
423434

‎src/App.css‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3574,6 +3574,18 @@ input, textarea {
35743574
text-align: left;
35753575
}
35763576

3577+
.midi-parameter-label {
3578+
cursor: context-menu;
3579+
}
3580+
3581+
.midi-parameter-label:hover {
3582+
color: var(--text-primary);
3583+
}
3584+
3585+
.midi-parameter-menu {
3586+
min-width: 210px;
3587+
}
3588+
35773589
.labeled-value .draggable-number-anchor {
35783590
flex: 0 0 auto;
35793591
min-width: 0;

‎src/changelog-data.json‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,25 @@
11
[
2+
{
3+
"date": "2026-04-27",
4+
"type": "new",
5+
"title": "Camera NO KF Live Override Mode",
6+
"description": "Camera clips now expose a NO KF toggle next to FPS navigation. Existing camera keyframes keep driving playback while MIDI and preview navigation write temporary live offsets on top instead of creating new camera keyframes.",
7+
"section": "Preview / Camera"
8+
},
9+
{
10+
"date": "2026-04-27",
11+
"type": "improve",
12+
"title": "MIDI Parameter Mapping Gets Ranges and Invert",
13+
"description": "Property labels can open MIDI learn with right-click while values still reset with right-click. Parameter mappings are now shown in the MIDI Mapping panel with editable min/max ranges and an invert toggle.",
14+
"section": "MIDI"
15+
},
16+
{
17+
"date": "2026-04-27",
18+
"type": "fix",
19+
"title": "MIDI and Marker State Persist Reliably",
20+
"description": "Project saves now include MIDI enabled state, marker bindings, parameter mappings, mapping ranges, and invert settings so live-control setups restore with the project.",
21+
"section": "Project Persistence"
22+
},
223
{
324
"date": "2026-04-27",
425
"type": "improve",

‎src/components/panels/MIDIMappingPanel.css‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,11 @@
147147
color: var(--success-light);
148148
}
149149

150+
.midi-mapping-scope-parameter {
151+
background: color-mix(in srgb, var(--accent) 16%, transparent);
152+
color: var(--accent);
153+
}
154+
150155
.midi-mapping-card-main {
151156
display: flex;
152157
flex-direction: column;
@@ -180,6 +185,33 @@
180185
flex-wrap: wrap;
181186
}
182187

188+
.midi-mapping-parameter-controls {
189+
margin-top: var(--sp-2);
190+
padding-top: var(--sp-2);
191+
border-top: 1px solid var(--border-color);
192+
display: grid;
193+
grid-template-columns: minmax(80px, 1fr) minmax(80px, 1fr) auto;
194+
align-items: end;
195+
gap: var(--sp-2);
196+
}
197+
198+
.midi-mapping-range-field input {
199+
height: 30px;
200+
padding: 5px 8px;
201+
font-family: var(--font-mono);
202+
}
203+
204+
.midi-mapping-invert-button {
205+
min-height: 30px;
206+
white-space: nowrap;
207+
}
208+
209+
.midi-mapping-invert-button.is-active {
210+
border-color: color-mix(in srgb, var(--accent) 55%, var(--border-color));
211+
background: color-mix(in srgb, var(--accent-subtle) 70%, var(--bg-primary));
212+
color: var(--accent);
213+
}
214+
183215
.midi-mapping-editor {
184216
margin-top: var(--sp-2);
185217
padding-top: var(--sp-2);
@@ -299,4 +331,8 @@
299331
.midi-mapping-editor-grid {
300332
grid-template-columns: 1fr;
301333
}
334+
335+
.midi-mapping-parameter-controls {
336+
grid-template-columns: 1fr;
337+
}
302338
}

0 commit comments

Comments
 (0)