Transition Loop

Something I have missed in trackers since 1995 is the ability to loop the transition between two patterns. Like the last 16 lines of pattern 1 and first 16 lines of pattern 2. For this reason the transitions often get a lot less love than they deserve. Maybe we could create some sort of feature that lets you loop transitions. Or even better create a temporary “virtual pattern” which scopes arbitrary selection from sequential patterns, so you could pay a better attention to the transitions.

Oh, thats a nice Idea. I sometimes try to use shorter patterns as transition, but that still is very messy. And for those “virtual transition patterns” it would be nice to be as tightly integrated as normal ones, so one can easily use the automation editor and all other features.

YES! arbitrary line for line selections for looping (or beat synced??) would be real cool.
Although with Repeater you can… no you can’t. 16 lines max. (at 4 lpb)

I would use this all the time!

Yes In most DAWs you can set arbitrary loop points in the time-line. Pattern crossovers are certainly a weakness in renoise`s current looping options.

Maybe drag points could be added to block looping but you could drag over pattern boundries. Some handy shortcuts for increase/ decrease aswell and you`re away:

3664 loop drag points.png

[quote=“Ledger, post:4, topic:37187”]
Maybe drag points could be added to block looping but you could drag over pattern boundries. Some handy shortcuts for increase/ decrease aswell and you`re away:

3664 loop drag points.png

I did start making notes to try and do that as a Tool. Although it would never be 100% seamlessly perfect it would be possibly to achieve to hopefully a usable extent. Tools like the one that plays the pattern in reverse prove this.

Yes maybe a tool could be a stop-gap for this. As you say though it may not be reliable as tools run in renoise`s GUI thread. Needs a proof of concept prototype - so a case of who will get the testpad into gear and try it first :)

[quote=“Ledger, post:4, topic:37187”]
I would use this all the time!

Yes In most DAWs you can set arbitrary loop points in the time-line. Pattern crossovers are certainly a weakness in renoise`s current looping options.

Maybe drag points could be added to block looping but you could drag over pattern boundries. Some handy shortcuts for increase/ decrease aswell and you`re away:

3664 loop drag points.png

There is actually functions for doing everything you describe within the API and as they are direct parameters which it seems Renoise uses it shouldn’t be processing at the GUI thread speed, as I had previously assumed (before looking into it, after making the set start/end sequence loop shortcuts.)

But this brings me to a question on your image above. How did you get it to highlight only the numbers by the side of the pattern editor? That is exactly what Renoise does when I set it to loop such a range! (Ahh Block Loops displays like that.) Well the good news is you can set them to arbitrary values and have the start and end in different patterns even!

Here’s a snippet which will set the loop to whatever your selection is in the pattern editor. To clear it you will probably have to turn Block Loop on and off…

 local rns = renoise.song   
 local s = rns().transport.edit_pos  
 local e = rns().transport.edit_pos  
 s.line = rns().selection_in_pattern.start_line  
 e.line = rns().selection_in_pattern.end_line  
  
 rns().transport.loop_range = {s, e}  

I would have to learn how to use notifiers to allow you to change patterns and it follow to where you are. The way the values work you will be locked to the current pattern currently.

It will make part of my forthcoming Editing Shortcuts tool, once I feel it is complete enough to publish.

EDIT: This isn’t actually the thread I was looking to post that snippet in, somewhere there is one about setting block loops of any length within a pattern, which is what I was searching for. Oh well, it’s close enough to the right subject…

Here you go, a Tool which does exactly as asked for in the first post.

{Tool removed due to error.}

Set Loop Start/End will change start/end loop point to the edit cursor position.

If there is no loop set Renoise counts this as the same as a loop over the entire song, so when you first set one of them it will likely only remove a small section from the overall song.

Clear loop will clear it again.

I probably will go for this version in my shortcuts tool, or maybe both. Currently undecided. There is something nice about making a selection and using that to set your loop range…

Nice! but when I try and drag it onto renoise 2.81 here it will not install. The icon comes up as a recognized xrnx and I can launch renoise with it. It just won`t install.

Ahh I must of uploaded the version from before I fixed the error in the manifest.xml. Sorry for that, was late last night. I will get the correct version uploaded once I’ve had a shower :)

Here you go. Looks like I forgot to package it again after fixing the error in the local version. This one should work :)/>/>

(Version with the selection loop included below.)

[quote=“kazakore, post:11, topic:37187”]
Here you go. Looks like I forgot to package it again after fixing the error in the local version. This one should work

Attachment 3761 not found.

Thanks, this is a nice proof of concept, I am having trouble with timing across patterns - I will investigate further. Looping a selection would certainly be a good step on! Will keep an eye out for any updates.

The thing that this hilights for me though is that more than just looping between two seperate patterns, the virtual pattern idea would be more improvement. i.e. [Line 32 of pattern 6 to line 32 of pattern 7] This way you could have all your shortcuts functional like nudging lines up/down for syncopating chords etc. To keep all these, this would need to be a native feature.

There is no “proof of concept” type programming in this. In fact it turned out to be the most simple tool I have ever programmed! Each function is only a single line. It uses the internal method of Renoise for setting start and end of loop, whether they be looped sequence or block loop within a pattern. Therefore it should be perfect and I’m surprised you’ve found problems with timing, although admit I was rushed for time and didn’t carefully check it so I might need a +1 or something to get it to use the correct like.

The snippet I posted a few lines before the tool does exactly that!

Not likely to be one to this tool but the shortcuts will appear in a future tool of mine or useful editing shortcuts…

Fair enough. Thought I’d knock it together when I realised how simple it actually was after creating the shortcuts to set start and end sequence for the loop sequence area.

Wasn`t a comment on your code, just the implementation of looping across patterns, maybe not the best technical use of terms.

It looked like you were planning to implement it.

Ok, will still keep an eye out.

cheers

Actually I’ve just tested it and although it uses what appear to be parameters from Renoise, rather than relying on notifiers and the GUI thread, it does stutter when going back patterns in the loop. That’s a shame.

Well as I have all the code…

3762 uk.deaddogdisko.TransitionLoop.V2.xrnx

I actually had to rewrite the Clear function to work with selection. For some reason the basic method I used previously didn’t want to work with it.

will take a look.

Cheers for sharing!

Could you check your posted Xrnx snippet?
You have one closing parenthesis too many.

  
  
'C:\Users\xxxxx\AppData\Roaming\Renoise\V2.8.1\Scripts\Tools\uk.deaddogdisko.TransitionLoop.xrnx\' failed to load.  
  
Please remove this tool or contact the author (Kazakore | dj_kaza@hotmail.com) for assistance...  
  
main.lua:41: unexpected symbol near ')'  
  

Will try and find the time to have a look this evening if it’s quiet at work. Did check all function of the tool were working (at least from keyboard shortcuts) before packing and posting though…

I have only installed Renoise on the one computer at work I most often used. One of my colleagues is on it today. He was meant to finish at 6pm and is still here at well gone 9pm!!! Won’t he *%&£ing well go home?!?!?! :(

I think I might have some input to this discussion, as I have experienced this behaviour too
The stuttering is due to the way the loop is set - we basically have two methods:

renoise.song().transport.loop_range
-> [array of two renoise.SongPos objects]

and

renoise.song().transport.loop_range_beats
-> [array of two floats within 0 - song_end_beats]

The first one “sort of” adheres to the coeff (the 1/16, 1/5 and so on) being set in the Renoise UI, which can cause all manner of strange behavior.
But the second one seems to be precise enough to do exact line by line loops, regardless of the size.

Problem is, that you need to convert a position to the “beats” floating-point value, a bit tricky but consider the following code
(straight from the upcoming rewrite of the Duplex navigator app, feel free to use and abuse):

  
-- calculate the beat value from a renoise.SongPos object  
function get_beats_by_songpos(pos)  
  
 local rns = renoise.song()  
  
 local seq_idx = pos.sequence  
 local line_idx = pos.line  
  
 assert(#rns.sequencer.pattern_sequence>=seq_idx,  
 "Oops, the sequence index is higher than the available number of patterns")  
  
 local total_lines = 0  
  
 for i = 1, seq_idx do  
 local patt_idx = rns.sequencer:pattern(i)  
 local num_lines = renoise.song().patterns[patt_idx].number_of_lines  
 if (i == seq_idx) then  
 if (num_lines < line_idx) then  
 print("The provided line does not exist, using the pattern length instead")  
 line_idx = num_lines  
 end  
 total_lines = total_lines + line_idx  
 else  
 total_lines = total_lines + num_lines  
 end  
 end  
  
 local beats = nil  
  
 if (rns.transport.timing_model == renoise.Transport.TIMING_MODEL_SPEED) then  
 local tpl = rns.transport.tpl  
 if (tpl == 1) then  
 beats = total_lines * (1/24)  
 elseif (tpl == 2) then  
 beats = total_lines * (1/12)  
 elseif (tpl == 3) then  
 beats = total_lines * (1/8)  
 else   
 beats = total_lines * (1/4)  
 end  
 else -- TIMING_MODEL_LPB  
 local lpb = rns.transport.lpb  
 beats = total_lines * (1/lpb)  
  
 end  
  
 return beats  
  
end  
  
-- test the code (change the values as you please)  
  
local loop_start = renoise.song().transport.edit_pos  
loop_start.sequence = 1  
loop_start.line = 16  
local loop_end = renoise.song().transport.edit_pos  
loop_end.sequence = 2  
loop_end.line = 15  
  
local beat_start = get_beats_by_songpos(loop_start)  
local beat_end = get_beats_by_songpos(loop_end)  
print("beat_start",beat_start,"beat_end",beat_end)  
  
renoise.song().transport.loop_range_beats = {beat_start,beat_end}