345 lines
7.6 KiB
C++
345 lines
7.6 KiB
C++
//---------------------------------------------------------------------------
|
|
#include <vcl.h>
|
|
#pragma hdrstop
|
|
|
|
#include "BackupUnit.h"
|
|
//---------------------------------------------------------------------------
|
|
#pragma package(smart_init)
|
|
|
|
TMelodyBackup::TMelodyBackup()
|
|
{
|
|
m_iKey = -1;
|
|
m_nBarCount = 0;
|
|
m_nStageCount = 0;
|
|
m_bModified = false;
|
|
|
|
m_aChords = NULL;
|
|
m_aFills = NULL;
|
|
m_aStages = NULL;
|
|
}
|
|
|
|
TMelodyBackup::~TMelodyBackup()
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
void TMelodyBackup::Clear()
|
|
{
|
|
m_iKey = -1;
|
|
m_nBarCount = 0;
|
|
m_nStageCount = 0;
|
|
m_bModified = false;
|
|
|
|
if( m_aChords ){
|
|
delete[] m_aChords;
|
|
m_aChords = NULL;
|
|
}
|
|
|
|
if( m_aFills ){
|
|
delete[] m_aFills;
|
|
m_aFills = NULL;
|
|
}
|
|
|
|
if( m_aStages ){
|
|
delete[] m_aStages;
|
|
m_aStages = NULL;
|
|
}
|
|
}
|
|
|
|
void TMelodyBackup::Backup()
|
|
{
|
|
//±¸·ÝMelodyÊý¾Ý
|
|
m_iKey = g_iMelodyKey;
|
|
|
|
if( m_nBarCount!=g_lstMelodyBars.size() ){
|
|
m_nBarCount = g_lstMelodyBars.size();
|
|
|
|
if( m_aChords ){
|
|
delete m_aChords;
|
|
m_aChords = NULL;
|
|
}
|
|
m_aChords = new int[m_nBarCount][2];
|
|
|
|
if( m_aFills ){
|
|
delete m_aFills;
|
|
m_aFills = NULL;
|
|
}
|
|
m_aFills = new int[m_nBarCount];
|
|
}
|
|
|
|
if( m_nStageCount!=g_lstMelodyStages.size() ){
|
|
m_nStageCount = g_lstMelodyStages.size();
|
|
|
|
if( m_aStages ){
|
|
delete m_aStages;
|
|
m_aStages = NULL;
|
|
}
|
|
m_aStages = new int[g_lstMelodyStages.size()][3];
|
|
}
|
|
|
|
for( int i=0; i<g_lstMelodyBars.size(); i++ ){
|
|
MELODYBAR *pMBar = g_lstMelodyBars[i];
|
|
m_aChords[i][0] = pMBar->iChords[0];
|
|
m_aChords[i][1] = pMBar->iChords[1];
|
|
m_aFills[i] = pMBar->iFill;
|
|
}
|
|
|
|
for( int i=0; i<g_lstMelodyStages.size(); i++ ){
|
|
MELODYSTAGE* pStage = g_lstMelodyStages[i];
|
|
m_aStages[i][0] = pStage->iFirstBar;
|
|
m_aStages[i][1] = pStage->iLastBar;
|
|
m_aStages[i][2] = pStage->iVar;
|
|
}
|
|
|
|
m_bModified = false;
|
|
}
|
|
|
|
void TMelodyBackup::Restore()
|
|
{
|
|
g_iMelodyKey = m_iKey;
|
|
|
|
for( int i=0; i<g_lstMelodyBars.size(); i++ ){
|
|
MELODYBAR *pMBar = g_lstMelodyBars[i];
|
|
pMBar->iChords[0] = m_aChords[i][0];
|
|
pMBar->iChords[1] = m_aChords[i][1];
|
|
pMBar->iFill = m_aFills[i];
|
|
}
|
|
|
|
if( m_nStageCount!=g_lstMelodyStages.size() ){
|
|
ClearGlobalVars( LIST_MELODYSTAGES );
|
|
|
|
for( int i=0; i<m_nStageCount; i++ ){
|
|
MELODYSTAGE * pStage = new MELODYSTAGE;
|
|
pStage->iFirstBar = m_aStages[i][0];
|
|
pStage->iLastBar = m_aStages[i][1];
|
|
pStage->iVar = m_aStages[i][2];
|
|
g_lstMelodyStages.push_back( pStage );
|
|
}
|
|
}
|
|
else{
|
|
for( int i=0; i<m_nStageCount; i++ ){
|
|
MELODYSTAGE * pStage = g_lstMelodyStages[i];
|
|
pStage->iFirstBar = m_aStages[i][0];
|
|
pStage->iLastBar = m_aStages[i][1];
|
|
pStage->iVar = m_aStages[i][2];
|
|
}
|
|
}
|
|
|
|
m_bModified = false;
|
|
}
|
|
|
|
BOOL TMelodyBackup::CheckModified( int iCheckType )
|
|
{
|
|
if( iCheckType==CHECK_GET ){
|
|
return m_bModified;
|
|
}
|
|
|
|
m_bModified &= ~iCheckType;
|
|
|
|
if( iCheckType & CHECK_KEY ){
|
|
if( m_iKey != g_iMelodyKey )
|
|
m_bModified |= CHECK_KEY;
|
|
}
|
|
|
|
if( iCheckType & CHECK_BAR ){
|
|
if( m_nBarCount!=g_lstMelodyBars.size() ){
|
|
m_bModified |= CHECK_BAR;
|
|
}
|
|
}
|
|
|
|
if( !(m_bModified & CHECK_BAR) && ((iCheckType & CHECK_CHORD)||(iCheckType & CHECK_FILL) )){
|
|
for( int i=0; i<m_nBarCount; i++ ){
|
|
MELODYBAR *pMBar = g_lstMelodyBars[i];
|
|
if( !(m_bModified & CHECK_CHORD) && (iCheckType & CHECK_CHORD) ){
|
|
if( m_aChords[i][0]!=pMBar->iChords[0] || m_aChords[i][1]!=pMBar->iChords[1] ){
|
|
m_bModified |= CHECK_CHORD;
|
|
}
|
|
}
|
|
|
|
if( !(m_bModified & CHECK_FILL ) && (iCheckType & CHECK_FILL ) ){
|
|
if( m_aFills[i]!=pMBar->iFill ){
|
|
m_bModified |= CHECK_FILL;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if( iCheckType & CHECK_STAGE ){
|
|
if( m_nStageCount!=g_lstMelodyStages.size() ){
|
|
m_bModified |= CHECK_STAGE;
|
|
}
|
|
}
|
|
|
|
if( !(m_bModified & CHECK_STAGE) && ((iCheckType & CHECK_POS)||(iCheckType & CHECK_VAR))){
|
|
for( int i=0; i<m_nStageCount; i++ ){
|
|
MELODYSTAGE* pStage = g_lstMelodyStages[i];
|
|
if( !(m_bModified & CHECK_POS) && (iCheckType & CHECK_POS) ){
|
|
if( m_aStages[i][0]!=pStage->iFirstBar || m_aStages[i][1]!=pStage->iLastBar ){
|
|
m_bModified |= CHECK_POS;
|
|
}
|
|
}
|
|
|
|
if( !(m_bModified & CHECK_VAR) && (iCheckType & CHECK_VAR ) ){
|
|
if( m_aStages[i][2]!=pStage->iVar ){
|
|
m_bModified |= CHECK_VAR;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return m_bModified;
|
|
}
|
|
|
|
TComposeBackup::TComposeBackup()
|
|
{
|
|
m_nStageCount = 0;
|
|
m_bModified = false;
|
|
m_iKey = -1;
|
|
}
|
|
|
|
TComposeBackup::~TComposeBackup()
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
void TComposeBackup::Backup( int iKey )
|
|
{
|
|
Clear();
|
|
|
|
m_iKey = iKey;
|
|
m_nStageCount = g_lstComposeStages.size();
|
|
|
|
for( int i=0; i<m_nStageCount; i++ ){
|
|
COMPOSESTAGE *pNewStage = new COMPOSESTAGE;
|
|
COMPOSESTAGE *pBkStage = g_lstComposeStages[i];
|
|
|
|
pNewStage->iMelodyStage = pBkStage->iMelodyStage;
|
|
pNewStage->nStageBars = pBkStage->nStageBars;
|
|
pNewStage->iVar = pBkStage->iVar;
|
|
pNewStage->idStyle = pBkStage->idStyle;
|
|
pNewStage->strStyleName = pBkStage->strStyleName;
|
|
for( int j=0; j<pBkStage->aFills.size(); j++ ){
|
|
pNewStage->aFills.push_back(pBkStage->aFills[j]);
|
|
}
|
|
|
|
m_lstStages.push_back( pNewStage );
|
|
}
|
|
|
|
m_bModified = false;
|
|
}
|
|
|
|
void TComposeBackup::Restore()
|
|
{
|
|
if( m_nStageCount!=g_lstComposeStages.size() ){
|
|
ClearGlobalVars( LIST_COMPOSESTAGES );
|
|
|
|
for( int i=0; i<m_nStageCount; i++ ){
|
|
COMPOSESTAGE *pNewStage = new COMPOSESTAGE;
|
|
COMPOSESTAGE *pBkStage = m_lstStages[i];
|
|
|
|
pNewStage->iMelodyStage = pBkStage->iMelodyStage;
|
|
pNewStage->nStageBars = pBkStage->nStageBars;
|
|
pNewStage->iVar = pBkStage->iVar;
|
|
pNewStage->idStyle = pBkStage->idStyle;
|
|
pNewStage->strStyleName = pBkStage->strStyleName;
|
|
for( int j=0; j<pBkStage->aFills.size(); j++ ){
|
|
pNewStage->aFills.push_back(pBkStage->aFills[j]);
|
|
}
|
|
|
|
g_lstComposeStages.push_back( pNewStage );
|
|
}
|
|
}
|
|
else{
|
|
for( int i=0; i<m_nStageCount; i++ ){
|
|
COMPOSESTAGE *pCStage = g_lstComposeStages[i];
|
|
COMPOSESTAGE *pBkStage = m_lstStages[i];
|
|
|
|
pCStage->iMelodyStage = pBkStage->iMelodyStage;
|
|
pCStage->nStageBars = pBkStage->nStageBars;
|
|
pCStage->iVar = pBkStage->iVar;
|
|
pCStage->idStyle = pBkStage->idStyle;
|
|
|
|
pCStage->aFills.clear();
|
|
for( int j=0; j<pBkStage->aFills.size(); j++ ){
|
|
pCStage->aFills.push_back(pBkStage->aFills[j]);
|
|
}
|
|
}
|
|
}
|
|
|
|
m_bModified = false;
|
|
}
|
|
|
|
BOOL TComposeBackup::CheckModified( int iCheckType )
|
|
{
|
|
if( iCheckType==CHECK_GET ){
|
|
return m_bModified;
|
|
}
|
|
|
|
m_bModified &= ~iCheckType;
|
|
|
|
if( iCheckType & CHECK_STAGE ){
|
|
if( m_nStageCount!=g_lstComposeStages.size() ){
|
|
m_bModified |= CHECK_STAGE;
|
|
}
|
|
}
|
|
|
|
if( !(m_bModified & CHECK_STAGE) && (iCheckType & CHECK_STAGE || iCheckType & CHECK_POS ||
|
|
iCheckType & CHECK_VAR || iCheckType & CHECK_FILL ||
|
|
iCheckType & CHECK_STYLE ) ){
|
|
for( int i=0; i<m_nStageCount; i++ ){
|
|
COMPOSESTAGE* pCpStage = g_lstComposeStages[i];
|
|
COMPOSESTAGE* pBkStage = m_lstStages[i];
|
|
|
|
if( !(m_bModified & CHECK_POS) && (iCheckType & CHECK_POS) ){
|
|
if( pCpStage->iMelodyStage!=pBkStage->iMelodyStage ||
|
|
pCpStage->nStageBars!=pBkStage->nStageBars ){
|
|
m_bModified |= CHECK_POS;
|
|
}
|
|
}
|
|
|
|
if( !(m_bModified & CHECK_VAR) && (iCheckType & CHECK_VAR) ){
|
|
if( pCpStage->iVar!=pBkStage->iVar ){
|
|
m_bModified |= CHECK_VAR;
|
|
}
|
|
}
|
|
|
|
if( !(m_bModified & CHECK_STYLE) && (iCheckType & CHECK_STYLE) ){
|
|
if( pCpStage->idStyle!=pBkStage->idStyle ){
|
|
m_bModified |= CHECK_STYLE;
|
|
}
|
|
}
|
|
|
|
if( !(m_bModified & CHECK_FILL) && (iCheckType & CHECK_FILL) ){
|
|
if( pCpStage->aFills.size()!=pBkStage->aFills.size() ){
|
|
m_bModified |= CHECK_FILL;
|
|
}
|
|
else{
|
|
for( int j=0; j<pBkStage->aFills.size(); j++ ){
|
|
if( pCpStage->aFills[j]!=pBkStage->aFills[j] ){
|
|
m_bModified |= CHECK_FILL;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return m_bModified;
|
|
}
|
|
|
|
void TComposeBackup::Clear()
|
|
{
|
|
m_iKey = -1;
|
|
|
|
for( int i=0; i<m_nStageCount; i++ ){
|
|
delete m_lstStages[i];
|
|
}
|
|
m_lstStages.clear();
|
|
m_nStageCount = 0;
|
|
}
|
|
|
|
TMelodyBackup g_bkMelody;
|
|
TComposeBackup g_bkCompose;
|
|
|