midi-toolkit-rs 0.3.1

A library for ultra high performance MIDI operations, designed for black MIDI. The library isn't perfect
Documentation
use crate::{
    events::{MIDIDelta, MIDIEvent},
    num::MIDINum,
};

/// Change the PPQ of an event sequence.
///
/// Similar to [`scale_event_time`](crate::sequence::event::scale_event_time), except does `new_delta = old_delta * to / from`.
/// ## Example
///```
///use midi_toolkit::{events::Event, prelude::*};
///
///let events = vec![
///    Event::new_delta_note_on_event(100.0f64, 0, 64, 127),
///    Event::new_delta_note_off_event(50.0f64, 0, 64),
///    Event::new_delta_note_on_event(30.0f64, 0, 64, 127),
///    Event::new_delta_note_off_event(80.0f64, 0, 64),
///];
///
///let changed = events
///    .into_iter()
///    .into_ok()
///    .scale_event_ppq(64.0, 96.0)
///    .collect_vec_result()
///    .unwrap();
///
///assert_eq!(
///    changed,
///    vec![
///        Event::new_delta_note_on_event(150.0f64, 0, 64, 127),
///        Event::new_delta_note_off_event(75.0f64, 0, 64),
///        Event::new_delta_note_on_event(45.0f64, 0, 64, 127),
///        Event::new_delta_note_off_event(120.0f64, 0, 64),
///    ]
///)
///```
pub fn scale_event_ppq<
    D: MIDINum,
    E: MIDIEvent + MIDIDelta<D>,
    Err,
    I: Iterator<Item = Result<E, Err>> + Sized,
>(
    iter: I,
    from: D,
    to: D,
) -> impl Iterator<Item = Result<E, Err>> {
    iter.map(move |e| {
        let mut e = e?;
        let delta = e.delta_mut();
        *delta = *delta * to / from;
        Ok(e)
    })
}

#[cfg(test)]
mod tests {
    use crate::{events::Event, prelude::*};

    #[test]
    fn delta_change() {
        let events = vec![
            Event::new_delta_note_on_event(100.0f64, 0, 64, 127),
            Event::new_delta_note_off_event(50.0f64, 0, 64),
            Event::new_delta_note_on_event(30.0f64, 0, 64, 127),
            Event::new_delta_note_off_event(80.0f64, 0, 64),
        ];

        let changed = events
            .into_iter()
            .into_ok()
            .scale_event_ppq(64.0, 96.0)
            .collect_vec_result()
            .unwrap();

        assert_eq!(
            changed,
            vec![
                Event::new_delta_note_on_event(150.0f64, 0, 64, 127),
                Event::new_delta_note_off_event(75.0f64, 0, 64),
                Event::new_delta_note_on_event(45.0f64, 0, 64, 127),
                Event::new_delta_note_off_event(120.0f64, 0, 64),
            ]
        )
    }

    #[test]
    fn delta_change_ints() {
        let events = vec![
            Event::new_delta_note_on_event(100, 0, 64, 127),
            Event::new_delta_note_off_event(50, 0, 64),
            Event::new_delta_note_on_event(30, 0, 64, 127),
            Event::new_delta_note_off_event(80, 0, 64),
        ];

        let changed = events
            .into_iter()
            .into_ok()
            .scale_event_ppq(64, 96)
            .collect_vec_result()
            .unwrap();

        assert_eq!(
            changed,
            vec![
                Event::new_delta_note_on_event(150, 0, 64, 127),
                Event::new_delta_note_off_event(75, 0, 64),
                Event::new_delta_note_on_event(45, 0, 64, 127),
                Event::new_delta_note_off_event(120, 0, 64),
            ]
        )
    }

    #[test]
    fn delta_change_ints_divide() {
        let events = vec![
            Event::new_delta_note_on_event(100, 0, 64, 127),
            Event::new_delta_note_off_event(50, 0, 64),
            Event::new_delta_note_on_event(30, 0, 64, 127),
            Event::new_delta_note_off_event(80, 0, 64),
        ];

        let changed = events
            .into_iter()
            .into_ok()
            .scale_event_ppq(3, 2)
            .collect_vec_result()
            .unwrap();

        assert_eq!(
            changed,
            vec![
                Event::new_delta_note_on_event(66, 0, 64, 127),
                Event::new_delta_note_off_event(33, 0, 64),
                Event::new_delta_note_on_event(20, 0, 64, 127),
                Event::new_delta_note_off_event(53, 0, 64),
            ]
        )
    }
}