Question about Arc + Norns / Crow Quad Gate Sequencer or LFO -or- Ansible Cycles for Norns / Crow?

My apologies for that lengthy topic title. . . .

I recently acquired an Arc and Crow to go along with my Grid and Norns, and I’m still fairly uninvolved in the whole Monome environment, so forgive me if this is obvious.

I have an idea in my head to use the four Arc wheels to act as as independent and unquantized Gate Sequencers or LFOs within my eurorack rig. I’m imagining something as simple as a gate being triggered whenever the arc wheel crosses 12 o’clock, and then using the arc wheel to manually modulate the speed of the Gate Sequencer or LFO.

The closest thing that I’ve found that comes close to what I’m imagining would be the Cycles app for the Ansible module, which leaves me with two questions:

  1. Are the Ansible scripts (specifically Cycles) available for Norns and/or Crow?
  2. Is anybody aware of such a script as I’m attempting to describe, or does anybody have any insight on how a novice such as myself may put together such a script?

Thanks all!

1 Like

All the grid apps for Ansible have been ported from C to Lua in order to run on norns, with some possible differences in functionality from the module:

To my knowledge Levels and Cycles have not yet been ported. Studying the Cycles source for Ansible may help to understand the app’s logic; the building blocks (timers, clocks, arc event handlers) all have counterparts in Lua programming for norns.

Here is a simple script to have the arc rings control four different timers. In this example each timer just prints, for example, gate 2: true when the state of the gate changes. This could just as easily do something like crow.output[timer.index].volts = timer.gate and 5 or 0 instead of print(...) in order to control the gate status on crow. Time intervals are in seconds, the arc_redraw function has to calculate an angle in radians (between 0 and 2π) to specify which arc LEDs to illuminate.

MIN_INTERVAL = 0.1
MAX_INTERVAL = 10
ring_timers = {}  
my_arc = arc.connect()
  
function init()
  for i=1,4 do
    local timer = {index = i, gate = false}
    timer.metro = metro.init()
    timer.metro.time = 1
    timer.metro.event = function() toggle_gate(timer) end
    timer.metro:start()
    ring_timers[#ring_timers + 1] = timer
  end

  my_arc.delta = function(n, d)
    ring_timers[n].metro.time = util.clamp(ring_timers[n].metro.time + (d / 100), MIN_INTERVAL, MAX_INTERVAL)
    arc_redraw()
  end
  arc_redraw()
end

function toggle_gate(timer)
  if timer.gate then
    timer.gate = false
  else
    timer.gate = true
  end
  print('gate '..timer.index..': '..tostring(timer.gate))
end

function arc_redraw()
  for i=1,4 do
    local rads = (ring_timers[i].metro.time / MAX_INTERVAL) * 2 * math.pi
    my_arc:segment(i, rads, rads + 0.1, 15)
  end
  my_arc:refresh()
end
4 Likes

if someone doesn’t beat me to it by the time I get around to it I’m planning on making a fairly straight port of cycles - - it will probably only take an afternoon or so

10 Likes

@andrew, oh yes, that would be really great and much appreciated!