New tool (3.0): Mlrx

Duplex Mlrx (0.99)

inspired by mlr: the loop/sample sequencer
Download Duplex 0.99.1 (including mlrx)

Feature walkthrough


Four trigger modes

  • TOUCH - only output while a trigger is touched
  • WRITE - output while a trigger is touched, clear when not
  • HOLD - continuously output loop, press to retrigger
  • TOGGLE - continuously output loop, press to toggle
    Per-track phrase recording
  • Press PHRASE button to toggle between sample and phrase (within same instrument)
  • Press and hold the PHRASE button to record/capture a phrase
    [When playing] begin session recording of “whatever you play”, press again to stop recording and create phrase from recording
    [When stopped] instantly create phrase from pattern data underneath the cursor (same length as pattern)
    Per-track sample slicing
  • Press and hold SLICE button to enable/disable slicing for the selected sample
  • Mlrx detects when you have manually adjusted slices - they will not be overwritten unless you choose to
    Per-track shuffle
    Using the delay column, notes can be shuffled via additional delay commands
    Also, enable the optional Cxx command to cut off when notes are overlapping (for sharp percussive sounds)

Per-track automation modes

  • READ - only display recorded velocity and panning
  • WRITE - once touched, continuously output velocity and panning for the selected parameters
  • READ+WRITE - when touched, output velocity and panning for the selected parameters
    Secondary MIDI keyboard
    Connect a secondary MIDI keyboard to trigger sounds by note instead of offset

Per-track arpeggiator

  • KEY - arpeggiate between held notes on secondary keyboard (order of arrival)
  • ALL = pick random offset from all triggers
  • RND = pick random offset among held triggers
  • FW = step through held triggers, order of arrival
  • 4TH = pick random offset (in step of four) from most recent trigger
  • 2TH = pick random offset (in step of two) from most recent trigger
    Per-track “Drifting” mode
    This gives you the ability to change the offset for each note being written
    It has two modes: “restrict to cycle”, and “drift across entire sample”

Per-track output filter
Determine which parts of the output that are actually written to the pattern

  • [—] = Note output
  • [Sxx] = Sample/slice/phrase output
  • [Exx] = Envelope offset output
    Per-track cycle length
    Use this to determine the length of the loop
  • 1/1, 1/2, 1/4, 1/8 and 1/16: Use fraction of the entire duration
  • “Step” = Use edit step size
  • “Custom” = Use a precise value
    Independent transpose and beat-sync/LPB settings
    Previously, they were combined into a single value, which didn’t work very well…

More features

  • Option to (auto)collapse mlrx-tracks within pattern editor
  • Option to sync with selected track and/or instrument in Renoise
  • All song-specific settings are automatically saved - mlrx will continue from where you left it
  • Ability to “route” signals (aftertouch, key velocity, xy pad) to targets (group/track velocity/panning)
  • Natively MIDI mappable sliders (CTRL/CMD+M), e.g. for track velocity, panning etc.
  • Option to detect when new samples are being loaded, and automatically loop/sync them
    Grab it here

Quickstart tutorial

1. Start mlrx from the duplex browser
choose one among the supported controllers. currently, that means the Launchpad or monome128 (or you can connect your MIDI keyboard and use it as a supplementary trigger device along with the on-screen controls)

2. Place your sounds in the first instrument slots
mlrx works with samples (including ones that are sliced and/or contain phrases) - simply drag any sample/instrument into the first few slots of the instrument list to automatically assign them to the controller

3. Hit play in renoise, and press any trigger button
this is it - the instrument is now triggered at a specific sample-offset - depending on track settings, you will either hear a continuously looping sound, or a sound that keeps playing until you release the button: briefly playing sound == WRITE or TOUCH, continuously looping sound == HOLD or TOGGLE. in both cases, a playing sound will overwrite existing data in the track, but carefully using e.g. the TOUCH mode, you can build complex sequences and see the buttons light up, as pattern data is being fed back to the controller

4. “Forget patterns” :slight_smile:
this application is designed from the group up to support seamless recording and playback across pattern boundaries. this means that you can loop a 192 line-long sample - or phrase - across a 16 line pattern, the application will be smart enough to keep track of playback progress - including looped patterns, pattern sequence loops, or reaching the end of the song :slight_smile:

Would love to try it out, but keep getting this error:

@Vastique: sorry, but all I see is a broken image link…
Could you try to copy paste the error, and perhaps explain what you were doing, leading up to the error?

Notice also that, like Duplex itself, this is a tool written for Renoise 2.8.

My bad, I didn’t realise you can copy the error report. Silly me!

Im using renoise 2.8 with my launchpad. The error occurs right when I open Tools/Duplex/Launchpad/Launchpad Mlrx

