383 lines
9.2 KiB
C++
383 lines
9.2 KiB
C++
//---------------------------------------------------------------------------
|
|
|
|
#include <vcl.h>
|
|
#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; i<g_lstVSTi.size(); i++ ){
|
|
VSTINFO* pVSTi = g_lstVSTi[i];
|
|
TListPanelItem* pItem = new TListPanelItem( pVSTi->strVSTName, DoItemClick );
|
|
pItem->Tag = i + 0x80;
|
|
|
|
if( m_iFont==pItem->Tag ){
|
|
iSel = i;
|
|
}
|
|
|
|
m_lvSoundFont->AddItem( pItem );
|
|
}
|
|
}
|
|
else{
|
|
for( int i=0; i<g_lstFonts.size(); i++ ){
|
|
FONTINFO* pFont = g_lstFonts[i];
|
|
|
|
if( m_iChno==9 && pFont->nDrumCount>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( ++iPlugin<pInfo->aPlugins.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; i<num; i++ ){
|
|
char* text = strInst ? strInst[pSet[i].id] : pSet[i].text;
|
|
|
|
TListPanelItem* pItem = new TListPanelItem( text, DoItemClick );
|
|
pItem->Tag = 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; i<count; i++ ){
|
|
VSTPLUGIN* pProg = new VSTPLUGIN;
|
|
pProg->id = 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;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|