#include "gen_exported.h" namespace gen_exported { /******************************************************************************************************************* Copyright (c) 2012 Cycling '74 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *******************************************************************************************************************/ // global noise generator Noise noise; static const int GENLIB_LOOPCOUNT_BAIL = 100000; // The State struct contains all the state and procedures for the gendsp kernel typedef struct State { CommonState __commonstate; Delay m_delay_5; Delta m_delta_14; Delta m_delta_11; Delta m_delta_20; Delta m_delta_17; Phasor m_phasor_10; Sah m_sah_13; Sah m_sah_12; Sah m_sah_15; Sah m_sah_16; Sah m_sah_21; Sah m_sah_19; Sah m_sah_18; Sah m_sah_22; double samples_to_seconds; double m_ratio_8; double m_xfade_9; double m_history_1; double samplerate; double m_history_3; double m_history_2; double m_blur_6; double m_window_7; double m_history_4; int vectorsize; int __exception; // re-initialize all member variables; inline void reset(double __sr, int __vs) { __exception = 0; vectorsize = __vs; samplerate = __sr; m_history_1 = 0; m_history_2 = 0; m_history_3 = 0; m_history_4 = 0; m_delay_5.reset("m_delay_5", 88200); m_blur_6 = 0; m_window_7 = 100; m_ratio_8 = 1; m_xfade_9 = 1; samples_to_seconds = (1 / samplerate); m_phasor_10.reset(0); m_delta_11.reset(0); m_sah_12.reset(0); m_sah_13.reset(0); m_delta_14.reset(0); m_sah_15.reset(0); m_sah_16.reset(0); m_delta_17.reset(0); m_sah_18.reset(0); m_sah_19.reset(0); m_delta_20.reset(0); m_sah_21.reset(0); m_sah_22.reset(0); genlib_reset_complete(this); }; // the signal processing routine; inline int perform(t_sample ** __ins, t_sample ** __outs, int __n) { vectorsize = __n; const t_sample * __in1 = __ins[0]; t_sample * __out1 = __outs[0]; t_sample * __out2 = __outs[1]; if (__exception) { return __exception; } else if (( (__in1 == 0) || (__out1 == 0) || (__out2 == 0) )) { __exception = GENLIB_ERR_NULL_BUFFER; return __exception; }; double mstosamps_1223 = (m_window_7 * (samplerate * 0.001)); double rsub_1209 = (1 - m_ratio_8); double mul_1208 = (rsub_1209 * 1000); double div_1207 = safediv(mul_1208, m_window_7); samples_to_seconds = (1 / samplerate); // the main sample loop; while ((__n--)) { const double in1 = (*(__in1++)); double noise_1159 = noise(); double abs_1177 = fabs(noise_1159); double mul_1183 = (abs_1177 * m_blur_6); double noise_1161 = noise(); double abs_1179 = fabs(noise_1161); double mul_1189 = (abs_1179 * m_blur_6); double noise_1160 = noise(); double abs_1178 = fabs(noise_1160); double mul_1186 = (abs_1178 * m_blur_6); double noise_1158 = noise(); double abs_1176 = fabs(noise_1158); double mul_1180 = (abs_1176 * m_blur_6); double phasor_1229 = m_phasor_10(div_1207, samples_to_seconds); double add_1206 = ((m_history_4 + phasor_1229) + 0.5); double mod_1205 = safemod(add_1206, 1); double delta_1185 = m_delta_11(mod_1205); double sah_1164 = m_sah_12(mul_1183, delta_1185, 0); double sah_1184 = m_sah_13(mstosamps_1223, delta_1185, 0); double mul_1173 = (sah_1184 * mod_1205); double sub_1204 = (mod_1205 - 0.5); double mul_1203 = (sub_1204 * 3.1415926535898); double cos_1202 = cos(mul_1203); double mul_1192 = (cos_1202 * cos_1202); double add_1228 = ((m_history_3 + phasor_1229) + 0); double mod_1227 = safemod(add_1228, 1); double delta_1169 = m_delta_14(mod_1227); double sah_1168 = m_sah_15(mul_1189, delta_1169, 0); double sah_1190 = m_sah_16(mstosamps_1223, delta_1169, 0); double mul_1175 = (sah_1190 * mod_1227); double sub_1226 = (mod_1227 - 0.5); double mul_1225 = (sub_1226 * 3.1415926535898); double cos_1224 = cos(mul_1225); double mul_1194 = (cos_1224 * cos_1224); double add_1222 = ((m_history_2 + phasor_1229) + 0.25); double mod_1221 = safemod(add_1222, 1); double delta_1188 = m_delta_17(mod_1221); double sah_1166 = m_sah_18(mul_1186, delta_1188, 0); double sah_1187 = m_sah_19(mstosamps_1223, delta_1188, 0); double mul_1174 = (sah_1187 * mod_1221); double sub_1220 = (mod_1221 - 0.5); double mul_1219 = (sub_1220 * 3.1415926535898); double cos_1218 = cos(mul_1219); double mul_1193 = (cos_1218 * cos_1218); double add_1200 = ((m_history_1 + phasor_1229) + 0.75); double mod_1199 = safemod(add_1200, 1); double delta_1182 = m_delta_20(mod_1199); double sah_1162 = m_sah_21(mul_1180, delta_1182, 0); double sah_1181 = m_sah_22(mstosamps_1223, delta_1182, 0); double mul_1172 = (sah_1181 * mod_1199); double tap_1214 = m_delay_5.read_linear(mul_1175); double tap_1215 = m_delay_5.read_linear(mul_1174); double tap_1216 = m_delay_5.read_linear(mul_1173); double tap_1217 = m_delay_5.read_linear(mul_1172); double mul_1212 = (tap_1214 * mul_1194); double mul_1201 = (tap_1216 * mul_1192); double add_1245 = (mul_1201 + mul_1212); double mix_1244 = (in1 + (m_xfade_9 * (add_1245 - in1))); double out1 = mix_1244; double mul_1211 = (tap_1215 * mul_1193); double sub_1198 = (mod_1199 - 0.5); double mul_1197 = (sub_1198 * 3.1415926535898); double cos_1196 = cos(mul_1197); double mul_1191 = (cos_1196 * cos_1196); double mul_1195 = (tap_1217 * mul_1191); double add_1247 = (mul_1195 + mul_1211); double mix_1246 = (in1 + (m_xfade_9 * (add_1247 - in1))); double out2 = mix_1246; double history_1165_next_1240 = sah_1164; double history_1170_next_1241 = sah_1168; double history_1167_next_1242 = sah_1166; double history_1163_next_1243 = sah_1162; m_delay_5.write(in1); m_history_4 = history_1165_next_1240; m_history_3 = history_1170_next_1241; m_history_2 = history_1167_next_1242; m_history_1 = history_1163_next_1243; m_delay_5.step(); // assign results to output buffer; (*(__out1++)) = out1; (*(__out2++)) = out2; }; return __exception; }; inline void set_blur(double _value) { m_blur_6 = (_value < 0 ? 0 : (_value > 0.25 ? 0.25 : _value)); }; inline void set_window(double _value) { m_window_7 = (_value < 0.1 ? 0.1 : (_value > 1000 ? 1000 : _value)); }; inline void set_ratio(double _value) { m_ratio_8 = (_value < 0.25 ? 0.25 : (_value > 4 ? 4 : _value)); }; inline void set_xfade(double _value) { m_xfade_9 = (_value < 0 ? 0 : (_value > 1 ? 1 : _value)); }; } State; /// /// Configuration for the genlib API /// /// Number of signal inputs and outputs const int gen_kernel_numins = 1; const int gen_kernel_numouts = 2; int num_inputs() { return gen_kernel_numins; } int num_outputs() { return gen_kernel_numouts; } int num_params() { return 4; } /// Assistive lables for the signal inputs and outputs const char * gen_kernel_innames[] = { "in1" }; const char * gen_kernel_outnames[] = { "out1", "out2" }; /// Invoke the signal process of a State object int perform(CommonState *cself, t_sample **ins, long numins, t_sample **outs, long numouts, long n) { State * self = (State *)cself; return self->perform(ins, outs, n); } /// Reset all parameters and stateful operators of a State object void reset(CommonState *cself) { State * self = (State *)cself; self->reset(cself->sr, cself->vs); } /// Set a parameter of a State object void setparameter(CommonState *cself, long index, t_param value, void *ref) { State * self = (State *)cself; switch (index) { case 0: self->set_blur(value); break; case 1: self->set_window(value); break; case 2: self->set_ratio(value); break; case 3: self->set_xfade(value); break; default: break; } } /// Get the value of a parameter of a State object void getparameter(CommonState *cself, long index, t_param *value) { State *self = (State *)cself; switch (index) { case 0: *value = self->m_blur_6; break; case 1: *value = self->m_window_7; break; case 2: *value = self->m_ratio_8; break; case 3: *value = self->m_xfade_9; break; default: break; } } /// Allocate and configure a new State object and it's internal CommonState: void * create(t_param sr, long vs) { State *self = new State; self->reset(sr, vs); ParamInfo *pi; self->__commonstate.inputnames = gen_kernel_innames; self->__commonstate.outputnames = gen_kernel_outnames; self->__commonstate.numins = gen_kernel_numins; self->__commonstate.numouts = gen_kernel_numouts; self->__commonstate.sr = sr; self->__commonstate.vs = vs; self->__commonstate.params = (ParamInfo *)genlib_sysmem_newptr(4 * sizeof(ParamInfo)); self->__commonstate.numparams = 4; // initialize parameter 0 ("m_blur_6") pi = self->__commonstate.params + 0; pi->name = "blur"; pi->paramtype = GENLIB_PARAMTYPE_FLOAT; pi->defaultvalue = self->m_blur_6; pi->defaultref = 0; pi->hasinputminmax = false; pi->inputmin = 0; pi->inputmax = 1; pi->hasminmax = true; pi->outputmin = 0; pi->outputmax = 0.25; pi->exp = 0; pi->units = ""; // no units defined // initialize parameter 1 ("m_window_7") pi = self->__commonstate.params + 1; pi->name = "window"; pi->paramtype = GENLIB_PARAMTYPE_FLOAT; pi->defaultvalue = self->m_window_7; pi->defaultref = 0; pi->hasinputminmax = false; pi->inputmin = 0; pi->inputmax = 1; pi->hasminmax = true; pi->outputmin = 0.1; pi->outputmax = 1000; pi->exp = 0; pi->units = ""; // no units defined // initialize parameter 2 ("m_ratio_8") pi = self->__commonstate.params + 2; pi->name = "ratio"; pi->paramtype = GENLIB_PARAMTYPE_FLOAT; pi->defaultvalue = self->m_ratio_8; pi->defaultref = 0; pi->hasinputminmax = false; pi->inputmin = 0; pi->inputmax = 1; pi->hasminmax = true; pi->outputmin = 0.25; pi->outputmax = 4; pi->exp = 0; pi->units = ""; // no units defined // initialize parameter 3 ("m_xfade_9") pi = self->__commonstate.params + 3; pi->name = "xfade"; pi->paramtype = GENLIB_PARAMTYPE_FLOAT; pi->defaultvalue = self->m_xfade_9; pi->defaultref = 0; pi->hasinputminmax = false; pi->inputmin = 0; pi->inputmax = 1; pi->hasminmax = true; pi->outputmin = 0; pi->outputmax = 1; pi->exp = 0; pi->units = ""; // no units defined return self; } /// Release all resources and memory used by a State object: void destroy(CommonState *cself) { State * self = (State *)cself; genlib_sysmem_freeptr(cself->params); delete self; } } // gen_exported::