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

PMAP autosave + 16 MIDI vports #1268

Merged
merged 6 commits into from Dec 15, 2020
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -233,9 +233,13 @@ function clock.add_params()
norns.state.clock.link_quantum = x
end)
params:set_save("link_quantum", false)

local clock_table = {"off"}
for i = 1,16 do
local short_name = string.len(midi.vports[i].name) < 12 and midi.vports[i].name or util.acronym(midi.vports[i].name)
clock_table[i+1] = "port "..(i)..""..(midi.vports[i].name ~= "none" and (": "..short_name) or "")
end
params:add_option("clock_midi_out", "midi out",
{"off", "port 1", "port 2", "port 3", "port 4"}, norns.state.clock.midi_out)
clock_table, norns.state.clock.midi_out)
params:set_action("clock_midi_out", function(x) norns.state.clock.midi_out = x end)
params:set_save("clock_midi_out", false)
params:add_option("clock_crow_out", "crow out",
@@ -1,5 +1,6 @@
local m = {
pos = 1,
last_pos = 1,
list = {"midi", "grid", "arc", "hid"},
}

@@ -34,7 +35,7 @@ m.key = function(n,z)
elseif n==3 and z==1 then
m.section = m.list[m.pos]
m.mode = "list"
m.len = 4
m.len = m.section ~= "midi" and 4 or 16
m.pos = 1
_menu.redraw()
end
@@ -45,19 +46,19 @@ m.key = function(n,z)
m.pos = 1
_menu.redraw()
elseif n==3 and z==1 then
m.last_pos = m.pos
m.refresh()
m.mode = "select"
m.setpos = m.pos
m.len = #m.options[m.section]
--tab.print(m.options[m.section])
m.pos = 1
_menu.redraw()
end
elseif m.mode == "select" then
if n==2 and z==1 then
m.mode = "list"
m.len = 4
m.pos = 1
m.len = m.section ~= "midi" and 4 or 16
m.pos = m.last_pos
_menu.redraw()
elseif n==3 and z==1 then
local s = m.options[m.section][m.pos]
@@ -75,23 +76,26 @@ m.key = function(n,z)
hid.update_devices()
end
m.mode = "list"
m.len = 4
m.pos = 1
m.len = m.section ~= "midi" and 4 or 16
m.pos = m.last_pos
_menu.redraw()
end
end
end

m.enc = function(n,delta)
if n==2 then
prev_pos = m.pos
m.pos = util.clamp(m.pos + delta, 1, m.len)
_menu.redraw()
if prev_pos ~= m.pos then
_menu.redraw()
end
end
end

m.redraw = function()
local y_offset = 0
if(4<m.pos) then
if(4<m.pos) and m.section ~= "midi" then
y_offset = 10*(4-m.pos)
end
screen.clear()
@@ -110,19 +114,50 @@ m.redraw = function()
if m.mode == "type" then
screen.text(string.upper(m.list[i]) .. " >")
elseif m.mode == "list" then
screen.text(i..".")
screen.move(8,10*i+20+y_offset)
if m.section == "midi" then
screen.text(midi.vports[i].name)
for j = 1,4 do
screen.move(0,10*j+20)
if m.pos+(j-1) <= m.len then
local line = m.pos+(j-1)..". "..midi.vports[m.pos+(j-1)].name
if j == 1 then
screen.level(15)
else
screen.level(3)
end
screen.text(line)
end
end
elseif m.section == "grid" then
screen.text(i..".")
screen.move(8,10*i+20+y_offset)
screen.text(grid.vports[i].name)
elseif m.section == "arc" then
screen.text(i..".")
screen.move(8,10*i+20+y_offset)
screen.text(arc.vports[i].name)
elseif m.section == "hid" then
screen.text(i..".")
screen.move(8,10*i+20+y_offset)
screen.text(hid.vports[i].name)
end
elseif m.mode == "select" then
screen.text(m.options[m.section][i])
if m.section == "midi" then
for j = 1,4 do
screen.move(0,10*j+20)
if m.options[m.section][m.pos+(j-1)] ~= nil then
local line = m.options[m.section][m.pos+(j-1)]
if j == 1 then
screen.level(15)
else
screen.level(3)
end
screen.text(line)
end
end
else
screen.move(8,10*i+20+y_offset)
screen.text(m.options[m.section][i])
end
end
end
screen.update()
@@ -136,4 +171,4 @@ end

m.deinit = function() end

return m
return m
@@ -24,6 +24,7 @@ m.key = function(n,z)
else
norns.script.clear()
_norns.free_engine()
params.reset()

This comment has been minimized.

@tehn

tehn Dec 28, 2020
Member

little late--- this throws an error, and i'm wondering what the original intention was?

_menu.locked = true
end
end
@@ -235,11 +235,13 @@ m.key = function(n,z)
if n==2 and z==1 then
m.mode = mMAP
norns.pmap.assign(name,m.dev,m.ch,m.cc)
norns.pmap.write()
elseif n==3 and z==1 then
if m.mpos == 1 then
m.midilearn = not m.midilearn
elseif m.mpos ==2 then
norns.pmap.remove(name)
norns.pmap.write()
m.mode = mMAP
elseif m.mpos==8 or m.mpos==9 then
m.fine = true
@@ -338,7 +340,7 @@ m.enc = function(n,d)
elseif m.mpos==4 then
m.ch = util.clamp(m.ch+d,1,16)
elseif m.mpos==5 then
m.dev = util.clamp(m.dev+d,1,16)
m.dev = util.clamp(m.dev+d,1,#midi.vports)
elseif m.mpos==6 then
pm.in_lo = util.clamp(pm.in_lo+d, 0, pm.in_hi)
pm.value = util.clamp(pm.value, pm.in_lo, pm.in_hi)
@@ -517,21 +519,25 @@ m.redraw = function()
screen.level(4)
screen.move(0,40)
screen.text("cc")
screen.move(40,40)
screen.move(55,40)
hl(3)
screen.text_right(m.cc)
screen.level(4)
screen.move(0,50)
screen.text("ch")
screen.move(40,50)
screen.move(55,50)
hl(4)
screen.text_right(m.ch)
screen.level(4)
screen.move(0,60)
screen.text("dev")
screen.move(40,60)
screen.move(55,60)
hl(5)
screen.text_right(m.dev)

local long_name = midi.vports[m.dev].name
local short_name = string.len(long_name) > 6 and util.acronym(long_name) or long_name

screen.text_right(tostring(m.dev)..": "..short_name)

screen.level(4)
screen.move(63,40)
@@ -10,7 +10,7 @@ Midi.__index = Midi
Midi.devices = {}
Midi.vports = {}

for i=1,4 do
for i=1,16 do
Midi.vports[i] = {
name = "none",
device = nil,
@@ -50,11 +50,11 @@ function Midi.new(id, name, dev)

-- autofill next postiion
local connected = {}
for i=1,4 do
for i=1,16 do
table.insert(connected, Midi.vports[i].name)
end
if not tab.contains(connected, name) then
for i=1,4 do
for i=1,16 do
-- assign device unless device is specialized virtual interface
if Midi.vports[i].name == "none" and d.name ~= "virtual" then
Midi.vports[i].name = d.name
@@ -184,7 +184,7 @@ end

--- clear handlers.
function Midi.cleanup()
for i=1,4 do
for i=1,16 do
Midi.vports[i].event = nil
end

@@ -364,7 +364,7 @@ function Midi.update_devices()
end

-- connect available devices to vports
for i=1,4 do
for i=1,16 do
Midi.vports[i].device = nil

for _, device in pairs(Midi.devices) do
@@ -49,7 +49,7 @@ function pmap.clear()
pmap.data = {}
pmap.rev = {}
-- build reverse lookup table: dev -> ch -> cc
for i=1,4 do
for i=1,16 do
pmap.rev[i]={}
for n=1,16 do
pmap.rev[i][n]={}
@@ -98,7 +98,7 @@ state.save_state = function()
io.write("norns.state.clock.crow_out = " .. norns.state.clock.crow_out .. "\n")
io.write("norns.state.clock.crow_out_div = " .. norns.state.clock.crow_out_div .. "\n")
io.write("norns.state.clock.crow_in_div = " .. norns.state.clock.crow_in_div .. "\n")
for i=1,4 do
for i=1,16 do
io.write("midi.vports[" .. i .. "].name = '" .. midi.vports[i].name .. "'\n")
end
for i=1,4 do
@@ -217,4 +217,15 @@ function util.rads_to_degs(radians)
return radians * (180 / math.pi)
end

--- convert string to acronym
-- @tparam string name
-- @treturn string acronym
function util.acronym(name)
This conversation was marked as resolved by dndrks

This comment has been minimized.

@ryanlaws

ryanlaws Dec 11, 2020
Contributor

Nice, I might steal this!

name = name:gsub( "[%w']+", function( word )
if not word:find "%U" then return word end
return word:sub( 1, 1 )
end )
return (name:gsub("%s+", ""))
end

return util
ProTip! Use n and p to navigate between commits in a pull request.