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, &amp);
         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, &amp);
                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();
            }
        }
Exemple #4
0
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;
}