nom_midi/parser/
track.rs

1use nom::IResult;
2
3use crate::{parser::event::parse_event, types::Track};
4
5pub fn parse_track_chunk_header(i: &[u8]) -> IResult<&[u8], &[u8]> {
6    use nom::{
7        bytes::streaming::{tag, take},
8        number::streaming::be_u32,
9    };
10
11    let (i, _) = tag("MTrk")(i)?;
12    let (i, length) = be_u32(i)?;
13    take(length)(i)
14}
15
16pub fn parse_track_chunk(i: &[u8]) -> IResult<&[u8], Track> {
17    let (i, mut data) = parse_track_chunk_header(i)?;
18    let mut events = vec![];
19    while data.len() > 0 {
20        let (data_after, evt) = parse_event(data)?;
21        data = data_after;
22        events.push(evt);
23    }
24    Ok((i, Track { events: events }))
25}