Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns > Class Template Reference

Fixed-capacity, sample-accurate MIDI arpeggiator. More...

#include <arpeggiator.hpp>

Public Member Functions

constexpr Arpeggiator (ArpeggiatorSpec spec={}) noexcept
constexpr bool valid () const noexcept
constexpr const ArpeggiatorSpec & spec () const noexcept
std::size_t held_note_count () const noexcept
std::size_t physical_note_count () const noexcept
std::size_t sounding_note_count () const noexcept
MidiUtilityProcessReport process (const MidiBuffer &input, MidiBuffer &output, const ArpeggiatorBlock &block) noexcept
MidiUtilityProcessReport flush_transport (MidiBuffer &output) noexcept
 Release generated notes and reset their clock while preserving the held input ledger.
MidiUtilityProcessReport reset (MidiBuffer &output) noexcept
 Release generated notes and discard every held/latch ownership.
MidiUtilityProcessReport replace_spec (const ArpeggiatorSpec &spec, MidiBuffer &output) noexcept
 Flush old generated notes before adopting a new policy.

Static Public Member Functions

static constexpr ArpeggiatorCapacityContract contract () noexcept
static constexpr bool valid_spec (const ArpeggiatorSpec &spec) noexcept

Static Public Attributes

static constexpr std::size_t kMaximumPatternNotes = MaximumHeldNotes * MaximumOctaves

Detailed Description

template<std::size_t MaximumHeldNotes = 32, std::size_t MaximumOctaves = 4, std::size_t MaximumStepsPerBlock = 64, std::size_t MaximumOwnershipRuns = 256>
class pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns >

Fixed-capacity, sample-accurate MIDI arpeggiator.

Short-message note input is consumed; non-note short messages, SysEx, and attached UMP packets pass through unchanged. Every accepted attack owns exactly one later release, including repeated attacks of the same key. An attack that cannot enter the fixed ledger is suppressed, and its matching release is consumed before an older accepted ownership can be retired. Generated note releases are retained as debt when the caller's reserved output capacity is exhausted.

Constructor & Destructor Documentation

◆ Arpeggiator()

template<std::size_t MaximumHeldNotes = 32, std::size_t MaximumOctaves = 4, std::size_t MaximumStepsPerBlock = 64, std::size_t MaximumOwnershipRuns = 256>
pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns >::Arpeggiator ( ArpeggiatorSpec spec = {})
inlineexplicitconstexprnoexcept

Member Function Documentation

◆ contract()

template<std::size_t MaximumHeldNotes = 32, std::size_t MaximumOctaves = 4, std::size_t MaximumStepsPerBlock = 64, std::size_t MaximumOwnershipRuns = 256>
constexpr ArpeggiatorCapacityContract pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns >::contract ( )
inlinestaticconstexprnoexcept

◆ flush_transport()

template<std::size_t MaximumHeldNotes = 32, std::size_t MaximumOctaves = 4, std::size_t MaximumStepsPerBlock = 64, std::size_t MaximumOwnershipRuns = 256>
MidiUtilityProcessReport pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns >::flush_transport ( MidiBuffer & output)
inlinenoexcept

Release generated notes and reset their clock while preserving the held input ledger.

Use this for a transport stop, seek, or loop boundary when the caller handles transitions outside process().

◆ held_note_count()

template<std::size_t MaximumHeldNotes = 32, std::size_t MaximumOctaves = 4, std::size_t MaximumStepsPerBlock = 64, std::size_t MaximumOwnershipRuns = 256>
std::size_t pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns >::held_note_count ( ) const
inlinenoexcept

◆ physical_note_count()

template<std::size_t MaximumHeldNotes = 32, std::size_t MaximumOctaves = 4, std::size_t MaximumStepsPerBlock = 64, std::size_t MaximumOwnershipRuns = 256>
std::size_t pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns >::physical_note_count ( ) const
inlinenoexcept

◆ process()

template<std::size_t MaximumHeldNotes = 32, std::size_t MaximumOctaves = 4, std::size_t MaximumStepsPerBlock = 64, std::size_t MaximumOwnershipRuns = 256>
MidiUtilityProcessReport pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns >::process ( const MidiBuffer & input,
MidiBuffer & output,
const ArpeggiatorBlock & block )
inlinenoexcept

◆ replace_spec()

template<std::size_t MaximumHeldNotes = 32, std::size_t MaximumOctaves = 4, std::size_t MaximumStepsPerBlock = 64, std::size_t MaximumOwnershipRuns = 256>
MidiUtilityProcessReport pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns >::replace_spec ( const ArpeggiatorSpec & spec,
MidiBuffer & output )
inlinenoexcept

Flush old generated notes before adopting a new policy.

Held physical notes survive the swap so the next grid boundary can use the new spec; latch-only notes are discarded when latch is disabled.

◆ reset()

template<std::size_t MaximumHeldNotes = 32, std::size_t MaximumOctaves = 4, std::size_t MaximumStepsPerBlock = 64, std::size_t MaximumOwnershipRuns = 256>
MidiUtilityProcessReport pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns >::reset ( MidiBuffer & output)
inlinenoexcept

Release generated notes and discard every held/latch ownership.

◆ sounding_note_count()

template<std::size_t MaximumHeldNotes = 32, std::size_t MaximumOctaves = 4, std::size_t MaximumStepsPerBlock = 64, std::size_t MaximumOwnershipRuns = 256>
std::size_t pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns >::sounding_note_count ( ) const
inlinenoexcept

◆ spec()

template<std::size_t MaximumHeldNotes = 32, std::size_t MaximumOctaves = 4, std::size_t MaximumStepsPerBlock = 64, std::size_t MaximumOwnershipRuns = 256>
const ArpeggiatorSpec & pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns >::spec ( ) const
inlineconstexprnoexcept

◆ valid()

template<std::size_t MaximumHeldNotes = 32, std::size_t MaximumOctaves = 4, std::size_t MaximumStepsPerBlock = 64, std::size_t MaximumOwnershipRuns = 256>
bool pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns >::valid ( ) const
inlineconstexprnoexcept

◆ valid_spec()

template<std::size_t MaximumHeldNotes = 32, std::size_t MaximumOctaves = 4, std::size_t MaximumStepsPerBlock = 64, std::size_t MaximumOwnershipRuns = 256>
constexpr bool pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns >::valid_spec ( const ArpeggiatorSpec & spec)
inlinestaticconstexprnoexcept

Member Data Documentation

◆ kMaximumPatternNotes

template<std::size_t MaximumHeldNotes = 32, std::size_t MaximumOctaves = 4, std::size_t MaximumStepsPerBlock = 64, std::size_t MaximumOwnershipRuns = 256>
std::size_t pulp::midi::Arpeggiator< MaximumHeldNotes, MaximumOctaves, MaximumStepsPerBlock, MaximumOwnershipRuns >::kMaximumPatternNotes = MaximumHeldNotes * MaximumOctaves
staticconstexpr

The documentation for this class was generated from the following file: