void process(AUAudioFrameCount frameCount, AUAudioFrameCount bufferOffset) override { for (int frameIndex = 0; frameIndex < frameCount; ++frameIndex) { int frameOffset = int(frameIndex + bufferOffset); cutoffFrequency = cutoffFrequencyRamper.getAndStep(); moogladder0->freq = (float)cutoffFrequency; moogladder1->freq = (float)cutoffFrequency; resonance = resonanceRamper.getAndStep(); moogladder0->res = (float)resonance; moogladder1->res = (float)resonance; for (int channel = 0; channel < channels; ++channel) { float *in = (float *)inBufferListPtr->mBuffers[channel].mData + frameOffset; float *out = (float *)outBufferListPtr->mBuffers[channel].mData + frameOffset; if (started) { if (channel == 0) { sp_moogladder_compute(sp, moogladder0, in, out); } else { sp_moogladder_compute(sp, moogladder1, in, out); } } else { *out = *in; } } } }
int sporth_moogladder(sporth_stack *stack, void *ud) { plumber_data *pd = ud; SPFLOAT input; SPFLOAT out; SPFLOAT freq; SPFLOAT res; sp_moogladder *moogladder; switch(pd->mode) { case PLUMBER_CREATE: #ifdef DEBUG_MODE fprintf(stderr, "moogladder: Creating\n"); #endif sp_moogladder_create(&moogladder); plumber_add_ugen(pd, SPORTH_MOOGLADDER, moogladder); if(sporth_check_args(stack, "fff") != SPORTH_OK) { fprintf(stderr,"Not enough arguments for moogladder\n"); stack->error++; return PLUMBER_NOTOK; } res = sporth_stack_pop_float(stack); freq = sporth_stack_pop_float(stack); input = sporth_stack_pop_float(stack); sporth_stack_push_float(stack, 0); break; case PLUMBER_INIT: #ifdef DEBUG_MODE fprintf(stderr, "moogladder: Initialising\n"); #endif res = sporth_stack_pop_float(stack); freq = sporth_stack_pop_float(stack); input = sporth_stack_pop_float(stack); moogladder = pd->last->ud; sp_moogladder_init(pd->sp, moogladder); sporth_stack_push_float(stack, 0); break; case PLUMBER_COMPUTE: res = sporth_stack_pop_float(stack); freq = sporth_stack_pop_float(stack); input = sporth_stack_pop_float(stack); moogladder = pd->last->ud; moogladder->freq = freq; moogladder->res = res; sp_moogladder_compute(pd->sp, moogladder, &input, &out); sporth_stack_push_float(stack, out); break; case PLUMBER_DESTROY: moogladder = pd->last->ud; sp_moogladder_destroy(&moogladder); break; default: fprintf(stderr, "moogladder: Unknown mode!\n"); break; } return PLUMBER_OK; }
void write_clip(sp_data *sp, void *ud) { UserData *udp = ud; SPFLOAT out, osc, filt; if(sp->pos < (44100 * 2)) { sp_osc_compute(sp, udp->osc, NULL, &osc); sp_moogladder_compute(sp, udp->filt, &osc, &filt); sp->out[0] = filt; return; } else if(sp->pos >= (44100 * 2) && sp->pos < (44100 * 3)) { udp->clp->meth = 0; } else if(sp->pos >= (44100 * 3) && sp->pos < (44100 * 4)) { udp->clp->meth = 1; udp->clp->lim = 0.2; } else { udp->clp->meth = 2; udp->clp->lim = 0.03; } sp_osc_compute(sp, udp->osc, NULL, &osc); sp_moogladder_compute(sp, udp->filt, &osc, &filt); sp_clip_compute(sp, udp->clp, &filt, &out); sp->out[0] = out; }
void process(AUAudioFrameCount frameCount, AUAudioFrameCount bufferOffset) override { // For each sample. for (int frameIndex = 0; frameIndex < frameCount; ++frameIndex) { double cutoffFrequency = double(cutoffFrequencyRamper.getStep()); double resonance = double(resonanceRamper.getStep()); int frameOffset = int(frameIndex + bufferOffset); moogladder->freq = (float)cutoffFrequency; moogladder->res = (float)resonance; if (!started) { outBufferListPtr->mBuffers[0] = inBufferListPtr->mBuffers[0]; outBufferListPtr->mBuffers[1] = inBufferListPtr->mBuffers[1]; return; } for (int channel = 0; channel < channels; ++channel) { float *in = (float *)inBufferListPtr->mBuffers[channel].mData + frameOffset; float *out = (float *)outBufferListPtr->mBuffers[channel].mData + frameOffset; sp_moogladder_compute(sp, moogladder, in, out); } } }