Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
pulp::timebase Namespace Reference

Namespaces

namespace  detail

Classes

struct  BeatFraction
struct  MeterSignature
struct  MeterPoint
struct  BarPosition
struct  BarTickPosition
class  MeterMap
class  CompiledMeterMap
struct  TempoPoint
class  TempoMap
struct  SampleToTickResult
class  CompiledTempoMap
class  TempoCursor
class  TempoTickCursor
struct  RandomCoordinate
struct  HostGridAnchor
struct  GridProjectionRange
struct  GridProjectionRequest
struct  GridProjectionPoint
struct  GridProjectionResult
struct  GrooveKernelStep
struct  GrooveKernelInput
class  OrderPreservingGrooveKernel
struct  InlineGrooveInput
class  InlineGrooveProjector
struct  LoopRegion
 The loop bounds a transport honours, in document ticks. More...
struct  SwingRatio
struct  RatchetProjectionResult
struct  SamplePosition
struct  RationalRate
struct  TickDuration
struct  TickPosition
struct  MonotonicBeat
struct  TriggerProbability
 An exact probability ratio for an authored trigger. More...
struct  TriggerCell
 The authored data at one track and step coordinate. More...
struct  TriggerEvent
struct  TriggerProjectionResult
class  TriggerGrid
 Fixed-capacity authored trigger data with allocation-free tick projection. More...

Enumerations

enum class  BeatDivision : std::uint8_t {
  Whole = 0 , WholeDotted = 1 , WholeTriplet = 2 , Half = 3 ,
  HalfDotted = 4 , HalfTriplet = 5 , Quarter = 6 , QuarterDotted = 7 ,
  QuarterTriplet = 8 , Eighth = 9 , EighthDotted = 10 , EighthTriplet = 11 ,
  Sixteenth = 12 , SixteenthDotted = 13 , SixteenthTriplet = 14 , ThirtySecond = 15 ,
  ThirtySecondDotted = 16 , ThirtySecondTriplet = 17 , SixtyFourth = 18 , SixtyFourthDotted = 19 ,
  SixtyFourthTriplet = 20 , Count = 21
}
enum class  BeatDivisionError { InvalidDivision , NotExactlyRepresentable , RangeExceeded }
enum class  MeterMapError {
  Empty , MissingTickZero , InvalidSignature , UnorderedPoints ,
  ChangeNotOnBarBoundary , RangeExceeded
}
enum class  TempoCurve { Constant , LinearInTicks }
enum class  TempoMapError {
  Empty , MissingTickZero , InvalidBpm , InvalidCurve ,
  InvalidFinalCurve , UnorderedPoints , InvalidSampleRate , SampleRangeExceeded
}
enum class  ProbabilityError { InvalidRatio }
enum class  GridAnchor { Timeline , Bar }
enum class  GridPlacement { Floor , Nearest }
enum class  GridProjectionError {
  None , InvalidDivision , InvalidAnchor , InvalidRange ,
  SampleRangeExceeded , TickRangeExceeded , ProjectionLimitExceeded , OutputTooSmall
}
enum class  GrooveKernelError {
  None , InvalidSwingGrid , InvalidSwing , InvalidTable ,
  TooManySteps , InvalidStrength , InvalidVelocityScale , ReordersEvents ,
  ValidationLimitExceeded , RangeExceeded
}
enum class  InlineGrooveError {
  None , InvalidSwingGrid , InvalidSwing , InvalidTable ,
  TooManySteps , InvalidStrength , InvalidVelocityScale , RangeExceeded
}
enum class  RatchetError {
  None , InvalidInterval , InvalidHitCount , CapacityExceeded ,
  InsufficientResolution , InvalidWindow , OutputTooSmall
}
enum class  TriggerGridError {
  None , NotConfigured , InvalidDimensions , CapacityExceeded ,
  InvalidStepDuration , PatternSpanOutOfRange , IndexOutOfRange , InvalidVelocity ,
  InvalidProbability , InvalidMicrotiming , InvalidWindow , DrawCountMismatch ,
  OutputTooSmall
}

Functions

constexpr BeatFraction beat_fraction_or (BeatDivision division, BeatFraction fallback) noexcept
 Returns the exact fraction for division, or fallback for an invalid ordinal.
