diff options
| author | Comment <tim@gray.(none)> | 2014-02-26 17:01:43 +0000 |
|---|---|---|
| committer | Comment <tim@gray.(none)> | 2014-02-26 17:01:43 +0000 |
| commit | a2fe68dfed91e362404ea1171cc8f0b313956cc3 (patch) | |
| tree | 013d071e94a2e29f0aee8ec2da44e1d0debbaab8 /basedProject/src/audioGlitcher.h | |
| parent | 84b516956e7ca1ddd7d89890d9ff81f71fcff217 (diff) | |
thank fuk
Diffstat (limited to 'basedProject/src/audioGlitcher.h')
| -rw-r--r-- | basedProject/src/audioGlitcher.h | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/basedProject/src/audioGlitcher.h b/basedProject/src/audioGlitcher.h new file mode 100644 index 0000000..8f48288 --- /dev/null +++ b/basedProject/src/audioGlitcher.h @@ -0,0 +1,179 @@ +#pragma once + +#include "ofMain.h" +#include "ofxOpenCv.h" + +class audioGlitcher { + public: + + ofxCvColorImage buffer; + ofFbo renderFBO; + IplImage tmp; + vector<float> *samples; + int interp_x,interp_y; + float trans_x,trans_y; + float scale; + float rotation; + float origin_x,origin_y; + + void setup(int w,int h,vector<float> *s){ + buffer.allocate(w,h); + renderFBO.allocate(w,h,GL_RGB); + samples=s; + origin_x=origin_y=0.5f; + trans_x=trans_y=0.0f; + scale=1.0f; + rotation=0.0f; + interp_x=16; + interp_y=12; + } + void set_interp(int ix,int iy){ + interp_x=ix; + interp_y=iy; + } + void set_trans(float x,float y){ + trans_x=x; + trans_y=y; + } + void set_scale(float s){ + scale=s; + } + void set_origin(float x,float y){ + origin_x=x; + origin_y=y; + } + void draw(int x,int y){ + renderFBO.draw(x,y); + } + void update(){ + + renderFBO.readToPixels(buffer.getPixelsRef()); + buffer.flagImageChanged(); + + //create low res remap target + + cv::Mat dstX(interp_x,interp_y,CV_32FC1); + cv::Mat dstY(interp_x,interp_y,CV_32FC1); + cv::Mat srcX(interp_x,interp_y,CV_32FC1); + cv::Mat srcY(interp_x,interp_y,CV_32FC1); + + float xFactor=renderFBO.getWidth()/srcX.cols; + float yFactor=renderFBO.getHeight()/srcX.rows; + for (int i=0;i<srcX.cols;i++){ + for (int j=0;j<srcX.rows;j++){ + srcX.at<float>(j,i)=i*xFactor; + srcY.at<float>(j,i)=j*yFactor; + } + } + + //transform the low res matrix + float tX=trans_x-.05; //fraction of image + float tY=trans_y-.04; //fraction of image + float oX=origin_x; //fraction of image + float oY=origin_y; //fraction of image + float s=scale; + float r=rotation; + + cv::Point2f srcTri[3], dstTri[3]; + + // Compute matrix by creating triangle and transforming + srcTri[0].x=0; + srcTri[0].y=0; + srcTri[1].x=dstX.rows-1; + srcTri[1].y=0; + srcTri[2].x=0; + srcTri[2].y=dstX.cols-1; + + for (int i=0;i<3;i++){ + + dstTri[i].x=srcTri[i].x+(tX*dstX.cols); + dstTri[i].y=srcTri[i].y+(tY*dstX.cols); //use cols for equiv coords + //rotate and scale around centre + //transform to centre + dstTri[i].x-=(oX*dstX.cols); + dstTri[i].y-=(oY*dstX.cols); + + dstTri[i].x*=s; + dstTri[i].y*=s; + + double dx=(dstTri[i].x*cos(r))-(dstTri[i].y*sin(r)); + double dy=(dstTri[i].x*sin(r))+(dstTri[i].y*cos(r)); + + dstTri[i].x=dx; + dstTri[i].y=dy; + + //transform back + dstTri[i].x+=(oX*dstX.cols); + dstTri[i].y+=(oY*dstX.cols); + } + + cv::Mat trans_mat=getAffineTransform(srcTri,dstTri); + warpAffine(srcX,dstX,trans_mat, srcX.size(), cv::INTER_LINEAR, cv::BORDER_WRAP); + warpAffine(srcY,dstY,trans_mat, srcY.size(), cv::INTER_LINEAR, cv::BORDER_WRAP); + + cv::Mat scaledstX; + cv::Mat scaledstY; + + cv::resize(dstX,scaledstX, cv::Size(renderFBO.getWidth(),renderFBO.getHeight()), 0, 0, cv::INTER_LINEAR); + cv::resize(dstY,scaledstY, cv::Size(renderFBO.getWidth(),renderFBO.getHeight()), 0, 0, cv::INTER_LINEAR); + + cv::Mat buf = buffer.getCvImage(); + cv::Mat dstbuf; + + cv::remap(buf,dstbuf,scaledstX,scaledstY, cv::INTER_NEAREST, cv::BORDER_WRAP); //, cv::Scalar(0,0, 0) ); + tmp = IplImage(dstbuf); + + //buffer=tmp; + //buffer.remap(scaledstX,scaledstY); + buffer=&tmp; + + renderFBO.begin(); + + // + ofSetColor(255,255,255); + + buffer-=1; + buffer.draw(0,0); + // + + //ofEnableAlphaBlending(); + //ofSetColor(0,0,0,128); + //ofRect(0,0,ofGetWidth(),ofGetHeight()); + //ofDisableAlphaBlending(); + + if (false){ + ofNoFill(); + ofPushMatrix(); + ofTranslate(renderFBO.getWidth()/2,renderFBO.getHeight()/2); + ofRect(-20,-20,40,40); + ofPopMatrix(); + } + + if (true) { + ofPushMatrix(); + ofTranslate(0,renderFBO.getHeight()/2); + + + ofSetColor(0,0,0); + ofFill(); + ofBeginShape(); + for (int i=0;i<samples->size();i++){ + ofVertex(i,(*samples)[i]*renderFBO.getHeight()); + } + ofEndShape(); + + ofSetColor(255,255,255); + ofNoFill(); + ofBeginShape(); + for (int i=0;i<samples->size();i++){ + ofVertex(i,(*samples)[i]*renderFBO.getHeight()); + } + ofEndShape(); + + ofPopMatrix(); + } + + renderFBO.end(); + //renderFBO.flagImageChanged(); + } +};
\ No newline at end of file |
