@@ -1 +1 @@ | |||||
Subproject commit eb6c8e9a5728a109ebe559aa78c4023be0b710e8 | |||||
Subproject commit 916d9620b538e004c8d1480ce378152805979eba |
@@ -55,7 +55,7 @@ void Blinds::step() { | |||||
for (int i = 0; i < 4; i++) { | for (int i = 0; i < 4; i++) { | ||||
float g = params[GAIN1_PARAM + i].value; | float g = params[GAIN1_PARAM + i].value; | ||||
g += params[MOD1_PARAM + i].value * inputs[CV1_INPUT + i].value / 5.0; | g += params[MOD1_PARAM + i].value * inputs[CV1_INPUT + i].value / 5.0; | ||||
g = clampf(g, -2.0, 2.0); | |||||
g = clamp(g, -2.0f, 2.0f); | |||||
lights[CV1_POS_LIGHT + 2*i].setBrightnessSmooth(fmaxf(0.0, g)); | lights[CV1_POS_LIGHT + 2*i].setBrightnessSmooth(fmaxf(0.0, g)); | ||||
lights[CV1_NEG_LIGHT + 2*i].setBrightnessSmooth(fmaxf(0.0, -g)); | lights[CV1_NEG_LIGHT + 2*i].setBrightnessSmooth(fmaxf(0.0, -g)); | ||||
out += g * inputs[IN1_INPUT + i].normalize(5.0); | out += g * inputs[IN1_INPUT + i].normalize(5.0); | ||||
@@ -112,7 +112,7 @@ void Braids::step() { | |||||
if (settings.meta_modulation) { | if (settings.meta_modulation) { | ||||
shape += roundf(fm / 10.0 * braids::MACRO_OSC_SHAPE_LAST_ACCESSIBLE_FROM_META); | shape += roundf(fm / 10.0 * braids::MACRO_OSC_SHAPE_LAST_ACCESSIBLE_FROM_META); | ||||
} | } | ||||
settings.shape = clampi(shape, 0, braids::MACRO_OSC_SHAPE_LAST_ACCESSIBLE_FROM_META); | |||||
settings.shape = clamp(shape, 0, braids::MACRO_OSC_SHAPE_LAST_ACCESSIBLE_FROM_META); | |||||
// Setup oscillator from settings | // Setup oscillator from settings | ||||
osc.set_shape((braids::MacroOscillatorShape) settings.shape); | osc.set_shape((braids::MacroOscillatorShape) settings.shape); | ||||
@@ -120,8 +120,8 @@ void Braids::step() { | |||||
// Set timbre/modulation | // Set timbre/modulation | ||||
float timbre = params[TIMBRE_PARAM].value + params[MODULATION_PARAM].value * inputs[TIMBRE_INPUT].value / 5.0; | float timbre = params[TIMBRE_PARAM].value + params[MODULATION_PARAM].value * inputs[TIMBRE_INPUT].value / 5.0; | ||||
float modulation = params[COLOR_PARAM].value + inputs[COLOR_INPUT].value / 5.0; | float modulation = params[COLOR_PARAM].value + inputs[COLOR_INPUT].value / 5.0; | ||||
int16_t param1 = rescalef(clampf(timbre, 0.0, 1.0), 0.0, 1.0, 0, INT16_MAX); | |||||
int16_t param2 = rescalef(clampf(modulation, 0.0, 1.0), 0.0, 1.0, 0, INT16_MAX); | |||||
int16_t param1 = rescale(clamp(timbre, 0.0f, 1.0f), 0.0f, 1.0f, 0, INT16_MAX); | |||||
int16_t param2 = rescale(clamp(modulation, 0.0f, 1.0f), 0.0f, 1.0f, 0, INT16_MAX); | |||||
osc.set_parameters(param1, param2); | osc.set_parameters(param1, param2); | ||||
// Set pitch | // Set pitch | ||||
@@ -132,7 +132,7 @@ void Braids::step() { | |||||
pitchV += log2f(96000.0 / engineGetSampleRate()); | pitchV += log2f(96000.0 / engineGetSampleRate()); | ||||
int32_t pitch = (pitchV * 12.0 + 60) * 128; | int32_t pitch = (pitchV * 12.0 + 60) * 128; | ||||
pitch += jitter_source.Render(settings.vco_drift); | pitch += jitter_source.Render(settings.vco_drift); | ||||
pitch = clampi(pitch, 0, 16383); | |||||
pitch = clamp(pitch, 0, 16383); | |||||
osc.set_pitch(pitch); | osc.set_pitch(pitch); | ||||
// TODO: add a sync input buffer (must be sample rate converted) | // TODO: add a sync input buffer (must be sample rate converted) | ||||
@@ -163,8 +163,8 @@ void Clouds::step() { | |||||
// We might not fill all of the input buffer if there is a deficiency, but this cannot be avoided due to imprecisions between the input and output SRC. | // We might not fill all of the input buffer if there is a deficiency, but this cannot be avoided due to imprecisions between the input and output SRC. | ||||
for (int i = 0; i < outLen; i++) { | for (int i = 0; i < outLen; i++) { | ||||
input[i].l = clampf(inputFrames[i].samples[0] * 32767.0, -32768, 32767); | |||||
input[i].r = clampf(inputFrames[i].samples[1] * 32767.0, -32768, 32767); | |||||
input[i].l = clamp(inputFrames[i].samples[0] * 32767.0f, -32768.0f, 32767.0f); | |||||
input[i].r = clamp(inputFrames[i].samples[1] * 32767.0f, -32768.0f, 32767.0f); | |||||
} | } | ||||
} | } | ||||
@@ -177,34 +177,34 @@ void Clouds::step() { | |||||
p->trigger = triggered; | p->trigger = triggered; | ||||
p->gate = triggered; | p->gate = triggered; | ||||
p->freeze = freeze || (inputs[FREEZE_INPUT].value >= 1.0); | p->freeze = freeze || (inputs[FREEZE_INPUT].value >= 1.0); | ||||
p->position = clampf(params[POSITION_PARAM].value + inputs[POSITION_INPUT].value / 5.0, 0.0, 1.0); | |||||
p->size = clampf(params[SIZE_PARAM].value + inputs[SIZE_INPUT].value / 5.0, 0.0, 1.0); | |||||
p->pitch = clampf((params[PITCH_PARAM].value + inputs[PITCH_INPUT].value) * 12.0, -48.0, 48.0); | |||||
p->density = clampf(params[DENSITY_PARAM].value + inputs[DENSITY_INPUT].value / 5.0, 0.0, 1.0); | |||||
p->texture = clampf(params[TEXTURE_PARAM].value + inputs[TEXTURE_INPUT].value / 5.0, 0.0, 1.0); | |||||
p->position = clamp(params[POSITION_PARAM].value + inputs[POSITION_INPUT].value / 5.0f, 0.0f, 1.0f); | |||||
p->size = clamp(params[SIZE_PARAM].value + inputs[SIZE_INPUT].value / 5.0f, 0.0f, 1.0f); | |||||
p->pitch = clamp((params[PITCH_PARAM].value + inputs[PITCH_INPUT].value) * 12.0f, -48.0f, 48.0f); | |||||
p->density = clamp(params[DENSITY_PARAM].value + inputs[DENSITY_INPUT].value / 5.0f, 0.0f, 1.0f); | |||||
p->texture = clamp(params[TEXTURE_PARAM].value + inputs[TEXTURE_INPUT].value / 5.0f, 0.0f, 1.0f); | |||||
p->dry_wet = params[BLEND_PARAM].value; | p->dry_wet = params[BLEND_PARAM].value; | ||||
p->stereo_spread = params[SPREAD_PARAM].value; | p->stereo_spread = params[SPREAD_PARAM].value; | ||||
p->feedback = params[FEEDBACK_PARAM].value; | p->feedback = params[FEEDBACK_PARAM].value; | ||||
// TODO | // TODO | ||||
// Why doesn't dry audio get reverbed? | // Why doesn't dry audio get reverbed? | ||||
p->reverb = params[REVERB_PARAM].value; | p->reverb = params[REVERB_PARAM].value; | ||||
float blend = inputs[BLEND_INPUT].value / 5.0; | |||||
float blend = inputs[BLEND_INPUT].value / 5.0f; | |||||
switch (blendMode) { | switch (blendMode) { | ||||
case 0: | case 0: | ||||
p->dry_wet += blend; | p->dry_wet += blend; | ||||
p->dry_wet = clampf(p->dry_wet, 0.0, 1.0); | |||||
p->dry_wet = clamp(p->dry_wet, 0.0f, 1.0f); | |||||
break; | break; | ||||
case 1: | case 1: | ||||
p->stereo_spread += blend; | p->stereo_spread += blend; | ||||
p->stereo_spread = clampf(p->stereo_spread, 0.0, 1.0); | |||||
p->stereo_spread = clamp(p->stereo_spread, 0.0f, 1.0f); | |||||
break; | break; | ||||
case 2: | case 2: | ||||
p->feedback += blend; | p->feedback += blend; | ||||
p->feedback = clampf(p->feedback, 0.0, 1.0); | |||||
p->feedback = clamp(p->feedback, 0.0f, 1.0f); | |||||
break; | break; | ||||
case 3: | case 3: | ||||
p->reverb += blend; | p->reverb += blend; | ||||
p->reverb = clampf(p->reverb, 0.0, 1.0); | |||||
p->reverb = clamp(p->reverb, 0.0f, 1.0f); | |||||
break; | break; | ||||
} | } | ||||
@@ -161,7 +161,7 @@ void Elements::step() { | |||||
p->exciter_blow_level = params[BLOW_PARAM].value; | p->exciter_blow_level = params[BLOW_PARAM].value; | ||||
p->exciter_strike_level = params[STRIKE_PARAM].value; | p->exciter_strike_level = params[STRIKE_PARAM].value; | ||||
#define BIND(_p, _m, _i) clampf(params[_p].value + 3.3*quadraticBipolar(params[_m].value)*inputs[_i].value/5.0, 0.0, 0.9995) | |||||
#define BIND(_p, _m, _i) clamp(params[_p].value + 3.3f*quadraticBipolar(params[_m].value)*inputs[_i].value/5.0f, 0.0f, 0.9995f) | |||||
p->exciter_bow_timbre = BIND(BOW_TIMBRE_PARAM, BOW_TIMBRE_MOD_PARAM, BOW_TIMBRE_MOD_INPUT); | p->exciter_bow_timbre = BIND(BOW_TIMBRE_PARAM, BOW_TIMBRE_MOD_PARAM, BOW_TIMBRE_MOD_INPUT); | ||||
p->exciter_blow_meta = BIND(FLOW_PARAM, FLOW_MOD_PARAM, FLOW_MOD_INPUT); | p->exciter_blow_meta = BIND(FLOW_PARAM, FLOW_MOD_PARAM, FLOW_MOD_INPUT); | ||||
@@ -172,14 +172,14 @@ void Elements::step() { | |||||
p->resonator_brightness = BIND(BRIGHTNESS_PARAM, BRIGHTNESS_MOD_PARAM, BRIGHTNESS_MOD_INPUT); | p->resonator_brightness = BIND(BRIGHTNESS_PARAM, BRIGHTNESS_MOD_PARAM, BRIGHTNESS_MOD_INPUT); | ||||
p->resonator_damping = BIND(DAMPING_PARAM, DAMPING_MOD_PARAM, DAMPING_MOD_INPUT); | p->resonator_damping = BIND(DAMPING_PARAM, DAMPING_MOD_PARAM, DAMPING_MOD_INPUT); | ||||
p->resonator_position = BIND(POSITION_PARAM, POSITION_MOD_PARAM, POSITION_MOD_INPUT); | p->resonator_position = BIND(POSITION_PARAM, POSITION_MOD_PARAM, POSITION_MOD_INPUT); | ||||
p->space = clampf(params[SPACE_PARAM].value + params[SPACE_MOD_PARAM].value*inputs[SPACE_MOD_INPUT].value/5.0, 0.0, 2.0); | |||||
p->space = clamp(params[SPACE_PARAM].value + params[SPACE_MOD_PARAM].value*inputs[SPACE_MOD_INPUT].value/5.0f, 0.0f, 2.0f); | |||||
// Get performance inputs | // Get performance inputs | ||||
elements::PerformanceState performance; | elements::PerformanceState performance; | ||||
performance.note = 12.0*inputs[NOTE_INPUT].value + roundf(params[COARSE_PARAM].value) + params[FINE_PARAM].value + 69.0; | performance.note = 12.0*inputs[NOTE_INPUT].value + roundf(params[COARSE_PARAM].value) + params[FINE_PARAM].value + 69.0; | ||||
performance.modulation = 3.3*quarticBipolar(params[FM_PARAM].value) * 49.5 * inputs[FM_INPUT].value/5.0; | performance.modulation = 3.3*quarticBipolar(params[FM_PARAM].value) * 49.5 * inputs[FM_INPUT].value/5.0; | ||||
performance.gate = params[PLAY_PARAM].value >= 1.0 || inputs[GATE_INPUT].value >= 1.0; | performance.gate = params[PLAY_PARAM].value >= 1.0 || inputs[GATE_INPUT].value >= 1.0; | ||||
performance.strength = clampf(1.0 - inputs[STRENGTH_INPUT].value/5.0, 0.0, 1.0); | |||||
performance.strength = clamp(1.0 - inputs[STRENGTH_INPUT].value/5.0f, 0.0f, 1.0f); | |||||
// Generate audio | // Generate audio | ||||
part->Process(performance, blow, strike, main, aux, 16); | part->Process(performance, blow, strike, main, aux, 16); | ||||
@@ -151,8 +151,8 @@ void Frames::step() { | |||||
int32_t timestamp = params[FRAME_PARAM].value * 65535.0; | int32_t timestamp = params[FRAME_PARAM].value * 65535.0; | ||||
int32_t timestampMod = timestamp + params[MODULATION_PARAM].value * inputs[FRAME_INPUT].value / 10.0 * 65535.0; | int32_t timestampMod = timestamp + params[MODULATION_PARAM].value * inputs[FRAME_INPUT].value / 10.0 * 65535.0; | ||||
timestamp = clampi(timestamp, 0, 65535); | |||||
timestampMod = clampi(timestampMod, 0, 65535); | |||||
timestamp = clamp(timestamp, 0, 65535); | |||||
timestampMod = clamp(timestampMod, 0, 65535); | |||||
int16_t nearestIndex = -1; | int16_t nearestIndex = -1; | ||||
if (!poly_lfo_mode) { | if (!poly_lfo_mode) { | ||||
nearestIndex = keyframer.FindNearestKeyframe(timestamp, 2048); | nearestIndex = keyframer.FindNearestKeyframe(timestamp, 2048); | ||||
@@ -212,8 +212,8 @@ void Frames::step() { | |||||
// Simulate SSM2164 | // Simulate SSM2164 | ||||
if (keyframer.mutable_settings(i)->response > 0) { | if (keyframer.mutable_settings(i)->response > 0) { | ||||
const float expBase = 200.0; | const float expBase = 200.0; | ||||
float expGain = rescalef(powf(expBase, gains[i]), 1.0, expBase, 0.0, 1.0); | |||||
gains[i] = crossf(gains[i], expGain, keyframer.mutable_settings(i)->response / 255.0); | |||||
float expGain = rescale(powf(expBase, gains[i]), 1.0f, expBase, 0.0f, 1.0f); | |||||
gains[i] = crossfade(gains[i], expGain, keyframer.mutable_settings(i)->response / 255.0f); | |||||
} | } | ||||
} | } | ||||
@@ -245,7 +245,7 @@ void Frames::step() { | |||||
} | } | ||||
} | } | ||||
outputs[MIX_OUTPUT].value = clampf(mix / 2.0, -10.0, 10.0); | |||||
outputs[MIX_OUTPUT].value = clamp(mix / 2.0, -10.0f, 10.0f); | |||||
// Set lights | // Set lights | ||||
for (int i = 0; i < 4; i++) { | for (int i = 0; i < 4; i++) { | ||||
@@ -176,10 +176,10 @@ void Rings::step() { | |||||
// Patch | // Patch | ||||
rings::Patch patch; | rings::Patch patch; | ||||
float structure = params[STRUCTURE_PARAM].value + 3.3*quadraticBipolar(params[STRUCTURE_MOD_PARAM].value)*inputs[STRUCTURE_MOD_INPUT].value/5.0; | float structure = params[STRUCTURE_PARAM].value + 3.3*quadraticBipolar(params[STRUCTURE_MOD_PARAM].value)*inputs[STRUCTURE_MOD_INPUT].value/5.0; | ||||
patch.structure = clampf(structure, 0.0, 0.9995); | |||||
patch.brightness = clampf(params[BRIGHTNESS_PARAM].value + 3.3*quadraticBipolar(params[BRIGHTNESS_MOD_PARAM].value)*inputs[BRIGHTNESS_MOD_INPUT].value/5.0, 0.0, 1.0); | |||||
patch.damping = clampf(params[DAMPING_PARAM].value + 3.3*quadraticBipolar(params[DAMPING_MOD_PARAM].value)*inputs[DAMPING_MOD_INPUT].value/5.0, 0.0, 0.9995); | |||||
patch.position = clampf(params[POSITION_PARAM].value + 3.3*quadraticBipolar(params[POSITION_MOD_PARAM].value)*inputs[POSITION_MOD_INPUT].value/5.0, 0.0, 0.9995); | |||||
patch.structure = clamp(structure, 0.0f, 0.9995f); | |||||
patch.brightness = clamp(params[BRIGHTNESS_PARAM].value + 3.3*quadraticBipolar(params[BRIGHTNESS_MOD_PARAM].value)*inputs[BRIGHTNESS_MOD_INPUT].value/5.0, 0.0f, 1.0f); | |||||
patch.damping = clamp(params[DAMPING_PARAM].value + 3.3*quadraticBipolar(params[DAMPING_MOD_PARAM].value)*inputs[DAMPING_MOD_INPUT].value/5.0, 0.0f, 0.9995f); | |||||
patch.position = clamp(params[POSITION_PARAM].value + 3.3*quadraticBipolar(params[POSITION_MOD_PARAM].value)*inputs[POSITION_MOD_INPUT].value/5.0, 0.0f, 0.9995f); | |||||
// Performance | // Performance | ||||
rings::PerformanceState performance_state; | rings::PerformanceState performance_state; | ||||
@@ -189,8 +189,8 @@ void Rings::step() { | |||||
if (inputs[PITCH_INPUT].active) { | if (inputs[PITCH_INPUT].active) { | ||||
transpose = roundf(transpose); | transpose = roundf(transpose); | ||||
} | } | ||||
performance_state.tonic = 12.0 + clampf(transpose, 0, 60.0); | |||||
performance_state.fm = clampf(48.0 * 3.3*quarticBipolar(params[FREQUENCY_MOD_PARAM].value) * inputs[FREQUENCY_MOD_INPUT].normalize(1.0)/5.0, -48.0, 48.0); | |||||
performance_state.tonic = 12.0 + clamp(transpose, 0.0f, 60.0f); | |||||
performance_state.fm = clamp(48.0 * 3.3*quarticBipolar(params[FREQUENCY_MOD_PARAM].value) * inputs[FREQUENCY_MOD_INPUT].normalize(1.0)/5.0, -48.0f, 48.0f); | |||||
performance_state.internal_exciter = !inputs[IN_INPUT].active; | performance_state.internal_exciter = !inputs[IN_INPUT].active; | ||||
performance_state.internal_strum = !inputs[STRUM_INPUT].active; | performance_state.internal_strum = !inputs[STRUM_INPUT].active; | ||||
@@ -202,7 +202,7 @@ void Rings::step() { | |||||
lastStrum = strum; | lastStrum = strum; | ||||
strum = false; | strum = false; | ||||
performance_state.chord = clampf(roundf(structure * (rings::kNumChords - 1)), 0, rings::kNumChords - 1); | |||||
performance_state.chord = clamp((int) roundf(structure * (rings::kNumChords - 1)), 0, rings::kNumChords - 1); | |||||
// Process audio | // Process audio | ||||
float out[24]; | float out[24]; | ||||
@@ -237,11 +237,11 @@ void Rings::step() { | |||||
Frame<2> outputFrame = outputBuffer.shift(); | Frame<2> outputFrame = outputBuffer.shift(); | ||||
// "Note that you need to insert a jack into each output to split the signals: when only one jack is inserted, both signals are mixed together." | // "Note that you need to insert a jack into each output to split the signals: when only one jack is inserted, both signals are mixed together." | ||||
if (outputs[ODD_OUTPUT].active && outputs[EVEN_OUTPUT].active) { | if (outputs[ODD_OUTPUT].active && outputs[EVEN_OUTPUT].active) { | ||||
outputs[ODD_OUTPUT].value = clampf(outputFrame.samples[0], -1.0, 1.0)*5.0; | |||||
outputs[EVEN_OUTPUT].value = clampf(outputFrame.samples[1], -1.0, 1.0)*5.0; | |||||
outputs[ODD_OUTPUT].value = clamp(outputFrame.samples[0], -1.0, 1.0)*5.0; | |||||
outputs[EVEN_OUTPUT].value = clamp(outputFrame.samples[1], -1.0, 1.0)*5.0; | |||||
} | } | ||||
else { | else { | ||||
float v = clampf(outputFrame.samples[0] + outputFrame.samples[1], -1.0, 1.0)*5.0; | |||||
float v = clamp(outputFrame.samples[0] + outputFrame.samples[1], -1.0, 1.0)*5.0; | |||||
outputs[ODD_OUTPUT].value = v; | outputs[ODD_OUTPUT].value = v; | ||||
outputs[EVEN_OUTPUT].value = v; | outputs[EVEN_OUTPUT].value = v; | ||||
} | } | ||||
@@ -132,12 +132,12 @@ void Tides::step() { | |||||
pitch += 60.0; | pitch += 60.0; | ||||
// Scale to the global sample rate | // Scale to the global sample rate | ||||
pitch += log2f(48000.0 / engineGetSampleRate()) * 12.0; | pitch += log2f(48000.0 / engineGetSampleRate()) * 12.0; | ||||
generator.set_pitch(clampf(pitch * 0x80, -0x8000, 0x7fff)); | |||||
generator.set_pitch((int) clamp(pitch * 0x80, (float) -0x8000, (float) 0x7fff)); | |||||
// Slope, smoothness, pitch | // Slope, smoothness, pitch | ||||
int16_t shape = clampf(params[SHAPE_PARAM].value + inputs[SHAPE_INPUT].value / 5.0, -1.0, 1.0) * 0x7fff; | |||||
int16_t slope = clampf(params[SLOPE_PARAM].value + inputs[SLOPE_INPUT].value / 5.0, -1.0, 1.0) * 0x7fff; | |||||
int16_t smoothness = clampf(params[SMOOTHNESS_PARAM].value + inputs[SMOOTHNESS_INPUT].value / 5.0, -1.0, 1.0) * 0x7fff; | |||||
int16_t shape = clamp(params[SHAPE_PARAM].value + inputs[SHAPE_INPUT].value / 5.0f, -1.0f, 1.0f) * 0x7fff; | |||||
int16_t slope = clamp(params[SLOPE_PARAM].value + inputs[SLOPE_INPUT].value / 5.0f, -1.0f, 1.0f) * 0x7fff; | |||||
int16_t smoothness = clamp(params[SMOOTHNESS_PARAM].value + inputs[SMOOTHNESS_INPUT].value / 5.0f, -1.0f, 1.0f) * 0x7fff; | |||||
generator.set_shape(shape); | generator.set_shape(shape); | ||||
generator.set_slope(slope); | generator.set_slope(slope); | ||||
generator.set_smoothness(smoothness); | generator.set_smoothness(smoothness); | ||||
@@ -152,7 +152,7 @@ void Tides::step() { | |||||
} | } | ||||
// Level | // Level | ||||
uint16_t level = clampf(inputs[LEVEL_INPUT].normalize(8.0) / 8.0, 0.0, 1.0) * 0xffff; | |||||
uint16_t level = clamp(inputs[LEVEL_INPUT].normalize(8.0) / 8.0f, 0.0f, 1.0f) * 0xffff; | |||||
if (level < 32) | if (level < 32) | ||||
level = 0; | level = 0; | ||||
@@ -52,10 +52,10 @@ void Veils::step() { | |||||
float in = inputs[IN1_INPUT + i].value * params[GAIN1_PARAM + i].value; | float in = inputs[IN1_INPUT + i].value * params[GAIN1_PARAM + i].value; | ||||
if (inputs[CV1_INPUT + i].active) { | if (inputs[CV1_INPUT + i].active) { | ||||
float linear = fmaxf(inputs[CV1_INPUT + i].value / 5.0, 0.0); | float linear = fmaxf(inputs[CV1_INPUT + i].value / 5.0, 0.0); | ||||
linear = clampf(linear, 0.0, 2.0); | |||||
linear = clamp(linear, 0.0f, 2.0f); | |||||
const float base = 200.0; | const float base = 200.0; | ||||
float exponential = rescalef(powf(base, linear / 2.0), 1.0, base, 0.0, 10.0); | |||||
in *= crossf(exponential, linear, params[RESPONSE1_PARAM + i].value); | |||||
float exponential = rescale(powf(base, linear / 2.0f), 1.0f, base, 0.0f, 10.0f); | |||||
in *= crossfade(exponential, linear, params[RESPONSE1_PARAM + i].value); | |||||
} | } | ||||
out += in; | out += in; | ||||
lights[OUT1_POS_LIGHT + 2*i].setBrightnessSmooth(fmaxf(0.0, out / 5.0)); | lights[OUT1_POS_LIGHT + 2*i].setBrightnessSmooth(fmaxf(0.0, out / 5.0)); | ||||
@@ -90,9 +90,9 @@ void Warps::step() { | |||||
if (++frame >= 60) { | if (++frame >= 60) { | ||||
frame = 0; | frame = 0; | ||||
p->channel_drive[0] = clampf(params[LEVEL1_PARAM].value + inputs[LEVEL1_INPUT].value / 5.0, 0.0, 1.0); | |||||
p->channel_drive[1] = clampf(params[LEVEL2_PARAM].value + inputs[LEVEL2_INPUT].value / 5.0, 0.0, 1.0); | |||||
p->modulation_algorithm = clampf(params[ALGORITHM_PARAM].value / 8.0 + inputs[ALGORITHM_INPUT].value / 5.0, 0.0, 1.0); | |||||
p->channel_drive[0] = clamp(params[LEVEL1_PARAM].value + inputs[LEVEL1_INPUT].value / 5.0f, 0.0f, 1.0f); | |||||
p->channel_drive[1] = clamp(params[LEVEL2_PARAM].value + inputs[LEVEL2_INPUT].value / 5.0f, 0.0f, 1.0f); | |||||
p->modulation_algorithm = clamp(params[ALGORITHM_PARAM].value / 8.0f + inputs[ALGORITHM_INPUT].value / 5.0f, 0.0f, 1.0f); | |||||
{ | { | ||||
// TODO | // TODO | ||||
@@ -103,19 +103,19 @@ void Warps::step() { | |||||
lights[ALGORITHM_LIGHT + 2].setBrightness(algorithmColor.b); | lights[ALGORITHM_LIGHT + 2].setBrightness(algorithmColor.b); | ||||
} | } | ||||
p->modulation_parameter = clampf(params[TIMBRE_PARAM].value + inputs[TIMBRE_INPUT].value / 5.0, 0.0, 1.0); | |||||
p->modulation_parameter = clamp(params[TIMBRE_PARAM].value + inputs[TIMBRE_INPUT].value / 5.0f, 0.0f, 1.0f); | |||||
p->frequency_shift_pot = params[ALGORITHM_PARAM].value / 8.0; | p->frequency_shift_pot = params[ALGORITHM_PARAM].value / 8.0; | ||||
p->frequency_shift_cv = clampf(inputs[ALGORITHM_INPUT].value / 5.0, -1.0, 1.0); | |||||
p->frequency_shift_cv = clamp(inputs[ALGORITHM_INPUT].value / 5.0f, -1.0f, 1.0f); | |||||
p->phase_shift = p->modulation_algorithm; | p->phase_shift = p->modulation_algorithm; | ||||
p->note = 60.0 * params[LEVEL1_PARAM].value + 12.0 * inputs[LEVEL1_INPUT].normalize(2.0) + 12.0; | p->note = 60.0 * params[LEVEL1_PARAM].value + 12.0 * inputs[LEVEL1_INPUT].normalize(2.0) + 12.0; | ||||
p->note += log2f(96000.0 / engineGetSampleRate()) * 12.0; | |||||
p->note += log2f(96000.0f * engineGetSampleTime()) * 12.0f; | |||||
modulator.Process(inputFrames, outputFrames, 60); | modulator.Process(inputFrames, outputFrames, 60); | ||||
} | } | ||||
inputFrames[frame].l = clampf(inputs[CARRIER_INPUT].value / 16.0 * 0x8000, -0x8000, 0x7fff); | |||||
inputFrames[frame].r = clampf(inputs[MODULATOR_INPUT].value / 16.0 * 0x8000, -0x8000, 0x7fff); | |||||
inputFrames[frame].l = clamp((int) (inputs[CARRIER_INPUT].value / 16.0 * 0x8000), -0x8000, 0x7fff); | |||||
inputFrames[frame].r = clamp((int) (inputs[MODULATOR_INPUT].value / 16.0 * 0x8000), -0x8000, 0x7fff); | |||||
outputs[MODULATOR_OUTPUT].value = (float)outputFrames[frame].l / 0x8000 * 5.0; | outputs[MODULATOR_OUTPUT].value = (float)outputFrames[frame].l / 0x8000 * 5.0; | ||||
outputs[AUX_OUTPUT].value = (float)outputFrames[frame].r / 0x8000 * 5.0; | outputs[AUX_OUTPUT].value = (float)outputFrames[frame].r / 0x8000 * 5.0; | ||||
} | } | ||||