Ah, should have known. I’m using some pretty crazy CC values for some of the controls (CC#1013), which obviously are out of bounds.
Don’t really know what I was thinking.

Please check out this fixed release, and see if that corrects the problem?

Alright! Now it’s working! I have no idea how this thing works but it’s fun as hell! :)

‘C:\Users\Kuzma\AppData\Roaming\Renoise\V2.8.1\Scripts\Tools\com.renoise.Duplex.xrnx\main.lua’ failed in one of its notifiers.

Please contact the author (danoise []) for assistance…

.\Duplex/Applications/Mlrx.lua:895: attempt to index field ‘?’ (a nil value)
stack traceback:
.\Duplex/Applications/Mlrx.lua:895: in function ‘_attach_to_song’
.\Duplex/Applications/Mlrx.lua:853: in function ‘_build_app’
.\Duplex/Application.lua:113: in function ‘start_app’
.\Duplex/Applications/Mlrx.lua:329: in function ‘start_app’
.\Duplex/Browser.lua:1768: in function ‘start’
.\Duplex/Browser.lua:715: in function ‘start_current_configuration’
.\Duplex/Browser.lua:1300: in function <.\Duplex/Browser.lua:1297>

This error was triggered by loading a song with fewer instruments than you have tracks in mlrx, right?

Because exactly on line 895, I am guilty of assuming some things … like that there are as many instruments as there are tracks. Bad practice, I know :slight_smile:
Will be fixed in the next release.

For now, simply make sure that you have enough instruments in the songs you load…and note that empty instruments count as instruments too (a new song has 10 of those)

I had the same error
then filled the track up with more samples than tracks
then I got this:

std::logic_error: 'invalid note_column index '1'. no note_column's are available. 0 may be allowed.'  
stack traceback:  
 [C]: in function 'note_column'  
 .\Duplex/Applications/Mlrx.lua:2067: in function 'track_output'  
 .\Duplex/Applications/Mlrx.lua:1714: in function 'group_output'  
 .\Duplex/Applications/Mlrx.lua:249: in function 'on_idle'  
 .\Duplex/Applications/Mlrx.lua:2039: in function 'on_idle'  
 .\Duplex/Applications/Mlrx.lua:183: in function 'on_idle'  
 main.lua:344: in function <342><br>

Basically, it's got something to do with not being able to set up before one starts using it. It might have something to do! with my usual startup song having 0 fx columns shown at start? (except on master &amp; sends) (PS they don't get auto added)<br>
Got it to work right after that error. Also in my case, assigning groups is not possible (or doesn't have visual feedback on the duplex window). The assigning does look exactly like I would have planned it though, this is something other mlrs miss, nice one! There must be a fix imaginable for the 'paging' to show the assignment.<br>
I would've imagined the running lights (which I don't see on my launchpad yet) to actually fall down, matrix style.<br>
Really cool work!!</342>

This tool looks amazing, it’s got me wondering if there is a way to use this (or other duplex tools) if you don’t have an external controller? Like could the computer keyboard be used? If not then maybe Touch OSC on an ipad is the way to go, I really wanna play with this tool

True to renoise, although mlr usually is horizontal, hehe. I had imagined that both should be possible, and specified simply as ‘orientation=vertical’ in the device mapping. In due time (isn’t really the highest of priorities right now).

Both are definitely possible, using touchosc as a controller for mlrx is already fully supported under the hood - just need a proper controlmap and mappings file to link it with the application - and some sort of keyboard support is also possible. It just begs the question how you would expect it to work - for instance, afaik the renoise API can’t really return key-release events, so we would need to implement separate trigger note ‘press’ and ‘release’ mappings. Or some clever workaround, perhaps.
I’m glad to hear about the enthusiastic comments. I’m pretty sure that mlrx will evolve into something really useful :slight_smile:

hey, I’m back from a little vacation, and trying to plan the next release.

I have a few question for you Cas (sorry it took so long)

I’m pretty sure the error you got was due to the song (template?) having group tracks in it, as group tracks doesn’t have any note columns - this first release of mlrx is brutally simple in this regard, it simply takes over the first few tracks of your song.

reading this a second time, maybe I overlooked your point - did you imagine that mlrx would in fact look at the existing song, and somehow attach itself to any existing groups?
(that would be a risky strategy, I think - you wouldn’t want it overwriting anything precious - but then, I would like to know what you mean by “something other mlrs miss”)

I’m definitely lost here, as to what paging/assignment you refer to

the next release will rectify some of the nasty habits of this first release - focusing on the overall solidity of the application, making it less prone to breaking when swapping, deleting and inserting tracks or instruments

secondly, I imagine that mlrx would have a startup procedure which will attempt to load a previously saved session, or create a default one. once initialized, the song will then contain a special group containing all the child tracks, which can be moved around as you please - and, as everything mlrx does is entered as notes and/or effect commands, the child track’s DSP chains are then completely “up for grabs” - adding FX and controlling them via automation envelopes is as easy as it would be in any other track

