1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 08:09:32 +02:00
This commit is contained in:
v.audacity 2012-08-12 22:03:12 +00:00
parent 27985d3631
commit e6c43712b8
5 changed files with 37 additions and 119 deletions

View File

@ -618,12 +618,10 @@ void SMS :: render(int c, list<SBSMSRenderer*> &renderers)
} else if(time >= t->start) {
if(time <= t->last) {
t->updateM(time,synthModeOutput);
if(band == 4 || band != 4) {
for(list<SBSMSRenderer*>::iterator i = renderers.begin(); i != renderers.end(); ++i) {
SBSMSRenderer *renderer = *i;
renderer->render(c,t);
}
}
t->step(time);
}
++tt;
@ -659,13 +657,6 @@ TrackPoint *SMS :: nearestForward(TrackPoint **begin, TrackPoint *tp0, float *mi
if(df2 > maxDF2) break;
float dM2 = dBApprox(tp1->m2,tp0->m2);
float cost2 = (df2+dMCoeff2*dM2);
if(0 && dNCoeff2 != 0.0f) {
if(tp0->owner) {
cost2 += dNCoeff2 * (tp0->owner->size()<minTrackSize?1.0f:0.0f);
} else {
cost2 += dNCoeff2 * (tp1->owner->size()<minTrackSize?1.0f:0.0f);
}
}
if(cost2 > maxCost2) continue;
if(cost2 < (*minCost2)) {
(*minCost2) = cost2;
@ -693,13 +684,6 @@ TrackPoint *SMS :: nearestReverse(TrackPoint **begin, TrackPoint *tp0, float *mi
if(df2 > maxDF2) break;
float dM2 = dBApprox(tp1->m2,tp0->m2);
float cost2 = (df2+dMCoeff2*dM2);
if(0 &&dNCoeff2 != 0.0f) {
if(tp0->owner) {
cost2 += dNCoeff2 * (tp0->owner->size()<minTrackSize?1.0f:0.0f);
} else {
cost2 += dNCoeff2 * (tp1->owner->size()<minTrackSize?1.0f:0.0f);
}
}
if(cost2 > maxCost2) continue;
if(cost2 < (*minCost2)) {
(*minCost2) = cost2;
@ -1267,6 +1251,7 @@ void SMS :: start(long offset, int c)
++tt;
assignTracks[c].erase(eraseMe);
returnTrackIndex(c,t);
t->absorb();
delete t;
continue;
}
@ -1357,7 +1342,7 @@ void SMS :: splitMerge(int c)
tp->cont = minH;
}
}
if(1&&tp->cont) {
if(tp->cont) {
tp->owner->point.insert(tp->owner->point.begin(),tp->cont);
tp->owner->first--;
tp->owner->bStitch = true;
@ -1393,7 +1378,7 @@ void SMS :: splitMerge(int c)
tp->cont = minH;
}
}
if(1&&tp->cont) {
if(tp->cont) {
tp->owner->point.insert(tp->owner->point.end(),tp->cont);
tp->owner->last++;
tp->owner->bStitch = true;
@ -1482,20 +1467,6 @@ void SMS :: add(grain *g0, grain *g1, grain *g2, int c)
bool bX1 = false;
TrackPoint *prev = NULL;
/*
float xt2sum = 1.0f;
bool bTroughN1sum = false;
bool bTroughN2sum = false;
float x0sum = 1.0f;
float y0sum = mag2[1];
float x1sum = 0.0f;
float y1sum = 0.0f;
bool bX0sum = !lo;
bool bX1sum = false;
TrackPoint *prevsum = NULL;
TrackPoint *psum = NULL;
*/
Slice *slice = new Slice(band,addtime[c]);
for(int k=1; k<=kEnd; k++) {
@ -1515,31 +1486,6 @@ void SMS :: add(grain *g0, grain *g1, grain *g2, int c)
} else {
TrackPoint *p = new TrackPoint(slice,peak2N,x2[c],mag2,mag2,k,N,band);
/*
if(psum) {
if(p->x - psum->x > peakWidth2) {
if(prev) {
prev->pn = psum;
psum->pp = prev;
} else {
slice->bottom = psum;
}
slice->top = psum;
prev = psum;
prevsum = psum;
psum->xtn2 = maxK;
bTroughN1sum = true;
bTroughN2sum = true;
psum->xtp2 = xt2sum;
psum->x01 = x0sum;
psum->y01 = y0sum;
} else {
delete psum;
}
}
psum = NULL;
*/
if(prev) {
prev->pn = p;
p->pp = prev;
@ -1564,34 +1510,6 @@ void SMS :: add(grain *g0, grain *g1, grain *g2, int c)
bTroughN2 = false;
}
}
/*
if(mag2sum[k] > mag2sum[k-1] && mag2sum[k] >= mag2sum[k+1]) {
if(k < kLo) {
x0sum = findExtremum(mag2sum,mag2,k,&y0sum);
bX0sum = true;
} else if(k > kHi) {
if(!bX1sum) {
x1sum = findExtremum(mag2sum,mag2,k,&y1sum);
if(prevsum) {
prevsum->x01 = x1sum;
prevsum->y01 = y1sum;
}
bX1sum = true;
}
} else {
if(!prev || k - prev->x > peakWidth2) {
psum = new TrackPoint(slice,peak2N,x2[c],mag2sum,mag2,k,N,band);
}
}
} else if(mag2sum[k] <= mag2sum[k-1] && mag2sum[k] <= mag2sum[k+1]) {
xt2sum = findExtremum(mag2sum,mag2,k,NULL);
if(bTroughN2sum) {
prevsum->xtn2 = xt2;
bTroughN2sum = false;
}
}
*/
}
if(bTroughN2) {
prev->xtn2 = (float)kEnd;
@ -1749,6 +1667,7 @@ void SMS :: add(grain *g0, grain *g1, grain *g2, int c)
p; ) {
TrackPoint *pn = p->pn;
if(p->m2 < m2min) {
p->absorb();
delete p;
}
p = pn;

View File

@ -42,9 +42,6 @@ Track :: ~Track() {
++i) {
TrackPoint *tp = (*i);
if(tp) {
if(tp->owner == this) {
tp->owner = NULL;
}
tp->destroy();
}
}
@ -348,4 +345,14 @@ void Track :: synth(float *out,
}
}
void Track :: absorb()
{
for(vector<TrackPoint*>::iterator i = point.begin();
i != point.end();
++i) {
TrackPoint *tp = (*i);
tp->absorb();
}
}
}

View File

@ -56,6 +56,7 @@ protected:
void step(const TimeType &time);
void synth(float *out, const TimeType &synthtime, int n, int mode, int c);
bool jump(TrackPoint *tp0, TrackPoint *tp1);
void absorb();
friend class SMS;
friend class SynthRenderer;

View File

@ -78,50 +78,40 @@ TrackPoint :: TrackPoint(Slice *slice, float *peak, audio *gx, float *mag, float
phSynth = ph;
}
void TrackPoint :: absorb()
{
if(pp && pn) {
if(pp->y * peak[lrintf(pp->x - x)] > pn->y * peak[lrintf(pn->x - x)]) {
pp->m2 += m2;
} else {
pn->m2 += m2;
}
} else if(pp) {
if(y01 == 0.0f || y01 * peak[lrintf(x01 - x)] < pp->y * peak[lrintf(pp->x - x)]) {
pp->m2 += m2;
}
} else if(pn) {
if(y01 == 0.0f || y01 * peak[lrintf(x01 - x)] < pn->y * peak[lrintf(pn->x - x)]) {
pn->m2 += m2;
}
}
}
TrackPoint :: ~TrackPoint()
{
for(int d=0;d<3;d++) {
if(dup[d]) {
m2 = 0.0f;
dup[d]->dup[2-d] = NULL;
}
}
m2 = 0;
if(slice) slice->remove(this);
if(pp && pn) {
pp->pn = pn;
pn->pp = pp;
if(!(owner && owner->bRender)) {
if(pp->y * peak[lrintf(pp->x - x)] > pn->y * peak[lrintf(pn->x - x)]) {
pp->m2 += m2;
pp->xtn2 = xtn2;
pn->xtp2 = xtn2;
} else {
pn->m2 += m2;
pp->xtn2 = xtp2;
pn->xtp2 = xtp2;
}
}
} else if(pp) {
pp->pn = NULL;
if(!(owner && owner->bRender)) {
if(y01 == 0.0f || y01 * peak[lrintf(x01 - x)] < pp->y * peak[lrintf(pp->x - x)]) {
pp->x01 = x01;
pp->y01 = y01;
pp->m2 += m2;
pp->xtn2 = xtn2;
}
}
} else if(pn) {
pn->pp = NULL;
if(!(owner && owner->bRender)) {
if(y01 == 0.0f || y01 * peak[lrintf(x01 - x)] < pn->y * peak[lrintf(pn->x - x)]) {
pn->x01 = x01;
pn->y01 = y01;
pn->m2 += m2;
pn->xtp2 = xtp2;
}
}
}
}

View File

@ -19,6 +19,7 @@ public:
float getF();
float getM();
float getPhase();
void absorb();
protected:
TrackPoint *pp;
TrackPoint *pn;