//--------------------------------------------------------------------------- #ifndef ComposeH #define ComposeH //--------------------------------------------------------------------------- #include #include "ProCommon.h" using namespace std; #define POINTS_PER_BAR 120 //每小节点数 #define SEGTYPE_VAR 0 #define SEGTYPE_FILL 1 #define SEGTYPE_INTRO 2 #define SEGTYPE_ENDING 3 #define CHECK_GET 0x0000 #define CHECK_STAGE 0x0001 #define CHECK_TRACK 0x0002 #define CHECK_CHORD 0x0004 #define CHECK_KEY 0x0008 #define CHECK_PROG 0x0010 #define CHECK_STAGEALL 0x001F #define CHECK_VOL 0x0020 #define CHECK_ALL 0x00FF /***************************************************************************************/ // 全局类定义 /***************************************************************************************/ // TCompose typedef struct tagBar0 { //每小节最多POINTS_PER_BAR个音量值 DWORD aVols[POINTS_PER_BAR]; bool aRecording[POINTS_PER_BAR]; TBarChords aChords; bool bInvalid; // 是否无效 tagBar0() { bInvalid = false; memset( this, 0, sizeof(tagBar0) ); } tagBar0( tagBar0* pSrc ) { memcpy( this, pSrc, sizeof(tagBar0)); } } TBarOld, *PTBarOld; typedef struct tagBar { TBarChords aChords; //和弦 char iBarKey; // 小节的调号 char reserved[3]; // 保留字段,对齐字节 tagBar() { memset( this, 0, sizeof(tagBar) ); iBarKey = -1; } tagBar( tagBar* pSrc ) { memcpy( this, pSrc, sizeof(tagBar)); } } TBar, *PTBar; typedef vector TTrackList; typedef vector TBarList; typedef struct tagOpusStage //曲式分段信息 { char iSegType; //片段类型 0=VAR, 1=FILL, 2=INTRO, 3=ENDING char iSegNo; //最初片段号 char iSegKey; //分段调号 char nVol; //段落音量 TBarList aBars; //小节列表 TTrackList aTracks; //轨道数列表 tagOpusStage(){ iSegKey = iSegType = iSegNo = -1; nVol = 100; } tagOpusStage( tagOpusStage* pSrc ){ iSegType = pSrc->iSegType; iSegNo = pSrc->iSegNo; iSegKey = pSrc->iSegKey; nVol = pSrc->nVol; } ~tagOpusStage(){ while( !aBars.empty() ){ delete aBars.back(); aBars.pop_back(); } while( !aTracks.empty() ){ delete aTracks.back(); aTracks.pop_back(); } } } TOpusStage, *PTOpusStage; typedef vector TOpusStageList; typedef vector STYLELIST; typedef vector TStageList; typedef struct{ UINT idLoc; UINT idStyle; vector aSegs; } TLocSegment; typedef vector LOCSEGLIST; typedef struct{ BYTE iBankOld; BYTE iBankNew; } TBankMap; typedef vector BANKMAPLIST; class TCompose { protected: UINT m_idLoc, m_idStyle; int m_nBarCount; TOpusStageList m_lstStages; void ClearStages(); public: virtual void Clear(); int StageCount() { return m_lstStages.size(); }; TOpusStage* CopyStageAt( int iStage ); TOpusStageList& StageList() { return m_lstStages; }; virtual void Set( UINT idLoc, UINT idStyle, TOpusStageList& lstStages ); virtual void Get( UINT& idLoc, UINT& idStyle, TOpusStageList& lstStages ); int BarCount() { return m_nBarCount; }; virtual void WriteProj( LOCSEGLIST& lstLocSeg, FILE* pFile ); virtual int ReadProj( STYLELIST& aUnsolvedStyles, FILE* pFile, DWORD dwVersion ); void SetTempStyle( UINT idLoc, UINT idStyle, int idSet ); void GetSpecBanks( vector& lstBank ); void SetSpecBanks( BANKMAPLIST& lstMap ); TCompose() { m_idLoc = m_idStyle = -1; m_nBarCount = 0; }; ~TCompose() { Clear(); }; }; class TTheme : public TCompose { private: bool m_bWeakup; int m_iKey; public: bool Empty() { return m_lstStages.empty(); }; bool IsWeadup() { return m_bWeakup; }; TBar* GetFirstBar() { return m_lstStages[0]->aBars[0]; }; int GetKey(){ return m_iKey; }; virtual void Clear(); virtual void Set( UINT idLoc, UINT idStyle, TOpusStageList& lstStages ); virtual void WriteProj( LOCSEGLIST& lstLocSeg, FILE* pFile ); virtual int ReadProj( STYLELIST& aUnsolvedStyles, FILE* pFile, DWORD dwVersion ); void Build( TBarList& lstBars, vector&lstStages ); int GetFirstChord(); int GetLastChord(); void Set( TOpusStageList& lstStages ); TTheme(); }; class TOpus : public TCompose { private: BOOL m_bModified; TOpusStageList m_lstStagesBk; int m_iKeyBk; vector m_aStageBars; public: TOpus(); ~TOpus(); virtual void Clear(); virtual void Set( UINT idLoc, UINT idStyle, TOpusStageList& lstStages ); virtual void WriteProj( LOCSEGLIST& lstLocSeg, FILE* pFile ); virtual int ReadProj( STYLELIST& aUnsolvedStyles, FILE* pFile, DWORD dwVersion ); void ClearBackup(); void CopyStages( int iStartBar, int iEndBar, TOpusStageList* lstStages ); void Backup(); void Restore(); BOOL CheckModified( int iCheckType ); void BuildStyleItem(); void ChangeKey( int iBarStart, int iBarEnd, int iKey, int keys[] ); void CountBars(); int FindStage( int iBar, int *piFirstBar ); int StageFirstBar( int iStage ); int StageLastBar( int iStage ); DWORD StageRange( int iStage ); void InsertStage( int iIns, TOpusStage* pStage ); void RemoveStage( int iDel ); void CutStage( int iStage, int iCutBar ); void ChangeStageBar( int iStage, int nBar, bool bCount ); }; /***************************************************************************************/ // 全局变量 /***************************************************************************************/ extern int g_iPreStage, // 预设段落模式 g_iMelodyKey; // 主旋律调号 extern float g_fMusicVolume; //伴奏音量 extern bool g_bComposeMute; //伴奏静音 extern TTheme g_Theme; //主旋律对象 extern TOpus g_Opus; //全曲对象 extern TOpusStageList& g_lstOpusStages; //曲式结构段落表 extern vector g_lstPaidStyleIDs; //当前工程本次使用已支付风格ID列表 /***************************************************************************************/ // 全局函数 /***************************************************************************************/ int FindStage( int iBar, int *piFirstBar=NULL ); int FirstBar( int iStage ); int GetBarCount(); int GetBarKey( int iBar ); TOpusStage* DuplicateStage( TOpusStage* pSrc ); void ProduceTracks( TOpusStage* pStage, void* pSegItem ); bool DiffStages( TOpusStage* pStage1, TOpusStage* pStage2, bool bPassSegNo=false, bool bPassFile=true ); #endif