Skip to content

Commit ebd0fbc

Browse files
committed
Fix parsing of SMF files with sysex messages
1 parent a6d5f19 commit ebd0fbc

File tree

3 files changed

+14
-4
lines changed

3 files changed

+14
-4
lines changed

src/file.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,8 @@ impl TrackEvent {
506506
let p = time_offset + len_offset + 1;
507507
ctx.is_smf_sysex = true;
508508
let (event, event_len) = SystemExclusiveMsg::from_midi(&v[p..], ctx)?;
509-
if event_len != len as usize {
509+
// event_length does not include the terminating 0xF7 byte, while len is the length of the entire message
510+
if event_len != len as usize + 1 {
510511
return Err(ParseError::Invalid("Invalid system exclusive message"));
511512
}
512513
Ok((
@@ -515,7 +516,7 @@ impl TrackEvent {
515516
event: MidiMsg::SystemExclusive { msg: event },
516517
beat_or_frame,
517518
},
518-
p + event_len,
519+
p + len as usize,
519520
))
520521
}
521522
0x7 => {
@@ -524,7 +525,7 @@ impl TrackEvent {
524525
ctx.is_smf_sysex = false;
525526
let (event, event_len) = MidiMsg::from_midi_with_context(&v[p..], ctx)?;
526527

527-
if event_len != len as usize {
528+
if event_len != len as usize + 1 {
528529
return Err(ParseError::Invalid("Invalid system exclusive message"));
529530
}
530531
Ok((
@@ -533,7 +534,7 @@ impl TrackEvent {
533534
event,
534535
beat_or_frame,
535536
},
536-
p + event_len,
537+
p + len as usize,
537538
))
538539
}
539540
0xF => {

tests/breaking-the-law.mid

43.4 KB
Binary file not shown.

tests/file_test.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,3 +330,12 @@ fn test_score_file() {
330330
assert!(deserialize_result.is_ok());
331331
assert_eq!(deserialize_result.unwrap(), expected);
332332
}
333+
334+
#[test]
335+
#[cfg(feature = "file")]
336+
fn test_smf_file_with_sysex() {
337+
let test_file = include_bytes!("./breaking-the-law.mid");
338+
339+
let deserialize_result = MidiFile::from_midi(test_file);
340+
assert!(deserialize_result.is_ok());
341+
}

0 commit comments

Comments
 (0)