[LAU] Extracting the tempo track from a MIDI file

Alexandre Ratchov alex at caoua.org
Tue Sep 25 13:27:10 EDT 2007


On Tue, Sep 25, 2007 at 10:08:57AM -0700, Ken Restivo wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> On Tue, Sep 25, 2007 at 09:21:06AM +0200, Alexandre Ratchov wrote:
> > On Mon, Sep 24, 2007 at 07:00:38PM -0700, Ken Restivo wrote:
> > > 
> > > Is there any command-line tool to extract and print the tempo of
> > > a MIDI file?
> > > 
> > 
> > hi, 
> > 
> > you could use midish for that: import the .mid file, and use the
> > songtimeinfo function; example:
> > 
> > $ rmidish  
> > send EOF character (control-D) to quit
> > 1> songimportsmf "sample.mid"
> > 2> songtimeinfo
> > {
> >         timesig 4 24
> >         tempo 400000
> > }
> > 3> 
> > 
> 
> Thanks! However, I haven't found any explanation of what those numbers mean. I need the tempo in BPM.
> 
> I found this formula in the Rosegarden source:
> 	qpm = (60.0 * beatTime) / (beatSec * quarter)
> 
> But of the three numbers that songtimeinfo spits out, I haven't been able to figure out which one is beatTime, beatSec, and quarter.
> 

oops, forgot to say what units are; 400000 is the diration of a
MIDI tic in 24th of microseconds. To get the BPM:

	bpm = 60 * 24000000 / (tempo * ticks_per_beat)
	    = 60 * 24000000 / (400000 * 24)
	    = 150

(ticks_per_beat is the second parameter of the time signature).

[...]

However, in this case it's simpler to use "songgettempo" function,
example:

	$ rmidish
	send EOF character (control-D) to quit
	1> songimportsmf "sample.mid"
	2> print [songgettempo -1]
	150

songgettempo returns the tempo (in BPM) at the given measure
number, -1 means the end of the song. This function is not in 0.3.1
release, its only in the last snapshot:

	 http://caoua.org/midish/midish.tar.gz 

cheers,

-- Alexandre



More information about the Linux-audio-user mailing list