nmQuadroDubber

nmQuadroDubber

Overdub external audio onto four tape loops

nmQuadroDubber

I only have a Norns Shield for two days, so this is my first proper project, after only a small encoder test script hacking. Yay! How cool is coding in Lua?! Anyway … I’ve had this idea in my head for a while and thought it might be easy enough to get me acquainted with the system.

There are four tape loops onto which you can record external audio. At any time you may set the record head to another loop, splitting the external audio across the loops, which are stereo-panned from left to right. An overdub level control lets you adjust the mix between the old audio on the tape loop and the new one. It’s fun :smiley:

Requirements

  • Norns
  • Softcut
  • External audio input (or audio from Tape)
  • MIDI input (optional)

Documentation

There are four 20-second “tape loops”, represented by four vertical columns, stereo-panned from left to right.

A record head, represented by a white line, constantly moves over one of the loops. Make it jump to another loop with E3 (t). Press K2 (rec) to start and stop recording external audio at the position of the record head. Erase the tape by pressing K3 (del).

Adjust the speed of the currently selected tape loop by turning E1. Reverse playback is possible too, by turning E1 counterclockwise past zero. The speed is indicated by the number in the bottom right corner of the screen.

Turn E2 (lvl) to adjust the overdub level. 10 means the external audio will overwrite the tape completely. Turning E2 (lvl) down will record the external audio quieter, letting the already present audio on the tape loop still sound trough, mixing both signals.

Hold K1 to display alternative control functions.

Holding K1 and pressing K2 (rOFF/rREC/rDEL/rALL) will switch random modes:

  • rOFF: random mode off
  • rREC: randomly toggle recording, switch tape loop and change level
  • rDEL: randomly toggle deletion and switch tape loop
  • rALL: both of the above

Holding K1 and pressing K3 (clear) will erase the entire tape loop under the record head.

Holding K1 and tuning E1 offsets all four tape speeds.

Holding K1 and turning E2 (fade) adjusts Softcut’s fade parameter, inserting a fade between loop start and end points. Turning this up can make the audio sound smoother.

Holding K1 and turning E3 (mon) blends between monitor and Softcut audio signals, letting you hear the external audio feed on top of the tape loops.

All displayed parameters (and some more) are exposed in Norns’ EDIT/MAP menus, for easy MIDI mapping.

Enjoy!

Version History & Download

v1.0.0 - Initial release.
v1.0.2 - Added a lot of code comments, cleaned up formatting, added random record and delete functionality.
v1.0.3 - Bug fix of random record and delete functionality.
v1.0.4 - Added reverse tape playback.
v1.0.5 - Individual tape loop speeds and code improvements.
v1.0.6 - Added MIDI control.
v1.1.0 - Major rewrite to add PARAMS functionality and @neauoire’s MIDI device helper code.
v1.1.1 - Panning is now adjustable via the EDIT/MAP menus.
v1.1.2 - Parameter range/step improvements and minor tweaks.
v.1.1.3 - Pan fix

Download GitHub ZIP File

Installation

in Maiden:

;install https://github.com/TuesdayNightMachines/nmQuadroDubber/

Fun Facts

I wrote this script entirely on my iPad in the Textastic app. This cool text editor with Lua code highlighting also has SFTP and SSH clients built in, so I could run Matron-REPL and transfer files to my Norns Shield from within the app easily (the latter even with just one keyboard shortcut!).

It’s the ultimate couch and travel setup:

65 Likes

this looks awesome! congrats on your first script :partying_face: :partying_face: :partying_face:

it looks like you set up one repo to host all your norns work, as opposed to one repo per script. if you want people to be able to download just the one script it might be easier to split them up. :slight_smile:

3 Likes

Thank you! Changed the GitHub repo situation and now it should work :slight_smile:

3 Likes

Awesome first script! excited to try it out. still heartbroken and mourning you selling your serge panels :sneezing_face: your serge jam vids on yt were some of the tipping points that convinced me to ditch euro and go full serge :+1: :fist: :metal:

1 Like

Thanks! Glad you liked the videos and that they were useful to you. I do miss the Serge, but I wanted to try something else that I needed the money for and I thought that I can always revisit that beautiful format in the future :slight_smile:

1 Like

Fun stuff! Cutting up some bollywood tapes into it from a modified speed-controlled Walkman :slight_smile:

Edit: oh wow, mixer feedback thru this thing is nice + Ryoji Ikeda-esque!

3 Likes

Thank you! :slight_smile: How did you set up the feedback loop?

just a simple mono Aux send from my main mixer into the norns. Some more elaborate setup with stereo (maybe L+R swapped) should be interesting with this script, might try. Also I tried putting the Norns compressor on to get more gain going tho didn’t yet experiment much with that

1 Like

Love how simple and easy this is to use. Can get right into things with it :slight_smile: !

1 Like

Thank you! Yes, just hit record and jump left and right :smiley:

I’m very interested in coming up with small, simple scripts that work with the Norns keys and encoders alone, without other external controls.


EDIT: Updated the script with lots of code comments, in case somebody wants to customize stuff.

Interesting things to alter could be:

  • sample time (currently 20 seconds at rate 1.0 for each of the four tape loops)
  • tape speed (currently only forward playback rate from 0.1 to 4.0, screen drawing will probably break on reverse playback :sweat_smile:)
  • add functionality to K2 button in the alt menu (while K1 is held)
6 Likes

For some reason I can’t get any sound out of this script (even after a restart)
It doesn’t look like I’m getting any errors

