Duplex : Notes On Wheels

Notes On Wheels is a sample-sequencing beast, hard to control, but I think it’s easy enough to understand how it works. Ever tried working with hardware sequencers?

As for it now being ‘ported it to Duplex’, this simply means that it now features bi-directional communication (between hard- and software), unlike standard Renoise midi mappings. But since you are using a software-based interface (the virtual control surface), this doesn’t really matter.

Edit: just noticed that the ‘learn’ feature slipped into this release. It only works when line spacing is set to 1

Looks pretty cool. Also, lemme think about what a phrase arp would sound like…


Yep, and I especially loved how you can just use a hardware sequencer as a midi note storage device and then send the sequencer notes or CC commands to make it play the next note in the stepsequencer memory…

Here’s another work in progress - now with continuous output.

Continuous output will ensure that you can create a sequence of any length, and N.O.W will output the notes seamlessly between patterns.
So it’s easy to do something interesting with polymeter rhythms - just make sure you have a enough patterns before you start recording, or alternatively, use the “Auto Clone Patterns” tool to add new patterns on the fly

If you want to try it out, simply overwrite NotesOnWheel.lua with the attached file.
If you haven’t got Duplex installed, follow the instructions in the original post :slight_smile:

Edit: removed the attachment

Will test this out now, looking forward to seeing how it performs

Cool!! Here’s most recent version with a lot of new features & fixes…

 * New mappings: shift up/down (push-buttons)  
 * Will now output from playback-pos when playing, edit-pos when stopped  
 * Continuous mode support: write sequences across patterns  
 * Better learning: able to determine the spacing, length and offset of the existing sequence   
 * Mode-toggle buttons: hold to produce output  
 * Fixed rounding issue when adjusting gate length (sometimes output wrong Fx command)  
 * Latch recording: 'write' button able to blink when playback is stopped   
 * Tweak: when going from many to fewer steps, remove the instrument values from obsolete tracks - this will cause them to be ignored when learning  
 * Tweak: disable write when a new song is created  

Hi… Are there any plans to make this capable of (nondestructive) transposition based on which note you play into the gui from the computer keyboard? :)

Absolutely. I’d like to take it a few steps further too, by allowing multiple keys and then alternating between them for each step in the sequence, hence the ‘arp’ in ‘phrase arp’.
So, if you had a sequence going C-C-C-C, and you pressed C+F, the output would become C-F-C-F. With the learn function, any transpose could then be ‘destructively’ applied to the actual sequence if you wanted to.

Not 100% sure how to implement it, though…those ‘arp keys’ work independently of the other controls, and there is so much stuff already.
So for now, I’m thinking about just doing the keyboard input, using a single note and providing a reset button. And learning a sequence would reset it as well, obviously.

Hi. I wud really recommend going through http://scene.org/~esa/zyklus .

Thanks, that was definitely interesting to read. I thought I knew my (electronic) music history, but I’ve never heard about Zuklus. 1988, eh?

By reading the article, I think I’ve understood enough to tell you a bit about the conceptual difference between N.O.W and Zuklus, as they are actually very different from each other. First and foremost, Zuklus relies on storing it’s sequences in memory, and supports multiple sequences at the same time, whereas N.O.W is working with a single sequence at a time, and doesn’t rely on storing presets (yet) - instead, it can learn from it’s own output. This is a very important point regarding N.O.W, that you are able to produce a huge amount of unique sequences, and then pick any point in the timeline, and apply those settings to the sequencer.
Being able to learn from one’s own output is also the reason why N.O.W is using unique note columns for each step in a sequence (well, apart from the fact that they are very easy to manage afterwards).

While this synchronicity between input and output does impose certain limitations, it doesn’t mean that performance and workflow cannot be improved further: For example, one of the planned features for N.O.W is the ability to ‘lock’ it. This would simply be a button which, when enabled, would lock the currently active instrument & track that N.O.W is using. This could potentially even be stored within the song (by assigning a specific name to the instrument and track). Then, any song which rely on N.O.W would instantly be ready for use when loaded, with the right sound (instrument) and effect (track dsp chain).

After weeks of hard labour I can finally say that N.O.W. has gone beta.

Check out the first post (updated with download link and proper documentation) :

Enjoy, and tell me what you think (strike that, I’d rather just hear the results!!)

Well, i can’t tell anything about your Notes on Wheels yet,
Here is what it does out of the box: (Yes i uninstalled the old duplex first)

