rstmt_nrt/motion/
planner.rs1use crate::motion::config::MotionPlannerConfig;
6use crate::motion::types::PathCache;
7use crate::tonnetz::StdHyperTonnetz;
8use core::hash::Hash;
9
10pub struct MotionPlanner<'a, T = usize>
13where
14 T: Eq + Hash,
15{
16 pub(crate) cache: PathCache<T>,
18 pub(crate) tonnetz: &'a StdHyperTonnetz<T>,
20 pub(crate) config: MotionPlannerConfig,
21}
22
23#[cfg(test)]
24mod tests {
25 use super::MotionPlanner;
26 use crate::tonnetz::HyperTonnetz;
27 use crate::triad::Triad;
28 use rstmt_core::Octave;
29
30 #[test]
31 fn test_motion_planner() -> crate::Result<()> {
32 let mut tonnetz = HyperTonnetz::new();
34 let _ = tonnetz.scaffold_layer(Octave(4))?;
36
37 let c_major = Triad::major(0).dynamic(); let c_major_idx = tonnetz.add_triad(c_major)?; let mut planner = MotionPlanner::new(&tonnetz).with_max_depth(4);
43
44 let target_note = 1; let paths = planner.find_paths_to_pitch(c_major_idx, target_note);
47
48 assert!(!paths.is_empty());
49 for path in paths {
50 assert!(path.triads().last().unwrap().contains(&target_note));
51 }
52
53 Ok(())
54 }
55}