Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
pulp::signal::osc::MinBlepAccumulator< MaximumEvents > Class Template Reference

Accumulates causal minBLEP corrections for discontinuities found between adjacent output samples. More...

#include <minblep.hpp>

Public Member Functions

void reset () noexcept
MinBlepInsertResult insert (double position, double height) noexcept
double next () noexcept
std::size_t active_events () const noexcept

Static Public Attributes

static constexpr std::size_t capacity = MaximumEvents
static constexpr std::size_t kernel_samples = detail::kMinBlepKernelSamples
static constexpr std::size_t phases_per_sample = detail::kMinBlepPhasesPerSample

Detailed Description

template<std::size_t MaximumEvents = 8>
class pulp::signal::osc::MinBlepAccumulator< MaximumEvents >

Accumulates causal minBLEP corrections for discontinuities found between adjacent output samples.

insert(position, height) receives a position in [0, 1], measured after the sample most recently returned by next(), and a step height measured as after minus before. The correction is added to the already-stepped trivial waveform beginning with subsequent next() calls. Position 0 means the event occurred immediately after the previous output sample; position 1 means the next output sample lands exactly on the event.

The table follows Brandt's minimum-phase construction: a Blackman-windowed sinc is transformed through its real cepstrum, integrated, normalized, and stored as the residual from an already-applied unit step. The reproducible generator is tools/scripts/generate_minblep_table.py; the primary method reference is https://www.cs.cmu.edu/~eli/papers/icmc01-hardsync.pdf.

Each insertion occupies one of MaximumEvents slots for at most 32 samples. Slots are chosen and summed in ascending index order. If every slot is live, the new event is dropped with capacity_exceeded; existing corrections are unchanged. Per-sample work is therefore fixed at MaximumEvents, with no allocation, locks, I/O, or table initialization on the audio thread.

Member Function Documentation

◆ active_events()

template<std::size_t MaximumEvents = 8>
std::size_t pulp::signal::osc::MinBlepAccumulator< MaximumEvents >::active_events ( ) const
inlinenodiscardnoexcept

◆ insert()

template<std::size_t MaximumEvents = 8>
MinBlepInsertResult pulp::signal::osc::MinBlepAccumulator< MaximumEvents >::insert ( double position,
double height )
inlinenodiscardnoexcept

◆ next()

template<std::size_t MaximumEvents = 8>
double pulp::signal::osc::MinBlepAccumulator< MaximumEvents >::next ( )
inlinenodiscardnoexcept

◆ reset()

template<std::size_t MaximumEvents = 8>
void pulp::signal::osc::MinBlepAccumulator< MaximumEvents >::reset ( )
inlinenoexcept

Member Data Documentation

◆ capacity

template<std::size_t MaximumEvents = 8>
std::size_t pulp::signal::osc::MinBlepAccumulator< MaximumEvents >::capacity = MaximumEvents
staticconstexpr

◆ kernel_samples

template<std::size_t MaximumEvents = 8>
std::size_t pulp::signal::osc::MinBlepAccumulator< MaximumEvents >::kernel_samples = detail::kMinBlepKernelSamples
staticconstexpr

◆ phases_per_sample

template<std::size_t MaximumEvents = 8>
std::size_t pulp::signal::osc::MinBlepAccumulator< MaximumEvents >::phases_per_sample = detail::kMinBlepPhasesPerSample
staticconstexpr

The documentation for this class was generated from the following file:
  • /home/runner/work/pulp/pulp/core/signal/include/pulp/signal/osc/minblep.hpp