Would somebody be able to help me with creating a Lua script that can be assigned to an LFO in order to sweep between the 8 FlexPhraser variations. I’m not wedded to it being an LFO as the source however it must have a depth knob.
Essentially I want the default to play on variation 1 and then, by turning up the depth knob, it will randomly select variation 1 to 8.
I’m in the final stages of my project so would really like to get this one sorted.
You can get random numbers by using e.g. math.random(1, 8)
That’s the easy bit. But how do you want to trigger this variation change? With each note, after certain amount of time…?
Well, good question. Ideally another random between say 1/2 and 1/4 (I can always edit that later if it’s not working).
However, if that isn’t possible I’m considering using the User section in the Flex Phraser with each variation having different note durations (calculated in accordance with the rate on that variation, ie 1/4 for a 1/4 variation).
You can try this. Not sure if it will work correctly for what you want. Paste this into lua script module. After this script module you need to add trigger pads midi module and then either flexphraser or midi player. The idea is the script will change the state of trigger pad module. This trigger pad module can be used to select variation of flexphraser or midi module. But you need to assign those variations to trigger pads first.
local freq = 1
local phase = 0
local beatValues = {0.03125, 0.0625, 0.125, 0.25, 0.5, 1, 2, 3, 4}
local syncRates = {"1/128", "1/64", "1/32", "1/16", "1/8", "1/4", "2/4", "3/4", "4/4"}
local anyNotePressed = 0
local retrigger = false
defineParameter("note", nil, 6, syncRates)
defineParameter("syncMode", nil, 3, {"Off", "Tempo + Retrig", "Tempo + Beat"})
defineParameter("frequency", nil, 1, 0.01, 30)
defineParameter("retriggerMode", nil, 1, {"Off", "First Note", "Each Note"})
defineParameter("enable", nil, true)
function calcModulation()
if retrigger then
phase = 0
retrigger = false
if isPlaying() and syncMode == 3 then
phase = (getBeatTime() / beatValues[note]) % 1
end
end
rate = getSamplingRate() / 32
freq = frequency
if syncMode > 1 then
freq = getTempo() / 60 / beatValues[note]
end
phase = phase + freq / rate
if phase >= 1 then
phase = phase - 1
local pad = math.random(1, 8)
if enable then
print("Pad ", pad)
spawn(playTriggerPad, pad)
end
end
end
function onNote(e)
if syncMode == 3 and isPlaying() or ((syncMode == 1 or syncMode == 2) and ((retriggerMode == 2 and anyNotePressed == 0) or retriggerMode == 3)) then
retrigger = true
end
anyNotePressed = anyNotePressed + 1
postEvent(e)
end
function onRelease(e)
anyNotePressed = math.max(anyNotePressed - 1, 0)
postEvent(e)
end
Hi misohoza, this works exactly as I envisaged. Thanks so much!
In fact it’s so helpful that in Microsoft fashion I skipped a version number and went straight from v18 to v20.
The only downside is it makes editing the FlexPhraser literally impossible now because it’s constantly jumping around Is there a way to assign the script to a button/knob (depth) so I can turn it off? I did expect to see a disable option on the MIDI modules with a right click but unfortunately not. Otherwise no big deal I can just move the script below the Trigger Pad while I edit the FlexPhraser.
Thanks once again misohoza, I’m in the final stages now!