diff --git a/Cargo.lock b/Cargo.lock index 6d22eb4..8670b04 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,31 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "memchr" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - [[package]] name = "slamshuffle" version = "0.1.0" -dependencies = [ - "nom", -] diff --git a/Cargo.toml b/Cargo.toml index 0547914..564d871 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,4 +7,3 @@ license = "MIT" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -nom = "7" diff --git a/src/instruments.rs b/src/instruments.rs deleted file mode 100644 index 0beb4c3..0000000 --- a/src/instruments.rs +++ /dev/null @@ -1,97 +0,0 @@ -use nom::{ - branch::alt, - bytes::complete::tag_no_case, - character::complete::{digit1, hex_digit1, line_ending, not_line_ending, space1}, - combinator::{map_parser, map_res, opt, success, value}, - error::{Error, ErrorKind}, - multi::fold_many1, - sequence::{preceded, separated_pair, terminated, tuple}, - IResult, -}; - -#[derive(Default)] -#[cfg_attr(test, derive(Debug, PartialEq))] -pub struct InstrumentSet([u8; 32]); - -impl InstrumentSet { - pub fn generate(input: &str) -> Self { - match Self::parse(input) { - Ok((_, set)) => set, - Err(_) => panic!(), - } - } - - fn parse<'i>(input: &'i str) -> IResult<&'i str, Self> { - fold_many1( - terminated( - opt(preceded( - tag_no_case("#WAVE "), - map_parser(not_line_ending, wave_numbers), - )), - line_ending, - ), - Self::default, - |mut set, bytes: Option<(usize, u8)>| match bytes { - Some((slot, sample)) => { - let pos = (slot - 0x20) * 2; - set.0[pos] = sample; - set - } - None => set, - }, - )(input) - } -} - -fn hexordecimal(input: &str) -> IResult<&str, (u32, &str)> { - alt(( - tuple((value(16, tag_no_case("0x")), hex_digit1)), - tuple((success(10), digit1)), - ))(input) -} - -fn wave_numbers(input: &str) -> IResult<&str, (usize, u8)> { - separated_pair( - map_res(hexordecimal, |(radix, s)| { - usize::from_str_radix(s, radix) - .map_err(|_| nom::error::make_error::<&str, Error<&str>>(s, ErrorKind::HexDigit)) - .and_then(|n| { - if (0x20..0x30).contains(&n) { - Ok(n) - } else { - Err(nom::error::make_error(s, ErrorKind::MapRes)) - } - }) - }), - space1, - map_res(hexordecimal, |(radix, s)| { - u8::from_str_radix(s, radix) - }), - )(input) -} - -#[cfg(test)] -mod test { - use super::InstrumentSet; - - #[test] - fn parse_waves() { - let input = " -#WAVE 0x20 0xA5 flute -#WAVE 0x21 0x95 clari -#WAVE 0x22 0x65 strings -#WAVE 0x23 0x63 ostrings -#WAVE 0x24 0x34 guitar -#WAVE 0x25 0x53 fbass - "; - - assert_eq!( - InstrumentSet::generate(input), - InstrumentSet([ - 0xa5, 0x00, 0x95, 0x00, 0x65, 0x00, 0x63, 0x00, 0x34, 0x00, 0x53, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00 - ]) - ); - } -} diff --git a/src/lib.rs b/src/lib.rs index db615be..b0011ee 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1 @@ -pub mod instruments; pub mod mfvi;