Skip to content

Instantly share code, notes, and snippets.

@p3r7
Created November 15, 2020 18:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save p3r7/8d9ba9fb8942696f5fc2609f59d5ca89 to your computer and use it in GitHub Desktop.
Save p3r7/8d9ba9fb8942696f5fc2609f59d5ca89 to your computer and use it in GitHub Desktop.
norns tutorial input with clock
--
-- ////\\\\
-- ////\\\\ TUTORIAL
-- ////\\\\ PART 6
-- \\\\////
-- \\\\//// INPUT
-- \\\\////
--
engine.name = 'InputTutorial'
local viewport = { width = 128, height = 64 }
local signal = { amp_in_l = 0, amp_out_l = 0, amp_in_l_max = 0, amp_out_l_max = 0 }
local controls = { amp = 1.0 }
local refresh_rate = 1.0 / 15
local p_amp_in
local p_amp_out
function init()
-- Render Style
screen.level(15)
screen.aa(0)
screen.line_width(1)
-- Render
redraw()
-- Listen
audio.monitor_mono()
engine.amp(1.0)
-- Poll in
p_amp_in = poll.set("amp_in_l")
p_amp_in.time = refresh_rate
p_amp_in.callback = function(val)
signal.amp_in_l = val
if signal.amp_in_l > signal.amp_in_l_max then
signal.amp_in_l_max = signal.amp_in_l
end
end
-- Poll out
p_amp_out = poll.set("amp_out_l")
p_amp_out.time = refresh_rate
p_amp_out.callback = function(val)
signal.amp_out_l = val
if signal.amp_out_l > signal.amp_out_l_max then
signal.amp_out_l_max = signal.amp_out_l
end
end
end
function update()
engine.amp(controls.amp)
redraw()
end
function repoll()
p_amp_in:update()
p_amp_out:update()
end
-- Controls
function key(id,state)
if state == 0 then return end
if id == 2 or id == 3 then
if controls.amp == 1 then
controls.amp = 0
else
controls.amp = 1
end
end
update()
end
function enc(id,delta)
controls.amp = clamp(controls.amp + (delta/10), 0.1, 1)
update()
end
-- Render
function draw_frame()
screen.level(15)
screen.rect(1, 1, viewport.width-1, viewport.height-1)
screen.stroke()
end
function draw_uv(value,maximum,offset)
size = {width = 4, height = viewport.height - 4}
pos = {x = viewport.width - size.width - offset, y = 2}
ratio = value/maximum
activity = clamp(size.height - (ratio * size.height),3,size.height)
screen.line_width(size.width)
-- Draw
screen.level(1)
screen.move(pos.x,pos.y)
screen.line(pos.x,pos.y + size.height)
screen.stroke()
screen.level(15)
screen.move(pos.x,pos.y + size.height)
screen.line(pos.x,activity)
screen.stroke()
screen.line_width(1)
end
function draw_controls()
x = viewport.width - 16
y = math.floor(viewport.height-(controls.amp * (viewport.height-5)) - 2)
-- Draw
screen.level(15)
screen.line_width(1)
screen.move(x,y)
screen.line(x + 4,y)
screen.stroke()
end
function draw_label()
line_height = 8
screen.move(5,viewport.height - (line_height * 1))
screen.text(controls.amp..'amp')
end
function redraw()
screen.clear()
draw_frame()
draw_controls()
draw_label()
draw_uv(signal.amp_in_l,signal.amp_in_l_max,0)
draw_uv(signal.amp_out_l,signal.amp_out_l_max,5)
screen.stroke()
screen.update()
end
-- Utils
function clamp(val,min,max)
return val < min and min or val > max and max or val
end
-- Interval
-- re = metro.init()
-- re.time = refresh_rate
-- re.event = function()
-- repoll()
-- redraw()
-- end
-- re:start()
clock.run(
function()
while true do
clock.sleep(refresh_rate)
repoll()
redraw()
end
end)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment