⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 musicsys.h

📁 游戏编程精粹2第六章源码
💻 H
字号:
/* Copyright (C) Scott Patterson, 2001. 
 * All rights reserved worldwide.
 *
 * This software is provided "as is" without express or implied
 * warranties. You may freely copy and compile this source into
 * applications you distribute provided that the copyright text
 * below is included in the resulting source code, for example:
 * "Portions Copyright (C) Scott Patterson, 2001"
 */

// MusicSys.h

#ifndef MUSICSYS_H
#define MUSICSYS_H

#include "Def.h"
#include "Sequence.h"
#include "Track.h"
#include "Voice.h"
#include "EventCommand.h"
#include "csyn.h"
#include "csynutil.h"

class MusicSequencerSystemConfig_t {
public:
	MusicSequencerSystemConfig_t();
	~MusicSequencerSystemConfig_t();

	// set the system maximum sequence count
	void SetSequenceCount( int nSequenceCount );
	int  GetSequenceCount();
	// set the system maximum track count
	void SetTrackCount( int nTrackCount );
	int  GetTrackCount();
	// set the system maximum voice architecture type count
	void SetVoiceArchitectureTypeCount( int nVoiceArchitectureTypeCount );
	int  GetVoiceArchitectureTypeCount();
	// set the system maximum voice count per architecture
	void SetVoiceCount( int nVoiceArchitectureType, int nVoiceCount );
	int  GetVoiceCount( int nVoiceArchitectureType );
private:
	int m_nSequenceCount;
	int m_nTrackCount;
	int m_nVoiceArchitectureTypeCount;  // number of voice architecture types
	IntVector_t m_VoiceCountVector;     // number of voices per voice architecture type
};

class MusicSequencerSystemState_t {
	bool m_bInitialized;
};

class SequenceData_t;
typedef std::map< int, SequenceData_t * > IntToSequenceDataPtrMap_t;

class InstrumentData_t;
typedef std::map< int, InstrumentData_t * > IntToInstrumentDataPtrMap_t;

class MusicSequencerSystem_t {
public:
	MusicSequencerSystem_t();
	~MusicSequencerSystem_t();

	bool Init( MusicSequencerSystemConfig_t &Config );
	bool AudioFrame();
	bool Shutdown();

	double GetCSynUsage();

	bool LoadInstrument( InstrumentData_t *pInstrumentData );
	void SetSlowInstrumentEnvelope( int nID );
	bool UnloadInstruments();

	bool LoadSequence( SequenceData_t *pSequenceData );
	void SetSequenceMixes( SequenceData_t *pSequenceData, IntVectorVector_t *pTrackVolumeVectorVector );
	bool PlaySequence( int nID, int nMixID );
	void UpdateSequenceMix( int nID, int nMixID );
	void StopSequences();
	bool UnloadSequences();

private:
	// system config
    MusicSequencerSystemConfig_t  m_Config;

	// system state
    MusicSequencerSystemState_t   m_State;

	// system update
	int m_nWorkTick;
	bool Update();

	void DisplayStats();
	void CheckForFinishedVoices();
	void PerformTargetStateChanges(); // interactive feature
	u32 CalcTimeStep( u16 qpm, u16 ppq, u16 ups );

	// resource allocation
	SequenceVector_t      m_SequenceVector;
	TrackVector_t         m_TrackVector;
	VoiceVectorVector_t   m_VoiceVectorVector; // voice vector per voice architecture type

	// resource assignment
    SequencePtrList_t     m_ActiveSequencePtrList;
    SequencePtrList_t     m_FreeSequencePtrList;
	Sequence_t *MakeActiveSequence();
	void FreeActiveSequence( Sequence_t *pSequence );

    TrackPtrList_t        m_ActiveTrackPtrList;
    TrackPtrList_t        m_FreeTrackPtrList;
	Track_t *MakeActiveTrack();
	void FreeActiveTrack( Track_t *pTrack );

	VoicePtrListVector_t  m_ActiveVoicePtrListVector; // active voice ptr list per voice architecture type
	VoicePtrListVector_t  m_FreeVoicePtrListVector; // free voice ptr list per voice architecture type
	Voice_t *MakeActiveVoice( int nVoiceArchitectureType );
	void FreeActiveVoice( Voice_t *pVoice );

	// sequence data registration
	IntToSequenceDataPtrMap_t  m_IntToSequenceDataPtrMap;
	SequenceData_t *FindSequenceData( int nID );
	// instrument data registration
	IntToInstrumentDataPtrMap_t  m_IntToInstrumentDataPtrMap;
	InstrumentData_t *FindInstrumentData( int nID );

	// event commands
	friend void NoteOff_Function( MusicSequencerSystem_t *pMSS, Track_t *pTrack );
	friend void NoteOn_Function( MusicSequencerSystem_t *pMSS, Track_t *pTrack );
	friend void SetPan_Function( MusicSequencerSystem_t *pMSS, Track_t *pTrack );
	friend void SetInstrument_Function( MusicSequencerSystem_t *pMSS, Track_t *pTrack );
	friend void TrackEnd_Function( MusicSequencerSystem_t *pMSS, Track_t *pTrack );

	// cleanup commands
	friend void Track_AllNotesOff( MusicSequencerSystem_t *pMSS, Track_t *pTrack );

	// this defines a type that is a function pointer
	typedef void (*EventFuncPtr_t)(MusicSequencerSystem_t *,Track_t *);

	// this is an array of function pointers
	static EventFuncPtr_t ms_aFP[EVENT_TYPE_COUNT];

	// audio exponential taper table
	static int ms_anAudioTaper[128];

	// private CSyn stuff
	CSynMix     m_CSynMix;
	CSynContext m_CSynContext;
};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -