summaryrefslogtreecommitdiff
path: root/rotord
diff options
context:
space:
mode:
Diffstat (limited to 'rotord')
-rw-r--r--rotord/01.mp3bin0 -> 10375915 bytes
-rw-r--r--rotord/01.wavbin0 -> 45748270 bytes
-rw-r--r--rotord/02.mp3bin0 -> 6924579 bytes
-rw-r--r--rotord/02.wavbin0 -> 30528046 bytes
-rw-r--r--rotord/rotor.cpp66
-rwxr-xr-xrotord/rotor.h70
-rw-r--r--rotord/silence.mp3bin0 -> 481070 bytes
-rw-r--r--rotord/silence.wavbin0 -> 2646044 bytes
-rw-r--r--rotord/wave.mp3bin0 -> 160913 bytes
-rw-r--r--rotord/wave.wavbin0 -> 882044 bytes
-rw-r--r--rotord/wave_s.mp3bin0 -> 160913 bytes
-rw-r--r--rotord/wave_s.wavbin0 -> 1764044 bytes
12 files changed, 70 insertions, 66 deletions
diff --git a/rotord/01.mp3 b/rotord/01.mp3
new file mode 100644
index 0000000..92e9c6d
--- /dev/null
+++ b/rotord/01.mp3
Binary files differ
diff --git a/rotord/01.wav b/rotord/01.wav
new file mode 100644
index 0000000..d82faee
--- /dev/null
+++ b/rotord/01.wav
Binary files differ
diff --git a/rotord/02.mp3 b/rotord/02.mp3
new file mode 100644
index 0000000..9543612
--- /dev/null
+++ b/rotord/02.mp3
Binary files differ
diff --git a/rotord/02.wav b/rotord/02.wav
new file mode 100644
index 0000000..1a43e7d
--- /dev/null
+++ b/rotord/02.wav
Binary files differ
diff --git a/rotord/rotor.cpp b/rotord/rotor.cpp
index 85382ea..36cc6f3 100644
--- a/rotord/rotor.cpp
+++ b/rotord/rotor.cpp
@@ -119,7 +119,7 @@ Command_response Render_context::session_command(const std::vector<std::string>&
response.description="<status context='"+command[1]+"'>Rotor: audio ready</status>\n";
response.description+="<audio>\n";
response.description+=audio_thumb->print();
- response.description+="\n</audio>";
+ response.description+="</audio>";
state=IDLE;
}
}
@@ -536,7 +536,7 @@ bool Render_context::load_audio(const string &filename,vector<base_audio_process
// documentation on an FFmpeg structure or function, I just type "<name> doxygen" into google (like
// "AVFrame doxygen" for AVFrame's docs)
- //std::cout << "Got a frame: bytes " << bytes << std::endl;
+ //std::cout << "Got a frame: bytes " << bytes << ", "<<frame->nb_samples<<" samples"<<std::endl;
//now we can pass the data to the processor(s)
for (auto p: processors) {
sample_processed=p->process_frame(frame->data[0],frame->nb_samples);
@@ -633,3 +633,65 @@ Node_factory::Node_factory(){
add_type("==",new Is_new_integer());
add_type("signal_output",new Signal_output());
}
+void audio_thumbnailer::init(int _channels,int _bits,int _samples) {
+ //base_audio_processor::init(_channels,_bits,_samples);
+ channels=_channels;
+ bits=_bits;
+ samples=_samples;
+
+
+ samples_per_column=samples/width;
+ column=0; //point thumbnail bitmap
+ out_sample=0; //sample in whole track
+ offset=(int)(pow(2.0,bits)/2.0);
+ scale=1.0/offset;
+}
+int audio_thumbnailer::process_frame(uint8_t *_data,int samples_in_frame){
+ //begin by processing remaining samplesthread 4
+ //samples per column could be larger than a frame! (probably is)
+ //but all we are doing is averaging
+ int bytes=(bits>>3);
+ int stride=channels*bytes;
+ int in_sample=0;
+ while (in_sample<samples_in_frame&&column<width) {
+ int sample=0;
+ int samples=0;
+ double accum=0;
+ while (sample<samples_per_column&&in_sample<samples_in_frame) {
+ //accumulate squares for this column
+ for (int i=0;i<channels;i++) {
+ int this_val=0;
+ for (int j=0;j<bytes;j++) {
+ this_val+=_data[(sample*stride)+(i*bytes)+j]<<(j*8);
+ }
+ //convert from integer data format - i.e s16p - to audio signal in -1..1 range
+ //don't know how many bytes we are dealing with necessarily?
+ double val=((double)(this_val-offset))*scale;
+ accum+=(val*val);
+ samples++;
+ }
+ in_sample++;
+ sample++;
+ out_sample++;
+ }
+ //get root-mean
+ double mean=pow(accum/samples,0.5);
+ int colheight=height*mean*0.5;
+ int hh=height>>1;
+ for (int i=0;i<height;i++) {
+ data[i*width+column]=abs(i-hh)<colheight?0xff:0x00;
+ }
+ column++;
+ }
+ return out_sample;
+}
+string audio_thumbnailer::print(){
+ string output;
+ for (int j=0;j<height;j++) {
+ for (int i=0;i<width;i++) {
+ output+=data[j*width+i]<0x7f?"0":"1";
+ }
+ output +="\n";
+ }
+ return output;
+}
diff --git a/rotord/rotor.h b/rotord/rotor.h
index de8e686..b7ffc25 100755
--- a/rotord/rotor.h
+++ b/rotord/rotor.h
@@ -336,11 +336,7 @@ namespace Rotor {
class base_audio_processor {
public:
virtual int process_frame(uint8_t *data,int samples)=0;
- void init(int _channels,int _bits,int _samples) {
- channels=_channels;
- bits=_bits;
- samples=_samples;
- };
+ virtual void init(int _channels,int _bits,int _samples)=0;
int channels,bits,samples;
};
class audio_thumbnailer: public base_audio_processor {
@@ -349,71 +345,17 @@ namespace Rotor {
//draw pixels based on rms value
public:
audio_thumbnailer(){
- height=64;
- width=128; //fit
+ height=16;
+ width=64; //fit
data=new uint8_t[height*width];
memset(data,0,height*width);
}
~audio_thumbnailer(){
delete[] data;
}
- void init(int _channels,int _bits,int _samples) {
- base_audio_processor::init(_channels,_bits,_samples);
- samples_per_column=samples/width;
- column=0; //point thumbnail bitmap
- out_sample=0; //sample in whole track
- offset=(int)(pow(2.0,bits)/2.0);
- scale=1.0/offset;
- }
- int process_frame(uint8_t *data,int samples_in_frame){
- //begin by processing remaining samples
- //samples per column could be larger than a frame! (probably is)
- //but all we are doing is averaging
- int bytes=(bits>>3);
- int stride=channels*bytes;
- int in_sample=0;
- while (in_sample<samples_in_frame&&column<width) {
- int sample=0;
- int samples=0;
- double accum=0;
- while (sample<samples_per_column&&in_sample<samples_in_frame) {
- //accumulate squares for this column
- for (int i=0;i<channels;i++) {
- int this_val=0;
- for (int j=0;j<bytes;j++) {
- this_val+=data[(sample*stride)+(i*bytes)+j]<<j;
- }
- //convert from integer data format - i.e s16p - to audio signal in -1..1 range
- //don't know how many bytes we are dealing with necessarily?
- double val=(this_val-offset)*scale;
- accum+=val*val;
- samples++;
- }
- in_sample++;
- sample++;
- out_sample++;
- }
- //get root-mean
- double mean=pow(accum/samples,0.5);
- int colheight=height*mean*0.5;
- int hh=height>>1;
- for (int i=0;i<height;i++) {
- data[i*width+column]=abs(i-hh)<colheight?0xff:0x00;
- }
- column++;
- }
- return out_sample;
- }
- string print(){
- string output;
- for (int j=0;j<height;j++) {
- for (int i=0;i<width;i++) {
- output+=data[j*width+i]<0x7f?"0":"1";
- }
- output +="\n";
- }
- return output;
- }
+ void init(int _channels,int _bits,int _samples);
+ int process_frame(uint8_t *data,int samples_in_frame);
+ string print();
uint8_t *data;
int height,width,samples_per_column;
int column,out_sample;
diff --git a/rotord/silence.mp3 b/rotord/silence.mp3
new file mode 100644
index 0000000..32fbbb4
--- /dev/null
+++ b/rotord/silence.mp3
Binary files differ
diff --git a/rotord/silence.wav b/rotord/silence.wav
new file mode 100644
index 0000000..3c98ffc
--- /dev/null
+++ b/rotord/silence.wav
Binary files differ
diff --git a/rotord/wave.mp3 b/rotord/wave.mp3
new file mode 100644
index 0000000..96fd908
--- /dev/null
+++ b/rotord/wave.mp3
Binary files differ
diff --git a/rotord/wave.wav b/rotord/wave.wav
new file mode 100644
index 0000000..98ed9ca
--- /dev/null
+++ b/rotord/wave.wav
Binary files differ
diff --git a/rotord/wave_s.mp3 b/rotord/wave_s.mp3
new file mode 100644
index 0000000..10f55d4
--- /dev/null
+++ b/rotord/wave_s.mp3
Binary files differ
diff --git a/rotord/wave_s.wav b/rotord/wave_s.wav
new file mode 100644
index 0000000..618fb26
--- /dev/null
+++ b/rotord/wave_s.wav
Binary files differ