Is there a piece of software that will verify the validity of the data in a MIDI file (in Windows)?
I'm am working towards finishing up my midi file instrument editor, and one of the complications is adding in program changes, bank selects, and SYSEX resets that did not exist in the original un-edited file. This involves updating track lengths and positioning data for lots of stuff in the editor. I am looking for any easy way to validate that my new track lengths are correct, as well as the general integrity of the file. It's not too difficult to manually look it over with a few small test files, but once I start messing with actual full length/complicated files, the ability to tell just by looking becomes too difficult.
Basically, I need a way to see if there is anything wrong with my modified files. (Currently, I modify, save, and reload to see if the reloaded file has the same banks/instruments/ instrument count as prior to saving, and play it to see if there are any obvious goof-ups).
Try this: https://github.com/jazz-soft/test-midi-files
It reports some problems that it finds in the MIDI files (but probably not all)
And I'm here if you need any help with that tool 🙂
I was aware of it from some of the other posts. Does it run in Windows? And if so, is there a pre-compiled version? GitHub is the bane of my existence :p
It's a Node.js application, it runs pretty much on everything.
1) Install Node.js (unless you already have it)
2) Clone the GIT repo ( git clone https://github.com/jazz-soft/test-midi-files.git )
I believe every developer uses git nowadays, but if you don't, just go to the GitHub page, click the green 'â³Code' button and download the zip file.
3) Read a README.md
4) go to the downloaded directory and run 'npm install'
5) run 'node . your-midi-file.mid print'
I have Windows 7, Node.js does not like Windows 7. I was able to force install it, but it does not run unless I manually set a version skip environment variable, and then manually specify the path to both node and test-midi-files.
I created a batch file so I can drag files on to it:
[code type=markup]
set NODE_SKIP_PLATFORM_CHECK=1
"C:\Program Files\node-v14.17.1-win-x64\node" "C:\Program Files\node-v14.17.1-win-x64\test-midi-files-main\index.js" %1 print > %1.txt
pause
[/code]
This seems to be working.
I already see that in my first few files I was testing, it shows invalid track lengths, and I tried a few others that showed other warnings. I like the full list of events.
Is the number listed on the left side of the output the time offset, or the byte offset? If it is time offset, is it possible to also display byte offset?
Left side shows the time, i.e. the sum of all previous time offsets.
Byte offset is shown only in the warning/error messages.
It is working well for what I am currently testing, when combined with the "compare" add-on in Notepad++ and my hex editor. It helped me correct my MSB/LSB insertion code (originally had too few in relation to the amount of program changes), and helped me correct my updating of track lengths when inserting bank selects (and soon to be program changes). Thanks!
Any chance you can add byte offset display to all lines of the output for test-midi-files? Maybe an option to do it? I am trying to track down where exactly in my file my byte-writing has gone wrong, and have to use a hex editor to do so. I see I have this problem (see attached screenshot)
I've inserted a bank select msb and lsb (and possibly program changes) throughout the file, but something has gone wrong at this spot, and I am unable to find those particular bytes doing a search in the modified file. A byte offset display in the test-mifi-files output would be SUPER helpful. 😉
Cannot promise it fast, but will see what I can do...
I was able to figure out how to search for those spots (had to mentally add in the delta times to my search) and I have been able to track down and correct my issue. No rush on that update 😉
I plan on eventually making a test file collection with different banks that you can add to YOUR test files collection, modifying the "all instrument sounds" and "all percussion sounds" files to have a different bank select in each. I already tried it out with bank select msb 1 in the all instrument sounds and it works perfect.
Please check the latest version from https://github.com/jazz-soft/test-midi-files
Made it especially for you 🙂
[code type=markup]
C:\JZZ\test-midi-files>node . test.mid print
[ 0] SMF:
[ 8] type: 0
[ 10] tracks: 1
[ 12] ppqn: 96
[ 14] MTrk:
[ 23] 0: ff03 -- Sequence Name: C Major Scale Test
[ 45] 96: ff01 -- Text: Now you must hear C5!
[ 71] 96: 90 3c 7f -- Note On
[ 75] 192: 80 3c 40 -- Note Off
[ 79] 192: ff01 -- Text: Now you must hear D5!
[105] 192: 90 3e 7f -- Note On
[109] 288: 80 3e 40 -- Note Off
[113] 288: ff01 -- Text: Now you must hear E5!
[139] 288: 90 40 7f -- Note On
[143] 384: 80 40 40 -- Note Off
[147] 384: ff01 -- Text: Now you must hear F5!
[173] 384: 90 41 7f -- Note On
[177] 480: 80 41 40 -- Note Off
[181] 480: ff01 -- Text: Now you must hear G5!
[207] 480: 90 43 7f -- Note On
[211] 576: 80 43 40 -- Note Off
[215] 576: ff01 -- Text: Now you must hear A5!
[241] 576: 90 45 7f -- Note On
[245] 672: 80 45 40 -- Note Off
[249] 672: ff01 -- Text: Now you must hear B5!
[275] 672: 90 47 7f -- Note On
[279] 768: 80 47 40 -- Note Off
[283] 768: ff01 -- Text: Now you must hear C6!
[309] 768: 90 48 7f -- Note On
[313] 864: 80 48 40 -- Note Off
[317] 864: ff01 -- Text: Thank you!
[331] 864: ff2f -- End of Track
[/code]
Fantastic! Thank you so much! I can't tell you how helpful your program has been the past few weeks in helping me with mine. I have 101 text files from at least 101 different tests, plus some I already got rid of, that have helped me sort out my track length changing code, and my bank change msb, lsb, and program change insertion code. Now my program is at least 90% guaranteed not to corrupt a saved MIDI file 😉
Haha, oh no, any chance you can make it optional, with a command line flag?
Now the compare plugin in Notepad++ chokes because every line is different after I do an update. 😛
It can tell if new lines have been added (or removed) if the ones around it are the same, but with the byte offset, now every line after the first insert is different.
Other than that the update works great though. Thanks.
Is it a plugin you use in Notepad++ to show midi files?
What program is this?
https://www.midi.org/index.php?option=com_easydiscuss&controller=attachment&task=download&tmpl=component&id=517