Impulse Tracker Style Binding Suggestions?

I have made some additions to my tool which emulates the Impulse Tracker style direct access to the octave column, and I am going to update it to simply be a group of IT style bindings.

Today I have made progress with a binding which changes the instrument value within a selection to the current instrument, and a basic pgup/pgdn which takes into account the number of rows and the lpb to divide the pattern similar to IT. It also restricts movement within the current pattern, truncating the movement so the cursor reaches both the top and very bottom of the pattern. When paging up from the very last row, it moves to the more logical position, one line lower than might be expected. My brain had been taking this for granted in IT, and I didn’t even notice until now :)

Next is to add keybindings for expanding and shrinking within a selection (even though there should already be native keybindings assignable for these already existing mouse-only features!) :angry:

I also intend to make an IT style mix-paste, but I am not sure if the “alt+m , alt+m” double-press will work out, so it may take two key bindings. One to mix note/volume data, the other to mix note/volume/effect.

and how can we forget… insert-paste :yeah:

Anything we miss that I am not thinking of?

You mean like inserting complete chord or note blocks related to the pressed note? That would be cool.
There currently is a mix-paste option in Renoise, but it does not relate to the basenote you are currently pressing.

I was a fasttracker man back in the days, so can’t help you with that. Just want to say, I think it is great you’re trying to implement Impulse Tracker like functionality in Renoise. Seems like that program was far ahead of its time.

protman, keep on pushing. excellent work!!
double-press will (probably) never work with renoise, they didn’t think of it like that. ((well, Bantai proved THAT wrong)
and mad props for expand+shrink keybinds. i like what dBlue is doing with his expand-shrink pattern script, but to have expand-shrink as keyshortcuts and to have them function the way impulsetracker did would be extra-super-nice.

as regards to “what else is required”, i can’t think of anything.

Jonas: IT.exe was quite ahead of its time.

Shouldn’t be too hard to attach a keyboard shortcut definition to these functions in dBlue’s script.
Ofcourse the shortcut should then execute the last configured settings or the first default settings if not configured yet.

there’s a place for dBlue’s script and keybindable expand/shrink :) the… shall i say… power, of having expand keybinable and shrink keybindable is quite different to what dBlue’s script is doing :)

Okay, then also extend dBlue’s script to perform the ordinary shrink and expand actions.

what i meant was: one (dBlue) is good with a dialogue window and selections (dBlue), for “stop what you’re doing on the keyboard, click something, do something, and click okay”… the other is good for advanced edit parameters->shrink/expand keyboard only usage. both have a significant place for altering tracked data. i equate expand-shrink with the same fluidity of use as copy / paste selection and so forth. one (advanced edit parameters expand/shrink) should be without having to lift your hands from the keyboard, the other would be for more complex work (dBlue’s script).

just sayin’.

oh, and i kind of like what protman is doing with his impulse tracker shortcut re-instatement / introduction for Renoise, and having access to alt-f (expand) / alt-g (shrink) via keyboard during-tracking, without dialogue button stopping, is closer to impulsetracker behaviour, and thus i can see why protman is merging both set-octave and expand-shrink keybindings into a “impulsetracker style”-lua script for enabling shortcuts.

Here is a current WIP including impulse style octave editing, pgup/dn navigation, and set selection to current instrument.


– Thanks to suva for the function per octave declaration loop :)

for oct=0,9 do
renoise.tool():add_keybinding {
name = "Pattern Editor:Impulse:Set Note to Octave " … oct,
invoke = function() Octave(oct) end

renoise.tool():add_keybinding {
name = “Pattern Editor:Impulse:Set Selection to Current Instrument”,
invoke = function() SetInstrument() end

renoise.tool():add_keybinding {
name = “Pattern Editor:Impulse:Jump Lines Up”,
invoke = function() Jump(-1) end

renoise.tool():add_keybinding {
name = “Pattern Editor:Impulse:Jump Lines Down”,
invoke = function() Jump(1) end

renoise.tool():add_keybinding {
name = “Pattern Editor:Impulse:Shrink”,
invoke = function() Shrink() end

function Shrink()


– Emulates Impulse Tracker style pgup/dn where it locks the cursor within the pattern boundaries, and jumps more logically from the last row when pgup.
function Jump(Dir)

local new_pos = 0
local song =
local lpb =
local pat_lines =

new_pos = song.transport.edit_pos
new_pos.line = new_pos.line + lpb * 2 * Dir
if (new_pos.line < 1) then
new_pos.line = 1
else if (new_pos.line > pat_lines) then
new_pos.line = pat_lines

if ((Dir == -1) and (new_pos.line == pat_lines - ((lpb * 2)))) then
new_pos.line = (pat_lines - (lpb*2) + 1)

song.transport.edit_pos = new_pos


– Emulates Impulse Tracker’s direct access to the octave column. Optimally, I use alt+0 - 9. It also obeys edit step and makes for interesting arpeggiations and variations.
function Octave(new_octave)

local new_pos = 0
local song =
local editstep =

new_pos = song.transport.edit_pos
if ((song.selected_note_column ~= nil) and (song.selected_note_column.note_value < 120)) then
song.selected_note_column.note_value = song.selected_note_column.note_value % 12 + (12 * new_octave)
new_pos.line = new_pos.line + editstep
if new_pos.line <= song.selected_pattern.number_of_lines then
song.transport.edit_pos = new_pos

– Simply adds a shortcut to set the current selection to the current instrument.
– thanks vV and taktik for help using the iterator more efficiently
function SetInstrument()

local EMPTY_INSTRUMENT = renoise.PatternTrackLine.EMPTY_INSTRUMENT

local pattern_iter =
local pattern_index =

for _,line in pattern_iter:lines_in_pattern(pattern_index) do
– will be nil when a send or the master track is iterated
local first_note_column = line.note_columns[1]

if (first_note_column and
first_note_column.instrument_value ~= EMPTY_INSTRUMENT and
first_note_column.instrument_value = - 1


Hi protman, will this be updated to the Impulse Tracker Style script you had in the tools section? I hope you’ll be able to wrangle Expand/Shrink into shortcuts, for IT enthusiasts… Thanks in advance! Please do let me know :)

How can something so beautiful and complex as dBlue’s script be simplified into ordinary shrink + expand actions?

That you have to use the mouse explicitly in his routine currently doesn’t mean that some functionality of his script can’t be taken and use to bind to keyshortcuts and do the more simpler things that are desired (simply shrink * 0.5 or expand * 2).

Would this man completely flip out if I figured out how to ransack his code to get block0.5 and block2 out of his code?

I don’t think so, the code is being made public so anyone can fork it.
That’s also why i release code here. As soon as it ends up here, you may use it.
For sure also on the tool page, but it is easier to repost here than to dump thousands of small forks on the tools page.

Eeep, looked at functions.lua, manifest.xml, resize_pattern.lua and main.lua and it’s all (really functional) crazytalk to me :)

This brings up the issue how should we handle modications of somebody elses scipt.

It shouldn’t be too difficult to modify dblues script for example but then how should this modified script go about being published in terms of manifest etc.

Very nice man, thanks! I really wish we could get an Impulse/Buzz tracker pattern scroll mode (where the cursor isn’t always centered and moves instead of the pattern background)

D’you mean “Pattern-based Follow” instead of “Row-based Follow”

I’d reallly love that!

I think reusing the required code and creating a new tool and crediting dBlue would be more clever… If dBlue wanted expand-shrink_in_pattern_editor_without_dialog_window_stopping_tracking to be keybindable he would’ve done it himself, right? :)

You just send him PM with quotes like:

And then it should be alright i guess.