void extract(CSOUND *csound, EXTRACT_STATICS* extractStatics) /* extract instr events within the time period */ { SRTBLK *bp; MYFLT turnoff, anticip; int warped; alloc_globals(csound, extractStatics); if ((bp = csound->frstbp) == NULL) /* if null file */ return; if (++STA(sectno) > STA(offsect)) { /* or later section, */ csound->frstbp = NULL; return; /* return */ } STA(frstout) = STA(prvout) = NULL; if (STA(sectno) < STA(onsect)) { /* for sects preceding, */ do { switch (bp->text[0]) { case 'f': /* include f's at time 0 */ bp->p2val = bp->newp2 = FL(1.0); /* time 1 for now!! */ include(csound, extractStatics, bp); break; case 'w': case 's': case 'e': include(csound, extractStatics, bp); /* incl w,s,e verbatim */ break; case 't': case 'i': case 'a': break; /* but skip all t,i,a */ } } while ((bp = bp->nxtblk) != NULL); } else { /* for sections in timespan: */ do { switch(bp->text[0]) { case 'w': warped = realtset(csound, bp); if (STA(sectno) == STA(onsect) && warped) STA(ontime) = STA(a0).newp3 = realt(csound, STA(onbeat)); if (STA(sectno) == STA(offsect) && warped) STA(offtime) = STA(f0).newp2 = realt(csound, STA(offbeat)); include(csound, extractStatics, bp); break; case 't': include(csound, extractStatics, bp); break; case 'f': casef: if (STA(sectno) == STA(onsect) && bp->newp2 < STA(ontime)) bp->newp2 = STA(ontime); else if (STA(sectno) == STA(offsect) && bp->newp2 > STA(offtime)) break; if (STA(sectno) == STA(onsect) && !STA(a0done)) { if (STA(onbeat) > 0) include(csound, extractStatics, &STA(a0)); STA(a0done)++; } include(csound, extractStatics, bp); break; case 'i': if (!STA(inslst)[bp->insno]) /* skip insnos not required */ break; if (bp->newp3 < 0) /* treat indef dur like f */ goto casef; case 'a':turnoff = bp->newp2 + bp->newp3; /* i and a: */ if (STA(sectno) == STA(onsect)) { if (turnoff < STA(ontime)) break; if ((anticip = STA(ontime) - bp->newp2) > 0) { if ((bp->newp3 -= anticip) < FL(0.001)) break; bp->p3val -= STA(onbeat) - bp->p2val; bp->newp2 = STA(ontime); bp->p2val = STA(onbeat); } } if (STA(sectno) == STA(offsect)) { if (bp->newp2 >= STA(offtime)) break; if (turnoff > STA(offtime)) { bp->newp3 = STA(offtime) - bp->newp2; bp->p3val = STA(offbeat) - bp->p2val; } } if (STA(sectno) == STA(onsect) && !STA(a0done)) { if (STA(onbeat) > 0) include(csound, extractStatics, &STA(a0)); STA(a0done)++; } include(csound, extractStatics, bp); break; case 's': case 'e': if (STA(sectno) == STA(offsect)) { include(csound, extractStatics, &STA(f0)); include(csound, extractStatics, &STA(e)); } else include(csound, extractStatics, bp); break; } } while ((bp = bp->nxtblk) != NULL); } csound->frstbp = STA(frstout); if (STA(prvout) != NULL) STA(prvout)->nxtblk = NULL; }
void extract(CSOUND *csound, EXTRACT_STATICS* extractStatics) /* extract instr events within the time period */ { SRTBLK *bp; MYFLT turnoff, anticip; int warped; alloc_globals(extractStatics); if ((bp = csound->frstbp) == NULL) /* if null file */ return; if (++extractStatics->sectno > extractStatics->offsect) { /* or later section, */ csound->frstbp = NULL; return; /* return */ } extractStatics->frstout = extractStatics->prvout = NULL; if (extractStatics->sectno < extractStatics->onsect) { /* for sects preceding, */ do { switch (bp->text[0]) { case 'f': /* include f's at time 0 */ bp->p2val = bp->newp2 = FL(1.0); /* time 1 for now!! */ include(extractStatics, bp); break; case 'w': case 's': case 'e': include(extractStatics, bp); /* incl w,s,e verbatim */ break; case 't': case 'i': case 'a': break; /* but skip all t,i,a */ } } while ((bp = bp->nxtblk) != NULL); } else { /* for sections in timespan: */ do { switch(bp->text[0]) { case 'w': warped = realtset(csound, bp); if (extractStatics->sectno == extractStatics->onsect && warped) extractStatics->ontime = extractStatics->a0.newp3 = realt(csound, extractStatics->onbeat); if (extractStatics->sectno == extractStatics->offsect && warped) extractStatics->offtime = extractStatics->f0.newp2 = realt(csound, extractStatics->offbeat); include(extractStatics, bp); break; case 't': include(extractStatics, bp); break; case 'f': casef: if (extractStatics->sectno == extractStatics->onsect && bp->newp2 < extractStatics->ontime) bp->newp2 = extractStatics->ontime; else if (extractStatics->sectno == extractStatics->offsect && bp->newp2 > extractStatics->offtime) break; if (extractStatics->sectno == extractStatics->onsect && !extractStatics->a0done) { if (extractStatics->onbeat > 0) include(extractStatics, &extractStatics->a0); extractStatics->a0done++; } include(extractStatics, bp); break; case 'i': if (!extractStatics->inslst[bp->insno]) /* skip insnos not required */ break; if (bp->newp3 < 0) /* treat indef dur like f */ goto casef; /* FALLTHRU */ case 'a':turnoff = bp->newp2 + bp->newp3; /* i and a: */ if (extractStatics->sectno == extractStatics->onsect) { if (turnoff < extractStatics->ontime) break; if ((anticip = extractStatics->ontime - bp->newp2) > 0) { if ((bp->newp3 -= anticip) < FL(0.001)) break; bp->p3val -= extractStatics->onbeat - bp->p2val; bp->newp2 = extractStatics->ontime; bp->p2val = extractStatics->onbeat; } } if (extractStatics->sectno == extractStatics->offsect) { if (bp->newp2 >= extractStatics->offtime) break; if (turnoff > extractStatics->offtime) { bp->newp3 = extractStatics->offtime - bp->newp2; bp->p3val = extractStatics->offbeat - bp->p2val; } } if (extractStatics->sectno == extractStatics->onsect && !extractStatics->a0done) { if (extractStatics->onbeat > 0) include(extractStatics, &extractStatics->a0); extractStatics->a0done++; } include(extractStatics, bp); break; case 's': case 'e': if (extractStatics->sectno == extractStatics->offsect) { include(extractStatics, &extractStatics->f0); include(extractStatics, &extractStatics->e); } else include(extractStatics, bp); break; } } while ((bp = bp->nxtblk) != NULL); } csound->frstbp = extractStatics->frstout; if (extractStatics->prvout != NULL) extractStatics->prvout->nxtblk = NULL; }