Playing MIDI Files Directly From The Resource | CodeGuru

Playing MIDI Files Directly From The Resource

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 […]

Written By
CodeGuru Staff
CodeGuru Staff
Nov 14, 1998
3 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

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);

// 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.

Advertisement

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

CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.