//--------------------------------------------------------------------------- #include #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; iaItems->Count; i++ ){ TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; for( int j=0; jaItems->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=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; iaItems->Count; i++ ){ TSegmentItem* pSeg = (TSegmentItem*)pStyItem->aItems->Items[i]; for( int j=0; jaItems->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); } //---------------------------------------------------------------------------