//--------------------------------------------------------------------------- #include #pragma hdrstop #include "GlobalUnit.h" #include "AudioFxFormUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "GeneralDialogPanel" #pragma link "TextButton" #pragma link "ComboBoxComponent" #pragma link "PNGButton" #pragma link "SkinTrackBar" #pragma resource "*.dfm" #define TIMER_INTERVAL 50 #define FX_TOP_BOUND 24 #define FX_BOTTOM_BOUND 24 #define FX_LEFT_BOUND 40 #define FX_ITEM_HEIGHT 40 TAudioFxForm *AudioFxForm; //--------------------------------------------------------------------------- __fastcall TAudioFxForm::TAudioFxForm( TComponent* Owner, int iTrk, double start, double end, int iInd, int iFx, int iPlugin ) : TForm(Owner) { m_iTrack = iTrk; m_iInd = iInd; m_iFx = iFx; m_iPlugin = iPlugin; memset( m_fParam, 0, sizeof(float)*6 ); memset( m_lstCaption, 0, sizeof(void*)*6 ); memset( m_lstTrack, 0, sizeof(void*)*6 ); m_iCurrPos = 0; m_dblPos = 0; m_dblStep = TIMER_INTERVAL * (double)g_nMelodyTempo / g_nBPM / 60.0 / ( end - start ); m_dblStart = start; m_dblEnd = end; } //--------------------------------------------------------------------------- __fastcall TAudioFxForm::~TAudioFxForm() { for( int i=0; i<6 && m_lstCaption[i]; i++ ){ delete m_lstCaption[i]; delete m_lstTrack[i]; } } //--------------------------------------------------------------------------- void __fastcall TAudioFxForm::FormClose(TObject *Sender, TCloseAction &Action) { if( m_btnStop->Visible ){ StopClick( NULL ); } if( m_iFx>=FX_VST ) f_MM_ShowVSTEditor( NULL, NULL, NULL, NULL, m_iTrack, m_iInd, NULL ); } //--------------------------------------------------------------------------- void __fastcall TAudioFxForm::PlayClick(TObject *Sender) { double dblPos = ( (double)m_tbPosition->Position / m_tbPosition->Max ) * ( m_dblEnd - m_dblStart ) + m_dblStart; m_btnPlay->Visible = false; m_btnStop->Visible = true; f_MM_Play( Handle, dblPos, TYPE_AUDIOFX|g_iSelAudio ); SetPlayTimer( true, m_tTimer, m_tAccuracy, Handle, TIMER_INTERVAL ); } //--------------------------------------------------------------------------- void __fastcall TAudioFxForm::PowerClick(TObject *Sender) { m_btnPowerOn->Visible = Sender==m_btnPowerOff; m_btnPowerOff->Visible = !m_btnPowerOn->Visible; if( m_iFx>=FX_VST ) f_MM_AudioSetFxParam( m_iTrack, m_iInd, (void*)m_btnPowerOn->Visible, 0 ); else f_MM_AudioSetFxParam( m_iTrack, m_iInd, (void*)(m_btnPowerOn->Visible ? m_fParam : NULL), 0 ); if( m_iInd<0 ) m_btnOk->Enabled = m_btnPowerOn->Visible; } //--------------------------------------------------------------------------- void __fastcall TAudioFxForm::StopClick(TObject *Sender) { m_btnStop->Visible = false; m_btnPlay->Visible = true; f_MM_Stop(); SetPlayTimer(false, m_tTimer, m_tAccuracy); } //--------------------------------------------------------------------------- void __fastcall TAudioFxForm::LoopClick(TObject *Sender) { m_btnLoop->Down = !m_btnLoop->Down; } //--------------------------------------------------------------------------- void __fastcall TAudioFxForm::PresetChange(TComboBoxItem *Sender, int Index) { if( m_iFxDefItemIndex!=m_cbPreset->ItemsCount-1 ){ int iFxNo = m_iFx==FX_PITCH ? MAX_FX_NUM-1 : m_iFx; GetFxPreset( m_iFx, m_cbPreset->DefItemIndex, m_fParam ); for( int i=0; i<6 && m_lstTrack[i]; i++ ){ m_lstTrack[i]->OnChange = NULL; if( m_iFx==FX_PITCH ){ m_lstTrack[i]->Position = (int)m_fParam[i]; } else{ int pos = Param2Pos( iFxNo, i, m_fParam[i] ); m_lstTrack[i]->Position = pos; } m_lstTrack[i]->Hint = IntToStr(m_lstTrack[i]->Position); m_lstTrack[i]->OnChange = TrackBarChange; } if( m_btnPowerOn->Visible ) f_MM_AudioSetFxParam( m_iTrack, m_iInd, (void*)m_fParam, 0 ); } } //--------------------------------------------------------------------------- void __fastcall TAudioFxForm::TrackBarChange(TObject *Sender) { TSkinTrackBar* pTrack = (TSkinTrackBar*)Sender; int nPos = pTrack->Position; pTrack->Hint = IntToStr(nPos); int iFxNo = m_iFx==FX_PITCH ? MAX_FX_NUM-1 : m_iFx; if( m_cbPreset->DefItemIndex!=m_cbPreset->ItemsCount-1 ) m_cbPreset->DefItemIndex = m_cbPreset->ItemsCount-1; float fParam = Pos2Param( iFxNo, pTrack->Tag, nPos ); m_fParam[pTrack->Tag] = fParam; if( m_btnPowerOn->Visible ) f_MM_AudioSetFxParam( m_iTrack, m_iInd, (void*)m_fParam, 0 ); } //--------------------------------------------------------------------------- void __fastcall TAudioFxForm::UMMediaTime(TMessage &Message) { m_dblPos += m_dblStep; m_iCurrPos = (DWORD)( m_dblPos + 0.5 ); if( m_iCurrPos==m_tbPosition->Position ) return; if( m_iCurrPos >= m_tbPosition->Max ){ m_dblPos = 0; m_iCurrPos = 0; if( m_btnLoop->Down ){ f_MM_Play( Handle, m_dblStart, TYPE_AUDIOFX | g_iSelAudio ); } else{ StopClick( NULL ); } } m_tbPosition->Position = m_iCurrPos; } //--------------------------------------------------------------------------- void __fastcall TAudioFxForm::PositionChange(TObject *Sender) { if( m_iCurrPos!=m_tbPosition->Position ){ m_iCurrPos = m_tbPosition->Position; m_dblPos = m_iCurrPos; if( m_btnStop->Visible ){ SetPlayTimer(false, m_tTimer, m_tAccuracy); double dblPos = ( (double)m_tbPosition->Position / m_tbPosition->Max ) * ( m_dblEnd - m_dblStart ) + m_dblStart; f_MM_Play( Handle, dblPos, TYPE_AUDIOFX | g_iSelAudio ); SetPlayTimer( true, m_tTimer, m_tAccuracy, Handle, TIMER_INTERVAL ); } } } //--------------------------------------------------------------------------- void __fastcall TAudioFxForm::FormResize(TObject *Sender) { m_panShow->SetBounds( m_panShow->Left, m_panShow->Top, ClientWidth - 50, ClientHeight - 155 ); m_tbPosition->Width = m_panShow->Width; m_tbPosition->Top = ClientHeight - 69; m_btnPlay->Top = ClientHeight - 43; m_btnStop->Top = m_btnPlay->Top; m_btnLoop->Top = m_btnPlay->Top; m_btnOk->Top = m_btnPlay->Top + 1; m_btnCancel->Top = m_btnOk->Top; m_btnPowerOn->Left = ClientWidth - 66; m_btnPowerOff->Left = m_btnPowerOn->Left; m_btnCancel->Left = ClientWidth - 83; m_btnOk->Left = ClientWidth - 148; } //--------------------------------------------------------------------------- void __fastcall TAudioFxForm::UMEditorResize(TMessage &Message) { int nWidth = Message.WParam, nHeight = Message.LParam; if( nWidth==0 ) nWidth = 300; if( nHeight==0 ) nHeight = 150; SetBounds( Left, Top, nWidth + 50, nHeight + 155 ); } //--------------------------------------------------------------------------- void __fastcall TAudioFxForm::FormCreate(TObject *Sender) { m_BKGPanel->Font->Size = g_szFont9; m_btnCancel->FontSize = g_szFont9; m_btnOk->FontSize = g_szFont9; m_cbPreset->SetFont(g_strTxtFontName, g_szFont9); String strCaption = m_BKGPanel->Caption + L" - "; int nFormWidth = m_panShow->Width + 50, nFormHeight = m_panShow->Height + 155; m_lblNoParams->Visible = false; if( m_iInd>=0 ) m_btnOk->Text = "确定"; if( m_iFx>=FX_VST ){ m_cbPreset->AddItem( "(默认)" ); m_cbPreset->DefItemIndex = 0; if( m_iPlugin<0 ) strCaption += g_lstVSTFx[m_iFx-FX_VST]->strVSTName; else strCaption += g_lstVSTFx[m_iFx-FX_VST]->aPlugins[m_iPlugin]->name; int nWidth(0), nHeight(0); if( f_MM_ShowVSTEditor( Handle, m_panShow->Handle, &nWidth, &nHeight, m_iTrack, m_iInd, NULL )==S_OK ){ if( nWidth<0 && nHeight<0 ){ m_lblNoParams->Visible = true; } else{ if( nWidth==0 || nHeight==0 ) BorderStyle = bsSizeable; if( nWidth==0 ) nWidth = 300; if( nHeight==0 ) nHeight = 150; nFormWidth = nWidth + 50; nFormHeight = nHeight + 155; } } } else{ int iFxNo = m_iFx==FX_PITCH ? MAX_FX_NUM-1 : m_iFx, n = GetFxParamNum( m_iFx ), t = FX_TOP_BOUND; strCaption += g_strEffect[iFxNo]; int nItemCount = 0; for( int i=0; i<3; i++ ){ if( strlen( g_strEffectPreset[iFxNo][i] )>0 ){ m_cbPreset->AddItem( g_strEffectPreset[iFxNo][i] ); nItemCount++; } else break; } m_cbPreset->AddItem( "自定义" ); if( false ){ m_cbPreset->DefItemIndex = 0; } else{ m_cbPreset->DefItemIndex = 0; } if( m_iInd<0 || m_iInd>=g_aAudioTracks[m_iTrack]->lstFxs.size() ){ GetFxPreset( m_iFx, m_cbPreset->DefItemIndex, m_fParam ); f_MM_AudioSetFxParam( m_iTrack, m_iInd, (void*)m_fParam, 0 ); } else{ TAudioFx* pFx = g_aAudioTracks[m_iTrack]->lstFxs[m_iInd]; m_cbPreset->DefItemIndex = pFx->iPreset; memcpy( m_fParam, pFx->pParam, sizeof(float) * pFx->nParamSize ); m_btnPowerOn->Visible = !pFx->bBypass; m_btnPowerOff->Visible = !!pFx->bBypass; } for( int i=0; iParent = m_panShow; m_lstCaption[i]->Layout = tlBottom; m_lstCaption[i]->Font->Name = g_strTxtFontName; m_lstCaption[i]->Font->Size = g_szFont9; m_lstCaption[i]->Font->Color = RGB( 156, 170, 189 ); m_lstCaption[i]->SetBounds( FX_LEFT_BOUND, t, 60, 18 ); m_lstCaption[i]->Caption = g_strEffectParamName[iFxNo][i]; m_lstCaption[i]->Caption += ":"; m_lstTrack[i] = new TSkinTrackBar(this); m_lstTrack[i]->Parent = m_panShow; m_lstTrack[i]->ShowHint = true; m_lstTrack[i]->Tag = i; m_lstTrack[i]->SetBounds( 104, t, 209, 18 ); if( m_iFx==FX_PITCH ){ m_lstTrack[i]->Min = -36; m_lstTrack[i]->Max = 36; m_lstTrack[i]->PageSize = 12; m_lstTrack[i]->Position = (int)m_fParam[i]; } else{ int pos = Param2Pos( iFxNo, i, m_fParam[i] ); m_lstTrack[i]->Position = pos; } m_lstTrack[i]->Hint = IntToStr(m_lstTrack[i]->Position); m_lstTrack[i]->OnChange = TrackBarChange; t += FX_ITEM_HEIGHT; } nFormHeight = t + 155; } m_BKGPanel->Caption = strCaption; SetBounds( Left, Top, nFormWidth, nFormHeight ); SetTransparent( this ); } //--------------------------------------------------------------------------- int __fastcall TAudioFxForm::GetParamCount() { int count = 0; for( int i=0; i<6 && m_lstCaption[i]; i++ ){ count++; } return count; } //--------------------------------------------------------------------------- int __fastcall TAudioFxForm::GetPreset() { return m_cbPreset->DefItemIndex; } //--------------------------------------------------------------------------- bool __fastcall TAudioFxForm::IsBypass() { return m_btnPowerOff->Visible; } //--------------------------------------------------------------------------- void __fastcall TAudioFxForm::OkClick(TObject *Sender) { f_MM_SaveVSTParams( m_iTrack, m_iInd, false ); } //---------------------------------------------------------------------------