Main Site Links Resources Tutorials
News VB Gaming Code Downloads DirectX 7
Contact Webmaster VB Programming Product Reviews DirectX 8
  General Multimedia Articles DirectX 9

DirectMusic: Gathering Information
By: Jack Hoxley
Written: June 2000
DM_Info.Zip (10kb)

Gathering information on a piece of music is only really useful to multimedia programs; rarely is it any use to games developers. When a game is written it is quite likely that the user wont want to know much about the music settings, and the developer could just open up the file in another program and copy the details from there - rather than program it.

However, when you are writing multimedia applications you probably wont know anything about the music being created, or being loaded - which is why you use these methods to work out whats been loaded. There are three main things that you can check for:

  1. Tempo
  2. Time Signature
  3. Length

General Notice
To gather information from a piece of music you need to have it playing - at least for the information listed below. This can be quite annoying, as you'll end up hearing the first 1/2 a second of music whilst it works things out. This can easily be overcome by setting the volume to 0 (mute) this way you won't hear anything. You should be able to play the music by now; so it's not included on this particular page.

1. Tempo
Tempo is basically how fast it goes; it is useful to know this if you want to speed it up or slow it down to a certain speed. Use this code to work out the tempo:

'Variables to hold our info
dim mtLength as long,dtempo as double
'Get Length
mtTime = perf.GetMusicTime()
'<Start playing music here>

dtempo = perf.GetTempo(mtTime + 2000, 0)
'You don't need this next line; only if you intend to output the result
lblTempo.Caption = "Tempo: " & Format(dtempo, "00.00") 'You may want to use the rounding feature though

Note; you'll need the tempo to work out the length

2. Time Signature
The time signature is only really useful if you want the user to know; or you are doing something that needs it.

'Required to hold the data

Call perf.GetTimeSig(mtTime + 2000, 0, timesig)
'You only need the second half of the next line if you aren't outputting it to the user.
lblTimeSig.Caption = "Time Signature: " & timesig.beatsPerMeasure & "/" & timesig.beat

3. Length
This is the most useful of the three; and is used to greater effect in the next tutorial (looping music). In that tutorial we will be working out how far through a piece we are. You will need to have worked out the tempo before you can use this code:

'Actual Length in seconds (Rounded)
'You can extract the formula from this next line

lblLength.Caption = "Length: " & Int((((seg.GetLength() / 768) * 60) / dtempo)) & "s"
'This will round it to the nearest second; so you may well be half a second short. You will have
'to write your own code to convert this into hh:mm:ss format.

You can download a complete working example from the top of this page; or from the downloads page. See the next tutorial for putting this code to practical use.

DirectX 4 VB 2000 Jack Hoxley. All rights reserved.
Reproduction of this site and it's contents, in whole or in part, is prohibited,
except where explicitly stated otherwise.
Design by Mateo
Contact Webmaster