| 56 | // This function carries model calculations |
| 57 | |
| 58 | static inline |
| 59 | void applyModelOffline(DynamicModel* model, float* const out, uint32_t numSamples) |
| 60 | { |
| 61 | const bool input_skip = model->input_skip; |
| 62 | const float input_gain = model->input_gain; |
| 63 | const float output_gain = model->output_gain; |
| 64 | |
| 65 | std::visit( |
| 66 | [&out, numSamples, input_skip, input_gain, output_gain] (auto&& custom_model) |
| 67 | { |
| 68 | using ModelType = std::decay_t<decltype (custom_model)>; |
| 69 | |
| 70 | if (d_isNotEqual(input_gain, 1.f)) |
| 71 | { |
| 72 | for (uint32_t i=0; i<numSamples; ++i) |
| 73 | out[i] *= input_gain; |
| 74 | } |
| 75 | |
| 76 | if constexpr (ModelType::input_size == 1) |
| 77 | { |
| 78 | if (input_skip) |
| 79 | { |
| 80 | for (uint32_t i=0; i<numSamples; ++i) |
| 81 | out[i] += custom_model.forward(out + i); |
| 82 | } |
| 83 | else |
| 84 | { |
| 85 | for (uint32_t i=0; i<numSamples; ++i) |
| 86 | out[i] = custom_model.forward(out + i) * output_gain; |
| 87 | } |
| 88 | } |
| 89 | else if constexpr (ModelType::input_size == 2) |
| 90 | { |
| 91 | float inArray1 alignas(RTNEURAL_DEFAULT_ALIGNMENT)[2]; |
| 92 | |
| 93 | if (input_skip) |
| 94 | { |
| 95 | for (uint32_t i=0; i<numSamples; ++i) |
| 96 | { |
| 97 | inArray1[0] = out[i]; |
| 98 | inArray1[1] = 0.f; |
| 99 | out[i] += custom_model.forward(inArray1); |
| 100 | } |
| 101 | } |
| 102 | else |
| 103 | { |
| 104 | for (uint32_t i=0; i<numSamples; ++i) |
| 105 | { |
| 106 | inArray1[0] = out[i]; |
| 107 | inArray1[1] = 0.f; |
| 108 | out[i] = custom_model.forward(inArray1) * output_gain; |
| 109 | } |
| 110 | } |
| 111 | } |
| 112 | else if constexpr (ModelType::input_size == 3) |
| 113 | { |
| 114 | float inArray2 alignas(RTNEURAL_DEFAULT_ALIGNMENT)[3]; |
| 115 | |