other than this, of course a few more supported controllers wouldn’t hurt …

A new version is up - you can grab the application lua file directly from google code

To install, simply download the lua file and navigate to the Duplex/Applications folder.
Then overwrite the old file with this new version and restart Renoise (or reload the tools)

(Update) You can now grab the official Duplex beta, if you want to download the whole release
Download is located here

What’s new:

  • performance: should be more responsive (critical parts of code have been optimized) - feature: re-assign track via select track + group toggle combination - feature: better handling of inserted/swapped/deleted tracks - feature: automatic creation, or take-over of "mlrx master group” - feature: retrieval/storage of per-song settings (stored in song comments) - new option: determine if tracks should be collapsed or expanded by default - ui related: added instr. number as part of track decoration - ui related: paint the track selector with the group color

Obviously, the most important thing in this update is the improved performance. The last release was perhaps a bit rushed, as I was going on a holiday and wanted it to get “out there” so I could get some early feedback. This release should feel more solid overall, and be much less likely to skip notes, due to improvements in the critical part of the code.
Also worth noting is the ability to assign tracks to groups via the controller. Now, the group matrix is merely useful as a sort of overview, since you can easily reassign tracks to any group using the “track selector” (on the Launchpad, the right-most column of buttons). Simply press the track button, and then choose one of the group toggles!

And, thanks to the early feedback I have added several improvements to how the whole application deals with missing tracks, instruments etc. You are now able to move the entire mlrx group around inside your song, it is no longer fixed to the first few tracks (also, you now have the option to collapse all the mlrx tracks if you don’t care about looking at the notes).

Finally, I have implemented a feature which will store all relevant settings for mlrx inside the song comments. This is done transparently, so you don’t have to configure anything. Once you load the song, it should simple recall the state of the application, including each track’s triggering mode, etc.

Just had an idea while jamming with this tool. I mean, I feel I can now work this thing, even when quantized to a single line.
So, with the fundamentals in place, it would be interesting to look at how the “improvisational aspects” of the tool can be improved.

Right now, the cycle length is great when you want to introduce a stutter-like effect, but it’s something you could do just by hitting a trigger fast enough. But how about having a button which, when pressed, will toggle between forwards and backwards playback?

So if the sound is already triggered, the reverse command could be inserted at the next (quantized) line, and if a sound was (re)triggered it would start playing in backwards mode.
And this state could then even be memorized per track, and stored in the song settings.

How would you imagine something like this to work? Feedback is most welcome!

A new day, a new update

I spent most of yesterday trying to catch any bugs that might still be lurking. Found the following six:

fixed: a sound whose length is longer than a pattern is always retriggered when the note was originally placed on the first line
fixed: wiping track lines would ignore the first line in a pattern
fixed: when switching track inside a group, scheduled note-offs should be quantized too
fixed: when switching between two tracks in the same group, make sure that the (now inactive) track has the line immediately following the note-off cleared as well
fixed: note duration for notes triggered in hold mode, with the trigger being released before the actual note-on now have the correct length (before it was always 1)
fixed: track summary not always updated when instr. props got modified

There are some minor optimizations here and there too. Please check it out!

Raw lua file is up on SVN

looking forward to try out this tool (hopefully soon). great idea.

No idea what I was thinking. Haven’t used it since, actually.

Nononono. I was speaking about the mlr concept of groups. And somehow someway I found the lights on the LP(S) looking like;
etc. - So I believed for a second that this was how you bind instruments to tracks (which should indeed be the renoise translation of any mlr’s “groups”), in mlrx. Thus I ranted on. How cool it would be to have that live assignment on deck, via what I would call ‘pages’ on the Launchpad - it showing and controlling another group of data while holding a button like session/user12/mixer.

Just a quick bump for this topic:

The Duplex tool is currently defunkt in Renoise 3.0 - I left for my holiday vacation just before the release - but once I get home, Duplex will have full support for Renoise 3.0
And this application - Mlrx - will then have support for phrases as well :dribble:


Slight bump, as there has been a new version available for a few days

I have updated Duplex for Renoise 3.0, download is located here

I promised phrase support stuff for mlrx, but only managed to make it a “feature preview” (you can trigger phrases but the running lights may, or may not, display correctly).

Also, for the next version of mlrx I have a few ideas:

First, I want to get rid of the “write a note-off when stopping a recording for a looped track” - it seems excessive, as the loop mode in itself is about producing a seamlessly (constant) sound.
If you want to stop the output of a looped track, this is still possible but it will then skip the automatic note-off and instead allow you to mute the track the standard way (non-destructive)

Also, I don’t like how the mlrx group is currently created on startup. Would be nice to have an “init” button that would create / take over the special pattern-editor tracks.