pub struct MIDIFile<T: MIDIReader> { /* private fields */ }
Implementations§
Source§impl<T: 'static + MIDIReader> MIDIFile<T>
impl<T: 'static + MIDIReader> MIDIFile<T>
pub fn open_track_reader(&self, track: u32) -> T::ByteReader
Sourcepub fn iter_all_tracks(
&self,
) -> impl Iterator<Item = impl Iterator<Item = Result<Delta<u64, Event>, MIDIParseError>>>
pub fn iter_all_tracks( &self, ) -> impl Iterator<Item = impl Iterator<Item = Result<Delta<u64, Event>, MIDIParseError>>>
Examples found in repository?
examples/write.rs (line 21)
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}
More examples
examples/benchmark.rs (line 42)
33fn main() {
34 let filename = "D:/Midis/Ra Ra Rasputin Ultimate Black MIDI Final.mid";
35 let repeats = 4;
36
37 println!("Opening midi...");
38 let file = MIDIFile::open(filename, None).unwrap();
39
40 println!("Tracks: {}", file.track_count());
41
42 let loaded_tracks = to_vec(file.iter_all_tracks().map(|t| to_vec_result(t).unwrap()));
43
44 let mut nc: u64 = 0;
45 for track in loaded_tracks.iter() {
46 for e in track {
47 if let Event::NoteOn(_) = **e {
48 nc += 1
49 }
50 }
51 }
52 println!("Note count: {nc}");
53
54 do_run("Parse all tracks individually", repeats, || {
55 for track in file.iter_all_tracks() {
56 for _ in pipe!(track) {}
57 }
58 });
59 do_run("Merge all tracks together while parsing", repeats, || {
60 let merged = pipe!(file.iter_all_tracks()|>to_vec()|>merge_events_array());
61 for _ in merged {}
62 });
63 do_run("Clone all events", repeats, || {
64 let iters = pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned())));
65 for track in iters {
66 for _ in track {}
67 }
68 });
69 do_run(
70 "Clone all events, then wrap and unwrap them in Result",
71 repeats,
72 || {
73 let iters = pipe!(loaded_tracks
74 .iter()
75 .map(|t| pipe!(t.iter().cloned()|>wrap_ok()|>unwrap_items())));
76 for track in iters {
77 for _ in track {}
78 }
79 },
80 );
81 do_run("Merge all tracks together while cloning", repeats, || {
82 let iters =
83 pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned()|>wrap_ok()))|>to_vec());
84 let merged = pipe!(iters|>merge_events_array());
85 for _ in merged {}
86 });
87 do_run("Write each track while cloning", repeats, || {
88 let output = Cursor::new(Vec::<u8>::new());
89 let writer = MIDIWriter::new_from_stram(Box::new(output), file.ppq()).unwrap();
90
91 let iters = pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned())));
92 for track in iters {
93 let mut track_writer = writer.open_next_track();
94 for e in track {
95 track_writer.write_event(e).unwrap();
96 }
97 }
98 });
99 do_run("Merge each track while cloning then write", repeats, || {
100 let output = Cursor::new(Vec::<u8>::new());
101 let writer = MIDIWriter::new_from_stram(Box::new(output), file.ppq()).unwrap();
102
103 let iters =
104 pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned()|>wrap_ok()))|>to_vec());
105 let merged = pipe!(iters|>merge_events_array()|>unwrap_items());
106 let mut track_writer = writer.open_next_track();
107 for e in merged {
108 track_writer.write_event(e).unwrap();
109 }
110 });
111}
examples/parse_benchmark.rs (line 45)
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}
pub fn iter_all_events_merged( &self, ) -> impl Iterator<Item = Result<Delta<u64, Event>, MIDIParseError>>
pub fn iter_all_track_events_merged( &self, ) -> impl Iterator<Item = Result<Delta<u64, Track<Event>>, MIDIParseError>>
pub fn iter_all_events_merged_batches( &self, ) -> impl Iterator<Item = Result<Delta<u64, EventBatch<Event>>, MIDIParseError>>
pub fn iter_all_track_events_merged_batches( &self, ) -> impl Iterator<Item = Result<Delta<u64, Track<EventBatch<Event>>>, MIDIParseError>>
pub fn iter_track( &self, track: u32, ) -> impl Iterator<Item = Result<Delta<u64, Event>, MIDIParseError>>
Sourcepub fn ppq(&self) -> u16
pub fn ppq(&self) -> u16
Examples found in repository?
examples/nps_bench.rs (line 21)
13pub fn main() {
14 println!("Opening midi...");
15 let midi = MIDIFile::open_in_ram(
16 "/mnt/fat/Midis/Ra Ra Rasputin Ultimate Black MIDI Final.mid",
17 None,
18 )
19 .unwrap();
20
21 let ppq = midi.ppq();
22 let merged = pipe!(
23 midi.iter_all_track_events_merged_batches()
24 |>TimeCaster::<f64>::cast_event_delta()
25 |>cancel_tempo_events(250000)
26 |>scale_event_time(1.0 / ppq as f64)
27 |>unwrap_items()
28 );
29
30 println!("Tracks: {}", midi.track_count());
31
32 let start = Instant::now();
33 let mut note_count = 0;
34 for batch in merged {
35 for e in batch.iter_events() {
36 if let Event::NoteOn(_) = e.as_event() {
37 note_count += 1;
38 }
39 }
40 }
41
42 println!("Note count: {} \tTime: {:?}", note_count, start.elapsed());
43 println!(
44 "Notes per second: {}",
45 note_count as f64 / start.elapsed().as_secs_f64()
46 );
47}
More examples
examples/statistics.rs (line 36)
20fn main() {
21 println!("Opening midi...");
22 let file = MIDIFile::open_in_ram("D:/Midis/tau2.5.9.mid", None).unwrap();
23 println!("Parsing midi...");
24
25 let now = Instant::now();
26 let stats1 = pipe!(
27 file.iter_all_tracks()
28 |>to_vec()
29 |>merge_events_array()
30 |>get_channel_statistics().unwrap()
31 );
32
33 println!("Calculated merged stats in {:?}", now.elapsed());
34 println!(
35 "MIDI length: {}",
36 duration_to_minutes_seconds(stats1.calculate_total_duration(file.ppq()))
37 );
38 println!("Other stats: {stats1:#?}\n\n");
39
40 let now = Instant::now();
41 let stats2 = pipe!(
42 file.iter_all_tracks()|>to_vec()|>get_channels_array_statistics().unwrap()
43 );
44 println!("Calculated multithreaded stats in {:?}", now.elapsed());
45 println!(
46 "MIDI length: {}",
47 duration_to_minutes_seconds(stats2.calculate_total_duration(file.ppq()))
48 );
49 println!("Other stats: {stats2:#?}");
50}
examples/write.rs (line 13)
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}
examples/benchmark.rs (line 89)
33fn main() {
34 let filename = "D:/Midis/Ra Ra Rasputin Ultimate Black MIDI Final.mid";
35 let repeats = 4;
36
37 println!("Opening midi...");
38 let file = MIDIFile::open(filename, None).unwrap();
39
40 println!("Tracks: {}", file.track_count());
41
42 let loaded_tracks = to_vec(file.iter_all_tracks().map(|t| to_vec_result(t).unwrap()));
43
44 let mut nc: u64 = 0;
45 for track in loaded_tracks.iter() {
46 for e in track {
47 if let Event::NoteOn(_) = **e {
48 nc += 1
49 }
50 }
51 }
52 println!("Note count: {nc}");
53
54 do_run("Parse all tracks individually", repeats, || {
55 for track in file.iter_all_tracks() {
56 for _ in pipe!(track) {}
57 }
58 });
59 do_run("Merge all tracks together while parsing", repeats, || {
60 let merged = pipe!(file.iter_all_tracks()|>to_vec()|>merge_events_array());
61 for _ in merged {}
62 });
63 do_run("Clone all events", repeats, || {
64 let iters = pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned())));
65 for track in iters {
66 for _ in track {}
67 }
68 });
69 do_run(
70 "Clone all events, then wrap and unwrap them in Result",
71 repeats,
72 || {
73 let iters = pipe!(loaded_tracks
74 .iter()
75 .map(|t| pipe!(t.iter().cloned()|>wrap_ok()|>unwrap_items())));
76 for track in iters {
77 for _ in track {}
78 }
79 },
80 );
81 do_run("Merge all tracks together while cloning", repeats, || {
82 let iters =
83 pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned()|>wrap_ok()))|>to_vec());
84 let merged = pipe!(iters|>merge_events_array());
85 for _ in merged {}
86 });
87 do_run("Write each track while cloning", repeats, || {
88 let output = Cursor::new(Vec::<u8>::new());
89 let writer = MIDIWriter::new_from_stram(Box::new(output), file.ppq()).unwrap();
90
91 let iters = pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned())));
92 for track in iters {
93 let mut track_writer = writer.open_next_track();
94 for e in track {
95 track_writer.write_event(e).unwrap();
96 }
97 }
98 });
99 do_run("Merge each track while cloning then write", repeats, || {
100 let output = Cursor::new(Vec::<u8>::new());
101 let writer = MIDIWriter::new_from_stram(Box::new(output), file.ppq()).unwrap();
102
103 let iters =
104 pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned()|>wrap_ok()))|>to_vec());
105 let merged = pipe!(iters|>merge_events_array()|>unwrap_items());
106 let mut track_writer = writer.open_next_track();
107 for e in merged {
108 track_writer.write_event(e).unwrap();
109 }
110 });
111}
examples/parse_benchmark.rs (line 57)
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}
pub fn format(&self) -> u16
Sourcepub fn track_count(&self) -> usize
pub fn track_count(&self) -> usize
Examples found in repository?
examples/nps_bench.rs (line 30)
13pub fn main() {
14 println!("Opening midi...");
15 let midi = MIDIFile::open_in_ram(
16 "/mnt/fat/Midis/Ra Ra Rasputin Ultimate Black MIDI Final.mid",
17 None,
18 )
19 .unwrap();
20
21 let ppq = midi.ppq();
22 let merged = pipe!(
23 midi.iter_all_track_events_merged_batches()
24 |>TimeCaster::<f64>::cast_event_delta()
25 |>cancel_tempo_events(250000)
26 |>scale_event_time(1.0 / ppq as f64)
27 |>unwrap_items()
28 );
29
30 println!("Tracks: {}", midi.track_count());
31
32 let start = Instant::now();
33 let mut note_count = 0;
34 for batch in merged {
35 for e in batch.iter_events() {
36 if let Event::NoteOn(_) = e.as_event() {
37 note_count += 1;
38 }
39 }
40 }
41
42 println!("Note count: {} \tTime: {:?}", note_count, start.elapsed());
43 println!(
44 "Notes per second: {}",
45 note_count as f64 / start.elapsed().as_secs_f64()
46 );
47}
More examples
examples/benchmark.rs (line 40)
33fn main() {
34 let filename = "D:/Midis/Ra Ra Rasputin Ultimate Black MIDI Final.mid";
35 let repeats = 4;
36
37 println!("Opening midi...");
38 let file = MIDIFile::open(filename, None).unwrap();
39
40 println!("Tracks: {}", file.track_count());
41
42 let loaded_tracks = to_vec(file.iter_all_tracks().map(|t| to_vec_result(t).unwrap()));
43
44 let mut nc: u64 = 0;
45 for track in loaded_tracks.iter() {
46 for e in track {
47 if let Event::NoteOn(_) = **e {
48 nc += 1
49 }
50 }
51 }
52 println!("Note count: {nc}");
53
54 do_run("Parse all tracks individually", repeats, || {
55 for track in file.iter_all_tracks() {
56 for _ in pipe!(track) {}
57 }
58 });
59 do_run("Merge all tracks together while parsing", repeats, || {
60 let merged = pipe!(file.iter_all_tracks()|>to_vec()|>merge_events_array());
61 for _ in merged {}
62 });
63 do_run("Clone all events", repeats, || {
64 let iters = pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned())));
65 for track in iters {
66 for _ in track {}
67 }
68 });
69 do_run(
70 "Clone all events, then wrap and unwrap them in Result",
71 repeats,
72 || {
73 let iters = pipe!(loaded_tracks
74 .iter()
75 .map(|t| pipe!(t.iter().cloned()|>wrap_ok()|>unwrap_items())));
76 for track in iters {
77 for _ in track {}
78 }
79 },
80 );
81 do_run("Merge all tracks together while cloning", repeats, || {
82 let iters =
83 pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned()|>wrap_ok()))|>to_vec());
84 let merged = pipe!(iters|>merge_events_array());
85 for _ in merged {}
86 });
87 do_run("Write each track while cloning", repeats, || {
88 let output = Cursor::new(Vec::<u8>::new());
89 let writer = MIDIWriter::new_from_stram(Box::new(output), file.ppq()).unwrap();
90
91 let iters = pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned())));
92 for track in iters {
93 let mut track_writer = writer.open_next_track();
94 for e in track {
95 track_writer.write_event(e).unwrap();
96 }
97 }
98 });
99 do_run("Merge each track while cloning then write", repeats, || {
100 let output = Cursor::new(Vec::<u8>::new());
101 let writer = MIDIWriter::new_from_stram(Box::new(output), file.ppq()).unwrap();
102
103 let iters =
104 pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned()|>wrap_ok()))|>to_vec());
105 let merged = pipe!(iters|>merge_events_array()|>unwrap_items());
106 let mut track_writer = writer.open_next_track();
107 for e in merged {
108 track_writer.write_event(e).unwrap();
109 }
110 });
111}
examples/parse_benchmark.rs (line 42)
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}
Source§impl MIDIFile<DiskReader>
impl MIDIFile<DiskReader>
Sourcepub fn open(
filename: impl AsRef<Path>,
read_progress: Option<&mut dyn FnMut(u32)>,
) -> Result<Self, MIDILoadError>
pub fn open( filename: impl AsRef<Path>, read_progress: Option<&mut dyn FnMut(u32)>, ) -> Result<Self, MIDILoadError>
Examples found in repository?
examples/test.rs (line 12)
10pub fn main() {
11 println!("Opening midi...");
12 let file = MIDIFile::open("/run/media/d/Midis/The Quarantine Project.mid", None).unwrap();
13 let now = Instant::now();
14 let mut nc: u64 = 0;
15
16 println!("Creating parsers...");
17 let merged = pipe!(file.iter_all_track_events_merged()|>unwrap_items());
18 println!("Parsing midi...");
19
20 for e in merged {
21 if let Event::NoteOn(_) = e.as_event() {
22 nc += 1;
23 }
24 }
25
26 println!("Finished parsing midi, found {nc} notes");
27 println!("Elapsed {:?}", now.elapsed());
28 println!(
29 "Notes/second {}",
30 (nc as f64 / now.elapsed().as_secs_f64()).round()
31 );
32}
More examples
examples/events_notes.rs (line 12)
10pub fn main() {
11 println!("Opening midi...");
12 let file = MIDIFile::open("D:/Midis/tau2.5.9.mid", None).unwrap();
13 println!("Parsing midi...");
14 let now = Instant::now();
15 let mut nc: u64 = 0;
16 // for track in file.iter_all_tracks(true) {
17 // // let track = TimeCaster::<f64>::cast_event_delta(track);
18 // for e in pipe!(track|>unwrap_items())
19 // // for e in pipe!(track|>TimeCaster::<f64>::cast_event_delta()|>scale_event_time(10.0)|>unwrap_items())
20 // {
21 // match e {
22 // Event::NoteOn(_) => nc += 1,
23 // _ => {}
24 // }
25 // }
26 // }
27 let merged = pipe!(file.iter_all_tracks()|>to_vec()|>merge_events_array()|>unwrap_items());
28
29 for e in merged {
30 if let Event::NoteOn(_) = *e {
31 nc += 1
32 }
33 let delta = e.delta;
34 if delta > 184467440737 {
35 dbg!(e);
36 }
37 }
38
39 println!("Finished parsing midi, found {nc} notes");
40 println!("Elapsed {:?}", now.elapsed());
41 println!(
42 "Notes/second {}",
43 (nc as f64 / now.elapsed().as_secs_f64()).round()
44 );
45}
examples/benchmark.rs (line 38)
33fn main() {
34 let filename = "D:/Midis/Ra Ra Rasputin Ultimate Black MIDI Final.mid";
35 let repeats = 4;
36
37 println!("Opening midi...");
38 let file = MIDIFile::open(filename, None).unwrap();
39
40 println!("Tracks: {}", file.track_count());
41
42 let loaded_tracks = to_vec(file.iter_all_tracks().map(|t| to_vec_result(t).unwrap()));
43
44 let mut nc: u64 = 0;
45 for track in loaded_tracks.iter() {
46 for e in track {
47 if let Event::NoteOn(_) = **e {
48 nc += 1
49 }
50 }
51 }
52 println!("Note count: {nc}");
53
54 do_run("Parse all tracks individually", repeats, || {
55 for track in file.iter_all_tracks() {
56 for _ in pipe!(track) {}
57 }
58 });
59 do_run("Merge all tracks together while parsing", repeats, || {
60 let merged = pipe!(file.iter_all_tracks()|>to_vec()|>merge_events_array());
61 for _ in merged {}
62 });
63 do_run("Clone all events", repeats, || {
64 let iters = pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned())));
65 for track in iters {
66 for _ in track {}
67 }
68 });
69 do_run(
70 "Clone all events, then wrap and unwrap them in Result",
71 repeats,
72 || {
73 let iters = pipe!(loaded_tracks
74 .iter()
75 .map(|t| pipe!(t.iter().cloned()|>wrap_ok()|>unwrap_items())));
76 for track in iters {
77 for _ in track {}
78 }
79 },
80 );
81 do_run("Merge all tracks together while cloning", repeats, || {
82 let iters =
83 pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned()|>wrap_ok()))|>to_vec());
84 let merged = pipe!(iters|>merge_events_array());
85 for _ in merged {}
86 });
87 do_run("Write each track while cloning", repeats, || {
88 let output = Cursor::new(Vec::<u8>::new());
89 let writer = MIDIWriter::new_from_stram(Box::new(output), file.ppq()).unwrap();
90
91 let iters = pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned())));
92 for track in iters {
93 let mut track_writer = writer.open_next_track();
94 for e in track {
95 track_writer.write_event(e).unwrap();
96 }
97 }
98 });
99 do_run("Merge each track while cloning then write", repeats, || {
100 let output = Cursor::new(Vec::<u8>::new());
101 let writer = MIDIWriter::new_from_stram(Box::new(output), file.ppq()).unwrap();
102
103 let iters =
104 pipe!(loaded_tracks.iter().map(|t| pipe!(t.iter().cloned()|>wrap_ok()))|>to_vec());
105 let merged = pipe!(iters|>merge_events_array()|>unwrap_items());
106 let mut track_writer = writer.open_next_track();
107 for e in merged {
108 track_writer.write_event(e).unwrap();
109 }
110 });
111}
examples/parse_benchmark.rs (line 40)
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}
pub fn open_from_stream<T: 'static + Read + Seek + Send>( stream: T, read_progress: Option<&mut dyn FnMut(u32)>, ) -> Result<Self, MIDILoadError>
Source§impl MIDIFile<RAMReader>
impl MIDIFile<RAMReader>
Sourcepub fn open_in_ram(
filename: impl AsRef<Path>,
read_progress: Option<&mut dyn FnMut(u32)>,
) -> Result<Self, MIDILoadError>
pub fn open_in_ram( filename: impl AsRef<Path>, read_progress: Option<&mut dyn FnMut(u32)>, ) -> Result<Self, MIDILoadError>
Examples found in repository?
examples/polyphony.rs (line 12)
10pub fn main() {
11 println!("Opening midi...");
12 let file = MIDIFile::open_in_ram("D:/Midis/tau2.5.9.mid", None).unwrap();
13 println!("Parsing midi...");
14 let now = Instant::now();
15 let mut poly: u64 = 0;
16 let merged = pipe!(file.iter_all_tracks()|>to_vec()|>merge_events_array()|>unwrap_items());
17
18 let mut max_poly: u64 = 0;
19
20 for e in merged {
21 match *e {
22 Event::NoteOn(_) => {
23 poly += 1;
24 if poly > max_poly {
25 max_poly = poly;
26 }
27 }
28 Event::NoteOff(_) => poly -= 1,
29 _ => {}
30 }
31 }
32
33 println!("Finished parsing midi, found {max_poly} polyphony");
34 println!("Elapsed {:?}", now.elapsed());
35}
More examples
examples/nps_bench.rs (lines 15-18)
13pub fn main() {
14 println!("Opening midi...");
15 let midi = MIDIFile::open_in_ram(
16 "/mnt/fat/Midis/Ra Ra Rasputin Ultimate Black MIDI Final.mid",
17 None,
18 )
19 .unwrap();
20
21 let ppq = midi.ppq();
22 let merged = pipe!(
23 midi.iter_all_track_events_merged_batches()
24 |>TimeCaster::<f64>::cast_event_delta()
25 |>cancel_tempo_events(250000)
26 |>scale_event_time(1.0 / ppq as f64)
27 |>unwrap_items()
28 );
29
30 println!("Tracks: {}", midi.track_count());
31
32 let start = Instant::now();
33 let mut note_count = 0;
34 for batch in merged {
35 for e in batch.iter_events() {
36 if let Event::NoteOn(_) = e.as_event() {
37 note_count += 1;
38 }
39 }
40 }
41
42 println!("Note count: {} \tTime: {:?}", note_count, start.elapsed());
43 println!(
44 "Notes per second: {}",
45 note_count as f64 / start.elapsed().as_secs_f64()
46 );
47}
examples/statistics.rs (line 22)
20fn main() {
21 println!("Opening midi...");
22 let file = MIDIFile::open_in_ram("D:/Midis/tau2.5.9.mid", None).unwrap();
23 println!("Parsing midi...");
24
25 let now = Instant::now();
26 let stats1 = pipe!(
27 file.iter_all_tracks()
28 |>to_vec()
29 |>merge_events_array()
30 |>get_channel_statistics().unwrap()
31 );
32
33 println!("Calculated merged stats in {:?}", now.elapsed());
34 println!(
35 "MIDI length: {}",
36 duration_to_minutes_seconds(stats1.calculate_total_duration(file.ppq()))
37 );
38 println!("Other stats: {stats1:#?}\n\n");
39
40 let now = Instant::now();
41 let stats2 = pipe!(
42 file.iter_all_tracks()|>to_vec()|>get_channels_array_statistics().unwrap()
43 );
44 println!("Calculated multithreaded stats in {:?}", now.elapsed());
45 println!(
46 "MIDI length: {}",
47 duration_to_minutes_seconds(stats2.calculate_total_duration(file.ppq()))
48 );
49 println!("Other stats: {stats2:#?}");
50}
examples/write.rs (line 12)
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}
pub fn open_from_stream_in_ram<T: 'static + Read + Seek + Send>( stream: T, read_progress: Option<&mut dyn FnMut(u32)>, ) -> Result<Self, MIDILoadError>
Trait Implementations§
Auto Trait Implementations§
impl<T> Freeze for MIDIFile<T>where
T: Freeze,
impl<T> RefUnwindSafe for MIDIFile<T>where
T: RefUnwindSafe,
impl<T> Send for MIDIFile<T>where
T: Send,
impl<T> Sync for MIDIFile<T>where
T: Sync,
impl<T> Unpin for MIDIFile<T>where
T: Unpin,
impl<T> UnwindSafe for MIDIFile<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more