CodeGuru
Earthweb Search
Forums Wireless Jars Gamelan Developer.com
CodeGuru Navigation
Member Sign In
User ID:
Password:
Remember Me:
Forgot Password?
Not a member?
Click here for more information and to register.

Become a Marketplace Partner

jobs.internet.com

internet.commerce
Partners & Affiliates
















RSS Feeds

RSSAll

RSSVC++/C++

RSS.NET/C#

RSSVB

See more EarthWeb Network feeds

Home >> Visual C++ / C++ >> Graphics & Multimedia >> Multimedia


Playing MIDI Files Directly From The Resource
Rating: none

Joerg Koenig (view profile)
November 14, 1998

Introduction
Public Interface
Overridables
Usage
Download
Comments
 

Introduction (back to top)

This class is a slightly modified "spin off" from the CGTetris application. It is based on a sample in the DirectX sdk (called mstream). The conversion into a C++ class makes it much easier to use. The CMIDI class makes it easy to play a MIDI file directly from the resource (without copying it into a temporary file). One can use the class to play MIDI files, too. In this case you have to load the entire file into memory and to pass the pointer to the beginning of the buffer to the Create() method.

Public Interface (back to top)

// create the MIDI object. You cannot use a MIDI object before
// you've "Create()"ed one!
BOOL Create(LPVOID pSoundData, DWORD dwSize, CWnd * pParent = 0);
BOOL Create(LPCTSTR pszResID, CWnd * pParent = 0);
BOOL Create(UINT uResID, CWnd * pParent = 0);

// Play the MIDI file. Normally the playback will stop after
// the MIDI played off.
BOOL Play(BOOL bInfinite = FALSE);
(continued)



// usually you should never set "bReOpen" to FALSE
// unless you're absolutly sure you will
// not reuse the MIDI object. Normally only the
// destructor of the class should set this flag
BOOL Stop(BOOL bReOpen = TRUE);

BOOL IsPlaying() const;

BOOL Pause();
BOOL Continue();
BOOL IsPaused() const;

// Set playback position back to the start
// normally there is no need to call this method directly.
BOOL Rewind();

// Get the number of volume channels
DWORD GetChannelCount() const;

// Set the volume of a channel in percentage. (default 100%)
// Channels can be addressed from 0 to (GetChannelCount()-1)
void SetChannelVolume(DWORD channel, DWORD percent);

// Get the volume of a channel (in percentage)
DWORD GetChannelVolume(DWORD channel) const;
 
// Set the volume for all channels in percentage
void SetVolume(DWORD percent);

// Get the average volume for all channels (in percentage)
DWORD GetVolume() const;

// Set the tempo of the playback. (default 100%)
void SetTempo(DWORD percent);

// Get the current tempo (in percentage)
DWORD GetTempo() const;

// You can (un)set an infinite loop during playback.
// Note that "Play()" overrides this setting!
void SetInfinitePlay(BOOL bSet = TRUE);

The CMIDI class sends the message WM_MIDI_VOLUMECHANGED to its owner window (if one is set via Create()), if the volume changed during playback in another way than explicitly set by the class (a MIDI stream can control its volume by itself). The WPARAM parameter of the message is a pointer to the CMIDI object that sent the message. The LOWORD of the LPARAM parameter describes the channel that changed volume and the HIWORD is the new volume in percentage. The WM_MIDI_VOLUMECHANGED message is #define'd as WM_USER+23.

Overridables (back to top)

// NOTE THAT, IF YOU OVERRIDE ONE OF THESE METHODS, YOU MUST CALL
// THE BASE CLASS IMPLEMENTATION, TOO!

// called when a MIDI output device is opened
virtual void OnMidiOutOpen();
 
// called when the MIDI output device is closed
virtual void OnMidiOutClose();

// called when the specified system-exclusive or stream buffer
// has been played and is being returned to the application
virtual void OnMidiOutDone(MIDIHDR &);

// called when a MEVT_F_CALLBACK event is reached in the MIDI output stream
virtual void OnMidiOutPositionCB(MIDIHDR &, MIDIEVENT &);

See the sample for how you could use these overridables. A derived CMyMidi class is inside MidiSampleDlg.h.

Usage (back to top)

The source consists of 2 files:
MIDI.[h|cpp]

Add a MIDI resource to your application (from the Menu Insert->Resource->import->*.mid->Custom Type MIDI).
"Create()" your CMIDI (derived) object giving it the resource-id of your MIDI resource. Now you can call Play(), Pause(), Stop() etc.

Download(back to top)

Download Demo Project - 44 KB

Download Sources - 14 KB

Tools:
Add www.codeguru.com to your favorites
Add www.codeguru.com to your browser search box
IE 7 | Firefox 2.0 | Firefox 1.5.x
Receive news via our XML/RSS feed







RATE THIS ARTICLE:   Excellent  Very Good  Average  Below Average  Poor  

(You must be signed in to rank an article. Not a member? Click here to register)

Latest Comments:
how to read notes from single track midi file ? - Legacy CodeGuru (06/27/2003)
How to play simultaneous two midi file ? - Legacy CodeGuru (04/07/2003)
Great class... - Legacy CodeGuru (11/25/2002)
Is there any C++ Class for Low-Level MIDI control????? - Legacy CodeGuru (07/09/2002)
is there Any Low-Level MIDI Class??? or SDK?????? - Legacy CodeGuru (07/08/2002)

View All Comments
Add a Comment:
Title:
Comment:
Pre-Formatted: Check this if you want the text to display with the formatting as typed (good for source code)



(You must be signed in to comment on an article. Not a member? Click here to register)


JupiterOnlineMedia

internet.comearthweb.comDevx.commediabistro.comGraphics.com

Search:

Jupitermedia Corporation has two divisions: Jupiterimages and JupiterOnlineMedia

Jupitermedia Corporate Info


Legal Notices, Licensing, Reprints, & Permissions, Privacy Policy.

Advertise | Newsletters | Tech Jobs | Shopping | E-mail Offers