MCPcopy Create free account
hub / github.com/VCVRack/Befaco / processProgramBankKnobLogic

Method processProgramBankKnobLogic

src/NoisePlethora.cpp:440–507  ·  view source on GitHub ↗

handle convoluted logic for the multifunction Program knob

Source from the content-addressed store, hash-verified

438
439 // handle convoluted logic for the multifunction Program knob
440 void processProgramBankKnobLogic(const ProcessArgs& args) {
441
442 // program knob will either change program for current bank...
443 if (programButtonDragged) {
444 // work out the change (in discrete increments) since the program/bank knob started being dragged
445 const int delta = (int)(dialResolution * (params[PROGRAM_PARAM].getValue() - programKnobReferenceState));
446
447 if (programKnobMode == PROGRAM_MODE) {
448 const int numProgramsForCurrentBank = getBankForIndex(programSelector.getCurrent().getBank()).getSize();
449
450 if (delta != 0) {
451 const int newProgramFromKnob = unsigned_modulo(programSelector.getCurrent().getProgram() + delta, numProgramsForCurrentBank);
452 programKnobReferenceState = params[PROGRAM_PARAM].getValue();
453 setAlgorithmViaProgram(newProgramFromKnob);
454 }
455 }
456 // ...or change bank, (trying to) keep program the same
457 else {
458
459 if (delta != 0) {
460 const int newBankFromKnob = unsigned_modulo(programSelector.getCurrent().getBank() + delta, numBanks);
461 programKnobReferenceState = params[PROGRAM_PARAM].getValue();
462 setAlgorithmViaBank(newBankFromKnob);
463 }
464 }
465 }
466
467 // if we have a new "press" on the knob, time it
468 if (programHoldTrigger.process(programButtonHeld)) {
469 programHoldTimer.reset();
470 }
471
472 // but cancel if it's actually a knob drag
473 if (programButtonDragged) {
474 programHoldTimer.reset();
475 programButtonHeld = false;
476 }
477 else {
478 if (programButtonHeld) {
479 programHoldTimer.process(args.sampleTime);
480
481 // if we've held for at least 0.5 seconds, switch into "bank mode"
482 if (programHoldTimer.time > 0.5f) {
483 programButtonHeld = false;
484 programHoldTimer.reset();
485
486 if (programKnobMode == PROGRAM_MODE) {
487 programKnobMode = BANK_MODE;
488 }
489 else {
490 programKnobMode = PROGRAM_MODE;
491 }
492
493 lights[BANK_LIGHT].setBrightness(programKnobMode == BANK_MODE);
494 }
495 }
496 // no longer held, but has been held for non-zero time (without being dragged), toggle "active" section (A or B),
497 // this is effectively just a "click"

Callers

nothing calls this directly

Calls 9

unsigned_moduloFunction · 0.85
getValueMethod · 0.80
getBankMethod · 0.80
getProgramMethod · 0.80
setModeMethod · 0.80
getModeMethod · 0.80
getSizeMethod · 0.45
processMethod · 0.45
resetMethod · 0.45

Tested by

no test coverage detected