xue@0: /* xue@0: Harmonic Visualiser xue@0: xue@0: An audio file viewer and editor. xue@0: Centre for Digital Music, Queen Mary, University of London. xue@0: This file copyright 2011 Wen Xue. xue@0: xue@0: This program is free software; you can redistribute it and/or xue@0: modify it under the terms of the GNU General Public License as xue@0: published by the Free Software Foundation; either version 2 of the xue@0: License, or (at your option) any later version. xue@0: */ xue@0: //--------------------------------------------------------------------------- xue@0: xue@0: #include xue@0: #include xue@0: #include xue@0: #pragma hdrstop xue@0: xue@0: #include "EditorPanelUnit.h" xue@0: #include "Unit1.h" xue@0: #include "VibratoDemoUnit.h" xue@0: #include "SFDemoUnit.h" xue@0: #include "splines.h" xue@0: #include "hsedit.h" xue@0: xue@0: //--------------------------------------------------------------------------- xue@0: #pragma package(smart_init) xue@0: #pragma resource "*.dfm" xue@0: TEditorPanel *EditorPanel; xue@0: //--------------------------------------------------------------------------- xue@0: __fastcall TEditorPanel::TEditorPanel(TComponent* Owner) xue@0: : TForm(Owner) xue@0: { xue@0: target=0; xue@0: Before=0; xue@0: HS=0; xue@0: } xue@0: xue@0: __fastcall TEditorPanel::~TEditorPanel() xue@0: { xue@0: free8(target); xue@0: delete[] Before; xue@0: delete HS; xue@0: } xue@0: //--------------------------------------------------------------------------- xue@0: void __fastcall TEditorPanel::AmpEdit1MouseWheel(int zDelta) xue@0: { xue@0: double a, db; xue@0: a=AmpEdit1->Text.ToDouble()*pow((zDelta>0)?2:0.5, 0.1); db=Log10(a)*20; xue@0: AmpEdit1->Text=a; xue@0: AmpDBEdit1->Text=db; xue@0: EditAmplify(a); xue@0: } xue@0: void __fastcall TEditorPanel::AMAEdit1MouseWheel(int zDelta) xue@0: { xue@0: double dep=AMAEdit1->Text.ToDouble()+((zDelta>0)?0.05:-0.05); xue@0: if (dep<0) dep=0; xue@0: AMAEdit1->Text=dep; xue@0: EditAM(dep, AMFEdit1->Text.ToDouble(), AMPhEdit1->Text.ToDouble()); xue@0: } xue@0: void __fastcall TEditorPanel::DeFMEdit1MouseWheel(int zDelta) xue@0: { xue@0: double a=DeFMEdit1->Text.ToDouble()+((zDelta>0)?0.2:-0.2); xue@0: if (a<0) a=0; xue@0: DeFMEdit1->Text=a; xue@0: EditReFM(a, DeFMEdit2->Text.ToDouble()); xue@0: } xue@0: void __fastcall TEditorPanel::FMAEdit1MouseWheel(int zDelta) xue@0: { xue@0: double a=FMAEdit1->Text.ToDouble()+((zDelta>0)?0.2:-0.2); xue@0: if (a<0) a=0; xue@0: FMAEdit1->Text=a; xue@0: EditFM(a, FMFEdit1->Text.ToDouble(), FMPhEdit1->Text.ToDouble()); xue@0: } xue@0: void __fastcall TEditorPanel::FMFEdit1MouseWheel(int zDelta) xue@0: { xue@0: double fre=FMFEdit1->Text.ToDouble()+((zDelta>0)?0.5:-0.5); xue@0: if (fre<0) fre=0; xue@0: FMFEdit1->Text=fre; xue@0: EditFM(FMAEdit1->Text.ToDouble(), fre, FMPhEdit1->Text.ToDouble()); xue@0: } xue@0: void __fastcall TEditorPanel::WMMouseWheel(TWMMouseWheel Message) xue@0: { xue@0: int zDelta=Message.WheelDelta; // wheel rotation xue@0: if (AmpEdit1->Focused()) AmpEdit1MouseWheel(zDelta); xue@0: else if (AmpDBEdit1->Focused()) xue@0: { xue@0: double a, db; xue@0: db=AmpDBEdit1->Text.ToDouble()+((zDelta>0)?0.5:-0.5); a=pow(10, db/20); xue@0: AmpEdit1->Text=a; xue@0: AmpDBEdit1->Text=db; xue@0: EditAmplify(a); xue@0: } xue@0: else if (PitchEdit1->Focused()) xue@0: { xue@0: double ps=PitchEdit1->Text.ToDouble()+((zDelta>0)?1:-1); xue@0: PitchEdit1->Text=ps; xue@0: EditPitchShifting(ps); xue@0: } xue@0: else if (AMAEdit1->Focused()) AMAEdit1MouseWheel(zDelta); xue@0: else if (AMFEdit1->Focused()) xue@0: { xue@0: double fre=AMFEdit1->Text.ToDouble()+((zDelta>0)?0.5:-0.5); xue@0: if (fre<0) fre=0; xue@0: AMFEdit1->Text=fre; xue@0: EditAM(AMAEdit1->Text.ToDouble(), fre, AMPhEdit1->Text.ToDouble()); xue@0: } xue@0: else if (AMPhEdit1->Focused()) xue@0: { xue@0: double ph=AMPhEdit1->Text.ToDouble()+((zDelta>0)?0.1:-0.1); xue@0: AMPhEdit1->Text=ph; xue@0: EditAM(AMAEdit1->Text.ToDouble(), AMFEdit1->Text.ToDouble(), ph); xue@0: } xue@0: else if (FMAEdit1->Focused()) FMAEdit1MouseWheel(zDelta); xue@0: else if (FMFEdit1->Focused()) FMFEdit1MouseWheel(zDelta); xue@0: else if (FMPhEdit1->Focused()) xue@0: { xue@0: double ph=FMPhEdit1->Text.ToDouble()+((zDelta>0)?0.1:-0.1); xue@0: FMPhEdit1->Text=ph; xue@0: EditFM(FMAEdit1->Text.ToDouble(), FMFEdit1->Text.ToDouble(), ph); xue@0: } xue@0: else if (DeFMEdit1->Focused()) DeFMEdit1MouseWheel(zDelta); xue@0: else if (DeFMEdit2->Focused()) xue@0: { xue@0: double r=DeFMEdit2->Text.ToDouble()+((zDelta>0)?0.1:-0.1); xue@0: if (r<0.2) r=0.2; xue@0: DeFMEdit2->Text=r; xue@0: EditReFM(DeFMEdit1->Text.ToDouble(), r); xue@0: } xue@0: } xue@0: //--------------------------------------------------------------------------- xue@0: xue@0: xue@0: void __fastcall TEditorPanel::AmpEdit1MouseMove(TObject *Sender, xue@0: TShiftState Shift, int X, int Y) xue@0: { xue@0: ((TWinControl*)Sender)->SetFocus(); xue@0: } xue@0: //--------------------------------------------------------------------------- xue@0: xue@0: xue@0: xue@0: void __fastcall TEditorPanel::AmpEdit1KeyPress(TObject *Sender, char &Key) xue@0: { xue@0: if (Key==VK_RETURN) xue@0: { xue@0: if (Sender==AmpEdit1) {double a=AmpEdit1->Text.ToDouble(); AmpDBEdit1->Text=double(Log10(a)*20); EditAmplify(a);} xue@0: else if (Sender==AmpDBEdit1) {double a=pow(10, AmpDBEdit1->Text.ToDouble()/20); AmpEdit1->Text=a; EditAmplify(a);} xue@0: else if (Sender==PitchEdit1) EditPitchShifting(PitchEdit1->Text.ToDouble()); xue@0: else if (Sender==AMAEdit1 || Sender==AMFEdit1 || Sender==AMPhEdit1) EditAM(AMAEdit1->Text.ToDouble(), AMFEdit1->Text.ToDouble(), AMPhEdit1->Text.ToDouble()); xue@0: else if (Sender==FMAEdit1 || Sender==FMFEdit1 || Sender==FMPhEdit1) EditFM(FMAEdit1->Text.ToDouble(), FMFEdit1->Text.ToDouble(), FMPhEdit1->Text.ToDouble()); xue@0: else if (Sender==DeFMEdit1 || Sender==DeFMEdit2) EditReFM(DeFMEdit1->Text.ToDouble(), DeFMEdit2->Text.ToDouble()); xue@0: } xue@0: else if ((Key<'0' || Key>'9') && Key!='.' && Key!='-' && Key!=VK_BACK) Key=NULL; xue@0: } xue@0: //--------------------------------------------------------------------------- xue@0: xue@0: xue@0: xue@0: double* SynthesisHSp(THS* HS, int& dst, int& den); xue@0: void __fastcall TEditorPanel::EditAmplify(double a) xue@0: { xue@0: for (int m=0; mM; m++) for (int fr=0; frFr; fr++) HS->Partials[m][fr].a=Form1->HS->Partials[m][fr].a*a; xue@0: xue@0: double* data=SynthesisHSp(HS, dst, den); xue@0: int L=To-From; xue@0: for (int i=0; iPostWaveViewData(data, Channel, From, To, Form1->FadeInCheck->Checked, Form1->FadeInCombo->Text.ToInt()); xue@0: free8(data); xue@0: } xue@0: xue@0: void __fastcall TEditorPanel::EditAM(double dep, double fre, double ph_00) xue@0: { xue@0: HSAM(HS, Form1->HS, dep, fre/Form1->WaveView1->SamplesPerSec, ph_00*2*M_PI); xue@0: double* data=SynthesisHS(HS, dst, den); xue@0: int L=To-From; for (int i=0; iPostWaveViewData(data, Channel, From, To, Form1->FadeInCheck->Checked, Form1->FadeInCombo->Text.ToInt()); xue@0: free8(data); xue@0: } xue@0: xue@0: void __fastcall TEditorPanel::EditFM(double a, double fre, double ph_00) xue@0: { xue@0: HSFM(HS, Form1->HS, a, fre/Form1->WaveView1->SamplesPerSec, ph_00*2*M_PI); xue@0: xue@0: double* data=SynthesisHS(HS, dst, den); xue@0: int L=To-From; for (int i=0; iPostWaveViewData(data, Channel, From, To, Form1->FadeInCheck->Checked, Form1->FadeInCombo->Text.ToInt()); xue@0: free8(data); xue@0: } xue@0: xue@0: void __fastcall TEditorPanel::EditPitchShifting(double ps12) xue@0: { xue@0: HSPitchShift(HS, Form1->HS, ps12); xue@0: xue@0: double* data=SynthesisHS(HS, dst, den); xue@0: int L=To-From; xue@0: if (PitchCheck1->Checked) for (int i=0; iPostWaveViewData(data, Channel, From, To, Form1->FadeInCheck->Checked, Form1->FadeInCombo->Text.ToInt()); xue@0: free8(data); xue@0: } xue@0: xue@0: void __fastcall TEditorPanel::EditReFM(double amp, double rate) xue@0: { xue@0: ReFM(Form1->HS->M, Form1->HS->Fr, Form1->HS->Partials, HS->Partials, amp, rate); xue@0: double* data=SynthesisHS(HS, dst, den); xue@0: xue@0: int L=To-From; xue@0: xue@0: for (int i=0; iPostWaveViewData(data, Channel, From, To, Form1->FadeInCheck->Checked, Form1->FadeInCombo->Text.ToInt()); xue@0: free8(data); xue@0: } xue@0: xue@0: void ClearObjectByShortTag0(TWaveView* WV, int tag0); xue@0: void __fastcall TEditorPanel::FormClose(TObject *Sender, TCloseAction &Action) xue@0: { xue@0: if (ModalResult==mrCancel) Form1->PostWaveViewData(Before, Channel, From, To); xue@0: else xue@0: { xue@0: DeAlloc2(Form1->HS->Partials); xue@0: Form1->HS->Channel=HS->Channel; Form1->HS->M=HS->M; Form1->HS->Fr=HS->Fr; Allocate2(atom, HS->M, HS->Fr, Form1->HS->Partials); xue@0: for (int m=0; mM; m++) memcpy(Form1->HS->Partials[m], HS->Partials[m], sizeof(atom)*HS->Fr); xue@0: ClearObjectByShortTag0(Form1->WaveView1, 1); xue@0: Form1->AddHSObject(Form1->HS); xue@0: } xue@0: } xue@0: //--------------------------------------------------------------------------- xue@0: xue@0: xue@0: void __fastcall TEditorPanel::SpeedButton1Click(TObject *Sender) xue@0: { xue@0: ModalResult=mrOk; xue@0: Close(); xue@0: } xue@0: //--------------------------------------------------------------------------- xue@0: xue@0: void __fastcall TEditorPanel::SpeedButton2Click(TObject *Sender) xue@0: { xue@0: ModalResult=mrCancel; xue@0: Close(); xue@0: } xue@0: //--------------------------------------------------------------------------- xue@0: xue@0: void __fastcall TEditorPanel::SpeedButton4Click(TObject *Sender) xue@0: { xue@0: for (int m=0; mM; m++) memcpy(HS->Partials[m], Form1->HS->Partials[m], sizeof(atom)*HS->Fr); xue@0: Form1->PostWaveViewData(Before, Channel, From, To); xue@0: } xue@0: //--------------------------------------------------------------------------- xue@0: