static void BandSplitter_setFrequencies(BandSplitter *self) { int i; MYFLT frac = 1. / self->bands; for (i=0; i<self->bands; i++) { self->band_freqs[i] = MYPOW(MYPOW(self->max_freq/self->min_freq, frac), i) * self->min_freq; } }
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_ii(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; } sharp = PyFloat_AS_DOUBLE(self->sharp); if (sharp < 0.0) sharp = 0.0; else if (sharp > 1.0) sharp = 1.0; inc = freq / self->sr; switch (self->wavetype) { case 0: /* Saw up */ maxHarms = (int)(self->srOverFour/freq); numh = sharp * 46.0 + 4.0; if (numh > maxHarms) numh = maxHarms; for (i=0; i<self->bufsize; i++) { 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->srOverFour/freq); numh = sharp * 46.0 + 4.0; if (numh > maxHarms) numh = maxHarms; for (i=0; i<self->bufsize; i++) { 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->srOverEight/freq); numh = sharp * 46.0 + 4.0; if (numh > maxHarms) numh = maxHarms; for (i=0; i<self->bufsize; i++) { 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 */ maxHarms = (int)(self->srOverFour/freq); if ((sharp * 36.0) > maxHarms) numh = (MYFLT)(maxHarms / 36.0); else numh = sharp; for (i=0; i<self->bufsize; i++) { 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 */ 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; for (i=0; i<self->bufsize; i++) { 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 */ 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; for (i=0; i<self->bufsize; i++) { 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 */ numh = 1.0 - sharp; inc2 = 1.0 / (int)(1.0 / inc * numh); for (i=0; i<self->bufsize; i++) { 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 */ inc2 = inc * sharp; for (i=0; i<self->bufsize; i++) { 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; } }