//--------------------------------------------------------------------------- #include #pragma hdrstop #include "SwitchProgFormUnit.h" #include "GlobalUnit.h" #include "Instruments.h" #include "VSTiFormUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "TextButton" #pragma link "PNGButton" #pragma link "GeneralDialogPanel" #pragma link "CKBox" #pragma resource "*.dfm" TSwitchProgForm *SwitchProgForm; //--------------------------------------------------------------------------- __fastcall TSwitchProgForm::TSwitchProgForm(TComponent* Owner, BYTE iFont, BYTE iProg, BYTE iChno ) : TForm(Owner) { m_iChno = m_iChnoOrig = iChno; m_iProg = m_iProgOrig = iProg; m_iFontOrig = iFont; m_iFont = ( iFont==0xFF && !g_bExtFont )? g_idFont : iFont; m_bVSTi = iFont!=0xFF && iFont>=0x80; } //--------------------------------------------------------------------------- __fastcall TSwitchProgForm::~TSwitchProgForm() { f_MM_Stop(); if( m_lvSoundFont ){ delete m_lvSoundFont; m_lvSoundFont = NULL; } if( m_lvProgram ){ delete m_lvProgram; m_lvProgram = NULL; } } //--------------------------------------------------------------------------- void __fastcall TSwitchProgForm::FormCreate(TObject *Sender) { m_BKGPanel->Font->Size = g_szFont9; m_btnOk->FontSize = g_szFont9; m_btnCancel->FontSize = g_szFont9; m_btnSet->FontSize = g_szFont9; m_lvSoundFont = new TListPanel(this); m_lvSoundFont->Parent = m_panFont; m_lvSoundFont->Align = alClient; // m_lvSoundFont->Parent = m_BKGPanel; // m_lvSoundFont->SetBounds( 27, 79, 156, 204 ); m_lvSoundFont->SetTextFont(g_strTxtFontName, g_szFont9); m_lvProgram = new TListPanel(this); m_lvProgram->Parent = m_panProg; m_lvProgram->Align = alClient; // m_lvProgram->Parent = m_BKGPanel; // m_lvProgram->SetBounds( 201, 79, 156, 204 ); m_lvProgram->SetTextFont(g_strTxtFontName, g_szFont9); m_lvProgram->OnDblClick = ProgramDblClick; if( m_bVSTi ){ m_tabVSTi->BringToFront(); m_tabVSTi->Down = true; m_tabSF2->Down = false; m_btnSet->Visible = true; } ResetComponents( true ); SetTransparent( this ); } //--------------------------------------------------------------------------- void TSwitchProgForm::ResetComponents( bool bInit ) { InitSoundFontList(); InitProgramList(); if( !bInit ){ m_lvSoundFont->ResetScroll(); m_lvProgram->ResetScroll(); } m_lblProgram->Caption = m_bVSTi ? L"通道/乐器" : L"音色/乐器"; m_btnOk->Enabled = !( m_lvSoundFont->SelectedItemIndex<0 || m_lvProgram->SelectedItemIndex<0 ); m_btnSet->Enabled = m_bVSTi && m_lvSoundFont->SelectedItemIndex>=0; } //--------------------------------------------------------------------------- void __fastcall TSwitchProgForm::InitSoundFontList() { m_lvSoundFont->Clear(); int iSel = -1; if( m_bVSTi ){ for( int i=0; istrVSTName, DoItemClick ); pItem->Tag = i + 0x80; if( m_iFont==pItem->Tag ){ iSel = i; } m_lvSoundFont->AddItem( pItem ); } } else{ for( int i=0; inDrumCount>0 || m_iChno!=9 && pFont->nInstCount>0 ){ TListPanelItem* pItem = new TListPanelItem( pFont->strFontName, DoItemClick ); pItem->Tag = i; if( g_bExtFont && m_iFont==0xFF ){ int ind = m_iProg / 8; if( g_lstFonts[i]==g_lstCZFonts[ind] ) iSel = m_lvSoundFont->ItemsCount; } else if( i==m_iFont ){ iSel = m_lvSoundFont->ItemsCount; } m_lvSoundFont->AddItem( pItem ); } } } m_lvSoundFont->SelectedItemIndex = iSel; } //--------------------------------------------------------------------------- void __fastcall TSwitchProgForm::InitProgramList() { m_lvProgram->Clear(); if( m_lvSoundFont->SelectedItemIndex<0 ) return; int ind = -1; if( m_bVSTi ){ VSTINFO* pInfo = g_lstVSTi[m_iFont-0x80]; int iNamedChan = -1, iPlugin = -1; if( pInfo->aPlugins.size()>0 ){ iPlugin = 0; iNamedChan = pInfo->aPlugins[iPlugin]->id; } for( int i=0; i<16; i++ ){ char text[32]; if( i==iNamedChan ){ strcpy( text, pInfo->aPlugins[iPlugin]->name ); if( ++iPluginaPlugins.size() ) iNamedChan = pInfo->aPlugins[iPlugin]->id; else iNamedChan = -1; } else sprintf( text, "Channel %d", i+1 ); TListPanelItem* pItem = new TListPanelItem( text, DoItemClick ); pItem->Tag = i; m_lvProgram->AddItem( pItem ); if( m_lvSoundFont->SelectedItemIndex>=0 && pItem->Tag==m_iChno ) ind = i; } } else{ FONTINFO* pFI = NULL; if( g_bExtFont && m_iFont==0xFF ){ int ind = m_iProg / 8; pFI = g_lstCZFonts[ind]; } else{ pFI = g_lstFonts[m_iFont]; } int num = m_iChno==9 ? pFI->nDrumCount : pFI->nInstCount; FONTPRESET* pSet = ( m_iChno==9 ? pFI->aDrums : pFI->aInsts ); char** strInst = NULL; if( m_iChno!=9 ){ if( !strcmp( pFI->strFontName, g_strDefaultSoundSet ) || !strcmp( pFI->strFontName, "Pop default" ) ) strInst = GM_INSTRUMENT; else{ bool bExtend = false; for( int i=0; i<16; i++ ){ if( pFI == g_lstCZFonts[i] ){ bExtend = true; break; } } if( bExtend ) strInst = GM_INSTRUMENT; } } for( int i=0; iTag = pSet[i].id; m_lvProgram->AddItem( pItem ); if( pItem->Tag==m_iProg ) ind = i; } } m_lvProgram->SelectedItemIndex = ind; } //--------------------------------------------------------------------------- void __fastcall TSwitchProgForm::DoItemClick(TListPanel *Sender, int Index) { if( Index<0 || Index>=Sender->ItemsCount ) return; TListPanelItem* pItem = Sender->GetItem( Index ); int iSel = pItem->Tag; if( Sender==m_lvSoundFont && ( m_iFont!=iSel || m_bVSTi ) ){ bool bReset = m_iFont!=iSel; if( bReset ){ m_iFont = iSel; m_lvProgram->Clear(); } if( m_bVSTi ){ ShowVSTiPanel( bReset ); } else{ f_MM_Stop(); m_iProg = -1; InitProgramList(); m_lvProgram->ResetScroll(); } } else if( Sender==m_lvProgram && ( m_bVSTi && m_iChno!=iSel || !m_bVSTi && m_iProg!=iSel )){ f_MM_Stop(); if( m_bVSTi ) m_iChno = iSel; else m_iProg = iSel; } m_btnOk->Enabled = !( m_lvSoundFont->SelectedItemIndex<0 || m_lvProgram->SelectedItemIndex<0 ); m_btnSet->Enabled = m_bVSTi && m_lvSoundFont->SelectedItemIndex>=0; } //--------------------------------------------------------------------------- void __fastcall TSwitchProgForm::ProgramDblClick(TObject *Sender) { if( m_lvProgram->SelectedItemIndex>=0 ){ TListPanelItem* pItem = m_lvProgram->GetItem( m_lvProgram->SelectedItemIndex ); int iChno = m_bVSTi ? pItem->Tag : -1, iProg = m_bVSTi ? -1 : pItem->Tag; char* strFile = m_iFont==0xFF ? NULL : m_iFont<0x80 ? g_lstFonts[m_iFont]->strFileName : g_lstVSTi[m_iFont-0x80]->strFileName; f_MM_PlayDemo( Handle, m_iStartBar, iChno, iProg, m_iFont, strFile ); } } //--------------------------------------------------------------------------- void __fastcall TSwitchProgForm::VSTSetClick(TObject *Sender) { ShowVSTiPanel( false ); } //--------------------------------------------------------------------------- void __fastcall TSwitchProgForm::SF2Click(TObject *Sender) { if( m_bVSTi ) SwitchFontType( false ); } //--------------------------------------------------------------------------- void __fastcall TSwitchProgForm::VSTiClick(TObject *Sender) { if( !m_bVSTi ) SwitchFontType( true ); } //--------------------------------------------------------------------------- void TSwitchProgForm::SwitchFontType( bool bVSTi ) { f_MM_Stop(); BYTE iFont = m_iFontOrig; m_iFont = ( iFont==0xFF && !g_bExtFont )? g_idFont : iFont; m_iProg = m_iProgOrig; m_iChno = m_iChnoOrig; m_bVSTi = bVSTi; if( bVSTi ) m_tabVSTi->BringToFront(); else m_tabSF2->BringToFront(); m_tabVSTi->Down = bVSTi; m_tabSF2->Down = !bVSTi; ResetComponents(); m_btnSet->Visible = m_bVSTi; } //--------------------------------------------------------------------------- void TSwitchProgForm::ShowVSTiPanel( bool bReset ) { //显示VSTi设置窗口 f_MM_Stop(); int iChno = m_iChno<0 ? m_iChnoOrig : m_iChno; TVSTiForm* pVI = new TVSTiForm( NULL, m_iFont, iChno, m_iStartBar, m_lenBar ); if( mrOk==pVI->ShowModal() ){ VSTINFO* pInfo = g_lstVSTi[m_iFont-0x80]; while( !pInfo->aPlugins.empty() ){ delete pInfo->aPlugins.back(); pInfo->aPlugins.pop_back(); } char ch[16]; char szName[16][64]; int count = f_MM_GetVSTiPrograms( m_iFont, ch, szName ); for( int i=0; iid = ch[i]; strcpy( pProg->name, szName[i] ); pInfo->aPlugins.push_back( pProg ); } m_iChno = pVI->m_iChno; InitProgramList(); m_lvProgram->ResetScroll(); if( pVI->IsEditable() ) f_MM_SaveVSTParams( -1, m_iFont, true ); } else{ if( pVI->IsEditable() ) f_MM_SaveVSTParams( -1, m_iFont, false ); if( bReset ){ m_iFont = m_iFontOrig; m_lvSoundFont->SelectedItemIndex = -1; } } delete pVI; } //---------------------------------------------------------------------------