Function bodies 1,902 total
stepTrack method · cpp · L257-L268 (12 LOC)src/EuclideanRhythm.cpp
void stepTrack() {
cycleCompleted = false;
currentStep = (currentStep + 1) % length;
if (currentStep == 0) {
cycleCompleted = true;
}
gateState = !pattern.empty() && pattern[currentStep];
if (gateState) {
trigPulse.trigger(0.01f);
}
}reset method · cpp · L282-L289 (8 LOC)src/EuclideanRhythm.cpp
void reset() {
currentTrackIndex = 0;
globalClockCount = 0;
for (int i = 0; i < 3; ++i) {
trackStartClock[i] = 0;
}
}calculateTrackCycleClock method · cpp · L290-L293 (4 LOC)src/EuclideanRhythm.cpp
int calculateTrackCycleClock(const TrackState& track) {
return track.length * track.division / track.multiplication;
}processStep method · cpp · L294-L327 (34 LOC)src/EuclideanRhythm.cpp
float processStep(TrackState tracks[], float sampleTime, bool globalClockTriggered) {
if (trackIndices.empty()) {
return 0.0f;
}
if (globalClockTriggered) {
globalClockCount++;
}
if (currentTrackIndex >= (int)trackIndices.size()) {
currentTrackIndex = 0;
}
int activeTrackIdx = trackIndices[currentTrackIndex];
if (activeTrackIdx < 0 || activeTrackIdx >= 3) {
return 0.0f;
}
TrackState& activeTrack = tracks[activeTrackIdx];
int trackCycleClock = calculateTrackCycleClock(activeTrack);
int elapsedClock = globalClockCount - trackStartClock[activeTrackIdx];
if (elapsedClock >= trackCycleClock) {
currentTrackIndex++;
if (currentTrackIndex >= (int)trackIndices.size()EuclideanRhythm method · cpp · L330-L426 (97 LOC)src/EuclideanRhythm.cpp
EuclideanRhythm() {
config(PARAMS_LEN, INPUTS_LEN, OUTPUTS_LEN, LIGHTS_LEN);
configInput(GLOBAL_CLOCK_INPUT, "Global Clock");
configInput(GLOBAL_RESET_INPUT, "Global Reset");
configParam(MANUAL_RESET_PARAM, 0.0f, 1.0f, 0.0f, "Manual Reset");
chain12.trackIndices = {0, 1};
chain23.trackIndices = {1, 2};
chain123.trackIndices = {0, 1, 0, 2};
// Track 1 預設值
configParam(TRACK1_DIVMULT_PARAM, -3.0f, 3.0f, 0.0f, "T1 Div/Mult");
getParamQuantity(TRACK1_DIVMULT_PARAM)->snapEnabled = true;
delete paramQuantities[TRACK1_DIVMULT_PARAM];
paramQuantities[TRACK1_DIVMULT_PARAM] = new DivMultParamQuantity;
paramQuantities[TRACK1_DIVMULT_PARAM]->module = this;
paramQuantities[TRACK1_DIVMULT_PARAM]->paramId = TRACK1_DIVMULT_PARAM;
paramQuantities[TRACK1_DIVMULT_PARAM]->minValue = -3.0f;
paramQuantities[TRACK1_DIVMULT_PARAM]->maxValue = 3.0f;
paramQuantitonReset method · cpp · L427-L437 (11 LOC)src/EuclideanRhythm.cpp
void onReset() override {
secondsSinceLastClock = -1.0f;
globalClockSeconds = 0.5f;
for (int i = 0; i < 3; ++i) {
tracks[i].reset();
}
chain12.reset();
chain23.reset();
chain123.reset();
}dataToJson method · cpp · L438-L444 (7 LOC)src/EuclideanRhythm.cpp
json_t* dataToJson() override {
json_t* rootJ = json_object();
json_object_set_new(rootJ, "panelTheme", json_integer(panelTheme));
json_object_set_new(rootJ, "panelContrast", json_real(panelContrast));
return rootJ;
}Generated by Repobility's multi-pass static-analysis pipeline (https://repobility.com)
dataFromJson method · cpp · L445-L455 (11 LOC)src/EuclideanRhythm.cpp
void dataFromJson(json_t* rootJ) override {
json_t* themeJ = json_object_get(rootJ, "panelTheme");
if (themeJ) {
panelTheme = json_integer_value(themeJ);
}
json_t* contrastJ = json_object_get(rootJ, "panelContrast");
if (contrastJ) {
panelContrast = json_real_value(contrastJ);
}
}process method · cpp · L456-L596 (141 LOC)src/EuclideanRhythm.cpp
void process(const ProcessArgs& args) override {
bool globalClockActive = inputs[GLOBAL_CLOCK_INPUT].isConnected();
bool globalClockTriggered = false;
bool globalResetTriggered = false;
bool manualResetTriggered = false;
if (globalClockActive) {
float clockVoltage = inputs[GLOBAL_CLOCK_INPUT].getVoltage();
globalClockTriggered = clockTrigger.process(clockVoltage);
}
if (inputs[GLOBAL_RESET_INPUT].isConnected()) {
globalResetTriggered = resetTrigger.process(inputs[GLOBAL_RESET_INPUT].getVoltage());
}
manualResetTriggered = manualResetTrigger.process(params[MANUAL_RESET_PARAM].getValue());
if (globalResetTriggered || manualResetTriggered) {
onReset();
return;
}
if (globalClockTriggered) {
if (secondsSinceLastClock > 0.0f) {
globalClockSeconds = secondsSinceLEuclideanRhythmWidget method · cpp · L603-L690 (88 LOC)src/EuclideanRhythm.cpp
EuclideanRhythmWidget(EuclideanRhythm* module) {
setModule(module);
panelThemeHelper.init(this, "8HP", module ? &module->panelContrast : nullptr);
box.size = Vec(8 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
addChild(new EnhancedTextLabel(Vec(0, 1), Vec(box.size.x, 20), "Euclidean Rhythm", 14.f, nvgRGB(255, 200, 0), true));
addChild(new EnhancedTextLabel(Vec(0, 13), Vec(box.size.x, 20), "MADZINE", 10.f, nvgRGB(255, 200, 0), false));
addChild(new EnhancedTextLabel(Vec(18, 34), Vec(30, 15), "CLK"));
addInput(createInputCentered<PJ301MPort>(Vec(33, 56), module, EuclideanRhythm::GLOBAL_CLOCK_INPUT));
addChild(new EnhancedTextLabel(Vec(62, 34), Vec(30, 15), "RST"));
addInput(createInputCentered<PJ301MPort>(Vec(77, 56), module, EuclideanRhythm::GLOBAL_RESET_INPUT));
addParam(createParamCentered<VCVButton>(Vec(100, 56), module, EuclideanRhythm::MANUAL_RESET_PARAM));
float trackY[3] = {77, 159,step method · cpp · L691-L713 (23 LOC)src/EuclideanRhythm.cpp
void step() override {
EuclideanRhythm* module = dynamic_cast<EuclideanRhythm*>(this->module);
if (module) {
panelThemeHelper.step(module);
// CV 調變顯示更新
for (int track = 0; track < 3; track++) {
for (int param = 0; param < 3; param++) {
if (knobs[track][param]) {
// param: 0=Length, 1=Fill, 2=Shift
int inputId = EuclideanRhythm::TRACK1_LENGTH_CV_INPUT + track * 3 + param;
bool connected = module->inputs[inputId].isConnected();
knobs[track][param]->setModulationEnabled(connected);
if (connected) {
knobs[track][param]->setModulation(module->cvMod[track][param]);
}
}
}
}
}
ModuleWidget::step();
}appendContextMenu method · cpp · L714-L720 (7 LOC)src/EuclideanRhythm.cpp
void appendContextMenu(ui::Menu* menu) override {
EuclideanRhythm* module = dynamic_cast<EuclideanRhythm*>(this->module);
if (!module) return;
addPanelThemeMenu(menu, module);
}WhiteBackgroundBox method · cpp · L10-L13 (4 LOC)src/Facehugger.cpp
WhiteBackgroundBox(Vec pos, Vec size) {
box.pos = pos;
box.size = size;
}draw method · cpp · L14-L20 (7 LOC)src/Facehugger.cpp
void draw(const DrawArgs &args) override {
nvgBeginPath(args.vg);
nvgRect(args.vg, 0, 0, box.size.x, box.size.y);
nvgFillColor(args.vg, nvgRGB(255, 255, 255));
nvgFill(args.vg);
}BlackBackgroundBox method · cpp · L24-L27 (4 LOC)src/Facehugger.cpp
BlackBackgroundBox(Vec pos, Vec size) {
box.pos = pos;
box.size = size;
}Repobility (the analyzer behind this table) · https://repobility.com
draw method · cpp · L28-L38 (11 LOC)src/Facehugger.cpp
void draw(const DrawArgs &args) override {
nvgBeginPath(args.vg);
nvgRect(args.vg, 0, 0, box.size.x, box.size.y);
nvgFillColor(args.vg, nvgRGB(10, 30, 20));
nvgFill(args.vg);
nvgStrokeWidth(args.vg, 1.0f);
nvgStrokeColor(args.vg, nvgRGBA(100, 100, 100, 255));
nvgStroke(args.vg);
}FacehuggerTitleLabel method · cpp · L46-L53 (8 LOC)src/Facehugger.cpp
FacehuggerTitleLabel(Vec pos, Vec size, std::string l1, std::string l2, std::string l3) {
box.pos = pos;
box.size = size;
line1 = l1;
line2 = l2;
line3 = l3;
}draw method · cpp · L54-L75 (22 LOC)src/Facehugger.cpp
void draw(const DrawArgs &args) override {
nvgFontFaceId(args.vg, APP->window->uiFont->handle);
nvgTextAlign(args.vg, NVG_ALIGN_CENTER | NVG_ALIGN_MIDDLE);
// Line 1: 模組名稱 (12pt 白色, 字元間距縮窄) - Y=11
nvgFontSize(args.vg, 12.f);
nvgTextLetterSpacing(args.vg, -1.0f);
nvgFillColor(args.vg, nvgRGB(255, 255, 255));
nvgText(args.vg, box.size.x / 2.f, 11.f, line1.c_str(), NULL);
// Line 2: 品牌 (10pt 黃色) - Y=26
nvgTextLetterSpacing(args.vg, 0.f);
nvgFontSize(args.vg, 10.f);
nvgFillColor(args.vg, nvgRGB(255, 200, 0));
nvgText(args.vg, box.size.x / 2.f, 26.f, line3.c_str(), NULL);
// Line 3: 效果類型 (7pt 外星螢光綠) - Y=33(MADZINE下方)
nvgFontSize(args.vg, 7.f);
nvgFillColor(args.vg, nvgRGB(57, 255, 20));
nvgText(args.vg, box.size.x / 2.f, 33.f, line2.c_str(), NULL);
}draw method · cpp · L94-L111 (18 LOC)src/Facehugger.cpp
void draw(const DrawArgs &args) override {
nvgFontSize(args.vg, fontSize);
nvgFontFaceId(args.vg, APP->window->uiFont->handle);
nvgTextAlign(args.vg, NVG_ALIGN_CENTER | NVG_ALIGN_MIDDLE);
if (bold) {
// 使用描邊模擬粗體效果
nvgFillColor(args.vg, color);
nvgText(args.vg, box.size.x / 2.f, box.size.y / 2.f, text.c_str(), NULL);
nvgStrokeColor(args.vg, color);
nvgStrokeWidth(args.vg, 0.3f);
nvgText(args.vg, box.size.x / 2.f, box.size.y / 2.f, text.c_str(), NULL);
} else {
nvgFillColor(args.vg, color);
nvgText(args.vg, box.size.x / 2.f, box.size.y / 2.f, text.c_str(), NULL);
}
}Facehugger method · cpp · L169-L193 (25 LOC)src/Facehugger.cpp
Facehugger() {
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
configParam(SIZE_PARAM, 0.0f, 1.0f, 0.3f, "Size");
configParam(BREAK_PARAM, 0.0f, 1.0f, 0.4f, "Break");
configParam(SHIFT_PARAM, 0.0f, 1.0f, 0.5f, "Shift");
configParam(MIX_PARAM, 0.0f, 1.0f, 0.5f, "Mix", "%", 0.f, 100.f);
configParam(CHAOS_PARAM, 0.0f, 1.0f, 0.0f, "Chaos", "%", 0.f, 100.f);
configParam(RATE_PARAM, 0.01f, 2.0f, 0.5f, "Rate", "x");
configInput(LEFT_INPUT, "Left Audio");
configInput(RIGHT_INPUT, "Right Audio");
configInput(SIZE_CV_INPUT, "Size CV");
configInput(BREAK_CV_INPUT, "Break CV");
configInput(SHIFT_CV_INPUT, "Shift CV");
configInput(MIX_CV_INPUT, "Mix CV");
configInput(CHAOS_CV_INPUT, "Chaos CV");
configInput(RATE_CV_INPUT, "Rate CV");
configOutput(LEFT_OUTPUT, "Left Audio");
configOutput(RIGHT_OUTPUT, "Right Audio");
configOutput(CHAOS_OUTPUonReset method · cpp · L194-L201 (8 LOC)src/Facehugger.cpp
void onReset() override {
for (int c = 0; c < MAX_POLY; c++) {
chaosGen[c].reset();
leftGrainProcessor[c].reset();
rightGrainProcessor[c].reset();
}
}dataToJson method · cpp · L202-L208 (7 LOC)src/Facehugger.cpp
json_t* dataToJson() override {
json_t* rootJ = json_object();
json_object_set_new(rootJ, "panelTheme", json_integer(panelTheme));
json_object_set_new(rootJ, "panelContrast", json_real(panelContrast));
return rootJ;
}dataFromJson method · cpp · L209-L219 (11 LOC)src/Facehugger.cpp
void dataFromJson(json_t* rootJ) override {
json_t* themeJ = json_object_get(rootJ, "panelTheme");
if (themeJ) {
panelTheme = json_integer_value(themeJ);
}
json_t* contrastJ = json_object_get(rootJ, "panelContrast");
if (contrastJ) {
panelContrast = json_real_value(contrastJ);
}
}Citation: Repobility (2026). State of AI-Generated Code. https://repobility.com/research/
process method · cpp · L220-L354 (135 LOC)src/Facehugger.cpp
void process(const ProcessArgs& args) override {
if (args.sampleRate <= 0) return;
int leftChannels = inputs[LEFT_INPUT].getChannels();
int rightChannels = inputs[RIGHT_INPUT].getChannels();
int channels = std::max({1, leftChannels, rightChannels});
outputs[LEFT_OUTPUT].setChannels(channels);
outputs[RIGHT_OUTPUT].setChannels(channels);
outputs[CHAOS_OUTPUT].setChannels(channels);
outputs[SH_OUTPUT].setChannels(channels);
float chaosAmountBase = params[CHAOS_PARAM].getValue();
float chaosRateBase = params[RATE_PARAM].getValue();
for (int c = 0; c < channels; c++) {
// Chaos 參數 + CV
float chaosAmount = chaosAmountBase;
if (inputs[CHAOS_CV_INPUT].isConnected()) {
float cv = inputs[CHAOS_CV_INPUT].getPolyVoltage(c < inputs[CHAOS_CV_INPUT].getChannels() ? c : 0);
chaosAmount += cv * 0.1f;
if (c == 0) chaosCvMod processBypass method · cpp · L355-L373 (19 LOC)src/Facehugger.cpp
void processBypass(const ProcessArgs& args) override {
int leftChannels = inputs[LEFT_INPUT].getChannels();
int rightChannels = inputs[RIGHT_INPUT].getChannels();
int channels = std::max({1, leftChannels, rightChannels});
outputs[LEFT_OUTPUT].setChannels(channels);
outputs[RIGHT_OUTPUT].setChannels(channels);
for (int c = 0; c < channels; c++) {
float leftInput = (c < leftChannels) ? inputs[LEFT_INPUT].getPolyVoltage(c) : 0.0f;
float rightInput = inputs[RIGHT_INPUT].isConnected()
? ((c < rightChannels) ? inputs[RIGHT_INPUT].getPolyVoltage(c) : 0.0f)
: leftInput;
outputs[LEFT_OUTPUT].setVoltage(leftInput, c);
outputs[RIGHT_OUTPUT].setVoltage(rightInput, c);
}
}FacehuggerWidget method · cpp · L392-L475 (84 LOC)src/Facehugger.cpp
FacehuggerWidget(Facehugger* module) {
setModule(module);
panelThemeHelper.init(this, "4HP", module ? &module->panelContrast : nullptr);
box.size = Vec(4 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
// 黑色標題背景
addChild(new BlackBackgroundBox(Vec(0, 1), Vec(box.size.x, 18)));
// 三行標題(壓縮高度,與標準模組對齊)
addChild(new FacehuggerTitleLabel(Vec(0, 0), Vec(box.size.x, 30),
"Facehugger", "the Gratch effect", "MADZINE"));
float centerX = box.size.x / 2.0f; // 30
float leftX = 15.0f;
float rightX = 45.0f;
// Row 1: SIZE, BREAK (Y=72, 標籤 Y=48)
addChild(new FacehuggerParamLabel(Vec(0, 48), Vec(30, 15), "SIZE"));
sizeKnob = createParamCentered<StandardBlackKnob26>(Vec(leftX, 72), module, Facehugger::SIZE_PARAM);
addParam(sizeKnob);
addChild(new FacehuggerParamLabel(Vec(30, 48), Vec(30, 15), "BREAK"));
breakKnob = createParamCentered<StandardBlackKnob26>(Vec(righstep method · cpp · L476-L685 (210 LOC)src/Facehugger.cpp
void step() override {
Facehugger* module = dynamic_cast<Facehugger*>(this->module);
if (module) {
panelThemeHelper.step(module);
if (sizeKnob) {
bool connected = module->inputs[Facehugger::SIZE_CV_INPUT].isConnected();
sizeKnob->setModulationEnabled(connected);
if (connected) sizeKnob->setModulation(module->sizeCvMod);
}
if (breakKnob) {
bool connected = module->inputs[Facehugger::BREAK_CV_INPUT].isConnected();
breakKnob->setModulationEnabled(connected);
if (connected) breakKnob->setModulation(module->breakCvMod);
}
if (shiftKnob) {
bool connected = module->inputs[Facehugger::SHIFT_CV_INPUT].isConnected();
shiftKnob->setModulationEnabled(connected);
if (connected) shiftKnob->setModulation(module->shiftCvMod);
}
if (mixKnob) {
appendContextMenu method · cpp · L686-L691 (6 LOC)src/Facehugger.cpp
void appendContextMenu(ui::Menu* menu) override {
Facehugger* module = dynamic_cast<Facehugger*>(this->module);
if (!module) return;
addPanelThemeMenu(menu, module);
}KEN method · cpp · L62-L91 (30 LOC)src/KEN.cpp
KEN() {
config(PARAMS_LEN, INPUTS_LEN, OUTPUTS_LEN, LIGHTS_LEN);
configParam(LEVEL_PARAM, 0.f, 1.f, 0.7f, "Level", "%", 0.f, 100.f);
configInput(INPUT_1, "1");
configInput(INPUT_2, "2");
configInput(INPUT_3, "3");
configInput(INPUT_4, "4");
configInput(INPUT_5, "5");
configInput(INPUT_6, "6");
configInput(INPUT_7, "7");
configInput(INPUT_8, "8");
configOutput(LEFT_OUTPUT, "Left");
configOutput(RIGHT_OUTPUT, "Right");
initializeHRTF();
initializeDelays();
initializeDistanceFilters();
initializeElevationFilters();
initializeReverbFilters();
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 2; j++) {
smoothedGains[i][j] = hrtfGains[i][j];
}
}
}dataToJson method · cpp · L92-L98 (7 LOC)src/KEN.cpp
json_t* dataToJson() override {
json_t* rootJ = json_object();
json_object_set_new(rootJ, "panelTheme", json_integer(panelTheme));
json_object_set_new(rootJ, "panelContrast", json_real(panelContrast));
return rootJ;
}dataFromJson method · cpp · L99-L109 (11 LOC)src/KEN.cpp
void dataFromJson(json_t* rootJ) override {
json_t* themeJ = json_object_get(rootJ, "panelTheme");
if (themeJ) {
panelTheme = json_integer_value(themeJ);
}
json_t* contrastJ = json_object_get(rootJ, "panelContrast");
if (contrastJ) {
panelContrast = json_real_value(contrastJ);
}
}Powered by Repobility — scan your code at https://repobility.com
initializeHRTF method · cpp · L110-L119 (10 LOC)src/KEN.cpp
void initializeHRTF() {
for (int i = 0; i < 8; i++) {
float azimuth = speakers[i].azimuth * M_PI / 180.0f;
float elevation = speakers[i].elevation * M_PI / 180.0f;
hrtfGains[i][0] = calculateAdvancedHRTF(azimuth, elevation, 0, i);
hrtfGains[i][1] = calculateAdvancedHRTF(azimuth, elevation, 1, i);
}
}initializeDistanceFilters method · cpp · L120-L137 (18 LOC)src/KEN.cpp
void initializeDistanceFilters() {
for (int i = 0; i < 8; i++) {
for (int ear = 0; ear < 2; ear++) {
float sampleRate = 44100.0f;
float distance = speakers[i].distance;
float cutoffFreq = 20000.0f / (1.0f + distance * 3.0f);
cutoffFreq = clamp(cutoffFreq, 1000.0f, 20000.0f);
distanceFilters[i][ear].setParameters(
dsp::TBiquadFilter<>::LOWPASS,
cutoffFreq / sampleRate,
0.8f,
1.0f
);
}
}
}initializeElevationFilters method · cpp · L138-L173 (36 LOC)src/KEN.cpp
void initializeElevationFilters() {
for (int i = 0; i < 8; i++) {
for (int ear = 0; ear < 2; ear++) {
float sampleRate = 44100.0f;
float elevation = speakers[i].elevation;
float centerFreq, gain, q;
if (elevation > 0) {
centerFreq = 8000.0f + elevation * 40.0f;
gain = 2.0f;
q = 1.5f;
} else {
centerFreq = 7000.0f - abs(elevation) * 30.0f;
gain = 0.3f;
q = 2.0f;
}
if (elevation > 0) {
elevationFilters[i][ear].setParameters(
dsp::TBiquadFilter<>::PEAK,
centerFreq / sampleRate,
q,
gain
);
} else {
elevationFilters[i][ear].setParameterinitializeReverbFilters method · cpp · L174-L191 (18 LOC)src/KEN.cpp
void initializeReverbFilters() {
for (int i = 0; i < 8; i++) {
for (int ear = 0; ear < 2; ear++) {
float sampleRate = 44100.0f;
float distance = speakers[i].distance;
float reverbGain = 0.1f + distance * 0.4f;
reverbFilters[i][ear].setParameters(
dsp::TBiquadFilter<>::HIGHPASS,
3000.0f / sampleRate,
0.7f,
reverbGain
);
}
}
}initializeDelays method · cpp · L192-L219 (28 LOC)src/KEN.cpp
void initializeDelays() {
float sampleRate = 44100.0f;
float headWidth = 0.18f;
float soundSpeed = 343.0f;
for (int i = 0; i < 8; i++) {
float azimuth = speakers[i].azimuth * M_PI / 180.0f;
float itdSeconds = (headWidth / soundSpeed) * sin(azimuth);
int itdSamples = (int)(itdSeconds * sampleRate);
if (itdSamples > 0) {
delaySamplesL[i] = itdSamples;
delaySamplesR[i] = 0;
} else {
delaySamplesL[i] = 0;
delaySamplesR[i] = -itdSamples;
}
delayPosL[i] = 0;
delayPosR[i] = 0;
for (int j = 0; j < 128; j++) {
delayBufferL[i][j] = 0.0f;
delayBufferR[i][j] = 0.0f;
}
}
}calculateAdvancedHRTF method · cpp · L220-L258 (39 LOC)src/KEN.cpp
float calculateAdvancedHRTF(float azimuth, float elevation, int ear, int speakerIndex) {
float gain = 1.0f;
float ildEffect = 1.0f;
if (ear == 0) {
if (azimuth > 0) {
ildEffect = 1.0f - (azimuth / M_PI) * 0.8f;
} else {
ildEffect = 1.0f + (-azimuth / M_PI) * 0.3f;
}
} else {
if (azimuth < 0) {
ildEffect = 1.0f - (-azimuth / M_PI) * 0.8f;
} else {
ildEffect = 1.0f + (azimuth / M_PI) * 0.3f;
}
}
float headShadowEffect = 1.0f;
if (abs(azimuth) > M_PI / 2) {
headShadowEffect *= 0.6f;
}
float elevationEffect = 1.0f;
if (elevation > 0) {
elevationEffect = 1.0f + elevation * 0.8f;
} else {
elevationEffect = 0.7f - abs(elevation) * 0.4f;
}
float distance = speakers[speakerIndprocessDelay method · cpp · L259-L276 (18 LOC)src/KEN.cpp
float processDelay(float input, int speaker, int ear) {
float output;
if (ear == 0) {
delayBufferL[speaker][delayPosL[speaker]] = input;
int readPos = (delayPosL[speaker] - delaySamplesL[speaker] + 128) % 128;
output = delayBufferL[speaker][readPos];
delayPosL[speaker] = (delayPosL[speaker] + 1) % 128;
} else {
delayBufferR[speaker][delayPosR[speaker]] = input;
int readPos = (delayPosR[speaker] - delaySamplesR[speaker] + 128) % 128;
output = delayBufferR[speaker][readPos];
delayPosR[speaker] = (delayPosR[speaker] + 1) % 128;
}
return output;
}processDistanceFiltering method · cpp · L277-L280 (4 LOC)src/KEN.cpp
float processDistanceFiltering(float input, int speaker, int ear) {
return distanceFilters[speaker][ear].process(input);
}Generated by Repobility's multi-pass static-analysis pipeline (https://repobility.com)
processElevationFiltering method · cpp · L281-L284 (4 LOC)src/KEN.cpp
float processElevationFiltering(float input, int speaker, int ear) {
return elevationFilters[speaker][ear].process(input);
}processReverbFiltering method · cpp · L285-L288 (4 LOC)src/KEN.cpp
float processReverbFiltering(float input, int speaker, int ear) {
return reverbFilters[speaker][ear].process(input);
}process method · cpp · L289-L328 (40 LOC)src/KEN.cpp
void process(const ProcessArgs& args) override {
float level = params[LEVEL_PARAM].getValue();
float leftOut = 0.0f;
float rightOut = 0.0f;
for (int i = 0; i < 8; i++) {
if (inputs[INPUT_1 + i].isConnected()) {
float input = inputs[INPUT_1 + i].getVoltage();
float delayedLeft = processDelay(input, i, 0);
float delayedRight = processDelay(input, i, 1);
delayedLeft = processDistanceFiltering(delayedLeft, i, 0);
delayedRight = processDistanceFiltering(delayedRight, i, 1);
delayedLeft = processElevationFiltering(delayedLeft, i, 0);
delayedRight = processElevationFiltering(delayedRight, i, 1);
float reverbLeft = processReverbFiltering(delayedLeft, i, 0);
float reverbRight = processReverbFiltering(delayedRight, i, 1);
draw method · cpp · L346-L363 (18 LOC)src/KEN.cpp
void draw(const DrawArgs &args) override {
nvgFontSize(args.vg, fontSize);
nvgFontFaceId(args.vg, APP->window->uiFont->handle);
nvgTextAlign(args.vg, NVG_ALIGN_CENTER | NVG_ALIGN_MIDDLE);
if (bold) {
// 使用描邊模擬粗體效果
nvgFillColor(args.vg, color);
nvgText(args.vg, box.size.x / 2.f, box.size.y / 2.f, text.c_str(), NULL);
nvgStrokeColor(args.vg, color);
nvgStrokeWidth(args.vg, 0.3f);
nvgText(args.vg, box.size.x / 2.f, box.size.y / 2.f, text.c_str(), NULL);
} else {
nvgFillColor(args.vg, color);
nvgText(args.vg, box.size.x / 2.f, box.size.y / 2.f, text.c_str(), NULL);
}
}WhiteBackgroundBox method · cpp · L367-L370 (4 LOC)src/KEN.cpp
WhiteBackgroundBox(Vec pos, Vec size) {
box.pos = pos;
box.size = size;
}draw method · cpp · L371-L381 (11 LOC)src/KEN.cpp
void draw(const DrawArgs &args) override {
nvgBeginPath(args.vg);
nvgRect(args.vg, 0, 0, box.size.x, box.size.y);
nvgFillColor(args.vg, nvgRGB(255, 255, 255));
nvgFill(args.vg);
nvgStrokeWidth(args.vg, 1.0f);
nvgStrokeColor(args.vg, nvgRGBA(200, 200, 200, 255));
nvgStroke(args.vg);
}KENWidget method · cpp · L387-L417 (31 LOC)src/KEN.cpp
KENWidget(KEN* module) {
setModule(module);
panelThemeHelper.init(this, "8HP", module ? &module->panelContrast : nullptr);
box.size = Vec(4 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
addChild(new TechnoEnhancedTextLabel(Vec(0, 1), Vec(box.size.x, 20), "KEN", 14.f, nvgRGB(255, 200, 0), true));
addChild(new TechnoEnhancedTextLabel(Vec(0, 13), Vec(box.size.x, 20), "MADZINE", 10.f, nvgRGB(255, 200, 0), false));
addChild(new TechnoEnhancedTextLabel(Vec(15, 43), Vec(30, 10), "LEVEL"));
addParam(createParamCentered<StandardBlackKnob>(Vec(30, 70), module, KEN::LEVEL_PARAM));
float inputStartY = 110;
float inputSpacing = 28;
for (int i = 0; i < 8; i++) {
float y = inputStartY + i * inputSpacing;
addChild(new TechnoEnhancedTextLabel(Vec(3, y-5), Vec(20, 10), std::to_string(i + 1)));
addInput(createInputCentered<PJ301MPort>(Vec(30, y), module, KEN::INPUT_1 + i));
step method · cpp · L418-L425 (8 LOC)src/KEN.cpp
void step() override {
KEN* module = dynamic_cast<KEN*>(this->module);
if (module) {
panelThemeHelper.step(module);
}
ModuleWidget::step();
}Repobility (the analyzer behind this table) · https://repobility.com
appendContextMenu method · cpp · L426-L432 (7 LOC)src/KEN.cpp
void appendContextMenu(ui::Menu* menu) override {
KEN* module = dynamic_cast<KEN*>(this->module);
if (!module) return;
addPanelThemeMenu(menu, module);
}draw method · cpp · L22-L39 (18 LOC)src/KIMO.cpp
void draw(const DrawArgs &args) override {
nvgFontSize(args.vg, fontSize);
nvgFontFaceId(args.vg, APP->window->uiFont->handle);
nvgTextAlign(args.vg, NVG_ALIGN_CENTER | NVG_ALIGN_MIDDLE);
if (bold) {
// 使用描邊模擬粗體效果
nvgFillColor(args.vg, color);
nvgText(args.vg, box.size.x / 2.f, box.size.y / 2.f, text.c_str(), NULL);
nvgStrokeColor(args.vg, color);
nvgStrokeWidth(args.vg, 0.3f);
nvgText(args.vg, box.size.x / 2.f, box.size.y / 2.f, text.c_str(), NULL);
} else {
nvgFillColor(args.vg, color);
nvgText(args.vg, box.size.x / 2.f, box.size.y / 2.f, text.c_str(), NULL);
}
}getDisplayValueString method · cpp · L47-L50 (4 LOC)src/KIMO.cpp
std::string getDisplayValueString() override {
int value = (int)std::round(getValue());
return string::f("%d step", value);
}