xiRetimer

fit recorded audio to a tempo
git clone https://git.ce9e.org/xiRetimer.git

commit
9eb2cd7ac283da36a0c0395074769435552d42e3
parent
a5425704a7273f2e45bba4ad1d10562b13b8700c
Author
Tobias Bengfort <tobias.bengfort@gmx.net>
Date
2010-11-01 21:14
marker handling

Diffstat

M gui/a.out 0
M gui/xiRTMainFrame.cpp 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
M gui/xiRTMainFrame.h 31 ++++++++++++++++++-------------
M gui/xiRetimer_wxfb.cpp 4 ++++
M gui/xiRetimer_wxfb.fbp 4 ++--
M gui/xiRetimer_wxfb.h 2 ++
M src/curve.cpp 13 +++++++++----
M src/marker.cpp 56 +++++++++++++++++++++++++++++++++++++++++---------------
M src/marker.h 3 ++-

9 files changed, 130 insertions, 41 deletions


diff --git a/gui/a.out b/gui/a.out

Binary files differ.

diff --git a/gui/xiRTMainFrame.cpp b/gui/xiRTMainFrame.cpp

@@ -19,19 +19,55 @@ xiRTMainFrame::xiRTMainFrame( wxWindow* parent ) : MainFrame( parent ) {
   19    19   curve->addMarker();
   20    20   curve->setSeeker(0.3);
   21    21   width=100; // anything greater than 2
   -1    22   Marker_move=false;
   22    23 }
   23    24 
   24    -1 xiRTMainFrame::~xiRTMainFrame() {
   25    -1   delete[] curve;
   26    -1 }
   -1    25 xiRTMainFrame::~xiRTMainFrame() {}
   27    26 
   -1    27 // ************  mouse  **************
   28    28 void xiRTMainFrame::OnLeftDown( wxMouseEvent& event ) {
   29    -1 std::cout << event.m_x << " " << event.m_x/(float)width <<std::endl;
   -1    29   // check for Marker Select
   -1    30   if (event.m_y<=MARKERWIDTH*4/5) {
   -1    31     for (int i=0; i<curve->getMarkerLength(); ++i) {
   -1    32       int n=int(curve->getMarker(i)*(width-1));
   -1    33       if (event.m_x<=n+MARKERWIDTH/2 && event.m_x>=n-MARKERWIDTH/2) {
   -1    34         curve->selectMarker(i);
   -1    35         Marker_move=true;
   -1    36         return;
   -1    37       }
   -1    38     }
   -1    39   }
   -1    40   // if not returned set Seeker
   -1    41   curve->setSeeker(event.m_x/(float)width);
   -1    42   curve->selectMarker(-1);  //deselct
   -1    43 }
   -1    44 
   -1    45 void xiRTMainFrame::OnLeftUp( wxMouseEvent& event ) {
   -1    46   Marker_move=false;
   -1    47 }
   -1    48 
   -1    49 void xiRTMainFrame::OnLeftDClick( wxMouseEvent& event ) {
   -1    50   // check for Marker Select
   -1    51   if (event.m_y<=MARKERWIDTH*4/5) {
   -1    52     for (int i=0; i<curve->getMarkerLength(); ++i) {
   -1    53       int n=int(curve->getMarker(i)*(width-1));
   -1    54       if (event.m_x<=n+MARKERWIDTH/2 && event.m_x>=n-MARKERWIDTH/2) {
   -1    55         curve->selectMarker(i);
   -1    56         curve->removeMarker();
   -1    57         return;
   -1    58       }
   -1    59     }
   -1    60   }
   30    61   curve->setSeeker(event.m_x/(float)width);
   -1    62   curve->addMarker();
   31    63 }
   32    64 
   33    -1 void xiRTMainFrame::OnLeftUp( wxMouseEvent& event ) {}
   -1    65 void xiRTMainFrame::OnMotion( wxMouseEvent& event ) {
   -1    66   if (Marker_move)
   -1    67     curve->setMarker(event.m_x/(float)width);
   -1    68 }
   34    69 
   -1    70 // ************  menu  **************
   35    71 void xiRTMainFrame::OnOpenClick( wxCommandEvent& event )
   36    72 {
   37    73     wxFileDialog* dialog = new wxFileDialog( (wxWindow*)NULL );
@@ -50,6 +86,7 @@ void xiRTMainFrame::OnExportClick( wxCommandEvent& event )
   50    86 
   51    87     if (dialog->ShowModal()==wxID_OK) {
   52    88       wxString filename=dialog->GetPath();
   -1    89       sample->process();
   53    90       sample->writeFile(filename.mb_str());
   54    91     }
   55    92 }
@@ -62,7 +99,8 @@ void xiRTMainFrame::OnPrefsClick( wxCommandEvent& event )
   62    99 
   63   100 void xiRTMainFrame::OnExitClick( wxCommandEvent& event )
   64   101 {
   65    -1 	Destroy();
   -1   102   delete[] curve;
   -1   103   Destroy();
   66   104 }
   67   105 
   68   106 void xiRTMainFrame::OnHelpClick( wxCommandEvent& event )
@@ -116,6 +154,14 @@ void xiRTMainFrame::paint() {
  116   154   for (int i=0; i<curve->getMarkerLength(); ++i) {
  117   155     int n=int(curve->getMarker(i)*(width-1));
  118   156     dc.DrawLine(n,0,n,h);
   -1   157     wxPoint ps[3];
   -1   158     wxPoint p0(n-MARKERWIDTH/2,0);
   -1   159     ps[0]=p0;
   -1   160     wxPoint p1(n+MARKERWIDTH/2,0);
   -1   161     ps[1]=p1;
   -1   162     wxPoint p2(n+0,MARKERWIDTH*4/5);
   -1   163     ps[2]=p2;
   -1   164     dc.DrawPolygon(3,ps);
  119   165   }
  120   166   dc.SetPen(penSeeker);
  121   167   int seek=int(curve->getSeeker()*(width-1));

diff --git a/gui/xiRTMainFrame.h b/gui/xiRTMainFrame.h

@@ -15,23 +15,28 @@ Subclass of MainFrame, which is generated by wxFormBuilder.
   15    15 class xiRTMainFrame : public MainFrame
   16    16 {
   17    17 protected:
   18    -1 	// Handlers for MainFrame events.
   19    -1 	void OnLeftDown( wxMouseEvent& event );
   20    -1 	void OnLeftUp( wxMouseEvent& event );
   21    -1 	void OnOpenClick( wxCommandEvent& event );
   22    -1 	void OnExportClick( wxCommandEvent& event );
   23    -1 	void OnPrefsClick( wxCommandEvent& event );
   24    -1 	void OnExitClick( wxCommandEvent& event );
   25    -1 	void OnHelpClick( wxCommandEvent& event );
   26    -1 	void OnAboutClick( wxCommandEvent& event );
   -1    18   // Handlers for MainFrame events.
   -1    19   void OnLeftDown( wxMouseEvent& event );
   -1    20   void OnLeftUp( wxMouseEvent& event );
   -1    21   void OnLeftDClick( wxMouseEvent& event );
   -1    22   void OnMotion( wxMouseEvent& event );
   -1    23   void OnOpenClick( wxCommandEvent& event );
   -1    24   void OnExportClick( wxCommandEvent& event );
   -1    25   void OnPrefsClick( wxCommandEvent& event );
   -1    26   void OnExitClick( wxCommandEvent& event );
   -1    27   void OnHelpClick( wxCommandEvent& event );
   -1    28   void OnAboutClick( wxCommandEvent& event );
   27    29   void OnProcessClick( wxCommandEvent& event );
   28    -1 	void OnMSetClick( wxCommandEvent& event );
   29    -1 	void OnMRmClick( wxCommandEvent& event );
   30    -1         void OnUpdateUI( wxUpdateUIEvent& event );
   31    -1         void paint();
   -1    30   void OnMSetClick( wxCommandEvent& event );
   -1    31   void OnMRmClick( wxCommandEvent& event );
   -1    32   void OnUpdateUI( wxUpdateUIEvent& event );
   -1    33   void paint();
   -1    34   static const int MARKERWIDTH=15;
   -1    35   
   32    36   Sample* sample;
   33    37   Curve* curve;
   34    38   int width;
   -1    39   bool Marker_move;
   35    40 	
   36    41 public:
   37    42 	/** Constructor */

diff --git a/gui/xiRetimer_wxfb.cpp b/gui/xiRetimer_wxfb.cpp

@@ -65,8 +65,10 @@ MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, co
   65    65 	m_statusBar1 = this->CreateStatusBar( 1, wxST_SIZEGRIP, wxID_ANY );
   66    66 	
   67    67 	// Connect Events
   -1    68 	this->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( MainFrame::OnLeftDClick ) );
   68    69 	this->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( MainFrame::OnLeftDown ) );
   69    70 	this->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( MainFrame::OnLeftUp ) );
   -1    71 	this->Connect( wxEVT_MOTION, wxMouseEventHandler( MainFrame::OnMotion ) );
   70    72 	this->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( MainFrame::OnUpdateUI ) );
   71    73 	this->Connect( m_open->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrame::OnOpenClick ) );
   72    74 	this->Connect( m_export->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrame::OnExportClick ) );
@@ -79,8 +81,10 @@ MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, co
   79    81 MainFrame::~MainFrame()
   80    82 {
   81    83 	// Disconnect Events
   -1    84 	this->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( MainFrame::OnLeftDClick ) );
   82    85 	this->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( MainFrame::OnLeftDown ) );
   83    86 	this->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( MainFrame::OnLeftUp ) );
   -1    87 	this->Disconnect( wxEVT_MOTION, wxMouseEventHandler( MainFrame::OnMotion ) );
   84    88 	this->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( MainFrame::OnUpdateUI ) );
   85    89 	this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrame::OnOpenClick ) );
   86    90 	this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrame::OnExportClick ) );

diff --git a/gui/xiRetimer_wxfb.fbp b/gui/xiRetimer_wxfb.fbp

@@ -59,13 +59,13 @@
   59    59             <event name="OnKeyUp"></event>
   60    60             <event name="OnKillFocus"></event>
   61    61             <event name="OnLeaveWindow"></event>
   62    -1             <event name="OnLeftDClick"></event>
   -1    62             <event name="OnLeftDClick">OnLeftDClick</event>
   63    63             <event name="OnLeftDown">OnLeftDown</event>
   64    64             <event name="OnLeftUp">OnLeftUp</event>
   65    65             <event name="OnMiddleDClick"></event>
   66    66             <event name="OnMiddleDown"></event>
   67    67             <event name="OnMiddleUp"></event>
   68    -1             <event name="OnMotion"></event>
   -1    68             <event name="OnMotion">OnMotion</event>
   69    69             <event name="OnMouseEvents"></event>
   70    70             <event name="OnMouseWheel"></event>
   71    71             <event name="OnPaint"></event>

diff --git a/gui/xiRetimer_wxfb.h b/gui/xiRetimer_wxfb.h

@@ -43,8 +43,10 @@ class MainFrame : public wxFrame
   43    43 		wxStatusBar* m_statusBar1;
   44    44 		
   45    45 		// Virtual event handlers, overide them in your derived class
   -1    46 		virtual void OnLeftDClick( wxMouseEvent& event ) { event.Skip(); }
   46    47 		virtual void OnLeftDown( wxMouseEvent& event ) { event.Skip(); }
   47    48 		virtual void OnLeftUp( wxMouseEvent& event ) { event.Skip(); }
   -1    49 		virtual void OnMotion( wxMouseEvent& event ) { event.Skip(); }
   48    50 		virtual void OnUpdateUI( wxUpdateUIEvent& event ) { event.Skip(); }
   49    51 		virtual void OnOpenClick( wxCommandEvent& event ) { event.Skip(); }
   50    52 		virtual void OnExportClick( wxCommandEvent& event ) { event.Skip(); }

diff --git a/src/curve.cpp b/src/curve.cpp

@@ -9,7 +9,7 @@ Curve::Curve() {
    9     9   sample=new Sample(marker);
   10    10   seeker=0;
   11    11   tempo=90;
   12    -1   selMarker=0;
   -1    12   selMarker=-1;
   13    13 }
   14    14 
   15    15 Curve::~Curve() {
@@ -34,24 +34,29 @@ void Curve::addMarker() {
   34    34   float n=marker->nnew2new(seeker);
   35    35   marker->add(marker->new2old(n),n);
   36    36   // update selMarker
   -1    37 /*
   37    38   if (n<selMarker) --selMarker;
   38    39   if (selMarker>=getMarkerLength()) --selMarker;
   -1    40 */
   -1    41   selMarker=marker->getAreaNew(n);
   39    42 }
   40    43 
   41    44 void Curve::removeMarker() {
   -1    45   if (selMarker<0) return;
   42    46   marker->remove(selMarker);
   43    47   // update selMarker
   44    -1   if (selMarker>=getMarkerLength()) --selMarker;
   -1    48 //  if (selMarker>=getMarkerLength()) --selMarker;
   -1    49   selMarker=-1;
   45    50 }
   46    51 
   47    52 void Curve::setMarker(float nn) {
   -1    53   if (selMarker<0) return;
   48    54   int i=marker->getAreaNew(marker->nnew2new(nn));
   49    -1   if (i!=selMarker || i!=selMarker-1) return;
   -1    55   if (i!=selMarker && i!=selMarker-1) return;
   50    56   marker->setNew(selMarker,marker->nnew2new(nn));
   51    57 }
   52    58 
   53    59 void Curve::selectMarker(int i) {
   54    -1   if (i<0 || i>=getMarkerLength()) return;
   55    60   selMarker=i;
   56    61 }
   57    62 

diff --git a/src/marker.cpp b/src/marker.cpp

@@ -10,17 +10,37 @@ Marker::Marker() {
   10    10 Marker::~Marker() {
   11    11 }
   12    12 
   -1    13 void Marker::reset() {
   -1    14   for (int i=0; i<getLength(); ++i) {
   -1    15     anew.remove(i);
   -1    16     aold.remove(i);
   -1    17   }
   -1    18   add(0,0);
   -1    19   add(1,1);
   -1    20 }
   -1    21 
   13    22 void Marker::add(float pold, float pnew) {
   14    -1   if (pold<0 || pold>1) return;
   15    -1   if (getAreaOld(pold)!=getAreaNew(pnew)) return;
   -1    23 print();
   -1    24   if (pold<0 || pold>1) {
   -1    25     std::cerr << "Error in Marker::add" << std::endl;
   -1    26     std::cerr << "  pold not in range" << std::endl;
   -1    27     return;
   -1    28   }
   -1    29   if (getAreaOld(pold)!=getAreaNew(pnew)) {
   -1    30     std::cerr << "Error in Marker::add" << std::endl;
   -1    31     std::cerr << "  Areas not Fitting: ";
   -1    32     std::cerr << getAreaOld(pold) << " " << getAreaNew(pnew) << std::endl;
   -1    33     return;
   -1    34   }
   16    35   anew.add(pnew);
   17    36   aold.add(pold);
   18    37 }
   19    38   
   20    39 void Marker::remove(int pi) {
   21    40   if (getLength()<=2) return;
   22    -1   anew.remove(resort(pi));
   23    -1   anew.remove(resort(pi));
   -1    41   int i=resort(pi);
   -1    42   anew.remove(i);
   -1    43   aold.remove(i);
   24    44 }
   25    45 
   26    46 float Marker::getNew(int pi) {
@@ -53,11 +73,6 @@ int Marker::getLength() {
   53    73   return anew.getLength();
   54    74 }
   55    75 
   56    -1 void Marker::println() {
   57    -1   aold.println();
   58    -1   anew.println();
   59    -1 }
   60    -1 
   61    76 int Marker::resort(int pi) {
   62    77   if (!(pi>=0 && pi<getLength())) return -1;
   63    78   // write anew and indices into arrays
@@ -112,15 +127,26 @@ float Marker::nnew2new(float nn) {
  112   127 }
  113   128 
  114   129 int Marker::getAreaNew(float n) {
  115    -1   int i=0;
  116    -1   while (i<getLength()-1 && n<getNew(i+1)) ++i; // TODO n=getNew(i)
  117    -1   return i;
   -1   130   // TODO n=getNew(i)
   -1   131   for (int i=0; i<getLength(); ++i)
   -1   132     if (n<getNew(i)) return i-1;
   -1   133   return getLength()-1;
  118   134 }
  119   135 
  120   136 int Marker::getAreaOld(float o) {
  121    -1   int i=0;
  122    -1   while (i<getLength()-1 && o<getOld(i+1)) ++i; // TODO o=getOld(i)
  123    -1   return i;
   -1   137   // TODO n=getNew(i)
   -1   138   for (int i=0; i<getLength(); ++i)
   -1   139     if (o<getOld(i)) return i-1;
   -1   140   return getLength()-1;
   -1   141 }
   -1   142 
   -1   143 void Marker::print() {
   -1   144   std::cout << "Marker" << std::endl;
   -1   145   for (int i=0; i<getLength(); ++i) {
   -1   146     std::cout << i << " ";
   -1   147     std::cout << getOld(i) << " ";
   -1   148     std::cout << getNew(i) << std::endl;
   -1   149   }
  124   150 }
  125   151 
  126   152 

diff --git a/src/marker.h b/src/marker.h

@@ -15,6 +15,7 @@ class Marker {
   15    15 public:
   16    16   Marker();
   17    17   ~Marker();
   -1    18   void reset();
   18    19   void add(float pold, float pnew);
   19    20   void remove(int pi);
   20    21   float getNew(int pi);
@@ -23,7 +24,7 @@ public:
   23    24   float getRatio(); // factor by wich the whole sample is stretched; used to guess the length of the output array;
   24    25   float getRatio(int i); // factor by wich the is area is stretched;
   25    26   int getLength();
   26    -1   void println();
   -1    27   void print();
   27    28   // 0-1 conversion
   28    29   float old2new(float o);
   29    30   float new2old(float n);