Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
stretch_preset.hpp
Go to the documentation of this file.
1#pragma once
19
21
22#include <sstream>
23#include <string>
24
25namespace pulp::signal {
26
31 std::string name = "untitled";
33 int fft_size = 0;
34 int analysis_hop = 0;
36 bool route_noise_stn = false;
37 bool relocate_transients = false;
38};
39
40inline const char* to_string(StretchCharacter c) {
41 switch (c) {
42 case StretchCharacter::varispeed: return "varispeed";
43 case StretchCharacter::phase_vocoder: return "phase_vocoder";
44 case StretchCharacter::granular: return "granular";
45 case StretchCharacter::clean: default: return "clean";
46 }
47}
48
49inline bool character_from_string(const std::string& s, StretchCharacter& out) {
50 if (s == "clean") { out = StretchCharacter::clean; return true; }
51 if (s == "varispeed") { out = StretchCharacter::varispeed; return true; }
52 if (s == "phase_vocoder") { out = StretchCharacter::phase_vocoder; return true; }
53 if (s == "granular") { out = StretchCharacter::granular; return true; }
54 return false;
55}
56
59 const std::string& name = "untitled") {
61 p.name = name;
62 p.character = o.character;
63 p.fft_size = o.fft_size;
64 p.analysis_hop = o.analysis_hop;
65 p.transient_sensitivity = o.transient_sensitivity;
66 p.route_noise_stn = o.route_noise_stn;
67 p.relocate_transients = o.relocate_transients;
68 return p;
69}
70
74 o.character = p.character;
75 o.fft_size = p.fft_size;
76 o.analysis_hop = p.analysis_hop;
77 o.transient_sensitivity = p.transient_sensitivity;
78 o.route_noise_stn = p.route_noise_stn;
79 o.relocate_transients = p.relocate_transients;
80}
81
82inline std::string preset_to_text(const StretchPreset& p) {
83 std::ostringstream s;
84 s << "# Pulp stretch preset\n"
85 << "name = " << p.name << "\n"
86 << "character = " << to_string(p.character) << "\n"
87 << "fft_size = " << p.fft_size << "\n"
88 << "analysis_hop = " << p.analysis_hop << "\n"
89 << "transient_sensitivity = " << p.transient_sensitivity << "\n"
90 << "route_noise_stn = " << (p.route_noise_stn ? "true" : "false") << "\n"
91 << "relocate_transients = " << (p.relocate_transients ? "true" : "false") << "\n";
92 return s.str();
93}
94
98inline bool preset_from_text(const std::string& text, StretchPreset& out,
99 std::string* err = nullptr) {
100 auto trim = [](std::string v) {
101 const auto a = v.find_first_not_of(" \t\r\n");
102 const auto b = v.find_last_not_of(" \t\r\n");
103 return a == std::string::npos ? std::string() : v.substr(a, b - a + 1);
104 };
105 auto as_bool = [](const std::string& v) { return v == "true" || v == "1" || v == "yes"; };
106 std::istringstream in(text);
107 std::string line;
108 while (std::getline(in, line)) {
109 const std::string t = trim(line);
110 if (t.empty() || t[0] == '#') continue;
111 const auto eq = t.find('=');
112 if (eq == std::string::npos) continue;
113 const std::string key = trim(t.substr(0, eq));
114 const std::string val = trim(t.substr(eq + 1));
115 if (key == "name") out.name = val;
116 else if (key == "character") {
117 if (!character_from_string(val, out.character)) {
118 if (err) *err = "unknown character: " + val;
119 return false;
120 }
121 }
122 else if (key == "fft_size") out.fft_size = std::atoi(val.c_str());
123 else if (key == "analysis_hop") out.analysis_hop = std::atoi(val.c_str());
124 else if (key == "transient_sensitivity") out.transient_sensitivity = static_cast<float>(std::atof(val.c_str()));
125 else if (key == "route_noise_stn") out.route_noise_stn = as_bool(val);
126 else if (key == "relocate_transients") out.relocate_transients = as_bool(val);
127 // unknown keys ignored (forward-compatible)
128 }
129 return true;
130}
131
132} // namespace pulp::signal
Definition additive_bank.hpp:218
@ c
Definition spectrum_trace.hpp:35
const char * to_string(StretchCharacter c)
Definition stretch_preset.hpp:40
StretchCharacter
Character mode — the musically-distinct "engine per job" selector.
Definition offline_stretch.hpp:66
@ clean
Definition offline_stretch.hpp:66
@ granular
Definition offline_stretch.hpp:66
@ phase_vocoder
Definition offline_stretch.hpp:66
@ varispeed
Definition offline_stretch.hpp:66
StretchPreset capture_preset(const OfflineStretchOptions &o, const std::string &name="untitled")
Capture the preset-relevant fields FROM a configured OfflineStretchOptions.
Definition stretch_preset.hpp:58
@ a
Definition formant_filter_bank.hpp:20
@ o
Definition formant_filter_bank.hpp:20
void apply_preset(OfflineStretchOptions &o, const StretchPreset &p)
Apply a preset to options (only the preset-managed fields; ratio/pitch are the caller's,...
Definition stretch_preset.hpp:73
bool character_from_string(const std::string &s, StretchCharacter &out)
Definition stretch_preset.hpp:49
bool preset_from_text(const std::string &text, StretchPreset &out, std::string *err=nullptr)
Parse a preset.
Definition stretch_preset.hpp:98
std::string preset_to_text(const StretchPreset &p)
Definition stretch_preset.hpp:82
Offline (non-realtime), maximum-quality time-stretch / pitch-shift / formant engine.
Whole-input render options.
Definition offline_stretch.hpp:69
The tunable subset of OfflineStretchOptions that defines a "character preset".
Definition stretch_preset.hpp:30
int analysis_hop
Definition stretch_preset.hpp:34
int fft_size
0 = adaptive (recommend_window)
Definition stretch_preset.hpp:33
bool relocate_transients
Definition stretch_preset.hpp:37
float transient_sensitivity
0 = engine default
Definition stretch_preset.hpp:35
bool route_noise_stn
Definition stretch_preset.hpp:36
std::string name
Definition stretch_preset.hpp:31
StretchCharacter character
Definition stretch_preset.hpp:32