| @@ -33,6 +33,11 @@ struct RandomValues : Module { | |||
| configInput(TRIG_INPUT, "Trigger"); | |||
| for (int i = 0; i < 7; i++) | |||
| configOutput(RND_OUTPUTS + i, string::f("Random %d", i + 1)); | |||
| // Initialize values of all channels | |||
| for (int c = 0; c < 16; c++) { | |||
| randomizeValues(c); | |||
| } | |||
| } | |||
| void onReset(const ResetEvent& e) override { | |||
| @@ -57,29 +62,60 @@ struct RandomValues : Module { | |||
| for (int c2 = 0; c2 < std::min(4, channels - c); c2++) { | |||
| if (pushed || (triggeredMask & (1 << c2))) { | |||
| for (int i = 0; i < 7; i++) { | |||
| float r = random::get<float>() * randomGain + randomOffset; | |||
| outputs[RND_OUTPUTS + i].setVoltage(r, c + c2); | |||
| } | |||
| randomizeValues(c + c2); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| for (int i = 0; i < 7; i++) { | |||
| outputs[RND_OUTPUTS + i].setChannels(channels); | |||
| // Don't call setChannels because we need to preserve all channel values | |||
| outputs[RND_OUTPUTS + i].channels = channels; | |||
| } | |||
| lights[PUSH_LIGHT].setBrightnessSmooth(light, args.sampleTime); | |||
| } | |||
| void randomizeValues(int channel) { | |||
| for (int i = 0; i < 7; i++) { | |||
| float r = random::get<float>() * randomGain + randomOffset; | |||
| outputs[RND_OUTPUTS + i].setVoltage(r, channel); | |||
| } | |||
| } | |||
| json_t* dataToJson() override { | |||
| json_t* rootJ = json_object(); | |||
| json_t* valuesJ = json_array(); | |||
| for (int i = 0; i < 7; i++) { | |||
| json_t* channelsJ = json_array(); | |||
| for (int c = 0; c < 16; c++) { | |||
| float value = outputs[RND_OUTPUTS + i].getVoltage(c); | |||
| json_array_insert_new(channelsJ, c, json_real(value)); | |||
| } | |||
| json_array_insert_new(valuesJ, i, channelsJ); | |||
| } | |||
| json_object_set_new(rootJ, "values", valuesJ); | |||
| json_object_set_new(rootJ, "randomGain", json_real(randomGain)); | |||
| json_object_set_new(rootJ, "randomOffset", json_real(randomOffset)); | |||
| return rootJ; | |||
| } | |||
| void dataFromJson(json_t* rootJ) override { | |||
| json_t* valuesJ = json_object_get(rootJ, "values"); | |||
| if (valuesJ) | |||
| for (int i = 0; i < 7; i++) { | |||
| json_t* channelsJ = json_array_get(valuesJ, i); | |||
| if (channelsJ) | |||
| for (int c = 0; c < 16; c++) { | |||
| json_t* valueJ = json_array_get(channelsJ, c); | |||
| if (valueJ) { | |||
| float value = json_number_value(valueJ); | |||
| outputs[RND_OUTPUTS + i].setVoltage(value, c); | |||
| } | |||
| } | |||
| } | |||
| json_t* randomGainJ = json_object_get(rootJ, "randomGain"); | |||
| if (randomGainJ) | |||
| randomGain = json_number_value(randomGainJ); | |||