write/
write.rs

1use std::time::Instant;
2
3use midi_toolkit::{
4    events::Event,
5    io::{MIDIFile, MIDIWriter},
6    pipe,
7    sequence::{event::merge_events_array, to_vec, unwrap_items},
8};
9
10pub fn main() {
11    println!("Opening midi...");
12    let file = MIDIFile::open_in_ram("D:/Midis/tau2.5.9.mid", None).unwrap();
13    let writer = MIDIWriter::new("./out.mid", file.ppq()).unwrap();
14    println!("Parsing midi...");
15    let now = Instant::now();
16
17    let mut nc: u64 = 0;
18    {
19        let mut track_writer = writer.open_next_track();
20        // let merged = pipe!(file.iter_all_tracks()|>to_vec()|>merge_events_array()|>unwrap_items());
21        let converted = file.iter_all_tracks();
22        // .map(|track| pipe!(track|>events_to_notes()|>notes_to_events()));
23        let merged = pipe!(converted|>to_vec()|>merge_events_array()|>unwrap_items());
24        for e in merged {
25            if let Event::NoteOn(_) = *e {
26                nc += 1
27            }
28            track_writer.write_event(e).unwrap();
29        }
30    }
31
32    println!("Finished parsing midi, found {nc} notes");
33    println!("Elapsed {:?}", now.elapsed());
34    println!(
35        "Notes/second {}",
36        (nc as f64 / now.elapsed().as_secs_f64()).round()
37    );
38}