Anklang-0.3.0.dev956+gd75ac925 anklang-0.3.0.dev956+gd75ac925
ASE — Anklang Sound Engine (C++)

« « « Anklang Documentation
Loading...
Searching...
No Matches
signalmath.hh
Go to the documentation of this file.
1 // This Source Code Form is licensed MPL-2.0: http://mozilla.org/MPL/2.0
2#pragma once
3
4#include <ase/mathutils.hh>
5
6namespace Ase {
7
9template<typename Float> Float hz_changed (Float a, Float b);
10
12template<typename Float> Float voltage2hz (Float x);
13
15float fast_voltage2hz (float x);
16
18template<typename Float> Float hz2voltage (Float x);
19
21float fast_hz2voltage (float x);
22
24template<typename Float> Float db_changed (Float a, Float b);
25
27template<typename Float> Float voltage2db (Float x);
28
30float fast_voltage2db (float x);
31
33template<typename Float> Float db2voltage (Float x);
34
36float fast_db2voltage (float x);
37
39template<typename Float> Float voltage_changed (Float a, Float b);
40
42struct Logscale {
43 double b2 = 0; // log2 (begin)
44 double r2 = 1, ir = 1; // range
46 void
47 setup (double min, double max)
48 {
49 b2 = ::log2l (min);
50 auto range = ::log2l (max) - b2;
51 ir = 1.0 / range;
52 r2 = range;
53 }
55 double
56 scale (double normalized) const
57 {
58 return ::exp2 (b2 + normalized * r2);
59 }
61 double
62 iscale (double mmvalue) const
63 {
64 return (::log2 (mmvalue) - b2) * ir;
65 }
66};
67
68// == Implementations ==
69static constexpr const long double c3_hertz = 261.6255653005986346778499935233; // 440 * 2^(-9/12)
70static constexpr const long double c3_hertz_inv = 0.0038222564329714297410505703465146; // 1 / c3_hertz
71
72template<typename Float> extern inline ASE_CONST Float
73voltage2hz (Float x)
74{
75 return std::exp2 (x * Float (10.0)) * Float (c3_hertz);
76}
77
78extern inline ASE_CONST float
80{
81 return fast_exp2 (x * 10.0f) * float (c3_hertz);
82}
83
84template<typename Float> extern inline ASE_CONST Float
85hz2voltage (Float x)
86{
87 return std::log2 (x * Float (c3_hertz_inv)) * Float (0.1);
88}
89
90extern inline ASE_CONST float
92{
93 return fast_log2 (x * float (c3_hertz_inv)) * 0.1f;
94}
95
96template<typename Float> extern inline ASE_CONST Float
97voltage2db (Float x)
98{
99 return std::log10 (std::abs (x)) * Float (20);
100}
101
102extern inline ASE_CONST float
104{
105 return fast_log2 (__builtin_fabsf (x)) * 6.02059991327962390427477789448986f;
106}
107
108template<typename Float> extern inline ASE_CONST Float
109db2voltage (Float x)
110{
111 return std::pow (10, x * Float (0.05));
112}
113
114extern inline ASE_CONST float
116{
117 return fast_exp2 (x * 0.1660964047443681173935159714744695f);
118}
119
120template<typename Float> extern inline ASE_CONST Float
121hz_changed (Float a, Float b)
122{
123 return __builtin_fabsf (a - b) > 1e-3;
124}
125
126template<typename Float> extern inline ASE_CONST Float
127db_changed (Float a, Float b)
128{
129 return __builtin_fabsf (a - b) > 1e-3;
130}
131
132template<typename Float> extern inline ASE_CONST Float
133voltage_changed (Float a, Float b)
134{
135 return __builtin_fabsf (a - b) > 1e-7;
136}
137
138} // Ase
139
T exp2(T... args)
T log10(T... args)
T log2(T... args)
typedef float
The Anklang C++ API namespace.
Definition api.hh:8
float fast_voltage2hz(float x)
Float precision variant of voltage2hz using fast_exp2().
Definition signalmath.hh:79
Float voltage2hz(Float x)
Convert synthesizer value (Voltage) to Hertz.
Definition signalmath.hh:73
float fast_exp2(float x)
Fast approximation of 2 raised to the power of x.
Definition mathutils.hh:81
float fast_hz2voltage(float x)
Float precision variant of hz2voltage using fast_log2().
Definition signalmath.hh:91
Float db_changed(Float a, Float b)
Determine a significant Decibel change.
Float hz2voltage(Float x)
Convert Hertz to synthesizer value (Voltage).
Definition signalmath.hh:85
float fast_db2voltage(float x)
Float precision variant of db2voltage using fast_exp2().
float fast_voltage2db(float x)
Float precision variant of voltage2db using fast_log2().
Float voltage_changed(Float a, Float b)
Determine a significant synthesizer value (Voltage) change.
Float hz_changed(Float a, Float b)
Determine a significant frequency change (audible Hertz).
Float voltage2db(Float x)
Convert synthesizer value (Voltage) to Decibel.
Definition signalmath.hh:97
float fast_log2(float x)
Fast approximation of logarithm to base 2.
Definition mathutils.hh:100
Float db2voltage(Float x)
Convert Decibel to synthesizer value (Voltage).
T pow(T... args)
Logarithmically map (and invert) a range onto 0…+1.
Definition signalmath.hh:42
double iscale(double mmvalue) const
Calculate normalized from a scale() result within [min … max].
Definition signalmath.hh:62
double scale(double normalized) const
Calculate scale value within [min … max] from normalized x.
Definition signalmath.hh:56
void setup(double min, double max)
Provide minimum and maximum values to be mapped.
Definition signalmath.hh:47