Last active
February 2, 2025 16:33
-
-
Save kmorrill/45b06565213a17e1f627f1bcdabc506c to your computer and use it in GitHub Desktop.
Mozaic OP-XY LFO explorer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@OnLoad | |
ShowLayout 0 | |
Call @ResetKnobLabels | |
// Set default LFO values | |
lfoDest = 0 // Default: Volume | |
lfoSpeed = 6 // Default: Quarter Note | |
lfoCurve = 0 // Default: Sine | |
lfoAmount = 127 // Default: Full Range | |
midiCC = 7 // Default CC: Volume | |
// Setup default LFO settings | |
Call @ApplyLFOSettings | |
@End | |
@OnKnobChange | |
changedKnob = LastKnob | |
knobValue = GetKnobValue changedKnob | |
if changedKnob > 3 | |
Exit | |
endif | |
if changedKnob = 0 | |
lfoDest = Round(TranslateScale knobValue, 0, 127, 0, 14) | |
Call @UpdateLfoDest | |
Call @GetMIDI_CC // Update midiCC when changing destination | |
elseif changedKnob = 1 | |
lfoSpeed = Round(TranslateScale knobValue, 0, 127, 0, 7) | |
Call @UpdateLfoSpeed | |
Call @ApplyLFOSettings | |
elseif changedKnob = 2 | |
lfoCurve = Round(TranslateScale knobValue, 0, 127, 0, 4) | |
Call @UpdateLfoCurve | |
Call @ApplyLFOSettings | |
elseif changedKnob = 3 | |
lfoAmount = knobValue | |
Call @UpdateLfoAmount | |
Call @ApplyLFOSettings | |
endif | |
ResetTimer | |
SetTimerInterval 10000 | |
StartTimer | |
@End | |
@OnTimer | |
Call @ResetKnobLabels | |
StopTimer | |
@End | |
@OnPadUp | |
// For any pad release, randomize the LFO parameters with equal weighting | |
Call @RandomizeLFO | |
@End | |
@RandomizeLFO | |
// Pick random values for each parameter (equal weighting): | |
lfoDest = Random 0,14 // 0..14 inclusive | |
lfoSpeed = Random 0,7 // 0..7 inclusive | |
lfoCurve = Random 0,4 // 0..4 inclusive | |
lfoAmount = Random 0,127 // 0..127 inclusive | |
// Update everything accordingly | |
Call @UpdateLfoDest | |
Call @GetMIDI_CC | |
Call @UpdateLfoSpeed | |
Call @UpdateLfoCurve | |
Call @UpdateLfoAmount | |
Call @ApplyLFOSettings | |
// Log each parameter, both numeric value and a "string" via subroutines. | |
Log {Random LFO Settings:} | |
Log {Dest} | |
Log lfoDest | |
Call @LogLfoDest | |
Log {Speed} | |
Log lfoSpeed | |
Call @LogLfoSpeed | |
Log {Curve} | |
Log lfoCurve | |
Call @LogLfoCurve | |
Log {Amount} | |
Log lfoAmount | |
@End | |
@ApplyLFOSettings | |
// Convert lfoSpeed [0..7] into a frequency [0.5..16.0] | |
lfoFreq = TranslateScale lfoSpeed, 0, 7, 0.5, 16.0 | |
// Set LFO wave type based on lfoCurve | |
if lfoCurve = 0 | |
SetLFOType 0, {Sine} | |
elseif lfoCurve = 1 | |
SetLFOType 0, {Square} | |
elseif lfoCurve = 2 | |
SetLFOType 0, {RampUp} | |
elseif lfoCurve = 3 | |
SetLFOType 0, {RampDown} | |
else | |
SetLFOType 0, {SH} | |
endif | |
// Apply the new LFO amplitude + frequency | |
SetupLFO 0, 0, lfoAmount, yes, lfoFreq | |
@End | |
@OnMetroPulse | |
lfoValue = Round(GetLFOValue 0) | |
if lfoDest = 2 | |
// Convert 0..127 into a -8192..+8191 range and offset by 8192 | |
offset = TranslateScale lfoValue, 0, 127, -8192, 8191 | |
SendMIDIPitchbend 0, (8192 + offset) | |
else | |
SendMIDICC 0, midiCC, lfoValue | |
endif | |
@End | |
@GetMIDI_CC | |
// Map destination to CC numbers, same as before | |
if lfoDest = 0 | |
midiCC = 7 | |
elseif lfoDest = 1 | |
midiCC = 10 | |
elseif lfoDest = 3 | |
midiCC = 12 | |
elseif lfoDest = 4 | |
midiCC = 13 | |
elseif lfoDest = 5 | |
midiCC = 14 | |
elseif lfoDest = 6 | |
midiCC = 15 | |
elseif lfoDest = 7 | |
midiCC = 20 | |
elseif lfoDest = 8 | |
midiCC = 21 | |
elseif lfoDest = 9 | |
midiCC = 22 | |
elseif lfoDest = 10 | |
midiCC = 23 | |
elseif lfoDest = 11 | |
midiCC = 32 | |
elseif lfoDest = 12 | |
midiCC = 33 | |
elseif lfoDest = 13 | |
midiCC = 34 | |
elseif lfoDest = 14 | |
midiCC = 35 | |
else | |
// if lfoDest=2 or anything unlisted | |
// we do pitchbend for 2 anyway | |
midiCC = 7 | |
endif | |
@End | |
//////////////////////////////////////////////////////////////////// | |
// LFO DEST / SPEED / CURVE LABELING (Knobs) | |
//////////////////////////////////////////////////////////////////// | |
@UpdateLfoDest | |
if lfoDest = 0 | |
LabelKnob 0, {Vol} | |
elseif lfoDest = 1 | |
LabelKnob 0, {Pan} | |
elseif lfoDest = 2 | |
LabelKnob 0, {Pitch} | |
elseif lfoDest = 3 | |
LabelKnob 0, {P1} | |
elseif lfoDest = 4 | |
LabelKnob 0, {P2} | |
elseif lfoDest = 5 | |
LabelKnob 0, {P3} | |
elseif lfoDest = 6 | |
LabelKnob 0, {P4} | |
elseif lfoDest = 7 | |
LabelKnob 0, {Atk} | |
elseif lfoDest = 8 | |
LabelKnob 0, {Dec} | |
elseif lfoDest = 9 | |
LabelKnob 0, {Sus} | |
elseif lfoDest = 10 | |
LabelKnob 0, {Rel} | |
elseif lfoDest = 11 | |
LabelKnob 0, {Cut} | |
elseif lfoDest = 12 | |
LabelKnob 0, {Res} | |
elseif lfoDest = 13 | |
LabelKnob 0, {FEnv} | |
else | |
LabelKnob 0, {KeyTrk} | |
endif | |
@End | |
@UpdateLfoSpeed | |
if lfoSpeed = 0 | |
LabelKnob 1, {64th} | |
elseif lfoSpeed = 1 | |
LabelKnob 1, {32nd} | |
elseif lfoSpeed = 2 | |
LabelKnob 1, {16th} | |
elseif lfoSpeed = 3 | |
LabelKnob 1, {16T} | |
elseif lfoSpeed = 4 | |
LabelKnob 1, {8th} | |
elseif lfoSpeed = 5 | |
LabelKnob 1, {8T} | |
elseif lfoSpeed = 6 | |
LabelKnob 1, {4th} | |
else | |
LabelKnob 1, {4T} | |
endif | |
@End | |
@UpdateLfoCurve | |
if lfoCurve = 0 | |
LabelKnob 2, {Sine} | |
elseif lfoCurve = 1 | |
LabelKnob 2, {Square} | |
elseif lfoCurve = 2 | |
LabelKnob 2, {RampUp} | |
elseif lfoCurve = 3 | |
LabelKnob 2, {RampDown} | |
else | |
LabelKnob 2, {S&H} | |
endif | |
@End | |
@UpdateLfoAmount | |
LabelKnob 3, {Amt} | |
@End | |
//////////////////////////////////////////////////////////////////// | |
// LOGGING HELPERS FOR STRING LITERALS | |
//////////////////////////////////////////////////////////////////// | |
@LogLfoDest | |
if lfoDest = 0 | |
Log {Vol} | |
elseif lfoDest = 1 | |
Log {Pan} | |
elseif lfoDest = 2 | |
Log {Pitch} | |
elseif lfoDest = 3 | |
Log {P1} | |
elseif lfoDest = 4 | |
Log {P2} | |
elseif lfoDest = 5 | |
Log {P3} | |
elseif lfoDest = 6 | |
Log {P4} | |
elseif lfoDest = 7 | |
Log {Atk} | |
elseif lfoDest = 8 | |
Log {Dec} | |
elseif lfoDest = 9 | |
Log {Sus} | |
elseif lfoDest = 10 | |
Log {Rel} | |
elseif lfoDest = 11 | |
Log {Cut} | |
elseif lfoDest = 12 | |
Log {Res} | |
elseif lfoDest = 13 | |
Log {FEnv} | |
else | |
Log {KeyTrk} | |
endif | |
@End | |
@LogLfoSpeed | |
if lfoSpeed = 0 | |
Log {64th} | |
elseif lfoSpeed = 1 | |
Log {32nd} | |
elseif lfoSpeed = 2 | |
Log {16th} | |
elseif lfoSpeed = 3 | |
Log {16T} | |
elseif lfoSpeed = 4 | |
Log {8th} | |
elseif lfoSpeed = 5 | |
Log {8T} | |
elseif lfoSpeed = 6 | |
Log {4th} | |
else | |
Log {4T} | |
endif | |
@End | |
@LogLfoCurve | |
if lfoCurve = 0 | |
Log {Sine} | |
elseif lfoCurve = 1 | |
Log {Square} | |
elseif lfoCurve = 2 | |
Log {RampUp} | |
elseif lfoCurve = 3 | |
Log {RampDown} | |
else | |
Log {S&H} | |
endif | |
@End | |
@ResetKnobLabels | |
LabelKnob 0, {Dest} | |
LabelKnob 1, {Speed} | |
LabelKnob 2, {Curve} | |
LabelKnob 3, {Amt} | |
@End |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment