diff --git a/src/main.rs b/src/main.rs index 755d0e1..2e054f4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ use itertools::Itertools; mod flags; +mod play; mod seq; mod syn; mod tone; @@ -16,8 +17,12 @@ fn main() { flags.sound_font, flags.sample_rate, )); - for i in 0..flags.play.len() { - syn_seq.append(i as i32, flags.play[i].clone()); + let mut i = 0; + for p in flags.play.iter() { + for p in play::new(p.clone()) { + syn_seq.append(i as i32, p); + i += 1; + } } play(syn_seq, flags.sample_rate, flags.bpm); diff --git a/src/play.rs b/src/play.rs new file mode 100644 index 0000000..3d31e5d --- /dev/null +++ b/src/play.rs @@ -0,0 +1,47 @@ +use std::io::Read; + +pub fn new(s: S) -> Vec { + parse(from_string(s.to_string())) +} + +fn from_string(s: String) -> String { + match std::fs::File::open(s.clone()) { + Ok(mut reader) => { + let mut content = String::new(); + reader + .read_to_string(&mut content) + .expect(format!("failed to read {}", s).as_ref()); + content.split_whitespace().collect::>().join(" ") + } + Err(_) => s, + } +} + +fn parse(s: String) -> Vec { + vec![s] +} + +#[cfg(test)] +mod test { + #[test] + fn test_string() { + assert_eq!(super::new("a b c")[0], "a b c".to_string()); + assert_eq!(super::new("a b c".to_string())[0], "a b c".to_string()); + } + + #[test] + fn test_single_line_file() { + assert_eq!( + super::new("src/testdata/single_line_file.txt")[0], + "a b c".to_string() + ); + } + + #[test] + fn test_two_channels_one_bar() { + assert_eq!( + super::new("src/testdata/two_channels_one_bar.txt")[0], + "a b c".to_string() + ); + } +} diff --git a/src/testdata/single_line_file.txt b/src/testdata/single_line_file.txt new file mode 100644 index 0000000..3774da6 --- /dev/null +++ b/src/testdata/single_line_file.txt @@ -0,0 +1 @@ +a b c diff --git a/src/testdata/two_channels_one_bar.txt b/src/testdata/two_channels_one_bar.txt new file mode 100644 index 0000000..31734d0 --- /dev/null +++ b/src/testdata/two_channels_one_bar.txt @@ -0,0 +1,2 @@ +a b c +a5 b5 c5