runtime::Result< BeatFraction, BeatDivisionError > beat_fraction (BeatDivision division) noexcept
runtime::Result< TickDuration, BeatDivisionError > division_ticks (BeatDivision division) noexcept
constexpr std::uint64_t coordinate_random (std::uint64_t seed, RandomCoordinate coordinate) noexcept
runtime::Result< bool, ProbabilityError > coordinate_chance (std::uint64_t seed, RandomCoordinate coordinate, std::uint64_t numerator, std::uint64_t denominator) noexcept
GridProjectionResult project_grid (const CompiledTempoMap &tempo, const CompiledMeterMap &meter, const GridProjectionRequest &request, std::span< const GridProjectionRange > ranges, std::span< GridProjectionPoint > output) noexcept
template<typename Groove>
std::int64_t groove_timing_reach (const Groove &groove) noexcept
bool valid_sample_rate (double sample_rate) noexcept
bool valid_tempo (double tempo_bpm) noexcept
bool valid_grid (double grid_beats) noexcept
double beats_per_bar (int numerator, int denominator) noexcept
double frames_to_beats (double frames, double sample_rate, double tempo_bpm) noexcept
double beats_to_frames (double beats, double sample_rate, double tempo_bpm) noexcept
double next_grid_boundary (double position_beats, double grid_beats) noexcept
constexpr bool valid_swing_grid (TickDuration grid) noexcept
constexpr bool valid_swing_ratio (SwingRatio ratio) noexcept
TickDuration swing_displacement (TickPosition position, TickDuration grid, SwingRatio ratio) noexcept
TickPosition swing_position (TickPosition position, TickDuration grid, SwingRatio ratio) noexcept
TickPosition unswing_position (TickPosition position, TickDuration grid, SwingRatio ratio) noexcept
template<std::size_t MaximumHits = 64>
constexpr RatchetProjectionResult project_ratchet_interval (TickPosition interval_begin, TickPosition interval_end, std::size_t hit_count, TickPosition window_begin, TickPosition window_end, std::span< TickPosition > output) noexcept
 Projects a bounded ratchet burst into an exact clock interval.
constexpr TickPosition operator+ (TickPosition position, TickDuration duration) noexcept
constexpr TickPosition operator- (TickPosition position, TickDuration duration) noexcept
constexpr TickDuration operator- (TickPosition lhs, TickPosition rhs) noexcept
constexpr MonotonicBeat operator+ (MonotonicBeat beat, TickDuration duration) noexcept
constexpr MonotonicBeat operator- (MonotonicBeat beat, TickDuration duration) noexcept
constexpr TickDuration operator- (MonotonicBeat lhs, MonotonicBeat rhs) noexcept

Variables

constexpr double kMinimumCompiledTempoBpm = 1.0
constexpr double kMaximumCompiledTempoBpm = 1'000.0
constexpr std::uint32_t kMaximumCompiledSampleRate = 768'000
constexpr std::size_t kMaximumGridProjectionPoints = 65'536
constexpr std::int32_t kGrooveKernelUnitScale = 1'000
constexpr std::int32_t kMaximumGrooveKernelVelocityScale = 4'000
constexpr std::size_t kMaximumGrooveKernelSteps = 1'024
constexpr std::size_t kMaximumGrooveValidationBoundaries = 65'536
constexpr std::size_t kMaximumInlineGrooveSteps = 16
constexpr double kBoundaryEpsilonBeats = 1.0e-9
constexpr SwingRatio kStraightSwing {1, 2}
constexpr SwingRatio kTripletSwing {2, 3}
constexpr std::int64_t kMaxSwingGridTicks = 1'000'000'000
constexpr std::int64_t kMaxSwingDenominator = 1'000'000
constexpr std::int64_t kTicksPerQuarter = 705'600

Enumeration Type Documentation

◆ BeatDivision

enum class pulp::timebase::BeatDivision : std::uint8_t
strong
Enumerator
Whole 
WholeDotted 
WholeTriplet 
Half 
HalfDotted 
HalfTriplet 
Quarter 
QuarterDotted 
QuarterTriplet 
Eighth 
EighthDotted 
EighthTriplet 
Sixteenth 
SixteenthDotted 
SixteenthTriplet 
ThirtySecond 
ThirtySecondDotted 
ThirtySecondTriplet 
SixtyFourth 
SixtyFourthDotted 
SixtyFourthTriplet 
Count 

◆ BeatDivisionError

Enumerator
InvalidDivision 
NotExactlyRepresentable 
RangeExceeded 

◆ GridAnchor

enum class pulp::timebase::GridAnchor
strong
Enumerator
Timeline 
Bar 

◆ GridPlacement

enum class pulp::timebase::GridPlacement
strong
Enumerator
Floor 
Nearest 

◆ GridProjectionError

Enumerator
None 
InvalidDivision 
InvalidAnchor 
InvalidRange 
SampleRangeExceeded 
TickRangeExceeded 
ProjectionLimitExceeded 
OutputTooSmall 

