Files
AC_Pro/Compose.h
T
2026-06-13 00:05:19 +08:00

248 lines
6.2 KiB
C++

//---------------------------------------------------------------------------
#ifndef ComposeH
#define ComposeH
//---------------------------------------------------------------------------
#include <vector>
#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<TTrack*> TTrackList;
typedef vector<TBar*> 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<TOpusStage*> TOpusStageList;
typedef vector<TPROSTYLE*> STYLELIST;
typedef vector<TStage*> TStageList;
typedef struct{
UINT idLoc;
UINT idStyle;
vector<DWORD> aSegs;
} TLocSegment;
typedef vector<TLocSegment*> LOCSEGLIST;
typedef struct{
BYTE iBankOld;
BYTE iBankNew;
} TBankMap;
typedef vector<TBankMap*> 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<BYTE>& 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<int>&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<DWORD> 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<UINT> 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