a collection of uncertain delays using norns softcut

tunnels is a collection of randomized, experimental stereo delays built using softcut. the base script does not include an engine that makes sound, so you will need to provide via the inputs. I am hooking tunnels into a few existing scripts and will share those soon here. users are encouraged to create new modes and share the results (code/audio) here. I also plan on continuing to add new modes as I experiment more with softcut (huge thanks to @zebra). all of the mode names - along with much of the inspiration - are taken from An Interface for a Fractal Landscape by Ed Steck (Ugly Duckling Presse, 2019). thanks, Ed.


norns 2.0+
audio input


page 2: tunnel modes

  • local tunnelmodes = {“off”, “fractal landscape”, “disemboguement”, “post-horizon”, “coded air”, “failing lantern”, “blue cat”, “crawler”, “hanging mosses”}

page 3: control modes

  • manual: K2 & K3 randomize params
  • input frequency: left input freq determines param randomization
  • input amplitude: left amplitude determines param randomization

page 4: input modes (left or left/right)

  • one lane: one buffer, left input
  • two lanes: two buffers, both inputs

K1 (hold): clear buffer(s)
K2 & K3: randomize voices/panning (manual mode)


v1.1 - https://github.com/speakerdamage/tunnels/archive/master.zip

Update Notes


  • added Passersby script w/ tunnels page. mode selection only. K2 + K3 on tunnels page (only) to randomize params.
  • replace entire folder if you already have v1.0 installed, as the base script and lib file have been updated.
  • optimizations will make it a lot easier to add tunnels to existing scripts.

this is really great for experimental soundtrack type stuff. The presets turned my music into a sci fi horror movie :slight_smile: I think assigning a controller to the delays / feedback in the parameters section is an absolute must to get the full benefits of this for bending through time.
I really enjoy stepping through the presets for even weirder stuff. Would be interesting to have access to midi cc of those presets in the parameters section also.
If you like Haven synth, then this is up there for strange sounds.
Seriously great app for sound design.


glad you like it! it still needs a fair bit of work: cleanup lib file, do something more interesting with freq/amp (those were just tacked on), a few more assignable params, etc. I really just wanted to get out what I had because everytime I sit down with it I get lost in tweaking ‘presets’.

I’ll also say that it has much less of a horror vibe (which I love, don’t get me wrong) when using with passersby :wink:


I am loving this. Even with no audio input it’s magical. And very musical. Nice work thanks for this!

1 Like

Very excited to check this out!


Love it with the sine, eerie and dreamy, really love it. Will we be able to try the Passersby version too? :innocent:

1 Like

I was debating letting my Norns go, but Tunnels, after a single session, has complicated the matter :slight_smile: Seriously amazing work. Had a great session pairing it with Cocoquantus and everything was gold.


v1.1 is here w/ passersby + tunnels added (thanks to @markeats for base script awesomeness) - see top post for notes.

replace entire tunnels folder if you already have 1.0 as there are breaking changes to lib/base files


Hi guys, this is Tunnels with Three Sisters and Just Friends.
Thank’s @speakerdamage , this script is awesome!


thanks so much for sharing @mlogger and @elia! I love hearing it in these two wildly different contexts.

I finally put aside the screen and just played it last night. this is guitar (live, no overdubs) into a few modules then into tunnels (new mode):


That’s great and scary. It sounded nothing like a guitar and more like a steam train and orchestra :slight_smile: What I like about Tunnels is how it always transforms the source material into something unique and interesting. It’s definitely great for soundtrack type stuff. I like music where you can’t quite make out how it was made.


if i’m using tunnel within another script, how do I get it to be in stereo as default? Currently only have left output and i feel like i’m being a bit slow here…!

edit - took a look at the passersby tunnels script and that taught me everything i needed!


Because it’s a multidelay, It works great on very short plucky sounds, and you start to really hear what the script does. I love the fractal preset with the jumping stereo panning.

Heres Tunnels with an Easel


Sounds great. Just to clarify it a bit, the modes/presets all randomize different params and bounds within those params. So if you have it on the Fractal one, it will probably never be the same twice, but it will have a general ‘sound’. Tip: if something in the far left voice sounds good, press key 3 to randomize the far right voice- you can get some interesting subtle (or not, ha) changes that way due to the feedback routings. Also the panning jumps around slightly on every change. voices 1 & 2 are far left & right, 3 & 4 are closer to center.

Edit: that wasn’t all meant to be directed at you @mlogger - just realized from your post that maybe I didn’t explain some basic things that might not be obvious to others (esp if you don’t look at the code)


no worries, i was using v1.0 in the video, not the v1.1 with the additional randomise and Passersby stuff. is it possible to control the passersby with a grid instead of midi keyboard?

1 Like

Only just seen this! Looking forward to checking it out. I’m guessing it should be fairly straight forward to shoehorn into another script that doesn’t use softcut… (Like Less Concepts etc?)

1 Like

yep, the only real challenge is figuring out how to handle the UI. with passersby it was easy due to existing UI library (see below)


add/edit a few things at the top:

local tn = include('tunnels/lib/tunnel')
local tab_titles = {{"Wave", "FM"}, {"Env", "Reverb"}, {"LFO", "Targets"}, {"Fate"}, {"Tunnels"}}
local tunnelmode = 1
local tgroup
local tunnelmodes_list
local tunnelmodes = {"off", "fractal landscape", "disemboguement", "post-horizon", "coded air", "failing lantern", "blue cat", "crawler"}

add this function:

local function update_tunnels()
  local tm = tunnelmode
  local tg = tgroup
  tn.randomize(tm, tg)

add this to encoder function:

-- tunnels
  elseif pages.index == 5 then
    if n == 2 then
      tunnelmodes_list:set_index_delta(util.clamp(delta, -1, 1))
      tunnelmode = tunnelmodes_list.index
      tgroup = 1
      tgroup = 2
      screen_dirty = true

update key function:

-- Key input
function key(n, z)
  if pages.index == 5 then
    if z == 1 then
      if n == 1 then
      elseif n == 2 then
        tgroup = 1
      elseif n == 3 then
        tgroup = 2
    if z == 1 then
      if n == 1 then
      elseif n == 2 then
        pages:set_index_delta(1, true)
      elseif n == 3 then
        tabs:set_index_delta(1, true)

add to init:

-- tunnels
  -- need to set to 0 here for some reason
  for i=1, 4 do
    softcut.level(i, 0)
tunnelmodes_list = UI.ScrollingList.new(8, 8, 1, tunnelmodes)

add to redraw function:

elseif pages.index == 5 then

I would love to add this (or other softcut things… cranes?! @Dan_Derks ) to Less Concepts. haven’t thought about the best way to handle it in that case. it’s only one page on norns so I suppose the UI lib could be added…


I have a WIP version of Less Concepts brewing that might help – I’ll share by the weekend :slight_smile:

btw, I’m so stoked by Tunnels! super inspiring use of softcut