Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
compiled_meter_map.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <compare>
7#include <cstddef>
8#include <cstdint>
9#include <span>
10#include <vector>
11
12namespace pulp::timebase {
13
15 std::int32_t numerator = 4;
16 std::int32_t denominator = 4;
17 constexpr auto operator<=>(const MeterSignature&) const = default;
18};
19
20struct MeterPoint {
23 constexpr auto operator<=>(const MeterPoint&) const = default;
24};
25
27 std::int64_t value = 0;
28 constexpr auto operator<=>(const BarPosition&) const = default;
29};
30
34 constexpr auto operator<=>(const BarTickPosition&) const = default;
35};
36
45
46class MeterMap {
47 public:
48 MeterMap() : points_{{{0}, {4, 4}}} {}
49
50 static runtime::Result<MeterMap, MeterMapError>
51 create(std::span<const MeterPoint> points) noexcept;
53 replacing_points(std::span<const MeterPoint> points) const noexcept {
54 return create(points);
55 }
56 std::span<const MeterPoint> points() const noexcept { return points_; }
57 auto operator<=>(const MeterMap&) const = default;
58
59 private:
60 explicit MeterMap(std::vector<MeterPoint> points) : points_(std::move(points)) {}
61 std::vector<MeterPoint> points_;
62};
63
64class CompiledMeterMap {
65 public:
67 compile(const MeterMap& map) noexcept;
69 compile(std::span<const MeterPoint> points) noexcept;
70
71 // Total over the signed 64-bit domain. Representable conversions are exact;
72 // results outside TickPosition/BarPosition clamp to the nearest endpoint.
74 TickPosition bar_to_tick(BarPosition bar, TickDuration tick_in_bar = {}) const noexcept;
76 std::size_t segment_count() const noexcept { return segments_.size(); }
77
78 private:
79 struct Segment {
80 TickPosition start_tick{};
81 BarPosition start_bar{};
82 std::int64_t ticks_per_bar = 0;
83 MeterSignature signature{};
84 };
85
86 explicit CompiledMeterMap(std::vector<Segment> segments) : segments_(std::move(segments)) {}
87 std::vector<Segment> segments_;
88};
89
90} // namespace pulp::timebase
Result<T, E> — either holds a T or an E, never both.
Definition result.hpp:76
std::size_t segment_count() const noexcept
Definition compiled_meter_map.hpp:76
static runtime::Result< CompiledMeterMap, MeterMapError > compile(std::span< const MeterPoint > points) noexcept
MeterSignature meter_at_tick(TickPosition tick) const noexcept
TickPosition bar_to_tick(BarPosition bar, TickDuration tick_in_bar={}) const noexcept
BarTickPosition tick_to_bar(TickPosition tick) const noexcept
static runtime::Result< CompiledMeterMap, MeterMapError > compile(const MeterMap &map) noexcept
Definition compiled_meter_map.hpp:46
runtime::Result< MeterMap, MeterMapError > replacing_points(std::span< const MeterPoint > points) const noexcept
Definition compiled_meter_map.hpp:53
auto operator<=>(const MeterMap &) const =default
std::span< const MeterPoint > points() const noexcept
Definition compiled_meter_map.hpp:56
MeterMap()
Definition compiled_meter_map.hpp:48
static runtime::Result< MeterMap, MeterMapError > create(std::span< const MeterPoint > points) noexcept
Definition beat_division.hpp:11
@ RangeExceeded
Definition beat_division.hpp:49
MeterMapError
Definition compiled_meter_map.hpp:37
@ InvalidSignature
Definition compiled_meter_map.hpp:40
@ ChangeNotOnBarBoundary
Definition compiled_meter_map.hpp:42
@ UnorderedPoints
Definition compiled_meter_map.hpp:41
@ Empty
Definition compiled_meter_map.hpp:38
@ MissingTickZero
Definition compiled_meter_map.hpp:39
@ move
Definition web_event_translate.hpp:110
STL namespace.
Result<T, E> — success / failure union for fallible operations.
Definition compiled_meter_map.hpp:26
std::int64_t value
Definition compiled_meter_map.hpp:27
constexpr auto operator<=>(const BarPosition &) const =default
Definition compiled_meter_map.hpp:31
TickDuration tick_in_bar
Definition compiled_meter_map.hpp:33
constexpr auto operator<=>(const BarTickPosition &) const =default
BarPosition bar
Definition compiled_meter_map.hpp:32
Definition compiled_meter_map.hpp:20
MeterSignature signature
Definition compiled_meter_map.hpp:22
constexpr auto operator<=>(const MeterPoint &) const =default
TickPosition tick
Definition compiled_meter_map.hpp:21
Definition compiled_meter_map.hpp:14
std::int32_t denominator
Definition compiled_meter_map.hpp:16
std::int32_t numerator
Definition compiled_meter_map.hpp:15
constexpr auto operator<=>(const MeterSignature &) const =default
Definition tick.hpp:56
Definition tick.hpp:61