void pdsp::ValueSequencer::process (int bufferSize) noexcept { //std::cout<<"valuesequencer slewLastValue = "<<slewLastValue<<"\n"; if(messageBuffer!=nullptr){ //updateBuffer(messageBuffer, bufferSize); if( messageBuffer->empty() ){ //std::cout<<"message queue empty, broadcasting last value\n"; if(slewRun){ float* outputBuffer = getOutputBufferToFill(output); runSlewBlock( outputBuffer, 0, bufferSize); }else{ setControlRateOutput(output, slewLastValue); } } else { float* outputBuffer = getOutputBufferToFill(output); int n=0; int k=0; int imax = messageBuffer->size(); for( int i=0; i<imax; ++i){ ControlMessage &msg = messageBuffer->messages[i]; //std::cout<<"broadcast message value = "<<messageBuffer->messages[i].value<<"\n"; if(slewRun){ runSlewBlock(outputBuffer, n, msg.sample * getOversampleLevel()); }else{ ofx_Aeq_S_range(outputBuffer, slewLastValue, n, msg.sample * getOversampleLevel()); } if( slewControl != nullptr && (k < slewControl->messages.size()) && (slewControl->messages[k].sample <= msg.sample)) { //std::cout<<"got slew message, value "<<slewControl->messages[k].value<<"\n"; slewTimeMod = slewControl->messages[k].value; k++; } valueChange(msg.value); n = msg.sample * getOversampleLevel(); } if(slewRun){ runSlewBlock(outputBuffer, n, bufferSize ); }else{ ofx_Aeq_S_range(outputBuffer, slewLastValue, n, bufferSize); } //std::cout<<"last message value = "<<slewLastValue<<"\n"; } }else{ setControlRateOutput(output, slewLastValue); } if(slewControl != nullptr && !slewControl->empty() ){ //we set the slew control with the last of the buffer slewTimeMod = slewControl->messages[ slewControl->messages.size() - 1 ].value; } }
void pdsp::UsesSlew::runSlewBlock(float* &buffer, const int &start, const int &stopExclusive) noexcept{ int n = start; for( ; n<stopExclusive; ++n){ buffer[n] = slewValueStart + slewAccumulator * slewValueInterval; slewAccumulator = slewOffset + (slewAccumulator * slewCoeff); if(slewAccumulator>=1.0f){ slewAccumulator = 1.0f; slewRun = false; break; } } if( !slewRun && n<stopExclusive){ n++; //as the break stops the increments ofx_Aeq_S_range(buffer, slewValueDest, n, stopExclusive); slewLastValue = slewValueDest; }else if(start!=stopExclusive) { slewLastValue = buffer[stopExclusive-1]; } }