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);
}
//---------------------------------------------------------------------------