Skip to content

Commit

Permalink
Refactor: use floats across the board.
Browse files Browse the repository at this point in the history
Fix: make style congruent.
  • Loading branch information
Bloodbat committed Oct 8, 2024
1 parent 11c401e commit f77cea6
Show file tree
Hide file tree
Showing 20 changed files with 298 additions and 298 deletions.
24 changes: 12 additions & 12 deletions src/Funes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,18 +166,18 @@ struct Funes : SanguineModule {
Funes() {
config(PARAMS_COUNT, INPUTS_COUNT, OUTPUTS_COUNT, LIGHTS_COUNT);

configSwitch(PARAM_MODEL, 0.0f, 23.0f, 8.0f, "Model", funesModelLabels);

configParam(PARAM_FREQUENCY, -4.0, 4.0, 0.0, "Frequency", " semitones", 0.f, 12.f);
configParam(PARAM_FREQUENCY_ROOT, -4.0, 4.0, 0.0, "Frequency Root", " semitones", 0.f, 12.f);
configParam(PARAM_HARMONICS, 0.0, 1.0, 0.5, "Harmonics", "%", 0.f, 100.f);
configParam(PARAM_TIMBRE, 0.0, 1.0, 0.5, "Timbre", "%", 0.f, 100.f);
configParam(PARAM_LPG_COLOR, 0.0, 1.0, 0.5, "Lowpass gate response", "%", 0.f, 100.f);
configParam(PARAM_MORPH, 0.0, 1.0, 0.5, "Morph", "%", 0.f, 100.f);
configParam(PARAM_LPG_DECAY, 0.0, 1.0, 0.5, "Lowpass gate decay", "%", 0.f, 100.f);
configParam(PARAM_TIMBRE_CV, -1.0, 1.0, 0.0, "Timbre CV");
configParam(PARAM_FREQUENCY_CV, -1.0, 1.0, 0.0, "Frequency CV");
configParam(PARAM_MORPH_CV, -1.0, 1.0, 0.0, "Morph CV");
configSwitch(PARAM_MODEL, 0.f, 23.f, 8.f, "Model", funesModelLabels);

configParam(PARAM_FREQUENCY, -4.f, 4.f, 0.f, "Frequency", " semitones", 0.f, 12.f);
configParam(PARAM_FREQUENCY_ROOT, -4.f, 4.f, 0.f, "Frequency Root", " semitones", 0.f, 12.f);
configParam(PARAM_HARMONICS, 0.f, 1.f, 0.5f, "Harmonics", "%", 0.f, 100.f);
configParam(PARAM_TIMBRE, 0.f, 1.f, 0.5f, "Timbre", "%", 0.f, 100.f);
configParam(PARAM_LPG_COLOR, 0.f, 1.f, 0.5f, "Lowpass gate response", "%", 0.f, 100.f);
configParam(PARAM_MORPH, 0.f, 1.f, 0.5f, "Morph", "%", 0.f, 100.f);
configParam(PARAM_LPG_DECAY, 0.f, 1.f, 0.5f, "Lowpass gate decay", "%", 0.f, 100.f);
configParam(PARAM_TIMBRE_CV, -1.f, 1.f, 0.f, "Timbre CV");
configParam(PARAM_FREQUENCY_CV, -1.f, 1.f, 0.f, "Frequency CV");
configParam(PARAM_MORPH_CV, -1.f, 1.f, 0.f, "Morph CV");
configSwitch(PARAM_FREQ_MODE, 0.f, 10.f, 10.f, "Frequency mode", funesFrequencyModes);

configInput(INPUT_ENGINE, "Model");
Expand Down
12 changes: 6 additions & 6 deletions src/aestus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,11 +118,11 @@ struct Aestus : SanguineModule {
config(PARAMS_COUNT, INPUTS_COUNT, OUTPUTS_COUNT, LIGHTS_COUNT);
configButton<ModeParam>(PARAM_MODE, aestusModelModeHeaders[0]);
configButton<RangeParam>(PARAM_RANGE, "Frequency range");
configParam(PARAM_FREQUENCY, -48.0, 48.0, 0.0, "Main frequency");
configParam(PARAM_FM, -12.0, 12.0, 0.0, "FM input attenuverter");
configParam(PARAM_SHAPE, -1.0, 1.0, 0.0, "Shape");
configParam(PARAM_SLOPE, -1.0, 1.0, 0.0, "Slope");
configParam(PARAM_SMOOTHNESS, -1.0, 1.0, 0.0, "Smoothness");
configParam(PARAM_FREQUENCY, -48.f, 48.f, 0.f, "Main frequency");
configParam(PARAM_FM, -12.f, 12.f, 0.f, "FM input attenuverter");
configParam(PARAM_SHAPE, -1.f, 1.f, 0.f, "Shape");
configParam(PARAM_SLOPE, -1.f, 1.f, 0.f, "Slope");
configParam(PARAM_SMOOTHNESS, -1.f, 1.f, 0.f, "Smoothness");

configSwitch(PARAM_MODEL, 0.f, 1.f, 0.f, "Module model", aestusMenuLabels);

Expand Down Expand Up @@ -201,7 +201,7 @@ struct Aestus : SanguineModule {
}

// Level
uint16_t level = clamp(inputs[INPUT_LEVEL].getNormalVoltage(8.0) / 8.0f, 0.0f, 1.0f)
uint16_t level = clamp(inputs[INPUT_LEVEL].getNormalVoltage(8.f) / 8.f, 0.f, 1.f)
* 65535;
if (level < 32) {
level = 0;
Expand Down
26 changes: 13 additions & 13 deletions src/anuli.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,16 +124,16 @@ struct Anuli : SanguineModule {
configParam(PARAM_POLYPHONY, 1.f, 4.f, 1.f, "Polyphony");
paramQuantities[PARAM_POLYPHONY]->snapEnabled = true;

configParam(PARAM_FREQUENCY, 0.0, 60.0, 30.0, "Frequency");
configParam(PARAM_STRUCTURE, 0.0, 1.0, 0.5, "Structure");
configParam(PARAM_BRIGHTNESS, 0.0, 1.0, 0.5, "Brightness");
configParam(PARAM_DAMPING, 0.0, 1.0, 0.5, "Damping");
configParam(PARAM_POSITION, 0.0, 1.0, 0.5, "Position");
configParam(PARAM_BRIGHTNESS_MOD, -1.0, 1.0, 0.0, "Brightness CV");
configParam(PARAM_FREQUENCY_MOD, -1.0, 1.0, 0.0, "Frequency CV");
configParam(PARAM_DAMPING_MOD, -1.0, 1.0, 0.0, "Damping CV");
configParam(PARAM_STRUCTURE_MOD, -1.0, 1.0, 0.0, "Structure CV");
configParam(PARAM_POSITION_MOD, -1.0, 1.0, 0.0, "Position CV");
configParam(PARAM_FREQUENCY, 0.f, 60.f, 30.f, "Frequency");
configParam(PARAM_STRUCTURE, 0.f, 1.f, 0.5f, "Structure");
configParam(PARAM_BRIGHTNESS, 0.f, 1.f, 0.5f, "Brightness");
configParam(PARAM_DAMPING, 0.f, 1.f, 0.5f, "Damping");
configParam(PARAM_POSITION, 0.f, 1.f, 0.5f, "Position");
configParam(PARAM_BRIGHTNESS_MOD, -1.f, 1.f, 0.f, "Brightness CV");
configParam(PARAM_FREQUENCY_MOD, -1.f, 1.f, 0.f, "Frequency CV");
configParam(PARAM_DAMPING_MOD, -1.f, 1.f, 0.f, "Damping CV");
configParam(PARAM_STRUCTURE_MOD, -1.f, 1.f, 0.f, "Structure CV");
configParam(PARAM_POSITION_MOD, -1.f, 1.f, 0.f, "Position CV");

configInput(INPUT_BRIGHTNESS_CV, "Brightness");
configInput(INPUT_FREQUENCY_CV, "Frequency");
Expand All @@ -156,7 +156,7 @@ struct Anuli : SanguineModule {
memset(&strummer[i], 0, sizeof(rings::Strummer));
memset(&part[i], 0, sizeof(rings::Part));
memset(&stringSynth[i], 0, sizeof(rings::StringSynthPart));
strummer[i].Init(0.01, 44100.0 / 24);
strummer[i].Init(0.01f, 44100.f / 24);
part[i].Init(reverbBuffer[i]);
stringSynth[i].Init(reverbBuffer[i]);

Expand Down Expand Up @@ -219,12 +219,12 @@ struct Anuli : SanguineModule {
// Get input
if (!inputBuffer[channel].full()) {
dsp::Frame<1> frame;
frame.samples[0] = inputs[INPUT_IN].getVoltage(channel) / 5.0;
frame.samples[0] = inputs[INPUT_IN].getVoltage(channel) / 5.f;
inputBuffer[channel].push(frame);
}

if (!bStrum[channel]) {
bStrum[channel] = inputs[INPUT_STRUM].getVoltage(channel) >= 1.0;
bStrum[channel] = inputs[INPUT_STRUM].getVoltage(channel) >= 1.f;
}

// Render frames
Expand Down
28 changes: 14 additions & 14 deletions src/apices.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -324,8 +324,8 @@ struct Apices : SanguineModule {

// Peaks manual says output spec is 0..8V for envelopes and 10Vpp for audio/CV.
// TODO Check the output values against an actual device.
outputs[OUT_1_OUTPUT].setVoltage(rescale(static_cast<float>(frame.samples[0]), 0.0f, 65535.f, -8.0f, 8.0f));
outputs[OUT_2_OUTPUT].setVoltage(rescale(static_cast<float>(frame.samples[1]), 0.0f, 65535.f, -8.0f, 8.0f));
outputs[OUT_1_OUTPUT].setVoltage(rescale(static_cast<float>(frame.samples[0]), 0.f, 65535.f, -8.f, 8.f));
outputs[OUT_2_OUTPUT].setVoltage(rescale(static_cast<float>(frame.samples[1]), 0.f, 65535.f, -8.f, 8.f));
}
}

Expand Down Expand Up @@ -502,7 +502,7 @@ struct Apices : SanguineModule {
int currentLight;
switch (editMode) {
case EDIT_MODE_FIRST:
lights[LIGHT_CHANNEL1].setBrightnessSmooth((flash == 1) ? 1.0f : 0.0f, sampleTime);
lights[LIGHT_CHANNEL1].setBrightnessSmooth((flash == 1) ? 1.f : 0.f, sampleTime);
lights[LIGHT_CHANNEL2].setBrightnessSmooth(0.f, sampleTime);
lights[LIGHT_CHANNEL_SELECT + 0].setBrightnessSmooth(1.f, sampleTime);
lights[LIGHT_CHANNEL_SELECT + 1].setBrightnessSmooth(0.f, sampleTime);
Expand All @@ -515,7 +515,7 @@ struct Apices : SanguineModule {
break;
case EDIT_MODE_SECOND:
lights[LIGHT_CHANNEL1].setBrightnessSmooth(0.f, sampleTime);
lights[LIGHT_CHANNEL2].setBrightnessSmooth((flash == 1 || flash == 3) ? 1.0f : 0.0f, sampleTime);
lights[LIGHT_CHANNEL2].setBrightnessSmooth((flash == 1 || flash == 3) ? 1.f : 0.f, sampleTime);
lights[LIGHT_CHANNEL_SELECT + 0].setBrightnessSmooth(1.f, sampleTime);
lights[LIGHT_CHANNEL_SELECT + 1].setBrightnessSmooth(1.f, sampleTime);
for (int i = 0; i < 4; i++) {
Expand Down Expand Up @@ -561,23 +561,23 @@ struct Apices : SanguineModule {
break;
}

lights[LIGHT_SPLIT_MODE].setBrightnessSmooth((editMode == EDIT_MODE_SPLIT) ? 1.0f : 0.0f, sampleTime);
lights[LIGHT_EXPERT_MODE].setBrightnessSmooth((editMode & 2) ? 1.0F : 0.F, sampleTime);
lights[LIGHT_SPLIT_MODE].setBrightnessSmooth((editMode == EDIT_MODE_SPLIT) ? 1.f : 0.f, sampleTime);
lights[LIGHT_EXPERT_MODE].setBrightnessSmooth((editMode & 2) ? 1.F : 0.F, sampleTime);

ProcessorFunction currentProcessorFunction = getProcessorFunction();
for (int i = 0; i < 4; i++) {
currentLight = LIGHT_FUNCTION_1 + i;
switch (lightStates[currentProcessorFunction][i]) {
case LIGHT_ON: {
lights[currentLight].setBrightnessSmooth(1.0f, sampleTime);
lights[currentLight].setBrightnessSmooth(1.f, sampleTime);
break;
}
case LIGHT_OFF: {
lights[currentLight].setBrightnessSmooth(0.0f, sampleTime);
lights[currentLight].setBrightnessSmooth(0.f, sampleTime);
break;
}
case LIGHT_BLINK: {
lights[currentLight].setBrightnessSmooth(getSystemTimeMs() & 256 ? 0.0f : 1.f, sampleTime);
lights[currentLight].setBrightnessSmooth(getSystemTimeMs() & 256 ? 0.f : 1.f, sampleTime);
break;
}
default: {
Expand Down Expand Up @@ -616,22 +616,22 @@ struct Apices : SanguineModule {
if (editMode == EDIT_MODE_SPLIT || editMode == EDIT_MODE_TWIN) {
uint8_t pattern = processors[0].number_station().digit() ^ processors[1].number_station().digit();
for (size_t i = 0; i < 4; ++i) {
lights[LIGHT_FUNCTION_1 + i].setBrightness((pattern & 1) ? 1.0f : 0.0f);
lights[LIGHT_FUNCTION_1 + i].setBrightness((pattern & 1) ? 1.f : 0.f);
pattern = pattern >> 1;
}
}
// Hacky but animates the lights!
else if (editMode == EDIT_MODE_FIRST && channel1IsStation) {
int digit = processors[0].number_station().digit();
for (size_t i = 0; i < 4; i++) {
lights[LIGHT_FUNCTION_1 + i].setBrightness((i & digit) ? 1.0f : 0.0f);
lights[LIGHT_FUNCTION_1 + i].setBrightness((i & digit) ? 1.f : 0.f);
}
}
// Ibid
else if (editMode == EDIT_MODE_SECOND && channel2IsStation) {
uint8_t digit = processors[1].number_station().digit();
for (size_t i = 0; i < 4; i++) {
lights[LIGHT_FUNCTION_1 + i].setBrightness((i & digit) ? 1.0f : 0.0f);
lights[LIGHT_FUNCTION_1 + i].setBrightness((i & digit) ? 1.f : 0.f);
}
}
if (channel1IsStation) {
Expand All @@ -642,8 +642,8 @@ struct Apices : SanguineModule {
}
}

lights[LIGHT_TRIGGER_1].setBrightnessSmooth(rescale(static_cast<float>(buttonBrightness[0]), 0.0f, 255.0f, 0.0f, 1.0f), sampleTime);
lights[LIGHT_TRIGGER_2].setBrightnessSmooth(rescale(static_cast<float>(buttonBrightness[1]), 0.0f, 255.0f, 0.0f, 1.0f), sampleTime);
lights[LIGHT_TRIGGER_1].setBrightnessSmooth(rescale(static_cast<float>(buttonBrightness[0]), 0.f, 255.f, 0.f, 1.f), sampleTime);
lights[LIGHT_TRIGGER_2].setBrightnessSmooth(rescale(static_cast<float>(buttonBrightness[1]), 0.f, 255.f, 0.f, 1.f), sampleTime);
}

void onReset() override {
Expand Down
52 changes: 26 additions & 26 deletions src/contextus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -307,34 +307,34 @@ struct Contextus : SanguineModule {

configSwitch(PARAM_MODEL, 0.f, renaissance::MACRO_OSC_SHAPE_LAST_ACCESSIBLE_FROM_META, 0.f,
"Model", contextusMenuLabels);
configParam(PARAM_MODULATION, -1.0, 1.0, 0.0, "Modulation");
configParam(PARAM_COARSE, -5.0, 3.0, -1.0, "Coarse frequency", " semitones", 0.f, 12.f, 12.f);
configParam(PARAM_FINE, -1.0, 1.0, 0.0, "Fine frequency", " semitones");
configParam(PARAM_ATTACK, 0.0, 15.0, 0.0, "Attack");
configParam(PARAM_MODULATION, -1.f, 1.f, 0.f, "Modulation");
configParam(PARAM_COARSE, -5.f, 3.f, -1.f, "Coarse frequency", " semitones", 0.f, 12.f, 12.f);
configParam(PARAM_FINE, -1.f, 1.f, 0.f, "Fine frequency", " semitones");
configParam(PARAM_ATTACK, 0.f, 15.f, 0.f, "Attack");
paramQuantities[PARAM_ATTACK]->snapEnabled = true;

configParam(PARAM_AD_TIMBRE, 0.0, 15.f, 0.0, "Timbre AD");
configParam(PARAM_AD_TIMBRE, 0.f, 15.f, 0.f, "Timbre AD");
paramQuantities[PARAM_AD_TIMBRE]->snapEnabled = true;

configParam(PARAM_TIMBRE, 0.0, 1.0, 0.5, "Timbre", "%", 0.f, 100.f);
configParam(PARAM_ROOT, 0.0, 11.0, 0.0, "Quantizer root note", "", 0.f, 1.0, 1.f);
configParam(PARAM_TIMBRE, 0.f, 1.f, 0.5f, "Timbre", "%", 0.f, 100.f);
configParam(PARAM_ROOT, 0.f, 11.f, 0.f, "Quantizer root note", "", 0.f, 1.f, 1.f);
paramQuantities[PARAM_ROOT]->snapEnabled = true;
configParam(PARAM_SCALE, 0.0, 48.0, 0.0, "Quantizer scale");
configParam(PARAM_SCALE, 0.f, 48.f, 0.f, "Quantizer scale");
paramQuantities[PARAM_SCALE]->snapEnabled = true;
configParam(PARAM_DECAY, 0.0, 15.f, 7.0, "Decay");
configParam(PARAM_DECAY, 0.f, 15.f, 7.f, "Decay");
paramQuantities[PARAM_DECAY]->snapEnabled = true;

configParam(PARAM_AD_COLOR, 0.f, 15.f, 0.f, "Color AD");
paramQuantities[PARAM_AD_COLOR]->snapEnabled = true;
configParam(PARAM_AD_MODULATION, 0.f, 15.f, 0.f, "FM AD");
paramQuantities[PARAM_AD_MODULATION]->snapEnabled = true;

configParam(PARAM_COLOR, 0.0, 1.0, 0.5, "Color", "%", 0.f, 100.f);
configParam(PARAM_PITCH_OCTAVE, 0.0, 4.0, 2.f, "Octave", "", 0.f, 1.f, -2.f);
configParam(PARAM_COLOR, 0.f, 1.f, 0.5f, "Color", "%", 0.f, 100.f);
configParam(PARAM_PITCH_OCTAVE, 0.f, 4.f, 2.f, "Octave", "", 0.f, 1.f, -2.f);
paramQuantities[PARAM_PITCH_OCTAVE]->snapEnabled = true;
configParam(PARAM_PITCH_RANGE, 0.f, 4.f, 0.f, "Pitch range");
paramQuantities[PARAM_PITCH_RANGE]->snapEnabled = true;
configParam(PARAM_FM, -1.0, 1.0, 0.0, "FM");
configParam(PARAM_FM, -1.f, 1.f, 0.f, "FM");

configParam(PARAM_TRIGGER_DELAY, 0.f, 6.f, 0.f, "Trigger delay");
paramQuantities[PARAM_TRIGGER_DELAY]->snapEnabled = true;
Expand Down Expand Up @@ -414,7 +414,7 @@ struct Contextus : SanguineModule {
settings[channel].invert_encoder = false;

// Trigger
bool bTriggerInput = inputs[INPUT_TRIGGER].getVoltage(channel) >= 1.0;
bool bTriggerInput = inputs[INPUT_TRIGGER].getVoltage(channel) >= 1.f;
if (!bLastTrig[channel] && bTriggerInput) {
bFlagTriggerDetected[channel] = bTriggerInput;
}
Expand Down Expand Up @@ -456,7 +456,7 @@ struct Contextus : SanguineModule {
// Set model
int model = params[PARAM_MODEL].getValue();
if (inputs[INPUT_META].isConnected()) {
model += roundf(inputs[INPUT_META].getVoltage(channel) / 10.0 * renaissance::MACRO_OSC_SHAPE_LAST_ACCESSIBLE_FROM_META);
model += roundf(inputs[INPUT_META].getVoltage(channel) / 10.f * renaissance::MACRO_OSC_SHAPE_LAST_ACCESSIBLE_FROM_META);
}

settings[channel].shape = clamp(model, 0, renaissance::MACRO_OSC_SHAPE_LAST_ACCESSIBLE_FROM_META);
Expand All @@ -465,25 +465,25 @@ struct Contextus : SanguineModule {
osc[channel].set_shape(renaissance::MacroOscillatorShape(settings[channel].shape));

// Set timbre/modulation
float timbre = params[PARAM_TIMBRE].getValue() + params[PARAM_MODULATION].getValue() * inputs[INPUT_TIMBRE].getVoltage(channel) / 5.0;
float modulation = params[PARAM_COLOR].getValue() + inputs[INPUT_COLOR].getVoltage(channel) / 5.0;
float timbre = params[PARAM_TIMBRE].getValue() + params[PARAM_MODULATION].getValue() * inputs[INPUT_TIMBRE].getVoltage(channel) / 5.f;
float modulation = params[PARAM_COLOR].getValue() + inputs[INPUT_COLOR].getVoltage(channel) / 5.f;

timbre += adValue / 65535. * settings[channel].ad_timbre / 16.;
modulation += adValue / 65535. * settings[channel].ad_color / 16.;
timbre += adValue / 65535.f * settings[channel].ad_timbre / 16.f;
modulation += adValue / 65535.f * settings[channel].ad_color / 16.f;

int16_t param1 = math::rescale(clamp(timbre, 0.0, 1.0), 0.0, 1.0, 0, INT16_MAX);
int16_t param2 = math::rescale(clamp(modulation, 0.0, 1.0), 0.0, 1.0, 0, INT16_MAX);
int16_t param1 = math::rescale(clamp(timbre, 0.f, 1.f), 0.f, 1.f, 0, INT16_MAX);
int16_t param2 = math::rescale(clamp(modulation, 0.f, 1.f), 0.f, 1.f, 0, INT16_MAX);
osc[channel].set_parameters(param1, param2);

// Set pitch
float pitchV = inputs[INPUT_PITCH].getVoltage(channel) + params[PARAM_COARSE].getValue() + params[PARAM_FINE].getValue() / 12.0;
float pitchV = inputs[INPUT_PITCH].getVoltage(channel) + params[PARAM_COARSE].getValue() + params[PARAM_FINE].getValue() / 12.f;
pitchV += fm;

if (bLowCpu) {
pitchV += log2f(96000.0 / args.sampleRate);
pitchV += log2f(96000.f / args.sampleRate);
}

int32_t pitch = (pitchV * 12.0 + 60) * 128;
int32_t pitch = (pitchV * 12.f + 60) * 128;

// pitch_range
if (settings[channel].pitch_range == renaissance::PITCH_RANGE_EXTERNAL || settings[channel].pitch_range == renaissance::PITCH_RANGE_LFO) {
Expand Down Expand Up @@ -556,7 +556,7 @@ struct Contextus : SanguineModule {
// Sample rate convert
dsp::Frame<1> in[24];
for (int i = 0; i < 24; i++) {
in[i].samples[0] = renderBuffer[i] / 32768.0;
in[i].samples[0] = renderBuffer[i] / 32768.f;
}
sampleRateConverter[channel].setRates(96000, args.sampleRate);

Expand All @@ -568,7 +568,7 @@ struct Contextus : SanguineModule {
else {
for (int i = 0; i < 24; i++) {
dsp::Frame<1> f;
f.samples[0] = renderBuffer[i] / 32768.0;
f.samples[0] = renderBuffer[i] / 32768.f;
drbOutputBuffer[channel].push(f);
}
}
Expand All @@ -577,7 +577,7 @@ struct Contextus : SanguineModule {
// Output
if (!drbOutputBuffer[channel].empty()) {
dsp::Frame<1> f = drbOutputBuffer[channel].shift();
outputs[OUTPUT_OUT].setVoltage(5.0 * f.samples[0], channel);
outputs[OUTPUT_OUT].setVoltage(5.f * f.samples[0], channel);
}
} // Channels

Expand Down
Loading

0 comments on commit f77cea6

Please sign in to comment.