Compare commits
	
		
			No commits in common. "3018db7dd1507249900e31c27e484d6fb7422685" and "209d1db66efcbb2a437fc192b18d373a4bce5d7a" have entirely different histories.
		
	
	
		
			3018db7dd1
			...
			209d1db66e
		
	
		
					 4 changed files with 0 additions and 124 deletions
				
			
		
							
								
								
									
										25
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										25
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							|  | @ -2,31 +2,6 @@ | ||||||
| # It is not intended for manual editing. | # It is not intended for manual editing. | ||||||
| version = 3 | 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]] | [[package]] | ||||||
| name = "slamshuffle" | name = "slamshuffle" | ||||||
| version = "0.1.0" | version = "0.1.0" | ||||||
| dependencies = [ |  | ||||||
|  "nom", |  | ||||||
| ] |  | ||||||
|  |  | ||||||
|  | @ -7,4 +7,3 @@ license = "MIT" | ||||||
| # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||||||
| 
 | 
 | ||||||
| [dependencies] | [dependencies] | ||||||
| nom = "7" |  | ||||||
|  |  | ||||||
|  | @ -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 |  | ||||||
|             ]) |  | ||||||
|         ); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,2 +1 @@ | ||||||
| pub mod instruments; |  | ||||||
| pub mod mfvi; | pub mod mfvi; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue