I posted the two articles on PlaySound and mciSendString for a reason. While both of these APIs are capable of playing WAV files, that is PlaySound's specialty. mciSendString can also play MP3 and MIDI files... however, I found that mciSendString is actually kind of slow and doesn't start playing the file instantly, when I demand it to (I tested it with a MIDI file and it chopped off the first second, which is not very good when you want that introduction to sound nice). So, the next level up in the .NET world for playing music is probably the DirectX AudioVideoPlayback.

Fortunately, the AudioVideoPlayback is pretty simple to get working.

Private Bbx As Microsoft.DirectX.AudioVideoPlayback.Audio
'To load a file:
Bbx = Microsoft.DirectX.AudioVideoPlayback.Audio.FromFile(Filename, False)
'You can even set the file to run automatically.
Bbx = Microsoft.DirectX.AudioVideoPlayback.Audio.FromFile(Filename, True)
'Or you can get it to play like this:
Bbx.Play()
'You can stop it like this:
Bbx.Stop()
'And you can Pause it like this:
Bbx.Pause()
'With extra Double variables, you can get the current position in the song (in fractions of seconds).
Dim SM As Double
SM = Bbx.CurrentPosition
'Then, when you need it, reset the .CurrentPosition and play again.
Bbx.CurrentPosition = SM
Bbx.Play()


The problems start to arise when you try to play a different song... in any version of AudioVideoPlayback other than the latest, you get any kind of internal errors (that's an error in the library, not our fault ), a green error highlighting and now, of course, your Audio doesn't work. However, with the latest version, you can now switch between multiple files (although I do think the method is kind of clunky). I even wrote some nice functions to go with them. They haven't been polished yet as far as the CurrentPosition goes, but they do Play and Stop the music.
    Public Function StopMusic() As Double
        If Not Bbx Is Nothing AndAlso Not Bbx.Stopped Then
        'Must be music playing in order for us to need to stop it.
            StopMusic = Bbx.CurrentPosition
            'Get current position
            Bbx.Stop()
        Else
	    StopMusic = 0.0#
            'Return a big zero if music is not playing.
        End If
    End Function

    Public Function PlayMusic(ByVal Filename As String) As Double

        PlayMusic = StopMusic()
	'Also returns the location of the playing music
        If Bbx Is Nothing Then
            Bbx = Audio.FromFile(Filename, True)
            'Create a new Audio object.  True means it's going to be playing.
        ElseIf Not Bbx.Playing Then
            Bbx.Open(Filename, True)
            'The Audio object is set.  If it is Stopped, then we change the file that is in the 
        End If
    End Function

    Public Function PlayMusic(ByVal Filename As String, ByVal StartAt As Double) As Double

        PlayMusic = StopMusic()
        'Also returns the location of the playing music
        If Bbx Is Nothing Then
            Bbx = Audio.FromFile(Filename, False)
            'Create a new Audio object.
            Bbx.CurrentPosition = StartAt
            'Set start position before playing the file.
            Bbx.Play()
        ElseIf Not Bbx.Playing Then
            Bbx.Open(Filename, False)
            Bbx.CurrentPosition = StartAt
            'Set start position before playing the file.
            Bbx.Play()
        End If
    End Function