Files
AC_Pro/ImportSegmentFormUnit.cpp
2026-06-13 00:05:19 +08:00

264 lines
7.4 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ImportSegmentFormUnit.h"
#include "MessageFormUnit.h"
#define E_WrongMIDIFormat 0x00000001 //MIDI版本错误
#define E_FileFormatError 0x00000002 //语法格式错误
#define E_TSConflict 0x00000004 //节拍匹配错误
#define E_TempoConfilict 0x00000008 //速度匹配错误
#define E_LessBarsNum 0x00000010 //小节数不足
#define E_MoreBarsNum 0x00000020 //小节数过多
#define E_EmptySegment 0x00000040 //片段无有效音轨数据
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "ComboBoxComponent"
#pragma link "GeneralDialogPanel"
#pragma link "LineEdit"
#pragma link "TextButton"
#pragma resource "*.dfm"
TImportSegmentForm *ImportSegmentForm;
//---------------------------------------------------------------------------
__fastcall TImportSegmentForm::TImportSegmentForm(TComponent* Owner, TPreStylePanel* pStylePanel)
: TForm(Owner)
{
m_pStylePanel = pStylePanel;
SetSegType();
SetTransparent( this );
}
//---------------------------------------------------------------------------
void TImportSegmentForm::SetSegType()
{
int iOldIndex = m_cbSegType->DefItemIndex;
m_cbSegType->Clear();
m_aParams.clear();
TStyleItem* pStyItem = m_pStylePanel->GetStyleItem();
DWORD dwParam = 0;
if( pStyItem->nSegNum[0]<8 ){
m_cbSegType->AddItem( "伴奏" );
m_aParams.push_back( MAKELONG(pStyItem->nSegNum[0], SEGTYPE_VAR) );
}
if( pStyItem->nSegNum[1]<8 ){
m_cbSegType->AddItem( "加花" );
m_aParams.push_back( MAKELONG(pStyItem->nSegNum[1], SEGTYPE_FILL) );
}
int count = m_pStylePanel->GetIECount( 0, 0 );
if( count < 4 ){
m_cbSegType->AddItem( "前奏(大调)" );
m_aParams.push_back( MAKELONG(count, SEGTYPE_INTRO) );
}
count = m_pStylePanel->GetIECount( 0, 1 );
if( count < 4 ){
m_cbSegType->AddItem( "前奏(小调)" );
m_aParams.push_back( MAKELONG(count+4, SEGTYPE_INTRO) );
}
count = m_pStylePanel->GetIECount( 1, 0 );
if( count < 4 ){
m_cbSegType->AddItem( "尾奏(大调)" );
m_aParams.push_back( MAKELONG(count, SEGTYPE_ENDING) );
}
count = m_pStylePanel->GetIECount( 1, 1 );
if( count < 4 ){
m_cbSegType->AddItem( "尾奏(小调)" );
m_aParams.push_back( MAKELONG(count+4, SEGTYPE_ENDING) );
}
count = m_cbSegType->ItemsCount;
if( count>0 ){
if( iOldIndex<0 || iOldIndex>=count )
m_cbSegType->DefItemIndex = 0;
else
m_cbSegType->DefItemIndex = iOldIndex;
}
}
//---------------------------------------------------------------------------
void __fastcall TImportSegmentForm::OkClick(TObject *Sender)
{
String strTips[] = {L"提示:请选择导入的MIDI文件和片段类型",
L"提示:风格所含片段数已达上限",
L"错误:所选文件不是标准MIDI(1)格式",
L"错误:MIDI语法解析错误",
L"错误:MIDI节拍不一致",
L"错误:MIDI速度不一致",
L"错误:伴奏片段不得少于2小节",
L"错误:加花片段不得超过1小节",
L"错误:片段不得超过16小节",
L"错误:片段缺少有效音轨数据" };
int iTip = 0;
if( m_editFileName->Text.Length()==0 ){
m_editFileName->SetFocus();
}
else{
string strName = AnsiString(m_editFileName->Text.Trim().c_str()).c_str();
DWORD dwParam = m_aParams[m_cbSegType->DefItemIndex];
int segType = HIWORD( dwParam ),
segNo = LOWORD( dwParam ),
errCode = 0;
char tracks[16][3];
memset( tracks, -1, sizeof(tracks) );
TStyleItem* pStyItem = m_pStylePanel->GetStyleItem();
UINT idLoc = -1, idStyle = 0;
TPROSTYLE* pStyle = pStyItem->pStyle;
if( pStyle && pStyle->idLoc!=0 && pStyle->idLoc!=(UINT)-1 ){
for( int i=0; i<pStyItem->aItems->Count; i++ ){
TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i];
for( int j=0; j<pSeg->aItems->Count; j++ ){
TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j];
if( pTrk->pStyle==pStyle ){
idLoc = pStyle->idLoc;
idStyle = pStyle->idStyle;
break;
}
}
}
}
int nBars = f_CM_AddTempSegment( idLoc, idStyle, (char*)strName.c_str(), g_iMelodyTimeSignature,
g_nMelodyTempo, segType, segNo, errCode, tracks );
if( nBars<0 ){ //添加失败
if( errCode & E_FileFormatError )
iTip = 2;
else if( errCode & E_WrongMIDIFormat )
iTip = 3;
else if( errCode & E_TSConflict )
iTip = 4;
else if( errCode & E_TempoConfilict )
iTip = 5;
else if( errCode & E_LessBarsNum )
iTip = 6;
else if( errCode & E_MoreBarsNum ){
if( segType==SEGTYPE_FILL )
iTip = 7;
else
iTip = 8;
}
else if( errCode & E_EmptySegment )
iTip = 9;
}
else{ //添加成功
TPROSTYLE* pTmpStyle = GetStyleInfo( -1, 0 );
if( !pTmpStyle ){
pTmpStyle = new TPROSTYLE;
pTmpStyle->idLoc = -1;
pTmpStyle->idStyle = 0;
g_aTempStyles.push_back( pTmpStyle );
}
DWORD opts = OPT_DEL | OPT_VOL | (segType<SEGTYPE_INTRO ? OPT_BRUSH : 0);
TSegmentItem* pSegItem = new TSegmentItem( pStyItem, segType, LOWORD( dwParam ),
opts, 0, LOWORD( dwParam ), 100 );
opts = OPT_DEL|OPT_FONTPROG|OPT_VOL | (segType<SEGTYPE_INTRO ? OPT_TEXTURE : 0);
for( int i=0; i<16; i++ ){
if( tracks[i][0]>=0 ){
pSegItem->AddTrack( pTmpStyle, segNo,
tracks[i][0],
tracks[i][1],
tracks[i][2],
opts );
}
else
break;
}
if( pStyle && pStyle->idLoc!=0 && pStyle->idLoc!=(UINT)-1 ){
for( int i=0; i<pStyItem->aItems->Count; i++ ){
TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i];
for( int j=0; j<pSeg->aItems->Count; j++ ){
TTrackItem* pTrk = (TTrackItem*)pSeg->aItems->Items[j];
if( pTrk->pStyle==pStyle ){
pTrk->pStyle = pTmpStyle;
}
}
}
}
if( segType>=SEGTYPE_INTRO ){
pSegItem->nBars = nBars;
}
g_strSegImportPath = ExtractFilePath( m_editFileName->Text ).c_str();
m_pStylePanel->AddTempSegment( pSegItem );
SetSegType();
if( m_cbSegType->ItemsCount==0 ){
iTip = 1;
m_btnBrowse->Enabled = false;
m_btnOk->Enabled = false;
}
}
}
m_lblTips->Font->Color = iTip<2 ? 0x00DACBBF : 0x004040FF;
m_lblTips->Caption = strTips[iTip];
}
//---------------------------------------------------------------------------
void __fastcall TImportSegmentForm::BrowseClick(TObject *Sender)
{
TOpenDialog * pDlg = new TOpenDialog(NULL);
pDlg->Options << ofFileMustExist;
pDlg->Title = L"导入";
if( m_editFileName->Text.Length()>0 ){
pDlg->FileName = ExtractFileName(m_editFileName->Text);
pDlg->InitialDir = ExtractFilePath(m_editFileName->Text);
}
else{
pDlg->InitialDir = g_strSegImportPath.c_str();
}
pDlg->Filter = "midi文件 (*.mid)|*.MID";
if(pDlg->Execute(Handle)){
m_editFileName->Text = pDlg->FileName;
}
delete pDlg;
}
//---------------------------------------------------------------------------
void __fastcall TImportSegmentForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
switch( Key ){
case VK_RETURN:
if(m_btnOk->Enabled)
OkClick(NULL);
break;
case VK_ESCAPE:
ModalResult = mrCancel;
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TImportSegmentForm::FormCreate(TObject *Sender)
{
m_panelBk->Font->Size = g_szFont9;
m_btnBrowse->FontSize = g_szFont9;
m_btnCancel->FontSize = g_szFont9;
m_btnOk->FontSize = g_szFont9;
m_cbSegType->SetFont(g_strTxtFontName, g_szFont9);
m_editFileName->SetTextFont(g_strTxtFontName, g_szFont9);
}
//---------------------------------------------------------------------------