I would think that dumping the midi into a wav file, then getting the time length of the wav would be the easiest. Of of course it is a "clunky approach", but easy. It would be sweeter to loop thru the midis, and summing the note durations, but there is the problem of overlapping notes. So maybe it can't be done that way? Anyways, you could use timidity to create a temp.wav with
system("timidity -Ow -o temp.wav $input.mid")
Then you can get the length of the wav with:
#!/usr/bin/perl -w use strict; use Fcntl; my $fnm = shift; sysopen WAV,$fnm,O_RDONLY; my $riff; sysread WAV,$riff,12; my $fmt; sysread WAV,$fmt,24; my $data; sysread WAV,$data,8; close WAV; # RIFF header: 'RIFF', long length, type='WAVE' my ($r1,$r2,$r3) = unpack "A4VA4", $riff; # WAV header, 'fmt ', long length, short unused, short channels, # long samples/second, long bytes per second, short bytes per sample, # short bits per sample my ($f1,$f2,$f3,$f4,$f5,$f6,$f7,$f8) = unpack "A4VvvVVvv",$fmt; # DATA header, 'DATA', long length my ($d1,$d2) = unpack "A4V", $data; my $playlength = $d2/$f6; print << "EOF"; RIFF header: $r1, length $r2, type $r3 Format: $f1, length $f2, always $f3, channels $f4, sample rate $f5, bytes per second $f6, bytes per sample $f7, bits per sample $f8 Data: $d1, length $d2 Playlength: $playlength seconds EOF
The drawback to using this method, is that timidity takes the exact playlength of the midi to do the conversion, which could take a long time to process thousands of midis. But you would only have to do it once, and save the lengths in a file of your choice, then you could select midis from the list to give you an exact program of length "$x seconds". Maybe there are better midi-2-wav dumpers out there, that do it faster?

I know on the midi newsgroups, they always refer to the win32 gnmidi set of utilities to do this type of thing. gnmidi does run under Wine, so it may be worth investigating. gnmidi

Another thought is to determine the BPM(beats per minute) of the midi, then count the number of beats, and the duration of a beat?


I'm not really a human, but I play one on earth. flash japh

In reply to Re: MIDI time elapsed stat by zentara
in thread MIDI time elapsed stat by chanio

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.