Skip to main content

write/
write.rs

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