Microsoft-3D-Movie-Maker/kauai/SRC/MIDI.H

106 lines
2.2 KiB
C++

/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
/***************************************************************************
Author: ShonK
Project: Kauai
Copyright (c) Microsoft Corporation
Midi playback class.
***************************************************************************/
#ifndef MIDI_H
#define MIDI_H
typedef class MIDS *PMIDS;
// midi event
struct MIDEV
{
ulong ts; // time stamp of this event
long cb; // number of bytes to send (in rgbSend)
long lwTempo; // the current tempo - at a tempo change, cb will be 0
union
{
byte rgbSend[4]; // bytes to send if pvLong is nil
long lwSend; // for convenience
};
};
typedef MIDEV *PMIDEV;
/***************************************************************************
Midi stream parser. Knows how to parse standard MIDI streams.
***************************************************************************/
typedef class MSTP *PMSTP;
#define MSTP_PAR BASE
#define kclsMSTP 'MSTP'
class MSTP : public MSTP_PAR
{
RTCLASS_DEC
NOCOPY(MSTP)
ASSERT
MARKMEM
protected:
ulong _tsCur;
long _lwTempo;
byte *_prgb;
byte *_pbLim;
byte *_pbCur;
byte _bStatus;
Debug( long _cactLongLock; )
PMIDS _pmids;
bool _FReadVar(byte **ppbCur, long *plw);
public:
MSTP(void);
~MSTP(void);
void Init(PMIDS pmids, ulong tsStart = 0, long lwTempo = 500000);
bool FGetEvent(PMIDEV pmidev, bool fAdvance = fTrue);
};
/***************************************************************************
Midi Stream object - this is like a MTrk chunk in a standard MIDI file,
with timing in milliseconds.
***************************************************************************/
#define MIDS_PAR BACO
#define kclsMIDS 'MIDS'
class MIDS : public MIDS_PAR
{
RTCLASS_DEC
ASSERT
MARKMEM
protected:
HQ _hqrgb;
friend MSTP;
MIDS(void);
static long _CbEncodeLu(ulong lu, byte *prgb);
public:
static bool FReadMids(PCRF pcrf, CTG ctg, CNO cno, PBLCK pblck,
PBACO *ppbaco, long *pcb);
static PMIDS PmidsRead(PBLCK pblck);
static PMIDS PmidsReadNative(FNI *pfni);
~MIDS(void);
virtual bool FWrite(PBLCK pblck);
virtual long CbOnFile(void);
};
#endif //!MIDI_H