◆ GrooveKernelError

Enumerator
None 
InvalidSwingGrid 
InvalidSwing 
InvalidTable 
TooManySteps 
InvalidStrength 
InvalidVelocityScale 
ReordersEvents 
ValidationLimitExceeded 
RangeExceeded 

◆ InlineGrooveError

Enumerator
None 
InvalidSwingGrid 
InvalidSwing 
InvalidTable 
TooManySteps 
InvalidStrength 
InvalidVelocityScale 
RangeExceeded 

◆ MeterMapError

enum class pulp::timebase::MeterMapError
strong
Enumerator
Empty 
MissingTickZero 
InvalidSignature 
UnorderedPoints 
ChangeNotOnBarBoundary 
RangeExceeded 

◆ ProbabilityError

Enumerator
InvalidRatio 

◆ RatchetError

enum class pulp::timebase::RatchetError
strong
Enumerator
None 
InvalidInterval 
InvalidHitCount 
CapacityExceeded 
InsufficientResolution 
InvalidWindow 
OutputTooSmall 

◆ TempoCurve

enum class pulp::timebase::TempoCurve
strong
Enumerator
Constant 
LinearInTicks 

◆ TempoMapError

enum class pulp::timebase::TempoMapError
strong
Enumerator
Empty 
MissingTickZero 
InvalidBpm 
InvalidCurve 
InvalidFinalCurve 
UnorderedPoints 
InvalidSampleRate 
SampleRangeExceeded 

◆ TriggerGridError

Enumerator
None 
NotConfigured 
InvalidDimensions 
CapacityExceeded 
InvalidStepDuration 
PatternSpanOutOfRange 
IndexOutOfRange 
InvalidVelocity 
InvalidProbability 
InvalidMicrotiming 
InvalidWindow 
DrawCountMismatch 
OutputTooSmall 

Function Documentation

◆ beat_fraction()

runtime::Result< BeatFraction, BeatDivisionError > pulp::timebase::beat_fraction ( BeatDivision division)
inlinenoexcept

◆ beat_fraction_or()

BeatFraction pulp::timebase::beat_fraction_or ( BeatDivision division,
BeatFraction fallback )
constexprnoexcept

Returns the exact fraction for division, or fallback for an invalid ordinal.

This total constexpr form lets compatibility vocabularies derive their values from the canonical table without duplicating its arithmetic.

◆ beats_per_bar()

double pulp::timebase::beats_per_bar ( int numerator,
int denominator )
inlinenoexcept

◆ beats_to_frames()

double pulp::timebase::beats_to_frames ( double beats,
double sample_rate,
double tempo_bpm )
inlinenoexcept

◆ coordinate_chance()

runtime::Result< bool, ProbabilityError > pulp::timebase::coordinate_chance ( std::uint64_t seed,
RandomCoordinate coordinate,
std::uint64_t numerator,
std::uint64_t denominator )
inlinenoexcept

◆ coordinate_random()

std::uint64_t pulp::timebase::coordinate_random ( std::uint64_t seed,
RandomCoordinate coordinate )
constexprnoexcept

◆ division_ticks()

runtime::Result< TickDuration, BeatDivisionError > pulp::timebase::division_ticks ( BeatDivision division)
inlinenoexcept

◆ frames_to_beats()

double pulp::timebase::frames_to_beats ( double frames,
double sample_rate,
double tempo_bpm )
inlinenoexcept

◆ groove_timing_reach()

template<typename Groove>
std::int64_t pulp::timebase::groove_timing_reach ( const Groove & groove)
noexcept

◆ next_grid_boundary()

double pulp::timebase::next_grid_boundary ( double position_beats,
double grid_beats )
inlinenoexcept

◆ operator+() [1/2]

MonotonicBeat pulp::timebase::operator+ ( MonotonicBeat beat,
TickDuration duration )
constexprnoexcept

◆ operator+() [2/2]

TickPosition pulp::timebase::operator+ ( TickPosition position,
TickDuration duration )
constexprnoexcept

◆ operator-() [1/4]

MonotonicBeat pulp::timebase::operator- ( MonotonicBeat beat,
TickDuration duration )
constexprnoexcept

◆ operator-() [2/4]

TickDuration pulp::timebase::operator- ( MonotonicBeat lhs,
MonotonicBeat rhs )
constexprnoexcept

◆ operator-() [3/4]

TickDuration pulp::timebase::operator- ( TickPosition lhs,
TickPosition rhs )
constexprnoexcept

