static void BandSplitter_filters_i(BandSplitter *self) { MYFLT val; int j, i; MYFLT *in = Stream_getData((Stream *)self->input_stream); if (self->init == 1) { for (j=0; j<self->bands; j++) { self->x1[j] = self->x2[j] = self->y1[j] = self->y2[j] = in[0]; } self->init = 0; } for (j=0; j<self->bands; j++) { for (i=0; i<self->bufsize; i++) { val = ( (self->b0[j] * in[i]) + (self->b2[j] * self->x2[j]) - (self->a1[j] * self->y1[j]) - (self->a2[j] * self->y2[j]) ) / self->a0[j]; self->y2[j] = self->y1[j]; self->y1[j] = val; self->x2[j] = self->x1[j]; self->x1[j] = in[i]; self->buffer_streams[i + j * self->bufsize] = val; } } }
static void LFO_generates_aa(LFO *self) { MYFLT val, inc, freq, sharp, pointer, numh; MYFLT v1, v2, inc2, fade; MYFLT sharp2 = 0.0; int i, maxHarms; MYFLT *fr = Stream_getData((Stream *)self->freq_stream); MYFLT *sh = Stream_getData((Stream *)self->sharp_stream); switch (self->wavetype) { case 0: /* Saw up */ for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; freq = fr[i]; if (freq < 0.00001) freq = 0.00001; else if (freq > self->srOverFour) freq = self->srOverFour; inc = freq * self->oneOverSr; maxHarms = (int)(self->srOverFour/freq); numh = sharp * 46.0 + 4.0; if (numh > maxHarms) numh = maxHarms; pointer = self->pointerPos * 2.0 - 1.0; val = pointer - MYTANH(numh * pointer) / MYTANH(numh); self->data[i] = val; self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) self->pointerPos -= 1.0; } break; case 1: /* Saw down */ for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; freq = fr[i]; if (freq < 0.00001) freq = 0.00001; else if (freq > self->srOverFour) freq = self->srOverFour; inc = freq * self->oneOverSr; maxHarms = (int)(self->srOverFour/freq); numh = sharp * 46.0 + 4.0; if (numh > maxHarms) numh = maxHarms; pointer = self->pointerPos * 2.0 - 1.0; val = -(pointer - MYTANH(numh * pointer) / MYTANH(numh)); self->data[i] = val; self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) self->pointerPos -= 1.0; } break; case 2: /* Square */ for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; freq = fr[i]; if (freq < 0.00001) freq = 0.00001; else if (freq > self->srOverFour) freq = self->srOverFour; inc = freq * self->oneOverSr; maxHarms = (int)(self->srOverEight/freq); numh = sharp * 46.0 + 4.0; if (numh > maxHarms) numh = maxHarms; val = MYATAN(numh * MYSIN(TWOPI*self->pointerPos)); self->data[i] = val * self->oneOverPiOverTwo; self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) self->pointerPos -= 1.0; } break; case 3: /* Triangle */ for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; freq = fr[i]; if (freq < 0.00001) freq = 0.00001; else if (freq > self->srOverFour) freq = self->srOverFour; inc = freq * self->oneOverSr; maxHarms = (int)(self->srOverFour/freq); if ((sharp * 36.0) > maxHarms) numh = (MYFLT)(maxHarms / 36.0); else numh = sharp; v1 = MYTAN(MYSIN(TWOPI*self->pointerPos)) * self->oneOverPiOverTwo; pointer = self->pointerPos + 0.25; if (pointer > 1.0) pointer -= 1.0; v2 = 4.0 * (0.5 - MYFABS(pointer - 0.5)) - 1.0; val = v1 * (1 - numh) + v2 * numh; self->data[i] = val; self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) self->pointerPos -= 1.0; } break; case 4: /* Pulse */ for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; freq = fr[i]; if (freq < 0.00001) freq = 0.00001; else if (freq > self->srOverFour) freq = self->srOverFour; inc = freq * self->oneOverSr; maxHarms = (int)(self->srOverEight/freq); numh = MYFLOOR(sharp * 46.0 + 4.0); if (numh > maxHarms) numh = maxHarms; if (MYFMOD(numh, 2.0) == 0.0) numh += 1.0; val = MYTAN(MYPOW(MYFABS(MYSIN(TWOPI*self->pointerPos)), numh)); self->data[i] = val * self->oneOverPiOverTwo; self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) self->pointerPos -= 1.0; } break; case 5: /* Bi-Pulse */ for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; freq = fr[i]; if (freq < 0.00001) freq = 0.00001; else if (freq > self->srOverFour) freq = self->srOverFour; inc = freq * self->oneOverSr; maxHarms = (int)(self->srOverEight/freq); numh = MYFLOOR(sharp * 46.0 + 4.0); if (numh > maxHarms) numh = maxHarms; if (MYFMOD(numh, 2.0) == 0.0) numh += 1.0; val = MYTAN(MYPOW(MYSIN(TWOPI*self->pointerPos), numh)); self->data[i] = val * self->oneOverPiOverTwo; self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) self->pointerPos -= 1.0; } break; case 6: /* SAH */ for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; numh = 1.0 - sharp; freq = fr[i]; if (freq < 0.00001) freq = 0.00001; else if (freq > self->srOverFour) freq = self->srOverFour; inc = freq * self->oneOverSr; inc2 = 1.0 / (int)(1.0 / inc * numh); self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) { self->pointerPos -= 1.0; self->sahPointerPos = 0.0; self->sahLastValue = self->sahCurrentValue; self->sahCurrentValue = RANDOM_UNIFORM * 2.0 - 1.0; } if (self->sahPointerPos < 1.0) { fade = 0.5 * MYSIN(PI * (self->sahPointerPos+0.5)) + 0.5; val = self->sahCurrentValue * (1.0 - fade) + self->sahLastValue * fade; self->sahPointerPos += inc2; } else { val = self->sahCurrentValue; } self->data[i] = val; } break; case 7: /* Sine-mod */ for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; freq = fr[i]; if (freq < 0.00001) freq = 0.00001; else if (freq > self->srOverFour) freq = self->srOverFour; inc = freq * self->oneOverSr; inc2 = inc * sharp * 0.99; sharp2 = sharp * 0.5; self->modPointerPos += inc2; if (self->modPointerPos < 0) self->modPointerPos += 1.0; else if (self->modPointerPos >= 1) self->modPointerPos -= 1.0; val = ((sharp2 * MYCOS(TWOPI*self->modPointerPos) + sharp2) + (1.0 - sharp)) * MYSIN(TWOPI*self->pointerPos); self->data[i] = val; self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) self->pointerPos -= 1.0; } break; default: break; } }
static void Harmonizer_transform_ii(Harmonizer *self) { MYFLT val, amp, inc, ratio, rate, del, xind, pos, envpos, fpart; int i, ipart; MYFLT *in = Stream_getData((Stream *)self->input_stream); MYFLT trans = PyFloat_AS_DOUBLE(self->transpo); MYFLT feed = PyFloat_AS_DOUBLE(self->feedback); ratio = MYPOW(2.0, trans/12.0); rate = (ratio-1.0) / self->winsize; inc = -rate / self->sr; for (i=0; i<self->bufsize; i++) { /* first overlap */ pos = self->pointerPos; envpos = pos * 8192.0; ipart = (int)envpos; fpart = envpos - ipart; amp = self->envelope[ipart] + (self->envelope[ipart+1] - self->envelope[ipart]) * fpart; del = pos * self->winsize; xind = self->in_count - (del * self->sr); if (xind < 0) xind += self->sr; ipart = (int)xind; fpart = xind - ipart; val = self->buffer[ipart] + (self->buffer[ipart+1] - self->buffer[ipart]) * fpart; self->data[i] = val * amp; /* second overlap */ pos = self->pointerPos + 0.5; if (pos >= 1) pos -= 1.0; envpos = pos * 8192.0; ipart = (int)envpos; fpart = envpos - ipart; amp = self->envelope[ipart] + (self->envelope[ipart+1] - self->envelope[ipart]) * fpart; del = pos * self->winsize; xind = self->in_count - (del * self->sr); if (xind < 0) xind += self->sr; ipart = (int)xind; fpart = xind - ipart; val = self->buffer[ipart] + (self->buffer[ipart+1] - self->buffer[ipart]) * fpart; self->data[i] += (val * amp); self->pointerPos += inc; if (self->pointerPos < 0.0) self->pointerPos += 1.0; else if (self->pointerPos >= 1.0) self->pointerPos -= 1.0; self->buffer[self->in_count] = in[i] + (self->data[i] * feed); if (self->in_count == 0) self->buffer[(int)self->sr] = self->buffer[0]; self->in_count++; if (self->in_count >= self->sr) self->in_count = 0; } }
static void LFO_generates_ia(LFO *self) { MYFLT val, inc, freq, sharp, pointer, numh; MYFLT v1, v2, inc2, fade; int i, maxHarms; freq = PyFloat_AS_DOUBLE(self->freq); if (freq <= 0) { return; } MYFLT *sh = Stream_getData((Stream *)self->sharp_stream); inc = freq / self->sr; switch (self->wavetype) { case 0: /* Saw up */ maxHarms = (int)(self->sr*0.25/freq); for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; numh = sharp * 46.0 + 4.0; if (numh > maxHarms) numh = maxHarms; pointer = self->pointerPos * 2.0 - 1.0; val = pointer - MYTANH(numh * pointer) / MYTANH(numh); self->data[i] = val; self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) self->pointerPos -= 1.0; } break; case 1: /* Saw down */ maxHarms = (int)(self->sr*0.25/freq); for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; numh = sharp * 46.0 + 4.0; if (numh > maxHarms) numh = maxHarms; pointer = self->pointerPos * 2.0 - 1.0; val = -(pointer - MYTANH(numh * pointer) / MYTANH(numh)); self->data[i] = val; self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) self->pointerPos -= 1.0; } break; case 2: /* Square */ maxHarms = (int)(self->sr*0.125/freq); for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; numh = sharp * 46.0 + 4.0; if (numh > maxHarms) numh = maxHarms; val = MYATAN(numh * MYSIN(TWOPI*self->pointerPos)); self->data[i] = val; self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) self->pointerPos -= 1.0; } break; case 3: /* Triangle */ maxHarms = (int)(self->sr*0.25/freq); for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; if ((sharp * 36.0) > maxHarms) numh = (MYFLT)(maxHarms / 36.0); else numh = sharp; v1 = MYTAN(MYSIN(TWOPI*self->pointerPos)); pointer = self->pointerPos + 0.25; if (pointer > 1.0) pointer -= 1.0; v2 = 4.0 * (0.5 - MYFABS(pointer - 0.5)) - 1.0; val = v1 * (1 - numh) + v2 * numh; self->data[i] = val; self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) self->pointerPos -= 1.0; } break; case 4: /* Pulse */ maxHarms = (int)(self->sr*0.125/freq); for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; numh = MYFLOOR(sharp * 46.0 + 4.0); if (numh > maxHarms) numh = maxHarms; if (MYFMOD(numh, 2.0) == 0.0) numh += 1.0; val = MYTAN(MYPOW(MYFABS(MYSIN(TWOPI*self->pointerPos)), numh)); self->data[i] = val; self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) self->pointerPos -= 1.0; } break; case 5: /* Bi-Pulse */ maxHarms = (int)(self->sr*0.125/freq); for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; numh = MYFLOOR(sharp * 46.0 + 4.0); if (numh > maxHarms) numh = maxHarms; if (MYFMOD(numh, 2.0) == 0.0) numh += 1.0; val = MYTAN(MYPOW(MYSIN(TWOPI*self->pointerPos), numh)); self->data[i] = val; self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) self->pointerPos -= 1.0; } break; case 6: /* SAH */ for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; numh = 1.0 - sharp; inc2 = 1.0 / (int)(1.0 / inc * numh); self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) { self->pointerPos -= 1.0; self->sahPointerPos = 0.0; self->sahLastValue = self->sahCurrentValue; self->sahCurrentValue = rand()/((MYFLT)(RAND_MAX)*0.5) - 1.0; } if (self->sahPointerPos < 1.0) { fade = 0.5 * MYSIN(PI * (self->sahPointerPos+0.5)) + 0.5; val = self->sahCurrentValue * (1.0 - fade) + self->sahLastValue * fade; self->sahPointerPos += inc2; } else { val = self->sahCurrentValue; } self->data[i] = val; } break; case 7: /* Sine-mod */ for (i=0; i<self->bufsize; i++) { sharp = sh[i]; if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; inc2 = inc * sharp; self->modPointerPos += inc2; if (self->modPointerPos < 0) self->modPointerPos += 1.0; else if (self->modPointerPos >= 1) self->modPointerPos -= 1.0; val = (0.5 * MYCOS(TWOPI*self->modPointerPos) + 0.5) * MYSIN(TWOPI*self->pointerPos); self->data[i] = val; self->pointerPos += inc; if (self->pointerPos < 0) self->pointerPos += 1.0; else if (self->pointerPos >= 1) self->pointerPos -= 1.0; } break; default: break; } }
static void FourBandMain_filters(FourBandMain *self) { double val, inval, tmp, f1, f2, f3; int i, j, j1, ind, ind1; MYFLT *in = Stream_getData((Stream *)self->input_stream); if (self->modebuffer[0] == 0) f1 = PyFloat_AS_DOUBLE(self->freq1); else f1 = (double)Stream_getData((Stream *)self->freq1_stream)[0]; if (self->modebuffer[1] == 0) f2 = PyFloat_AS_DOUBLE(self->freq2); else f2 = (double)Stream_getData((Stream *)self->freq2_stream)[0]; if (self->modebuffer[2] == 0) f3 = PyFloat_AS_DOUBLE(self->freq3); else f3 = (double)Stream_getData((Stream *)self->freq3_stream)[0]; if (f1 != self->last_freq1) { self->last_freq1 = f1; FourBandMain_compute_variables(self, f1, 0); } if (f2 != self->last_freq2) { self->last_freq2 = f2; FourBandMain_compute_variables(self, f2, 1); } if (f3 != self->last_freq3) { self->last_freq3 = f3; FourBandMain_compute_variables(self, f3, 2); } for (i=0; i<self->bufsize; i++) { inval = (double)in[i]; /* First band */ val = self->la0[0] * inval + self->la1[0] * self->x1[0] + self->la2[0] * self->x2[0] + self->la1[0] * self->x3[0] + self->la0[0] * self->x4[0] - self->b1[0] * self->y1[0] - self->b2[0] * self->y2[0] - self->b3[0] * self->y3[0] - self->b4[0] * self->y4[0]; self->y4[0] = self->y3[0]; self->y3[0] = self->y2[0]; self->y2[0] = self->y1[0]; self->y1[0] = val; self->x4[0] = self->x3[0]; self->x3[0] = self->x2[0]; self->x2[0] = self->x1[0]; self->x1[0] = inval; self->buffer_streams[i] = (MYFLT)val; /* Second and third bands */ for (j=0; j<2; j++) { j1 = j + 1; ind = j * 2 + 1; ind1 = ind + 1; tmp = self->ha0[j] * inval + self->ha1[j] * self->x1[ind] + self->ha2[j] * self->x2[ind] + self->ha1[j] * self->x3[ind] + self->ha0[j] * self->x4[ind] - self->b1[j] * self->y1[ind] - self->b2[j] * self->y2[ind] - self->b3[j] * self->y3[ind] - self->b4[j] * self->y4[ind]; self->y4[ind] = self->y3[ind]; self->y3[ind] = self->y2[ind]; self->y2[ind] = self->y1[ind]; self->y1[ind] = tmp; self->x4[ind] = self->x3[ind]; self->x3[ind] = self->x2[ind]; self->x2[ind] = self->x1[ind]; self->x1[ind] = inval; val = self->la0[j1] * tmp + self->la1[j1] * self->x1[ind1] + self->la2[j1] * self->x2[ind1] + self->la1[j1] * self->x3[ind1] + self->la0[j1] * self->x4[ind1] - self->b1[j1] * self->y1[ind1] - self->b2[j1] * self->y2[ind1] - self->b3[j1] * self->y3[ind1] - self->b4[j1] * self->y4[ind1]; self->y4[ind1] = self->y3[ind1]; self->y3[ind1] = self->y2[ind1]; self->y2[ind1] = self->y1[ind1]; self->y1[ind1] = val; self->x4[ind1] = self->x3[ind1]; self->x3[ind1] = self->x2[ind1]; self->x2[ind1] = self->x1[ind1]; self->x1[ind1] = tmp; self->buffer_streams[i + j1 * self->bufsize] = (MYFLT)val; } val = self->ha0[2] * inval + self->ha1[2] * self->x1[5] + self->ha2[2] * self->x2[5] + self->ha1[2] * self->x3[5] + self->ha0[2] * self->x4[5] - self->b1[2] * self->y1[5] - self->b2[2] * self->y2[5] - self->b3[2] * self->y3[5] - self->b4[2] * self->y4[5]; self->y4[5] = self->y3[5]; self->y3[5] = self->y2[5]; self->y2[5] = self->y1[5]; self->y1[5] = val; self->x4[5] = self->x3[5]; self->x3[5] = self->x2[5]; self->x2[5] = self->x1[5]; self->x1[5] = inval; self->buffer_streams[i + 3 * self->bufsize] = (MYFLT)val; } }
static void OscBank_readframes(OscBank *self) { MYFLT freq, spread, slope, frndf, frnda, arndf, arnda, amp, modamp, pos, inc, x, y, fpart; int i, j, ipart; MYFLT *tablelist = TableStream_getData(self->table); int size = TableStream_getSize(self->table); MYFLT tabscl = size / self->sr; for (i=0; i<self->bufsize; i++) { self->data[i] = 0.0; } if (self->modebuffer[2] == 0) freq = PyFloat_AS_DOUBLE(self->freq); else freq = Stream_getData((Stream *)self->freq_stream)[0]; if (self->modebuffer[3] == 0) spread = PyFloat_AS_DOUBLE(self->spread); else spread = Stream_getData((Stream *)self->spread_stream)[0]; if (self->modebuffer[4] == 0) slope = PyFloat_AS_DOUBLE(self->slope); else slope = Stream_getData((Stream *)self->slope_stream)[0]; if (self->modebuffer[5] == 0) frndf = PyFloat_AS_DOUBLE(self->frndf); else frndf = Stream_getData((Stream *)self->frndf_stream)[0]; if (self->modebuffer[6] == 0) frnda = PyFloat_AS_DOUBLE(self->frnda); else frnda = Stream_getData((Stream *)self->frnda_stream)[0]; if (self->modebuffer[7] == 0) arndf = PyFloat_AS_DOUBLE(self->arndf); else arndf = Stream_getData((Stream *)self->arndf_stream)[0]; if (self->modebuffer[8] == 0) arnda = PyFloat_AS_DOUBLE(self->arnda); else arnda = Stream_getData((Stream *)self->arnda_stream)[0]; if (freq != self->lastFreq || spread != self->lastSpread) { self->lastFreq = freq; self->lastSpread = spread; OscBank_setFrequencies(self, freq, spread); } if (self->fjit != self->lastFjit) { self->lastFjit = self->fjit; OscBank_setFrequencies(self, freq, spread); if (self->fjit == 0) { for (i=0; i<self->stages; i++) { self->pointerPos[i] = 0.0; } } } if (frnda == 0.0 && arnda == 0.0) { amp = self->amplitude; for (j=0; j<self->stages; j++) { inc = self->frequencies[j] * tabscl; pos = self->pointerPos[j]; for (i=0; i<self->bufsize; i++) { pos = OscBank_clip(pos, size); ipart = (int)pos; fpart = pos - ipart; x = tablelist[ipart]; y = tablelist[ipart+1]; self->data[i] += (x + (y - x) * fpart) * amp; pos += inc; } self->pointerPos[j] = pos; amp *= slope; } } else if (frnda != 0.0 && arnda != 0.0) { if (self->ftime >= 1.0) { OscBank_pickNewFrnds(self, frndf, frnda); } if (self->atime >= 1.0) { OscBank_pickNewArnds(self, arndf, arnda); } amp = self->amplitude; for (j=0; j<self->stages; j++) { inc = (self->frequencies[j] + (self->fOldValues[j] + self->fDiffs[j] * self->ftime)) * tabscl; pos = self->pointerPos[j]; modamp = (1.0 - arnda) + (self->aOldValues[j] + self->aDiffs[j] * self->atime); for (i=0; i<self->bufsize; i++) { pos = OscBank_clip(pos, size); ipart = (int)pos; fpart = pos - ipart; x = tablelist[ipart]; y = tablelist[ipart+1]; self->data[i] += (x + (y - x) * fpart) * amp * modamp; pos += inc; } self->pointerPos[j] = pos; amp *= slope; } self->ftime += self->finc; self->atime += self->ainc; } else if (frnda != 0.0 && arnda == 0.0) { if (self->ftime >= 1.0) { OscBank_pickNewFrnds(self, frndf, frnda); } amp = self->amplitude; for (j=0; j<self->stages; j++) { inc = (self->frequencies[j] + (self->fOldValues[j] + self->fDiffs[j] * self->ftime)) * tabscl; pos = self->pointerPos[j]; for (i=0; i<self->bufsize; i++) { pos = OscBank_clip(pos, size); ipart = (int)pos; fpart = pos - ipart; x = tablelist[ipart]; y = tablelist[ipart+1]; self->data[i] += (x + (y - x) * fpart) * amp; pos += inc; } self->pointerPos[j] = pos; amp *= slope; } self->ftime += self->finc; } else if (frnda == 0.0 && arnda != 0.0) { if (self->atime >= 1.0) { OscBank_pickNewArnds(self, arndf, arnda); } amp = self->amplitude; for (j=0; j<self->stages; j++) { inc = self->frequencies[j] * tabscl; pos = self->pointerPos[j]; modamp = (1.0 - arnda) + (self->aOldValues[j] + self->aDiffs[j] * self->atime); for (i=0; i<self->bufsize; i++) { pos = OscBank_clip(pos, size); ipart = (int)pos; fpart = pos - ipart; x = tablelist[ipart]; y = tablelist[ipart+1]; self->data[i] += (x + (y - x) * fpart) * amp * modamp; pos += inc; } self->pointerPos[j] = pos; amp *= slope; } self->atime += self->ainc; } }