'C:\Users\vvoois\AppData\Roaming\Renoise\V2.7.2\Scripts\Tools\com.renoise.Duplex.xrnx\' failed to execute in one of its menu entry functions.  
Please contact the author (danoise [bjorn.nesby@googlemail.com]) for assistance...  
std::logic_error: 'invalid mute column value '1'. valid values are (1-0).'  
stack traceback:  
 [C]: in function 'mute_column'  
 .\Duplex/Applications/NotesOnWheels.lua:2383: in function 'set_num_steps'  
 .\Duplex/Applications/NotesOnWheels.lua:2136: in function <.><br>
  [C]: in function 'NOW_Sequence'<br>
  .\Duplex/Applications/NotesOnWheels.lua:807: in function 'create_empty_sequence'<br>
  .\Duplex/Applications/NotesOnWheels.lua:531: in function 'start_app'<br>
  .\Duplex/Browser.lua:1555: in function 'start'<br>
  .\Duplex/Browser.lua:568: in function 'start_current_configuration'<br>
  .\Duplex/Browser.lua:519: in function 'set_configuration'<br>
  main.lua:31: in function 'create_browser'<br>
  main.lua:41: in function 'show_dialog'<br>
  main.lua:121: in function <120><br>

Though the response looks also like an API bug, the value 1 clearly corresponds to a valid value.<br>
Just to inform you:You need to add a Master and Sendtrack filter in this routine so that it doesn't mess up when the cursor is placed in the master or sendtrack.</120></.>

Yeah, I noticed that as well.

Thanks, this should be easy enough to fix!!

Ok, should have first read through the documentation on how this thing actually works :slight_smile: , but yeah…trying to run it with my bcr2000 and am encountering slow down quickly when tweaking in notes. Is this because of Renoise’s undo collection, is there a way to optimize this?

Ensuring good performance is not yet covered by the docs, but let me just tell you that the FILL mode is a potential CPU hog!! (No wonder really, as it’s writing dozens or even hundreds of lines several times per second…). Did you enable this when it happened?

In general, retriggering notes is a bit heavy and could probably be optimized some more - especially when the retrig count is high.

Edit: while on the subject of things not covered by the documentation, I did a bit of a hackish workaround for the virtual keyboard: if you’re using a keyboard layout other than english, you might experience wrong notes when inputting multiple notes while holding shift (transpose is working OK). This is due to a limitation in the API described here.

Second beta has arrived with much less CPU usage, and external MIDI keyboard support

Goto Duplex beta versions for the most recent download link

Full list of features & fixes:

  • Optimize: precalculate @gate_cached
  • Optimize: scheduled updates, use the idle loop to reduce CPU usage
  • MIDI keyboard input (add as option listing available MIDI ports)-
    • Detect multiple pressed keys, update sequence length on release
    • Pitchbend is hardwired to @pitch_adjust
    • CC is hardwired to @multi_adjust (pitch is ignored)
  • Fixed: virtual KB had a couple of minor bugs
  • Fixed: skip master/send tracks when writing output
  • Tweak: start output (‘touch’) when using virtual keyboard
  • Tweak: output immediately when starting playback (first line)


I used the sprachenspell sample from the Renoise kit to produce this little gem


Another update is ready - download is already on SVN, packaged tool coming later…Edit: here it is
I took some time to finish a couple of new features that I missed while using this thing - especially, the ability to clone steps.
Also, support for the Remote-SL25 controller is complete - and support for many more controllers is coming.

  • Added: control-map assignements for Remote-SL-MKII
  • Feature: continuous/endless write in looped patterns
  • New mapping: ‘extend’, expand sequence by repeating it
  • New mapping: ‘shrink’ - reduce to half the number of steps
  • Changed how global retrig-adjustment works: it now multiplies steps, instead of adding to them (more musically relevant values)
  • Global mode: (when disabled) always output note along with retriggers
  • Prefix tooltips with “NOW”, provide more useful descriptions…
  • Fixed: some controls did not use position when assigned to hardware
  • Fixed: a learned sequence is adapted to sliced instrument
  • Fixed: setting length to 0 can cause output to stop
  • Fixed: write mode (latch) always wait for touched control
  • Fixed: sliced sample support, highest slice was sometimes unavailable
  • Fixed: sliced sample support, check when slices are changed (notifier)

@danoise: i have not tried this app out (yet) because i don’t use a midi-controller. would it be possible to also have the features of Duplex/Notes on Wheels with sample-based instruments?