@NightMachines
SUCH a cool script!
digging into it right now!!!
i know this is WAY early to be asking…but…it would be super awesome if the REC and DEL could have S&H LFOs assigned to them or also…if they could have MIDI control to turn them on and off. :stuck_out_tongue:
also being able to switch tracks with MIDI or LFO would be cool too!

@Cementimental DITTO on the Ryoji Ikeda!!!
a big fan of his…got to see him in concert at the (sadly) last Day For Night and it was absolutely fracken incredible!
super intense violent noiz!
i immediately went out and bought every album i could get my hands on.

3 Likes

Strange. If you hold K1 and turn E3 (mon) up, you should hear the external audio come through. Does that work? Also check in your audio mixer parameters that incoming audio is turned up and that softcut is heard, etc.

Thank you! Although I wanted to create scripts that run with the Norns alone, MIDI support would indeed be great addition to have all adjustments exposed and to remote control them. I‘ll look into it :slight_smile:

S&H is a cool idea too, to make this script a “set & forget” machine in a music setup, that just does its thing. There is still one button function in the K1 alt menu unassigned (K2), so I will see that I add an on/off button for a this feature there.

Great ideas!!!

4 Likes

[quote=“NightMachines, post:13, topic:44127, full:true”]

oop…forgot to mention the LEVEL!
having that change along with other things as well would be super cool!

i currently have it on a pair of AUX sends and i’m going crazy with hitting buttons and changing the LVL!
:stuck_out_tongue:

1 Like

Oh yes, of course level and tape loop have to change randomly :+1:


@SPIKE
Done! Version 1.0.2 is up on GitHub and I’ve updated the OP above too.

Hold K1 and press K2 to switch through the random modes now. Probability of change is currently still hardcoded to 50%, but you can change it via the very first variable at the top of the script called rndProb.

Still need to test this for bugs, but it’s certainly doing random stuff now :smiley:

Thanks for this great suggestion!


EDIT: Updated to 1.0.3 with a minor bugfix. Hopefully the random mode recordings and deletions now match up with the display :wink:


EDIT: Okay, so next up will be MIDI control then. I have to take a look at the studies first, to figure out how that’s handled and then rewrite some of my code. I’ve learned that I need to use a lot more functions, instead of writing features directly inside the key/encoder listeners. E.g. call a separate “record” function when a key is pressed instead of writing the whole record routine inside the key press function. Whoops.

So while I do that research and re-structuring (probably on the weekend), how should MIDI be implemented? My ideas/questions so far:

  • four MIDI CC#s for fade, monitor, tape speed and overdub level values
  • one MIDI Note to toggle record on/off (or should it be momentary on/off while note is held? Or a CC# switch?)
  • one MIDI Note to toggle delete on/off (or should it be momentary on/off while note is held? Or a CC# switch?)
  • four MIDI Notes to jump directly to tape loops 1-4 (or four CC# switches? Or one CC# range to jump between loops? E.g. CC# 0-32 selects tape 1, 33-64 tape 2, etc.)
  • two MIDI Notes to jump left/right between loops (like the E3 encoder does)
  • a MIDI CC# range to select random modes (e.g. CC# 0-32 selects rOFF, 33-64 rREC, etc.)

What do you think? Or should I skip MIDI Notes altogether and just use CC#s? Coming form Gotharman gear, I’m very fond of CC# sequencing :wink:


yet another EDIT (lol)

I’ve released another quick update v1.0.4 which introduces negative (reverse) tape playback rates. So now you can also play the loop backwards by turning E1 counterclockwise past zeerrrrrooo o o o oorrrreeeeez tsap esiw… :metal:

6 Likes

very nice! enjoying my first outing with it…

one question, though… is there any way to see what pitch you’re at when you turn the encoder to pitch shift? i don’t see a + or - indicator… and it’s hard to go back and find your original pitch once you’ve started pitch shifting around…

a simple + or - pitch step display would be quite useful.

interested in hearing other tips and tricks… on the surface it seems like a simple looper but when you start jumping around and randomly recording/deleting things get interesting.

would be nice if the 4 loops could be different lengths!

2 Likes

Thank you for trying my script!

No problem. I’ll put that in the next version :slight_smile:

I think it really is just a simple looper that gets a bit more fun when splitting the recordings across the loops :man_shrugging: Not sure if there are any more tips or tricks :sweat_smile:

I have thought about this too, but I feel that this might overcomplicate things for my little script. It would also not really work with the current visualization of the four columns.

Although, I suppose I could simply let the user set the playback rate of each loop individually and then I’d only need to add a visible playhead line for each one. Hmmm :thinking:

2 Likes

oooh. individual speed/rate for each loop would certainly open up some fun stuff!

i agree, not over complicate.

pitch display tho. thank you for considering!

3 Likes

Alright, fellow QuadroDubbers, a new version is up on the GitHub!

v1.0.5 lets you adjust each tape loop’s speed individually. The speed value is displayed in the bottom right corner of the screen.

nmQuadroDubber

To make this work I had to rewrite my shamefully bad screen drawing and syncing routine, so thanks for pushing me in this direction with your feature requests! As I wrote in the first post, this is my first Norns project and it’s also my first coding project that involves a screen which has to be addressed on a pixel level. I’ve only done some mild Arduino, Java, JavaScript and Python coding before and while that might sound impressive to people who don’t code at all, I’m still so much of a noob and rarely venture past if/else statements.

But Norns is fun and it feels the right level for me to joyfully grow my coding skills a little further!

Now back to dubbing!

16 Likes

WOO!!!
THANK YOU!!!
can’t wait to update!

so cool!
(of course i am going to completely agree with any Gotharman decisions. :stuck_out_tongue: )
i would just stick with CC# for everything.

3 Likes