◆ operator-() [4/4]

TickPosition pulp::timebase::operator- ( TickPosition position,
TickDuration duration )
constexprnoexcept

◆ project_grid()

GridProjectionResult pulp::timebase::project_grid ( const CompiledTempoMap & tempo,
const CompiledMeterMap & meter,
const GridProjectionRequest & request,
std::span< const GridProjectionRange > ranges,
std::span< GridProjectionPoint > output )
inlinenoexcept

◆ project_ratchet_interval()

template<std::size_t MaximumHits = 64>
RatchetProjectionResult pulp::timebase::project_ratchet_interval ( TickPosition interval_begin,
TickPosition interval_end,
std::size_t hit_count,
TickPosition window_begin,
TickPosition window_end,
std::span< TickPosition > output )
nodiscardconstexprnoexcept

Projects a bounded ratchet burst into an exact clock interval.

hit_count includes the onset at interval_begin; interval_end belongs to the adjacent clock interval and is never emitted. Integer remainders are distributed across the interval without accumulating a floating-point phase. The same interval and half-open windows therefore produce the same events regardless of callback partition. The operation is allocation-free, bounded by MaximumHits, and leaves output unchanged on every error.

◆ swing_displacement()

TickDuration pulp::timebase::swing_displacement ( TickPosition position,
TickDuration grid,
SwingRatio ratio )
inlinenoexcept

◆ swing_position()

TickPosition pulp::timebase::swing_position ( TickPosition position,
TickDuration grid,
SwingRatio ratio )
inlinenoexcept

◆ unswing_position()

TickPosition pulp::timebase::unswing_position ( TickPosition position,
TickDuration grid,
SwingRatio ratio )
inlinenoexcept

◆ valid_grid()

bool pulp::timebase::valid_grid ( double grid_beats)
inlinenoexcept

◆ valid_sample_rate()

bool pulp::timebase::valid_sample_rate ( double sample_rate)
inlinenoexcept

◆ valid_swing_grid()

bool pulp::timebase::valid_swing_grid ( TickDuration grid)
inlineconstexprnoexcept

◆ valid_swing_ratio()

bool pulp::timebase::valid_swing_ratio ( SwingRatio ratio)
inlineconstexprnoexcept

◆ valid_tempo()

bool pulp::timebase::valid_tempo ( double tempo_bpm)
inlinenoexcept

Variable Documentation

◆ kBoundaryEpsilonBeats

double pulp::timebase::kBoundaryEpsilonBeats = 1.0e-9
inlineconstexpr

◆ kGrooveKernelUnitScale

std::int32_t pulp::timebase::kGrooveKernelUnitScale = 1'000
inlineconstexpr

◆ kMaximumCompiledSampleRate

std::uint32_t pulp::timebase::kMaximumCompiledSampleRate = 768'000
inlineconstexpr

◆ kMaximumCompiledTempoBpm

double pulp::timebase::kMaximumCompiledTempoBpm = 1'000.0
inlineconstexpr

◆ kMaximumGridProjectionPoints

std::size_t pulp::timebase::kMaximumGridProjectionPoints = 65'536
inlineconstexpr

◆ kMaximumGrooveKernelSteps

std::size_t pulp::timebase::kMaximumGrooveKernelSteps = 1'024
inlineconstexpr

◆ kMaximumGrooveKernelVelocityScale

std::int32_t pulp::timebase::kMaximumGrooveKernelVelocityScale = 4'000
inlineconstexpr

◆ kMaximumGrooveValidationBoundaries

std::size_t pulp::timebase::kMaximumGrooveValidationBoundaries = 65'536
inlineconstexpr

◆ kMaximumInlineGrooveSteps

std::size_t pulp::timebase::kMaximumInlineGrooveSteps = 16
inlineconstexpr

◆ kMaxSwingDenominator

std::int64_t pulp::timebase::kMaxSwingDenominator = 1'000'000
inlineconstexpr

◆ kMaxSwingGridTicks

std::int64_t pulp::timebase::kMaxSwingGridTicks = 1'000'000'000
inlineconstexpr

◆ kMinimumCompiledTempoBpm

double pulp::timebase::kMinimumCompiledTempoBpm = 1.0
inlineconstexpr

◆ kStraightSwing

SwingRatio pulp::timebase::kStraightSwing {1, 2}
inlineconstexpr

◆ kTicksPerQuarter

std::int64_t pulp::timebase::kTicksPerQuarter = 705'600
inlineconstexpr

◆ kTripletSwing

SwingRatio pulp::timebase::kTripletSwing {2, 3}
inlineconstexpr