389 lines
10 KiB
C++
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 );
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|