alpha
Login
or
Join now
gwen.works
/
shapemaker
Star
0
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
This repository has no description
Star
0
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
Overview
Issues
Pulls
Pipelines
✨ Add SyncData.marker_ms_range
author
Gwenn Le Bihan
date
7 months ago
(Nov 11, 2025, 10:38 PM +0100)
commit
93f1179f
93f1179f83c891873f17745d44ee55c37a64d652
parent
f5ec13d3
f5ec13d37af54a85f60b18e0cbf3d27ea9776300
+35
-32
2 changed files
Expand all
Collapse all
Unified
Split
examples
schedule-hell
src
main.rs
src
synchronization
sync.rs
+11
-31
examples/schedule-hell/src/main.rs
Reviewed
···
1
1
mod scenes;
2
2
3
3
use anyhow::anyhow;
4
4
-
use itertools::Itertools;
5
4
use schedule_hell::State;
6
5
use shapemaker::{ui::Log, *};
7
6
use std::{fs, path::PathBuf, time::Duration};
···
21
20
.expect("Failed to sync from WAV file");
22
21
23
22
if let Ok(marker) = args.value_from_str::<_, String>("--marker") {
24
24
-
let marker_start = video
25
25
-
.syncdata
26
26
-
.markers
27
27
-
.iter()
28
28
-
.find_map(|(&ms, m)| if m == &marker { Some(ms) } else { None })
29
29
-
.expect("Marker not found");
30
30
-
31
31
-
let marker_end = video
23
23
+
let range = video
32
24
.syncdata
33
33
-
.markers
34
34
-
.iter()
35
35
-
.filter(|&(&ms, _)| ms > marker_start)
36
36
-
.sorted_by_key(|&(&ms, _)| ms)
37
37
-
.find_map(|(&ms, m)| if m != &marker { Some(ms) } else { None });
25
25
+
.marker_ms_range(marker)
26
26
+
.expect("Cannot find marker {marker:?} in sync data");
38
27
39
39
-
video.start_rendering_at = Timestamp::from_ms(marker_start as _);
40
40
-
video.duration_override =
41
41
-
marker_end.map(|end| Duration::from_millis((end - marker_start) as _))
28
28
+
video.start_rendering_at = Timestamp::from_ms(range.start);
29
29
+
video.duration_override = Some(Duration::from_millis(range.len() as _));
42
30
}
43
31
44
44
-
video.duration_override = Some(
45
45
-
args.value_from_str("--duration")
46
46
-
.map(Duration::from_secs)
47
47
-
.unwrap_or(video.duration_override.unwrap_or_default()),
48
48
-
);
32
32
+
if let Ok(duration) = args.value_from_str("--duration") {
33
33
+
video.duration_override = Some(Duration::from_secs(duration));
34
34
+
}
49
35
50
50
-
if video.duration_override.is_some_and(|d| d.is_zero()) {
51
51
-
video.duration_override = None;
36
36
+
if let Ok(start) = args.value_from_str("--start") {
37
37
+
video.start_rendering_at = Timestamp::from_seconds(start);
52
38
}
53
53
-
54
54
-
video.start_rendering_at = args
55
55
-
.value_from_str("--start")
56
56
-
.ok()
57
57
-
.map(Timestamp::from_seconds)
58
58
-
.unwrap_or(video.start_rendering_at);
59
39
60
40
video.resolution = args.value_from_str("--resolution").ok().unwrap_or(480);
61
41
video.fps = args.value_from_str("--fps").ok().unwrap_or(30);
···
78
58
canvas.root().set(
79
59
"credits text",
80
60
Shape::Text(
81
81
-
world.start.translated(2, 2),
61
61
+
world.start,
82
62
"Postamble / Schedule Hell".into(),
83
63
12.0,
84
64
)
+24
-1
src/synchronization/sync.rs
Reviewed
···
1
1
use super::audio::Stem;
2
2
use anyhow::Result;
3
3
use serde::{Deserialize, Serialize};
4
4
-
use std::{collections::HashMap, path::PathBuf};
4
4
+
use std::{collections::HashMap, fmt::Display, ops::Range, path::PathBuf};
5
5
6
6
pub type TimestampMS = usize;
7
7
···
23
23
self.bpm = other.bpm.or(self.bpm);
24
24
self.stems.extend(other.stems);
25
25
self.markers.extend(other.markers);
26
26
+
}
27
27
+
28
28
+
pub fn marker_ms_range(
29
29
+
&self,
30
30
+
marker: impl Display,
31
31
+
) -> Option<Range<TimestampMS>> {
32
32
+
let start = self.markers.iter().find_map(|(&ms, m)| {
33
33
+
if m == &marker.to_string() {
34
34
+
Some(ms)
35
35
+
} else {
36
36
+
None
37
37
+
}
38
38
+
})?;
39
39
+
40
40
+
let end = self.markers.iter().find_map(|(&ms, m)| {
41
41
+
if m == &marker.to_string() && ms > start {
42
42
+
Some(ms)
43
43
+
} else {
44
44
+
None
45
45
+
}
46
46
+
})?;
47
47
+
48
48
+
Some(start..end)
26
49
}
27
50
}