2#include "vendor/prelude/hint.h"
21[[nodiscard, gnu::const]]
22static inline float nec_trilerp(
31 float x,
float y,
float z
33 assume(0 <= x && x <= 1);
34 assume(0 <= y && y <= 1);
35 assume(0 <= z && z <= 1);
36 const auto z1 = 1.f - z;
37 const auto c00 = c000 * z1 + c001 * z;
38 const auto c01 = c010 * z1 + c011 * z;
39 const auto c10 = c100 * z1 + c101 * z;
40 const auto c11 = c110 * z1 + c111 * z;
41 const auto y1 = 1.f - y;
42 const auto c0 = c00 * y1 + c01 * y;
43 const auto c1 = c10 * y1 + c11 * y;
44 return c0 * (1.f - x) + c1 * x;
52) [[clang::allocating]] {
53 if (!mipmap_count) { mipmap_count = 16; }
54 if (!variant_count) { variant_count = 1; }
55 if (!sample_count) { sample_count = 2048; }
56 const size_t data_len = mipmap_count * variant_count * sample_count;
57 return calloc(1,
sizeof(nec_wt_t) +
sizeof(
float) * data_len);
60[[nodiscard, gnu::const, gnu::nonnull]]
61static inline float nec_wt_get(
62 nec_wt_t wt[
const restrict
static 1],
63 float normalized_frequency,
67 assume(0 <= normalized_frequency && normalized_frequency < 1);
68 assume(0 <= variant && variant <= 1);
69 assume(0 <= phase && phase < 1);
71 const auto samples_per_mipmap = wt->sample_count * wt->variant_count;
72 const auto mipmap_idxr = normalized_frequency * (wt->mipmap_count - 1);
73 const auto mipmap_idxi = ceilf(mipmap_idxr);
74 const auto mipmap_idxf = mipmap_idxr - mipmap_idxi;
75 const auto mipmap_idx1 = (size_t)(mipmap_idxi);
76 const auto mipmap_idx0 = mipmap_idx1 - 1;
77 const auto m0 = mipmap_idx0 * samples_per_mipmap;
78 const auto m1 = mipmap_idx1 * samples_per_mipmap;
80 const auto variant_idxr = variant * (wt->variant_count - 1);
81 const auto variant_idxi = floorf(variant_idxr);
82 const auto variant_idxf = variant_idxr - variant_idxi;
83 const auto variant_idx0 = (size_t)(variant_idxi);
84 const auto variant_idx1 = 1 + variant_idx0;
85 const auto v0 = variant_idx0 * wt->sample_count;
86 const auto v1 = variant_idx1 * wt->sample_count;
88 const auto sample_idxr = phase * wt->sample_count;
89 const auto sample_idxi = floorf(sample_idxr);
90 const auto sample_idxf = sample_idxr - sample_idxi;
91 const auto sample_idx0 = (size_t)(sample_idxi);
92 const auto sample_idx1 = (1 + sample_idx0) % wt->sample_count;
95 wt->data[m0 + v0 + sample_idx0],
96 wt->data[m0 + v0 + sample_idx1],
97 wt->data[m0 + v1 + sample_idx0],
98 wt->data[m0 + v1 + sample_idx1],
99 wt->data[m1 + v0 + sample_idx0],
100 wt->data[m1 + v0 + sample_idx1],
101 wt->data[m1 + v1 + sample_idx0],
102 wt->data[m1 + v1 + sample_idx1]
Definition wavetable.h:13