#include #include #include #include "grain.h" #include "sbsms.h" #include "real.h" #include "utils.h" #include using namespace std; namespace _sbsms_ { map > wwMap; map > peakMap; map fftPlanMap; map ifftPlanMap; grain* grain :: create(int N,real pad) { grain *g = new grain(N,pad); return g; } void grain :: referenced(grain *g) { g->refCount++; } void grain :: forget(grain *g) { g->refCount--; if(g->refCount <= 0) { destroy(g); } } void grain :: destroy(grain *g) { free_audio_buf(g->x); delete g; } grain :: grain(int N, real pad) { this->N = N; this->pad = pad; calc_plans(); calc_windows(); refCount = 0; x = (audio*) malloc(N*sizeof(audio)); } void grain :: analyze() { for(int k=0;kx[k][c] = g->x[k][c]; for(int k=N/2+1;k<=N/2+N;k++) g2->x[k][c] = 0; for(int k=N/2+N+1;k<2*N;k++) g2->x[k][c] = g->x[k-N][c]; } return g2; } grain* grain :: downsample() { grain *g2 = grain::create(N/2,pad); grain *g = this; for(int c=0;c<2;c++) { for(int k=0;k<=N/4-1;k++) g2->x[k][c] = g->x[k][c]; g2->x[N/4][c] = 0.5f*(g->x[N/4][c] + g->x[N-N/4][c] ); for(int k=N/4+1;kx[k][c] = g->x[k+N/2][c]; } return g2; } }