Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
sample_zone_map.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <span>
6#include <vector>
7
12
13namespace pulp::audio {
14
15inline constexpr std::uint32_t kNoSampleSliceIndex =
16 static_cast<std::uint32_t>(-1);
17
18struct SampleZone {
19 std::uint32_t sample_id = kInvalidSampleId;
21
22 int root_note = 60;
23 int lowest_note = 0;
24 int highest_note = 127;
27
28 // 100 cents per key gives chromatic playback from root_note.
29 // 0 cents per key gives fixed-pitch trigger behavior.
30 double keytrack_cents_per_key = 100.0;
31 double tune_semitones = 0.0;
32
33 // Higher priority wins. Equal-priority non-round-robin matches keep first
34 // configured order; equal-priority round_robin_group matches rotate by the
35 // request's round_robin_step.
36 std::uint32_t priority = 0;
37 std::uint32_t round_robin_group = 0;
38 std::uint32_t voice_group = 0;
39 std::uint32_t choke_group = 0;
40
43
44 bool has_loop = false;
46};
47
49 int note = 60;
50 int velocity = 100;
51 std::uint32_t round_robin_step = 0;
52 // 0.0 performs selection/pitch-only queries; playback_rate will be 0.0.
53 double host_sample_rate = 0.0;
54};
55
57 bool valid = false;
58 std::uint32_t zone_index = 0;
60 double semitone_offset = 0.0;
61 double pitch_ratio = 0.0;
62 double playback_rate = 0.0;
63};
64
66public:
67 SampleZoneMap() = default;
68
69 static bool zone_valid(const SampleZone& zone) noexcept;
70 static bool request_valid(const ZoneSelectionRequest& request) noexcept;
71
72 // Control/background-thread only. Copies and may allocate. Do not mutate a
73 // map while an audio callback is selecting from it; publish whole-map
74 // snapshots when sharing with RT readers.
75 bool configure(std::span<const SampleZone> zones);
76 void clear() noexcept;
77
78 std::span<const SampleZone> zones() const noexcept { return zones_; }
79 bool empty() const noexcept { return zones_.empty(); }
80 std::size_t size() const noexcept { return zones_.size(); }
81
82private:
83 std::vector<SampleZone> zones_;
84};
85
87public:
88 static bool matches(const SampleZone& zone,
89 const ZoneSelectionRequest& request) noexcept;
90
91 static double semitone_offset_for_zone(const SampleZone& zone,
92 int note) noexcept;
93 static double pitch_ratio_for_zone(const SampleZone& zone,
94 int note) noexcept;
95 static double playback_rate_for_zone(const SampleZone& zone,
96 int note,
97 double host_sample_rate) noexcept;
98
99 // RT-safe when the map is immutable for the duration of the call.
101 const ZoneSelectionRequest& request) noexcept;
102};
103
104} // namespace pulp::audio
Definition sample_zone_map.hpp:65
std::span< const SampleZone > zones() const noexcept
Definition sample_zone_map.hpp:78
static bool zone_valid(const SampleZone &zone) noexcept
std::size_t size() const noexcept
Definition sample_zone_map.hpp:80
bool empty() const noexcept
Definition sample_zone_map.hpp:79
static bool request_valid(const ZoneSelectionRequest &request) noexcept
bool configure(std::span< const SampleZone > zones)
Definition sample_zone_map.hpp:86
static double semitone_offset_for_zone(const SampleZone &zone, int note) noexcept
static ZoneSelection select(const SampleZoneMap &map, const ZoneSelectionRequest &request) noexcept
static bool matches(const SampleZone &zone, const ZoneSelectionRequest &request) noexcept
static double pitch_ratio_for_zone(const SampleZone &zone, int note) noexcept
static double playback_rate_for_zone(const SampleZone &zone, int note, double host_sample_rate) noexcept
Definition analyzer_provider.hpp:12
constexpr std::uint32_t kInvalidSampleId
Definition sample_identity.hpp:8
constexpr std::uint32_t kNoSampleSliceIndex
Definition sample_zone_map.hpp:15
STL namespace.
Definition loop_types.hpp:42
Definition sample_slot_bank.hpp:22
Definition sample_zone_map.hpp:18
std::uint32_t choke_group
Definition sample_zone_map.hpp:39
std::uint32_t voice_group
Definition sample_zone_map.hpp:38
std::uint32_t slice_index
Definition sample_zone_map.hpp:41
std::uint32_t sample_id
Definition sample_zone_map.hpp:19
double keytrack_cents_per_key
Definition sample_zone_map.hpp:30
bool has_loop
Definition sample_zone_map.hpp:44
std::uint32_t round_robin_group
Definition sample_zone_map.hpp:37
LoopRegion loop
Definition sample_zone_map.hpp:45
int lowest_velocity
Definition sample_zone_map.hpp:25
std::uint32_t priority
Definition sample_zone_map.hpp:36
int lowest_note
Definition sample_zone_map.hpp:23
int highest_note
Definition sample_zone_map.hpp:24
int root_note
Definition sample_zone_map.hpp:22
SliceRegion slice_region
Definition sample_zone_map.hpp:42
PublishedSampleView sample
Definition sample_zone_map.hpp:20
double tune_semitones
Definition sample_zone_map.hpp:31
int highest_velocity
Definition sample_zone_map.hpp:26
Definition slice_map.hpp:24
Definition sample_zone_map.hpp:48
std::uint32_t round_robin_step
Definition sample_zone_map.hpp:51
double host_sample_rate
Definition sample_zone_map.hpp:53
int velocity
Definition sample_zone_map.hpp:50
int note
Definition sample_zone_map.hpp:49
Definition sample_zone_map.hpp:56
double pitch_ratio
Definition sample_zone_map.hpp:61
double semitone_offset
Definition sample_zone_map.hpp:60
bool valid
Definition sample_zone_map.hpp:57
std::uint32_t zone_index
Definition sample_zone_map.hpp:58
double playback_rate
Definition sample_zone_map.hpp:62
SampleZone zone
Definition sample_zone_map.hpp:59