Function get_channels_array_statistics

Source
pub fn get_channels_array_statistics<D: MIDINum, E: MIDIEventEnum + MIDIDelta<D>, Err: Send, I: Iterator<Item = Result<E, Err>> + Sized + Send>(
    iters: Vec<I>,
) -> Result<ChannelGroupStatistics<D>, Err>
Expand description

Parse the events in an array of channels (multithreaded) and return the statistics for all of the channels, as well as the combined stats.

NOTE: This uses rayon for the threadpool, if you want to use your own rayon threadpool instance then install it before calling this function.

Examples found in repository?
examples/parse_benchmark.rs (line 46)
35fn main() {
36    let filename = "D:/Midis/toilet story 3 2020 ver 3840 black with tempo.mid";
37    let repeats = 4;
38
39    println!("Opening midi...");
40    let file = MIDIFile::open(filename, None).unwrap();
41
42    println!("Tracks: {}", file.track_count());
43
44    // Make windows cache stuff
45    let tracks = file.iter_all_tracks().collect();
46    let stats = get_channels_array_statistics(tracks).unwrap();
47
48    println!("Note count: {}", stats.note_count());
49
50    do_run("Parse tracks in parallel", repeats, || {
51        let tracks = file.iter_all_tracks().collect();
52        let stats = get_channels_array_statistics(tracks).unwrap();
53        stats.note_count()
54    });
55
56    do_run("Iter event batches merged", repeats, || {
57        let ppq = file.ppq();
58        let merged = pipe!(
59            file.iter_all_track_events_merged_batches()
60            |>TimeCaster::<f64>::cast_event_delta()
61            |>cancel_tempo_events(250000)
62            |>scale_event_time(1.0 / ppq as f64)
63            |>unwrap_items()
64        );
65
66        let mut note_count = 0;
67        for batch in merged {
68            for e in batch.into_iter() {
69                if let Event::NoteOn(_) = e.as_event() {
70                    note_count += 1
71                }
72            }
73        }
74
75        note_count
76    });
77
78    // do_run("Merge all tracks together while parsing", repeats, || {
79    //     let merged = pipe!(file.iter_all_tracks()|>to_vec()|>merge_events_array());
80    //     for _ in merged {}
81    // });
82    // do_run("Clone all events", repeats, || {
83    //     let iters = pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned())));
84    //     for track in iters {
85    //         for _ in track {}
86    //     }
87    // });
88    // do_run(
89    //     "Clone all events, then wrap and unwrap them in Result",
90    //     repeats,
91    //     || {
92    //         let iters = pipe!(loaded_tracks
93    //             .iter()
94    //             .map(|t| pipe!(t.iter().cloned()|>wrap_ok()|>unwrap_items())));
95    //         for track in iters {
96    //             for _ in track {}
97    //         }
98    //     },
99    // );
100    // do_run("Merge all tracks together while cloning", repeats, || {
101    //     let iters =
102    //         pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned()|>wrap_ok()))|>to_vec());
103    //     let merged = pipe!(iters|>merge_events_array());
104    //     for _ in merged {}
105    // });
106    // do_run("Write each track while cloning", repeats, || {
107    //     let output = Cursor::new(Vec::<u8>::new());
108    //     let writer = MIDIWriter::new_from_stram(Box::new(output), file.ppq()).unwrap();
109
110    //     let iters = pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned())));
111    //     for track in iters {
112    //         let mut track_writer = writer.open_next_track();
113    //         for e in track {
114    //             track_writer.write_event(e).unwrap();
115    //         }
116    //     }
117    // });
118    // do_run("Merge each track while cloning then write", repeats, || {
119    //     let output = Cursor::new(Vec::<u8>::new());
120    //     let writer = MIDIWriter::new_from_stram(Box::new(output), file.ppq()).unwrap();
121
122    //     let iters =
123    //         pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned()|>wrap_ok()))|>to_vec());
124    //     let merged = pipe!(iters|>merge_events_array()|>unwrap_items());
125    //     let mut track_writer = writer.open_next_track();
126    //     for e in merged {
127    //         track_writer.write_event(e).unwrap();
128    //     }
129    // });
130}