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}