···
9
9
bass_pattern_at: Region,
10
10
kick_color: Color,
11
11
rng: SmallRng,
12
12
+
kick_counter: u32,
12
13
}
13
14
14
15
impl Default for State {
···
17
18
bass_pattern_at: Region::from_topleft(Point(1, 1), (2, 2)).unwrap(),
18
19
kick_color: Color::White,
19
20
rng: SmallRng::seed_from_u64(0),
21
21
+
kick_counter: 0,
20
22
}
21
23
}
22
24
}
···
64
66
65
67
video.audiofile = PathBuf::from("schedule-hell.wav");
66
68
video = video
69
69
+
// Sync inputs //
67
70
.sync_audio_with("schedule-hell.midi")
68
71
.sync_audio_with("schedule-hell.wav")
72
72
+
// Scenes //
69
73
.with_scene(scenes::starry_sky())
70
74
.with_init_scene(scenes::intro())
71
75
.with_marked_scene(scenes::first_break())
72
72
-
.on("end of first break", &|_, ctx| {
73
73
-
ctx.switch_scene("starry sky");
74
74
-
Ok(())
75
75
-
})
76
76
+
.assign_scene_to("end of first break", "starry sky")
77
77
+
.assign_scene_to("second break", "intro")
78
78
+
// Credits //
76
79
.when_remaining(10, &|canvas, _| {
77
80
let world = canvas.world_region;
78
81
canvas.root().set(
···
5
5
pub fn intro() -> Scene<State> {
6
6
Scene::<State>::new("intro")
7
7
.init(&|canvas, _| {
8
8
+
canvas.clear();
8
9
canvas.set_background(Color::Black);
9
10
10
11
let mut kicks = Layer::new("anchor kick");
···
1
1
-
use shapemaker::{synchronization::audio::MusicalDurationUnit, *};
1
1
+
use anyhow::Result;
2
2
+
use shapemaker::*;
2
3
3
4
use crate::State;
4
5
5
6
pub fn starry_sky() -> Scene<State> {
6
6
-
Scene::new("starry sky")
7
7
-
.init(&|canvas, _| {
8
8
-
canvas.clear();
9
9
-
sky(Angle::default(), canvas);
10
10
-
Ok(())
7
7
+
Scene::<State>::new("starry sky")
8
8
+
.init(&|canvas, ctx| {
9
9
+
ctx.extra.kick_counter = 0;
10
10
+
sky(ctx.extra.kick_counter, canvas)
11
11
+
})
12
12
+
.on_note("anchor kick", &|canvas, ctx| {
13
13
+
// Move spacecraft on each kick
14
14
+
ctx.extra.kick_counter += 1;
15
15
+
sky(ctx.extra.kick_counter, canvas)
11
16
})
12
12
-
.every(1.0, MusicalDurationUnit::Eighths, &|canvas, ctx| {
13
13
-
canvas.clear();
14
14
-
sky(
15
15
-
Angle::from_degrees(ctx.scene_started_at_ms.unwrap() as _),
16
16
-
canvas,
17
17
-
);
18
18
-
Ok(())
17
17
+
.each_n_frame(3, &|canvas, ctx| {
18
18
+
// Keep spacecraft alive, by animating on threes
19
19
+
sky(ctx.extra.kick_counter, canvas)
19
20
})
20
21
}
21
22
22
22
-
fn sky(theta: Angle, canvas: &mut Canvas) -> () {
23
23
+
fn sky(kick_hits_count: u32, canvas: &mut Canvas) -> Result<()> {
24
24
+
// Make a full rotation every 32 kicks
25
25
+
let theta = Angle::from_ratio(kick_hits_count as f32, 32.0);
26
26
+
27
27
+
canvas.clear();
23
28
canvas.colormap = ColorMapping {
24
29
black: "#000000".to_string(),
25
30
white: "#FFFFFF".to_string(),
···
61
66
}),
62
67
)));
63
68
}
69
69
+
70
70
+
Ok(())
64
71
}
65
72
66
73
fn cluster(world: Region, rotation: Angle, at: Point) -> Layer {