Mercurial > hg > hv
diff EventBoxUnit.cpp @ 0:a6a46af64546
first upload
author | wenx <xue.wen@eecs.qmul.ac.uk> |
---|---|
date | Wed, 10 Aug 2011 14:55:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EventBoxUnit.cpp Wed Aug 10 14:55:38 2011 +0100 @@ -0,0 +1,301 @@ +/* + 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> +#pragma hdrstop + +#include "EventBoxUnit.h" +#include "WaveView.h" +#include "Unit1.h" +#include "EditorPanelUnit.h" +#include <Math.hpp> +#include <math.h> +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma resource "*.dfm" +TEventBox *EventBox; +//--------------------------------------------------------------------------- +__fastcall TEventBox::TEventBox(TComponent* Owner) + : TForm(Owner) +{ + HSCapacity=100; + HSCount=0; + HS=(THS**)malloc(sizeof(THS*)*HSCapacity); + memset(HS, 0, sizeof(THS*)*HSCapacity); +} + +__fastcall TEventBox::~TEventBox() +{ + Clear(); + free(HS); +} + +void __fastcall TEventBox::Clear() +{ + ListBox1->Clear(); + for(int i=0; i<HSCount; i++) delete HS[i]; + HSCount=0; +} +//--------------------------------------------------------------------------- +THS* __fastcall TEventBox::NewHS(int M, int Fr) +{ + if (HSCount>=HSCapacity) + { + HSCapacity+=100; + HS=(THS**)realloc(HS, sizeof(THS*)*HSCapacity); + memset(&HS[HSCount], 0, sizeof(THS*)*(HSCapacity-HSCount)); + } + THS* newhs; + if (M>0 && Fr>0) newhs=new THS(M, Fr); + else newhs=new THS; + HS[HSCount++]=newhs; + if (ListBox1->Enabled) + { + ListBox1->Items->Add(""); + ListBox1->ItemIndex=ListBox1->Count-1; + } + return newhs; +} + +//--------------------------------------------------------------------------- +void __fastcall TEventBox::ListBox1MouseDown(TObject *Sender, + TMouseButton Button, TShiftState Shift, int X, int Y) +{ + int c=ListBox1->ItemAtPos(TPoint(X, Y), true); + SetItemIndex(c); +} +//--------------------------------------------------------------------------- + void ClearObjectByShortTag0(TWaveView* WV, int tag0); +void __fastcall TEventBox::SetItemIndex(int index) +{ + ListBox1->ItemIndex=index; + ClearObjectByShortTag0(Form1->WaveView1, 1); + if (index>=0) + { + Form1->HS=HS[index]; + Form1->AddHSObject(Form1->HS); + } + else + { + Form1->HS=0; + } + + bool alreadyinvalidated=false; + if (CheckBox1->Checked && Form1->HS) + { + TWaveView* WaveView1=Form1->WaveView1; + int eventst=Form1->HS->Partials[0][0].t, eventen=Form1->HS->Partials[0][Form1->HS->Fr-1].t, + wvlen=WaveView1->EndPos-WaveView1->StartPos; + if (eventst>WaveView1->EndPos || eventen<WaveView1->StartPos) + { + int newst=(eventst+eventen)/2-wvlen/2, newen=newst+wvlen; + if (newst<0) newst=0, newen=wvlen; + else if (newen>WaveView1->Length) newen=WaveView1->Length, newst=WaveView1->Length-wvlen; + WaveView1->SetStartAndEndPos(newst, newen); + alreadyinvalidated=true; + } + } + if (!alreadyinvalidated) Form1->WaveView1->Invalidate(); +} +//--------------------------------------------------------------------------- +void __fastcall TEventBox::Save(TObject *Sender) +{ + Sort(); + AnsiString FileName=ChangeFileExt(Form1->WaveAudio1->FileName, ".evt"); + if (FileExists(FileName)) + { + AnsiString BakName=ChangeFileExt(FileName, ".evt.bak."+Now().FormatString("yymmddhhnnss")); + RenameFile(FileName, BakName); + } + SaveToFile(FileName); +} +//--------------------------------------------------------------------------- +void __fastcall TEventBox::Load(TObject *Sender) +{ + LoadFromFile(ChangeFileExt(Form1->WaveAudio1->FileName, ".evt")); +} +//--------------------------------------------------------------------------- +void __fastcall TEventBox::Sort() +{ + for (int i=0; i<HSCount-1; i++) + { + int indmint=i; + for (int j=i+1; j<HSCount; j++) if (HS[j]->Partials[0][0].t<HS[indmint]->Partials[0][0].t) indmint=j; + + if (indmint!=i) + { + THS* tmphs=HS[i]; + HS[i]=HS[indmint]; + HS[indmint]=tmphs; + AnsiString tmpstr=ListBox1->Items->Strings[i]; + ListBox1->Items->Strings[i]=ListBox1->Items->Strings[indmint]; + ListBox1->Items->Strings[indmint]=tmpstr; + } + } +} + +void __fastcall TEventBox::SaveToFile(AnsiString FileName) +{ + TFileStream* File=new TFileStream(FileName, fmCreate); + File->Write(&HSCount, sizeof(int)); + for (int i=0; i<HSCount; i++) HS[i]->WriteToStream(File); + delete File; +} + +void __fastcall TEventBox::LoadFromFile(AnsiString FileName) +{ + Clear(); SetItemIndex(-1); + if (!FileExists(FileName)) return; + TFileStream* File=new TFileStream(FileName, fmOpenRead); + __int32 hsc; File->Read(&hsc, sizeof(__int32)); + bool counted=memcmp(&hsc, "EVT", 4); + if (!counted) File->Seek(-4, soFromCurrent); + ListBox1->Enabled=false; + + int i=0; + while (!counted || i<hsc) + { + THS* hs=NewHS(0, 0); + if (!hs->ReadFromStream(File)) + { + if (!counted) + { + delete HS[i]; + HSCount--; + break; + } + else + { //load old format file + char c[5]; c[4]=0; + int Channel, M, Fr; + File->Read(c, 4); + File->Read(&Channel, sizeof(int)); + File->Read(&M, sizeof(int)); + File->Read(&Fr, sizeof(int)); + hs->Resize(M, Fr); + hs->Channel=Channel; + File->Read(hs->Partials[0], sizeof(atom)*M*Fr); + File->Read(c, 4); + if (strcmp(c, "EVT ")) hs->isconstf=*(int*)c; + else File->Seek(-4, soFromCurrent); + } + } + i++; + } + delete File; + TStringList* List=new TStringList; + + for (int i=0; i<HSCount; i++) + { + List->Add(AnsiString(i)+" "+ + (HS[i]->Channel==0?"left: ":"right: ") + +AnsiString().sprintf("%.2fs, ", HS[i]->Partials[0][0].t*1.0/Form1->WaveView1->SamplesPerSec) + +SemitoneToPitch(Log2(HS[i]->Partials[0][0].f*Form1->WaveView1->SamplesPerSec/C4)*12) + ); + } + ListBox1->Items=List; + delete List; + ListBox1->Enabled=true; + SetItemIndex(-1); +} +//--------------------------------------------------------------------------- + + +void __fastcall TEventBox::ListBox1KeyUp(TObject *Sender, WORD &Key, + TShiftState Shift) +{ + int LII=ListBox1->ItemIndex; + if (Key==VK_DELETE) + { + if (LII>=0) + { + delete HS[LII]; + HSCount-=1; + memcpy(&HS[LII], &HS[LII+1], sizeof(THS*)*(HSCount-LII)); + ListBox1->Items->Delete(LII); + ClearObjectByShortTag0(Form1->WaveView1, 1); + Form1->HS=0; + Form1->WaveView1->Invalidate(); + } + } + else if (Key=='L') Load(NULL); + else if (Key=='S') Save(NULL); + else + { + } + LII=ListBox1->ItemIndex; + if (LII>=0 && Form1->HS!=HS[LII]) SetItemIndex(LII); + else if (LII<0 && Form1->HS!=0) SetItemIndex(LII); +} +//--------------------------------------------------------------------------- + + +void __fastcall TEventBox::Vibratowizard1Click(TObject *Sender) +{ + if (Form1->Vibratowizard1->Enabled) Form1->Vibratowizard1Click(Sender); +} +//--------------------------------------------------------------------------- + +void __fastcall TEventBox::ListBox1DblClick(TObject *Sender) +{ + if (Form1->Vibratowizard1->Enabled) + { + if (GetKeyState(VK_SHIFT)>=0) + Form1->Sourcefilter1Click(Vibratowizard1); + else + Form1->Vibratowizard1Click(Vibratowizard1); + } +} +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- + +void __fastcall TEventBox::FormClick(TObject *Sender) +{ + SetItemIndex(-1); +} +//--------------------------------------------------------------------------- + + +void __fastcall TEventBox::Cut1Click(TObject *Sender) +{ + if (Form1->Cut1->Enabled) Form1->Cut1Click(Sender); +} +//--------------------------------------------------------------------------- + + +void __fastcall TEventBox::PopupMenu1Popup(TObject *Sender) +{ + bool hasselection=ListBox1->ItemIndex>=0; + Vibratowizard1->Visible=hasselection; + Sourcefilter1->Visible=hasselection; + Extract1->Visible=hasselection; + Cut1->Visible=hasselection;; +} +//--------------------------------------------------------------------------- + +void __fastcall TEventBox::Extract1Click(TObject *Sender) +{ + if (Form1->Extract1->Enabled) Form1->Extract1Click(Sender); +} +//--------------------------------------------------------------------------- + + +void __fastcall TEventBox::Sourcefilter1Click(TObject *Sender) +{ + if (Form1->Vibratowizard1->Enabled) + Form1->Sourcefilter1Click(Vibratowizard1); +} +//--------------------------------------------------------------------------- +