Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

hnds.lua - fix sine phase jump #1

Merged
merged 3 commits into from Nov 14, 2019
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -22,8 +22,10 @@ for i = 1, number_of_outputs do
lfo[i] = {
freq = 0.01,
counter = 1,
waveform = 1,
waveform = options.lfotypes[1],
slope = 0,
depth = 100,
offset = 0,
}
end

@@ -52,70 +54,56 @@ function lfo.scale(old_value, old_min, old_max, new_min, new_max)
end


local function set_lfo_min(i, v)
lfo[i].min_val = util.clamp(v, 0.0, params:get(i .. "lfo_max"))
params:set(i .."lfo_min", lfo[i].min_val)
end


local function make_sine(n)
lfo[n].slope = 1 * math.sin(((tau / 100) * (lfo[n].counter)) - (tau / (lfo[n].freq)))

return 1 * math.sin(((tau / 100) * (lfo[n].counter)) - (tau / (lfo[n].freq)))
end


local function make_square(n)
if (lfo[n].counter + lfo[n].freq) % 360 <= 180.0 then
lfo[n].slope = 1.0
else
lfo[n].slope = -1.0
end
return make_sine(n) >= 0 and 1 or -1
end


function lfo.init()
for i = 1, number_of_outputs do
params:add_separator()
-- modualtion destination
-- modulation destination
params:add_option(i .. "lfo_target", i .. " lfo target", lfo[i].lfo_targets, 1)
-- lfo shape
params:add_option(i .. "lfo_shape", i .. " lfo shape", options.lfotypes, 1)
params:set_action(i .. "lfo_shape", function(value) lfo[i].waveform = options.lfotypes[value] end)
-- lfo max value
params:add_number(i .. "lfo_max", i .. " lfo max", 1, 100, 100)
params:set_action(i .. "lfo_max", function(value) lfo[i].max_val = value end)
-- lfo min value
params:add_number(i .. "lfo_min", i .. " lfo min", 0.0, 99, 1)
params:set_action(i .. "lfo_min", function(value) set_lfo_min(i, value) end)
-- lfo offset
params:add_control(i .."offset", i .. " offset", controlspec.new(-400, 300, "lin", 5, 0, ""))
params:add_control(i .."lfo_offset", i .. " lfo offset", controlspec.new(-400, 300, "lin", 5, 0, ""))
params:set_action(i .. "lfo_offset", function(value) lfo[i].offset = value end)
-- lfo speed
params:add_control(i .. "lfo_freq", i .. " lfo freq", controlspec.new(0.001, 25.0, "lin", 0.001, math.random(100) * 0.001, ""))
params:set_action(i .. "lfo_freq", function(value) lfo[i].freq = value end)
-- lfo depth
params:add_number(i .. "lfo_depth", i .. " lfo depth", 0, 100, 100)
params:set_action(i .. "lfo_depth", function(value) lfo[i].depth = value end)
-- lfo on/off
params:add_option(i .. "lfo", i .. " lfo", {"off", "on"}, 1)
end

lfo_metro = metro.init()
local lfo_metro = metro.init()
lfo_metro.time = .01
lfo_metro.count = -1
lfo_metro.event = function()
for i = 1, number_of_outputs do
lfo[i].prev = lfo[i].slope
local slope
if params:get(i .. "lfo") == 1 then
break
elseif lfo[i].waveform == "sine" then
make_sine(i)
slope = make_sine(i)
elseif lfo[i].waveform == "square" then
make_square(i)
slope = make_square(i)
end
lfo[i].slope = math.max(-1.0, math.min(1.0, lfo[i].slope))
lfo[i].counter = (lfo[i].counter + lfo[i].freq) % 360
lfo[i].slope = slope * (lfo[i].depth * 0.01) + (lfo[i].offset * 0.01)
lfo[i].counter = lfo[i].counter + lfo[i].freq
end
lfo.process()
end
lfo_metro:start()

end


@@ -153,20 +153,12 @@ end
function lfo.process()

for i = 1, 4 do

local offset = params:get(i .. "offset")
local target = params:get(i .. "lfo_target")

if params:get(i .. "lfo") == 2 then
-- left/right panning
if target > 1 and target <= 3 then
params:set(lfo_targets[target], lfo.scale(lfo[i].slope, -1.0, 1.0, params:get(i .. "lfo_min") + offset, params:get(i .. "lfo_max") + offset) * 0.01)
-- volume, and feedback
elseif target > 3 and target <= 7 then
params:set(lfo_targets[target], lfo.scale(lfo[i].slope, -1.0, 1.0, params:get(i .. "lfo_min"), params:get(i .. "lfo_max")) * 0.01)
-- speed mod
elseif target == 8 or target == 9 then
params:set(lfo_targets[target], lfo.scale(lfo[i].slope, -1.0, 1.0, params:get(i .. "lfo_min") + offset, params:get(i .. "lfo_max") + offset) * 0.01)
-- left/right panning, volume, feedback, speed
if target > 1 and target <= 9 then
params:set(lfo_targets[target], lfo[i].slope)
-- record L on/off
elseif target == 10 then
if lfo[i].slope > 0 then
@@ -237,10 +229,9 @@ function init()
params:add_separator()

sc.init()

params:add_option("skip_controls", "skip controls", skip_options, 1)
params:add_option("speed_controls", "speed controls", speed_options, 1)

-- for lib/hnds
for i = 1, 4 do
lfo[i].lfo_targets = lfo_targets
ProTip! Use n and p to navigate between commits in a pull request.