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

389 lines
10 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#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_iFx<FX_VST && m_cbPreset->DefItemIndex!=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; i<n; i++ ){
m_lstCaption[i] = new TLabel(this);
m_lstCaption[i]->Parent = 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 );
}
//---------------------------------------------------------------------------