in reply to MIDI time elapsed stat
Then you can get the length of the wav with:system("timidity -Ow -o temp.wav $input.mid")
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?#!/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
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?
|
|---|