Пример #1
0
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;
}
Пример #2
0
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;
}