Skip to content

Instantly share code, notes, and snippets.

@kmorrill
Last active February 2, 2025 16:33
Show Gist options
  • Save kmorrill/45b06565213a17e1f627f1bcdabc506c to your computer and use it in GitHub Desktop.
Save kmorrill/45b06565213a17e1f627f1bcdabc506c to your computer and use it in GitHub Desktop.
Mozaic OP-XY LFO explorer
@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