Skip to content

Commit 7d7a0eb

Browse files
committed
chore: merge master and release 1.5.9
2 parents f03c936 + de2f7d1 commit 7d7a0eb

5 files changed

Lines changed: 90 additions & 4 deletions

File tree

docs/Features/Project-Persistence.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ interface ProjectFile {
292292

293293
### Per Composition
294294
- All tracks and clips
295+
- Timeline markers and per-marker MIDI bindings
295296
- Clip positions and durations
296297
- Trim points (inPoint/outPoint)
297298
- Transform properties (position, scale, rotation, anchor, opacity, blend mode)
@@ -323,6 +324,7 @@ interface ProjectFile {
323324
- Composition view state per composition (playhead, zoom, scroll, in/out points)
324325
- Media panel column order and name width
325326
- Transcript language preference
327+
- Global MIDI state: enabled flag and transport bindings (`Play / Pause`, `Stop`)
326328
- View toggles: thumbnails, waveforms, proxy, transcript markers
327329
- Changelog preferences (`showChangelogOnStartup`, `lastSeenChangelogVersion`)
328330
- Export panel state: live export settings, named export presets, and the selected preset

src/changelog-data.json

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,66 @@
11
[
2+
{
3+
"date": "2026-04-24",
4+
"type": "new",
5+
"title": "Native Shared 3D Scene Rendering Added for Splats, Models, Planes, and Text",
6+
"description": "Scene cameras now drive one native WebGPU 3D space where Gaussian splats, 3D planes, meshes, models, and text can be arranged together instead of composited as isolated layers.",
7+
"section": "3D / Native Scene",
8+
"commits": [
9+
"f16d8536"
10+
]
11+
},
12+
{
13+
"date": "2026-04-24",
14+
"type": "improve",
15+
"title": "Gaussian Splats Render with Better Quality, Sorting, and Multi-Splat Depth",
16+
"description": "PLY splats now use the native splat renderer with GPU sorting, per-clip transforms, independent splat settings, shared-scene depth integration, and a separate depth mask pass that avoids the thin or flickering look during camera movement.",
17+
"section": "3D / Gaussian Splats",
18+
"commits": [
19+
"9ffd2336",
20+
"f03c9361"
21+
]
22+
},
23+
{
24+
"date": "2026-04-24",
25+
"type": "improve",
26+
"title": "Scene Camera Navigation Gets FPS Speed Control",
27+
"description": "FPS camera mode now has discrete movement-speed steps from 0.1x to 8x, and scrolling while moving or looking adjusts speed instead of zooming the camera.",
28+
"section": "3D / Camera Controls",
29+
"commits": [
30+
"752212d0",
31+
"f03c9361"
32+
]
33+
},
34+
{
35+
"date": "2026-04-24",
36+
"type": "improve",
37+
"title": "Property Stopwatches Can Be Dragged Across Controls",
38+
"description": "Transform and effect keyframe stopwatches now share a drag interaction so multiple related properties can be enabled or disabled faster from the Properties panel.",
39+
"section": "Properties / Keyframes",
40+
"commits": [
41+
"f03c9361"
42+
]
43+
},
44+
{
45+
"date": "2026-04-23",
46+
"type": "new",
47+
"title": "Browser MIDI Control Added with Learn Mode and a Dedicated Mapping Panel",
48+
"description": "MasterSelects now supports direct browser MIDI input over Web MIDI with a dedicated Settings tab, transport bindings, a dockable MIDI Mapping panel, note learn mode, manual reassignment, and project-persistent marker plus transport mappings.",
49+
"section": "MIDI / Workflow",
50+
"commits": [
51+
"8e2701c3"
52+
]
53+
},
54+
{
55+
"date": "2026-04-23",
56+
"type": "improve",
57+
"title": "Timeline Markers Can Now Trigger Playback and Auto-Stop the Playhead",
58+
"description": "Markers now expose right-click MIDI actions for Jump, Play From Marker, and Jump To Marker And Stop, and any marker can be turned into a Stop Marker so playback halts automatically when the playhead crosses it.",
59+
"section": "Timeline / Markers",
60+
"commits": [
61+
"8e2701c3"
62+
]
63+
},
264
{
365
"date": "2026-04-18",
466
"type": "new",

src/services/project/projectLoad.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ function convertProjectCompositionToStore(
489489
inPoint: viewState?.inPoint ?? null,
490490
outPoint: viewState?.outPoint ?? null,
491491
loopPlayback: false,
492-
markers: pc.markers.map((marker) => ({
492+
markers: (pc.markers || []).map((marker) => ({
493493
id: marker.id,
494494
time: marker.time,
495495
label: marker.name || '',

src/version.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// App version
22
// Format: MAJOR.MINOR.PATCH
3-
export const APP_VERSION = '1.5.5';
3+
export const APP_VERSION = '1.5.9';
44

55
export interface ChangelogNotice {
66
type: 'info' | 'warning' | 'success' | 'danger';

tests/unit/serialization.test.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,24 @@ describe('CompositionTimelineData round-trip', () => {
306306
it('markers serialize and deserialize', () => {
307307
const data = makeTimelineData({
308308
markers: [
309-
{ id: 'm1', time: 5, label: 'Intro', color: '#ff0000' },
310-
{ id: 'm2', time: 15, label: 'Chorus', color: '#00ff00' },
309+
{
310+
id: 'm1',
311+
time: 5,
312+
label: 'Intro',
313+
color: '#ff0000',
314+
midiBindings: [
315+
{ action: 'playFromMarker', channel: 1, note: 36 },
316+
],
317+
},
318+
{
319+
id: 'm2',
320+
time: 15,
321+
label: 'Chorus',
322+
color: '#00ff00',
323+
midiBindings: [
324+
{ action: 'jumpToMarker', channel: 2, note: 48 },
325+
],
326+
},
311327
],
312328
});
313329

@@ -317,6 +333,12 @@ describe('CompositionTimelineData round-trip', () => {
317333
expect(restored.markers).toHaveLength(2);
318334
expect(restored.markers![0].label).toBe('Intro');
319335
expect(restored.markers![1].time).toBe(15);
336+
expect(restored.markers![0].midiBindings).toEqual([
337+
{ action: 'playFromMarker', channel: 1, note: 36 },
338+
]);
339+
expect(restored.markers![1].midiBindings).toEqual([
340+
{ action: 'jumpToMarker', channel: 2, note: 48 },
341+
]);
320342
});
321343
});
322344

0 commit comments

Comments
 (0)