Can I midi-map 'schedule next sequence'


(brisket) #1

I want to assign a button to schedule the next sequence – not play it immediately; ie, same as a left click on the pattern number, not a double-click.

Even better: assign scheduling to all the patterns (would give pretty much the same functionality as ‘scene’ launching in other programs).

This seems so obvious, I’m wondering if I’m overlooking a simple setting somewhere.


(Djeroek) #2

Have you searched in the midi-map window (press ctrl+m)? Or maybe with button, you mean computer keyboard? Than you should look in the preferences\keys for the keybindins, not sure it is there though.


(brisket) #3

Yeah, I looked in the midi-map window but couldn’t find an action for this.

Maybe I’m looking under the wrong name? If so, please let me know what I should be looking for!


(danoise) #4

What you want can be done by opening the mapping dialog, CMD/CTRL+M

Then search for “schedule”. You will get a lot of choices :slight_smile:

The following is still useful, (I originally misread this as “sections”, not “sequence”…)

Sections are really useful, but not MIDI mapped in Renoise by default.

Luckily, we can quite easily customize the built-in MIDI mappings

Here’s the procedure for overriding the default mappings

  1. Go into the Renoise program folder (on my machine, it’s “C:\Program Files\Renoise 3.1.0”

  2. In the folder “Scripts” there is a file called “GlobalMidiActions.lua”. Mark the file for copy

  3. Now head into another folder - Renoise help menu > Show Renoise preferences folder

  4. Finally, in the subfolder “Scripts”, paste the file as “GlobalMidiActions.lua” (same name).

  5. Now Renoise will use this file instead of the default one.

To add section scheduling, we can add the following using a text editor

-- Seq. Triggering:Schedule:Section 

local schedule_section_pos_by_seq_pos = function(sequence_pos)
  local rns = renoise.song()
  local positions = {}
  for k,v in ipairs(rns.sequencer.pattern_sequence) do
    if rns.sequencer:sequence_is_start_of_section(k) then
      table.insert(positions,k)
    end
  end
  if positions[sequence_pos] then
    song().transport:set_scheduled_sequence(positions[sequence_pos])
  end
end

add_action("Seq. Triggering:Schedule:Section XX [Set]",
function(message)
  if message:is_abs_value() then
    local sequence_pos = clamp_value(
      message.int_value, 1, song().transport.song_length.sequence)
    schedule_section_pos_by_seq_pos(sequence_pos)
  end
end)

for sequence_pos = 1,MAX_SEQUENCE_MAPPINGS do
  add_action(string.format(
    "Seq. Triggering:Schedule:Section XX:Section #%02d [Trigger]",
    sequence_pos),
  function(message)
    if message:is_trigger() then
      schedule_section_pos_by_seq_pos(sequence_pos)
    end
  end)
end

Insert that code at the end of the file, save, restart Renoise and you should be ready to go


(brisket) #5

Hey thanks, nice clear directions, that seems to be working. (Also for the surprise update, I’m loving the new filters.)

A follow-up question: in the midi-mapping I can map ‘Select next sequence’, but only as [trigger], not as [set]. Is there any way around this?


(danoise) #6

A follow-up question: in the midi-mapping I can map ‘Select next sequence’, but only as [trigger], not as [set]. Is there any way around this?

[Set] means that you supply some value along with the message - for example, CC number #01 might be mapped to control the scheduling, and by sending a value of 7 you are then triggering sequence #07. Send a value of 5 and you trigger sequence #05, and so on.

For an action like “Select next sequence” the value does not matter - this is why it’s labelled a [Trigger].


(brisket) #7

OK, I thought it was about when the action was implemented. What I want could maybe be called ‘schedule next’?

What I want to do: playing live, have a simple MIDI control to schedule the next sequence (not jump to it immediately). I can map ‘schedule sequence 2, 3’, etc to different buttons, but without bidirectional control it can be difficult to tell what sequence you’re up to (when you’re singing & bantering too as I tend to do). I have ‘play next’ but that skips abruptly to the next sequence, which isn’t what I want, I want the current one to finish first. Can I do this? (Thanks for your patience.)


(danoise) #8

If you follow the instructions above, you can add next/previous by adding this code to GlobalMidiActions

add_action("Seq. Triggering:Schedule:Next [Trigger]",
function(message)
  if message:is_trigger() then
    local seq_pos = song().transport.edit_pos.sequence + 1
    if song().sequencer.pattern_sequence[seq_pos] then
      song().transport:set_scheduled_sequence(seq_pos)
    end
  end
end)

add_action("Seq. Triggering:Schedule:Previous [Trigger]",
function(message)
  if message:is_trigger() then
    local seq_pos = song().transport.edit_pos.sequence - 1
    if song().sequencer.pattern_sequence[seq_pos] then
      song().transport:set_scheduled_sequence(seq_pos)
    end
  end
end)

(brisket) #9

THANK YOU. Really.

I’m stoked (Kiwi for EXTREMELY HAPPY) that the developer has taken the time to write this little bit of script for me, that maybe has no use for anyone else but is a big help for me.

Cheers!


(danoise) #10

Hey brisket,

it’s really nice to hear that you find them useful.

These mappings will work ‘out of the box’ in the next beta:

Seq. Triggering:Schedule:Section:Current [Trigger]
Seq. Triggering:Schedule:Section:Next [Trigger]
Seq. Triggering:Schedule:Section:Previous [Trigger]
Seq. Triggering:Schedule:Section:Section XX [Set]
Seq. Triggering:Schedule:Section XX:Section #%02d [Trigger]
Seq. Looping:Section:Current Section [Trigger]
Seq. Looping:Section:Section XX [Set]
Seq. Triggering:Schedule:Next [Trigger]
Seq. Triggering:Schedule:Previous [Trigger]

And we could add even more mappings. Suggestions welcome :slight_smile:


(brisket) #11

Ha, excellent!

I’m really curious if anyone else is using Renoise live in the same way as I am…? because they seem like useful actions…?


(danoise) #12

I’m really curious if anyone else is using Renoise live in the same way as I am…?

Absolutely - different artists have asked me for pattern sections to be supported in my Duplex Matrix application.
But since I have been working ever more closely with the Renoise API, it makes sense to have native support.


(Stamba) #13

I guess i’m missing something, but, using duplex (v 1.05 or 1.07b) with novation launchpad and renoise (3.1.1)… I’m not able to schedule pattern in Matrix + Mixer + Transport mode… even if “schedule pattern” mode is correctly selected in the settings for this mode…

Any clue ? :slight_smile:

Thanks a lot !

David


(danoise) #14

I guess i’m missing something, but, using duplex (v 1.05 or 1.07b) with novation launchpad and renoise (3.1.1)…

Wrong thread, I guess? But I am the author of Duplex - will check what’s up with this (have a LP myself) :slight_smile: