xiRetimer

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

commit
6fc5e1681f3609aea6f34f52a021926cb82b5182
parent
030c7547aab47a831a094db66c1d915bc61cd88f
Author
Tobias Bengfort <tobias.bengfort@gmx.net>
Date
2010-10-29 20:42
marker

Diffstat

A rb_expermients/buffer.cpp 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A rb_expermients/buffer.h 34 ++++++++++++++++++++++++++++++++++
A rb_expermients/gs.c 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A rb_expermients/marker.cpp 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A rb_expermients/marker.h 33 +++++++++++++++++++++++++++++++++
A rb_expermients/rb1 6 ++++++
A rb_expermients/rb2 41 +++++++++++++++++++++++++++++++++++++++++
A rb_expermients/rb3 28 ++++++++++++++++++++++++++++
A rb_expermients/test.cpp 18 ++++++++++++++++++
A rb_expermients/test.h 39 +++++++++++++++++++++++++++++++++++++++

10 files changed, 392 insertions, 0 deletions


diff --git a/rb_expermients/buffer.cpp b/rb_expermients/buffer.cpp

@@ -0,0 +1,71 @@
   -1     1 #include "buffer.h"
   -1     2 
   -1     3 Buffer::Buffer() {
   -1     4   _length=0;
   -1     5   array=new float[length()];
   -1     6 }
   -1     7 
   -1     8 Buffer::~Buffer() {
   -1     9   delete[] array;
   -1    10 }
   -1    11 
   -1    12 float Buffer::get(int i) {
   -1    13   if (i>=0 && i<length())
   -1    14     return array[i];
   -1    15   else
   -1    16     return NULL;
   -1    17 }
   -1    18 
   -1    19 void Buffer::set(int i, float v) {
   -1    20   if (i>=0 && i<=length()) array[i]=v;
   -1    21 }
   -1    22 
   -1    23 void Buffer::insert(int i,float v) {
   -1    24   if (i>=0 && i<=length()) {
   -1    25     float* tmpArray=new float[length()+1];
   -1    26     for (int ii=0; ii<i; ii++)
   -1    27       tmpArray[ii]=array[ii];
   -1    28     tmpArray[i]=v;
   -1    29     for (int ii=i; ii<length(); ii++)
   -1    30       tmpArray[ii+1]=array[ii];
   -1    31     delete[] array;
   -1    32     array=tmpArray;
   -1    33     _length++;
   -1    34   }
   -1    35 }
   -1    36 
   -1    37 void Buffer::add(float v) {
   -1    38   insert(length(),v);
   -1    39 }
   -1    40 
   -1    41 void Buffer::remove(int i) {
   -1    42   if (i>=0 && i<length()) {
   -1    43     float* tmpArray=new float[length()-1];
   -1    44     for (int ii=0; ii<i; ii++)
   -1    45       tmpArray[ii]=array[ii];
   -1    46     for (int ii=i+1; ii<length(); ii++)
   -1    47       tmpArray[ii-1]=array[ii];
   -1    48     delete[] array;
   -1    49     array=tmpArray;
   -1    50     _length--;
   -1    51   }
   -1    52 }
   -1    53 
   -1    54 int Buffer::length() {
   -1    55   return _length;
   -1    56 }
   -1    57 
   -1    58 void Buffer::print() {
   -1    59   std::cout << "[";
   -1    60   for (int i=0; i<length()-1; i++)
   -1    61     std::cout << get(i) << " ";
   -1    62   if (length() > 0)
   -1    63     std::cout << get(length()-1);
   -1    64   std::cout << "]";
   -1    65 }
   -1    66 
   -1    67 void Buffer::println() {
   -1    68   print();
   -1    69   std::cout << std::endl;
   -1    70 }
   -1    71 

diff --git a/rb_expermients/buffer.h b/rb_expermients/buffer.h

@@ -0,0 +1,34 @@
   -1     1 #ifndef __XIBUFFER_H
   -1     2 #define __XIBUFFER_H
   -1     3 
   -1     4 #include <iostream>
   -1     5 
   -1     6 class Buffer {
   -1     7 public:
   -1     8   Buffer();
   -1     9   ~Buffer();
   -1    10   float get(int i);
   -1    11   void set(int i, float v);
   -1    12   void add(float v);
   -1    13   void insert(int i,float v);
   -1    14   void remove(int i);
   -1    15   int length();
   -1    16   void print();
   -1    17   void println();
   -1    18 private:
   -1    19   float* array;
   -1    20   int _length;
   -1    21 };
   -1    22 
   -1    23 /*
   -1    24 int main() {
   -1    25   Buffer b;
   -1    26   b.insert(0,17);
   -1    27   b.insert(0,13);
   -1    28   b.insert(1,9);
   -1    29   b.remove(1);
   -1    30   b.println();
   -1    31 }
   -1    32 */
   -1    33 
   -1    34 #endif

diff --git a/rb_expermients/gs.c b/rb_expermients/gs.c

@@ -0,0 +1,58 @@
   -1     1 #include <gst/gst.h>
   -1     2 #include <stdbool.h>
   -1     3  
   -1     4 static GMainLoop *loop;
   -1     5  
   -1     6 static gboolean bus_call(GstBus *bus, GstMessage *msg, void *user_data)
   -1     7 {
   -1     8 	switch (GST_MESSAGE_TYPE(msg)) {
   -1     9 	case GST_MESSAGE_EOS: {
   -1    10 		g_message("End-of-stream");
   -1    11 		g_main_loop_quit(loop);
   -1    12 		break;
   -1    13 	}
   -1    14 	case GST_MESSAGE_ERROR: {
   -1    15 		GError *err;
   -1    16 		gst_message_parse_error(msg, &err, NULL);
   -1    17 		g_error("%s", err->message);
   -1    18 		g_error_free(err);
   -1    19  
   -1    20 		g_main_loop_quit(loop);
   -1    21 		break;
   -1    22 	}
   -1    23 	default:
   -1    24 		break;
   -1    25 	}
   -1    26  
   -1    27 	return true;
   -1    28 }
   -1    29  
   -1    30 static void play_uri(const char *uri)
   -1    31 {
   -1    32 	GstElement *pipeline;
   -1    33 	GstBus *bus;
   -1    34  
   -1    35 	loop = g_main_loop_new(NULL, FALSE);
   -1    36 	pipeline = gst_element_factory_make("playbin", "player");
   -1    37  
   -1    38 	if (uri)
   -1    39 		g_object_set(G_OBJECT(pipeline), "uri", uri, NULL);
   -1    40  
   -1    41 	bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
   -1    42 	gst_bus_add_watch(bus, bus_call, NULL);
   -1    43 	gst_object_unref(bus);
   -1    44  
   -1    45 	gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING);
   -1    46  
   -1    47 	g_main_loop_run(loop);
   -1    48  
   -1    49 	gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL);
   -1    50 	gst_object_unref(GST_OBJECT(pipeline));
   -1    51 }
   -1    52  
   -1    53 int main(int argc, char *argv[])
   -1    54 {
   -1    55 	gst_init(&argc, &argv);
   -1    56 	play_uri(argv[1]);
   -1    57 	return 0;
   -1    58 }

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

@@ -0,0 +1,64 @@
   -1     1 #include "marker.h"
   -1     2 
   -1     3 Marker::Marker() {
   -1     4   anew;
   -1     5   aold;
   -1     6 }
   -1     7 
   -1     8 Marker::~Marker() {
   -1     9 }
   -1    10 
   -1    11 void Marker::add(float pold, float pnew) {
   -1    12   anew.add(pnew);
   -1    13   aold.add(pold);
   -1    14 }
   -1    15   
   -1    16 void Marker::rm(int pi) {
   -1    17   anew.remove(resort(pi));
   -1    18   anew.remove(resort(pi));
   -1    19 }
   -1    20 
   -1    21 float Marker::getNew(int pi) {
   -1    22   return anew.get(resort(pi));
   -1    23 }
   -1    24 
   -1    25 float Marker::getOld(int pi) {
   -1    26   return aold.get(resort(pi));
   -1    27 }
   -1    28 
   -1    29 void Marker::setNew(int pi, float pnew) {
   -1    30   anew.set(resort(pi), pnew);
   -1    31 }
   -1    32 
   -1    33 int Marker::length() {
   -1    34   return anew.length();
   -1    35 }
   -1    36 
   -1    37 int Marker::resort(int pi) {
   -1    38   if (!(pi>=0 && pi<length())) return -1;
   -1    39   // write anew and indices into arrays
   -1    40   float tnew[length()];
   -1    41   int ti[length()];
   -1    42   for (int i=0; i<length(); i++) {
   -1    43     tnew[i]=anew.get(i);
   -1    44     ti[i]=i;
   -1    45   }
   -1    46   // sort arrays
   -1    47   for (int j=0; j<length()-1; j++) {
   -1    48     for (int i=0; i<length()-1-j; i++) {
   -1    49       if (tnew[i]>tnew[i+1]) {
   -1    50         // swap
   -1    51         float ttf;
   -1    52         ttf=tnew[i];
   -1    53         tnew[i]=tnew[i+1];
   -1    54         tnew[i+1]=ttf;
   -1    55         int tti;
   -1    56         tti=ti[i];
   -1    57         ti[i]=ti[i+1];
   -1    58         ti[i+1]=tti;
   -1    59       }
   -1    60     }
   -1    61   }
   -1    62   return ti[pi];
   -1    63 }
   -1    64 

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

@@ -0,0 +1,33 @@
   -1     1 #ifndef __XIMARKER_H
   -1     2 #define __XIMARKER_H
   -1     3 
   -1     4 #include <iostream>
   -1     5 #include "buffer.h"
   -1     6 
   -1     7 class Marker {
   -1     8 public:
   -1     9   Marker();
   -1    10   ~Marker();
   -1    11   void add(float pold, float pnew);
   -1    12   void rm(int pi);
   -1    13   float getNew(int pi);
   -1    14   float getOld(int pi);
   -1    15   void setNew(int pi, float pnew);
   -1    16   int length();
   -1    17 private:
   -1    18   Buffer anew;
   -1    19   Buffer aold;
   -1    20   int resort(int pi);
   -1    21 };
   -1    22 
   -1    23 /*
   -1    24 int main() {
   -1    25   Marker m;
   -1    26   m.add(0,0);
   -1    27   m.add(1,1);
   -1    28   m.add(0.5,0.4);
   -1    29   std::cout << m.getNew(3) << std::endl;
   -1    30 }
   -1    31 */
   -1    32 
   -1    33 #endif

diff --git a/rb_expermients/rb1 b/rb_expermients/rb1

@@ -0,0 +1,6 @@
   -1     1 include
   -1     2 
   -1     3 // für jeden Abschnitt wird ein Stretcher erstellt, der den Abschnitt anpasst
   -1     4 rb=new RubberBandStretcher(44100,1,DefaultOptions,ratio);
   -1     5 rb.study(abschnitt,abschnitt.length,true);
   -1     6 rb.process(abschnitt,abschnitt.length,true);

diff --git a/rb_expermients/rb2 b/rb_expermients/rb2

@@ -0,0 +1,41 @@
   -1     1 
   -1     2     SNDFILE *sndfile;
   -1     3     SNDFILE *sndfileOut;
   -1     4     SF_INFO sfinfo;
   -1     5     SF_INFO sfinfoOut;
   -1     6 
   -1     7     sndfile = sf_open(fileName, SFM_READ, &sfinfo);
   -1     8 
   -1     9     sfinfoOut.channels = sfinfo.channels;
   -1    10     sfinfoOut.format = sfinfo.format;
   -1    11     sfinfoOut.frames = int(sfinfo.frames * ratio + 0.1);
   -1    12     sfinfoOut.samplerate = sfinfo.samplerate;
   -1    13     sfinfoOut.sections = sfinfo.sections;
   -1    14     sfinfoOut.seekable = sfinfo.seekable;
   -1    15 
   -1    16     sndfileOut = sf_open(fileNameOut, SFM_WRITE, &sfinfoOut) 
   -1    17 
   -1    18     RubberBandStretcher ts(sfinfo.samplerate, channels, options,
   -1    19                            ratio, frequencyshift);
   -1    20 
   -1    21     float *fbuf = new float[channels * ibs];
   -1    22     float **ibuf = new float *[channels];
   -1    23     for (size_t i = 0; i < channels; ++i) ibuf[i] = new float[ibs];
   -1    24 
   -1    25         if ((count = sf_readf_float(sndfile, fbuf, ibs)) < 0) break;
   -1    26 
   -1    27             for (size_t c = 0; c < channels; ++c) {
   -1    28                 for (int i = 0; i < count; ++i) {
   -1    29                     float value = fbuf[i * channels + c];
   -1    30                     ibuf[c][i] = value;
   -1    31                 }
   -1    32             }
   -1    33 
   -1    34             ts.study(ibuf, count, final);
   -1    35         ts.process(ibuf, count, final);
   -1    36 
   -1    37 
   -1    38             sf_writef_float(sndfileOut, fobf, avail);
   -1    39 
   -1    40     sf_close(sndfile);
   -1    41     sf_close(sndfileOut);

diff --git a/rb_expermients/rb3 b/rb_expermients/rb3

@@ -0,0 +1,28 @@
   -1     1 
   -1     2 double getRatio(int i) {
   -1     3   float o1=marger.getOld(i);
   -1     4   float n1=marger.getNew(i);
   -1     5   float o2=marger.getOld(i+1);
   -1     6   float n2=marger.getNew(i+1);
   -1     7   return (n2-n1)/(o2-o1);
   -1     8 }
   -1     9 
   -1    10 int samples=10000000;
   -1    11 int sample_rate=44100
   -1    12 float[] raw=new float[samples];
   -1    13 
   -1    14 Marker marker=new Marker();
   -1    15 
   -1    16 marker.add(0,0);
   -1    17 marker.add(0.4,0.5);
   -1    18 marker.add(1,1);
   -1    19 
   -1    20 
   -1    21 for (int i=0; i<marker.length()-1; i++) {
   -1    22   RubberBandStretcher ts(sample_rate, 1, DefaultOptions, getRatio(i), 0);
   -1    23   ts.study(raw, raw.length, true);
   -1    24   ts.process(raw, raw.length, true);
   -1    25   int avail=ts.available();
   -1    26   float[] tmpRaw=new tmpRaw[avail];
   -1    27   addRaw(ts.recieve(tmpRaw,avail));
   -1    28 }

diff --git a/rb_expermients/test.cpp b/rb_expermients/test.cpp

@@ -0,0 +1,18 @@
   -1     1 
   -1     2 #include "test.h"
   -1     3 
   -1     4 /*
   -1     5 RTlayer::RTlayer() {
   -1     6   marker;
   -1     7 }
   -1     8 
   -1     9 RTlayer::~RTlayer() {
   -1    10 }
   -1    11 
   -1    12 float RTlayer::getRatio(int i) {
   -1    13   if (i>=0 && i<marker.length()-1)
   -1    14     return (marker.getNew(i+1)-marker.getNew(i))/(marker.getOld(i+1)-marker.getOld(i));
   -1    15   else
   -1    16     return NULL;
   -1    17 }
   -1    18 */

diff --git a/rb_expermients/test.h b/rb_expermients/test.h

@@ -0,0 +1,39 @@
   -1     1 
   -1     2 //#include <iostream>
   -1     3 //#include "marker.h"
   -1     4 #include <rubberband/RubberBandStretcher.h>
   -1     5 
   -1     6 /*
   -1     7 class RTlayer {
   -1     8 public:
   -1     9   RTlayer();
   -1    10   ~RTlayer();
   -1    11   float getRatio(int i);
   -1    12   Marker marker;
   -1    13 };
   -1    14 */
   -1    15 
   -1    16 int main() {
   -1    17 /*
   -1    18   RTlayer layer;
   -1    19 
   -1    20   int samples=10000000;
   -1    21   int sample_rate=44100;
   -1    22   float* raw=new float[samples];
   -1    23 
   -1    24   layer.marker.add(0,0);
   -1    25   layer.marker.add(0.4,0.5);
   -1    26   layer.marker.add(1,1);
   -1    27 */
   -1    28 
   -1    29 //  for (int i=0; i<layer.marker.length()-1; i++) {
   -1    30     RubberBand::RubberBandStretcher ts(44100, 1);
   -1    31 //    ts.study(raw, raw.length, true);
   -1    32 //    ts.process(raw, raw.length, true);
   -1    33 //    int avail=ts.available();
   -1    34 //    float[] tmpRaw=new tmpRaw[avail];
   -1    35 //    addRaw(ts.recieve(tmpRaw,avail));
   -1    36 //  }
   -1    37 
   -1    38 
   -1    39 }