void run(int frameCount, float* outL, float* outR) { float originalFrequency = *blsquare->freq; *blsquare->freq *= kernel->detuningMultiplier; *blsquare->freq += kernel->detuningOffset; *blsquare->freq = clamp(*blsquare->freq, 0.0f, 22050.0f); *blsquare->width = kernel->pulseWidth; adsr->atk = (float)kernel->attackDuration; adsr->dec = (float)kernel->decayDuration; adsr->sus = (float)kernel->sustainLevel; adsr->rel = (float)kernel->releaseDuration; for (int frameIndex = 0; frameIndex < frameCount; ++frameIndex) { float x = 0; sp_adsr_compute(kernel->sp, adsr, &internalGate, &); sp_blsquare_compute(kernel->sp, blsquare, nil, &x); *outL++ += amp * x; *outR++ += amp * x; } *blsquare->freq = originalFrequency; if (stage == stageRelease && amp < 0.00001) { clear(); remove(); } }
void process(AUAudioFrameCount frameCount, AUAudioFrameCount bufferOffset) override { for (int frameIndex = 0; frameIndex < frameCount; ++frameIndex) { int frameOffset = int(frameIndex + bufferOffset); frequency = double(frequencyRamper.getAndStep()); amplitude = double(amplitudeRamper.getAndStep()); pulseWidth = double(pulseWidthRamper.getAndStep()); detuningOffset = double(detuningOffsetRamper.getAndStep()); detuningMultiplier = double(detuningMultiplierRamper.getAndStep()); *blsquare->freq = frequency * detuningMultiplier + detuningOffset; *blsquare->amp = amplitude; *blsquare->width = pulseWidth; float temp = 0; for (int channel = 0; channel < channels; ++channel) { float *out = (float *)outBufferListPtr->mBuffers[channel].mData + frameOffset; if (started) { if (channel == 0) { sp_blsquare_compute(sp, blsquare, nil, &temp); } *out = temp; } else { *out = 0.0; } } } }
void run(int frameCount, float *outL, float *outR) override { auto bankKernel = (AKPWMOscillatorBankDSPKernel*)kernel; float originalFrequency = *blsquare->freq; *blsquare->freq *= powf(2, kernel->pitchBend / 12.0); *blsquare->freq = clamp(*blsquare->freq, 0.0f, 22050.0f); float bentFrequency = *blsquare->freq; *blsquare->width = bankKernel->pulseWidth; adsr->atk = (float)kernel->attackDuration; adsr->dec = (float)kernel->decayDuration; adsr->sus = (float)kernel->sustainLevel; adsr->rel = (float)kernel->releaseDuration; for (int frameIndex = 0; frameIndex < frameCount; ++frameIndex) { float x = 0; float depth = kernel->vibratoDepth / 12.0; float variation = sinf((kernel->currentRunningIndex + frameIndex) * 2 * 2 * M_PI * kernel->vibratoRate / kernel->getSampleRate()); *blsquare->freq = bentFrequency * powf(2, depth * variation); sp_adsr_compute(kernel->getSpData(), adsr, &internalGate, &); sp_blsquare_compute(kernel->getSpData(), blsquare, nil, &x); *outL++ += amp * x; *outR++ += amp * x; } *blsquare->freq = originalFrequency; if (stage == stageRelease && amp < 0.00001) { clear(); remove(); } }
int sporth_blsquare(sporth_stack *stack, void *ud) { plumber_data *pd = ud; SPFLOAT out; SPFLOAT freq; SPFLOAT amp; SPFLOAT width; sp_blsquare *blsquare; switch(pd->mode) { case PLUMBER_CREATE: #ifdef DEBUG_MODE fprintf(stderr, "blsquare: Creating\n"); #endif sp_blsquare_create(&blsquare); plumber_add_ugen(pd, SPORTH_SQUARE, blsquare); if(sporth_check_args(stack, "fff") != SPORTH_OK) { fprintf(stderr,"Not enough arguments for blsquare\n"); stack->error++; return PLUMBER_NOTOK; } width = sporth_stack_pop_float(stack); amp = sporth_stack_pop_float(stack); freq = sporth_stack_pop_float(stack); sporth_stack_push_float(stack, 0); break; case PLUMBER_INIT: #ifdef DEBUG_MODE fprintf(stderr, "blsquare: Initialising\n"); #endif width = sporth_stack_pop_float(stack); amp = sporth_stack_pop_float(stack); freq = sporth_stack_pop_float(stack); blsquare = pd->last->ud; sp_blsquare_init(pd->sp, blsquare); sporth_stack_push_float(stack, 0); break; case PLUMBER_COMPUTE: if(sporth_check_args(stack, "fff") != SPORTH_OK) { fprintf(stderr,"Not enough arguments for blsquare\n"); stack->error++; return PLUMBER_NOTOK; } width = sporth_stack_pop_float(stack); amp = sporth_stack_pop_float(stack); freq = sporth_stack_pop_float(stack); blsquare = pd->last->ud; *blsquare->freq = freq; *blsquare->amp = amp; *blsquare->width = width; sp_blsquare_compute(pd->sp, blsquare, NULL, &out); sporth_stack_push_float(stack, out); break; case PLUMBER_DESTROY: blsquare = pd->last->ud; sp_blsquare_destroy(&blsquare); break; default: fprintf(stderr, "blsquare: Uknown mode!\n"); break; } return PLUMBER_OK; }