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