Instant Gratification - mapping to my controller

Instant Gratification - mapping to my controller

I have downloaded the instant gratification .tsi to use with Traktor Pro 2. I could like to change the mapping to my keys on my Remote SL 25. I basically want to transfer the 16 buttons of the midifighter to 16 of the keys on the keyboard.
The only way I have seen to do this is to look at the comments for each mapping and note which midi control changes this. This could take a long time.

Is there any way I can change the midi input for all the settings in one go?

e.g. The midi control for “Beatmash 1” is “Ch.03.Note.E2”. This midi control is maybe repeated 30 times throughout the entire mapping for one deck. How can I change them all in one go?

I will buy a midifighter one day I’m sure, but I’d love to try it out this way first.

nope you can’t. Welcome in the very boring world of Traktor’s controller manager.

Ouch! So then I need to write down what is already mapped for one button and go through them all individually. OMG - this entire mapping is around 500 different settings…

no pain, no gain

this

  • custom firmware for midifighters (additional notes triggered if you combinate certain buttons) I’m working on an emulation of this firmware for GlovePIE to go nuts on any 16 button controller (MPC etc…)

I didn’t really understand what you wrote until I looked I started to change the mapping.

My theory was this:

  • I go into MF_FX 4 Banks A
  • I order the column “Mapped to” by clicking on the header. This puts all the midi notes in order thus making them easier to change.
  • The first note I found was “G2” which related to Beatmash 4.
  • I clicked in learn and changed all the “G2” to a key on my controller.
  • I continued and changed all the Beatmash mappings for Bank “A”.
  • At this point I thought it would work - I’m wrong.
  • Pressing my beatmash keys only made delay kick in on FX2
  1. I don’t understand about the banks. I thought I could change all the mappings for Bank A and change Device Target to “focus”.

  2. I’m not new to this but I do it so infrequently it always feels like starting from new again.

  3. Any help or advice would be appreciated.

If I’m not mistaken, banks are like pages if you want. So to adapt the MF mapping you’ll have to use modifiers and depending on those modifiers, you may assign fx units to different decks.

This article may also help you to adapt it to your own controller as unlike your controller you may not have (probably not) a 5 fifth note sent after pressing 4 buttons:

I just thought…

I could change the midi signals my Remote SL sends to match the ones of the Midifighter…

That would work wouldn’t it?

nope, you’d still have to trigger additional notes in certain combinations.

I’m working on a simulation of the midi-fighter firmware for GlovePIE as we speak (or whatever this medium of communitcation is called). to convert any 16-button controller into a midi-fighter!

To an extent. The firmware quirks for super combos in the IG mapping are a very new thing, If you find an older version of it they’re all controlled by modifiers so yes, you could do that.

Arrgghhh! I can’t find an older version. Anyone? I have a gig in 12 hours time :slight_smile:

3rd thread on the midifighter forum… :roll_eyes:

That version is 1.0.2 - I was led to believe there was a version that didn’t use 4 banks… I have mapped this one and it doesn’t see to work on my controller

there’s no version of the IG mapping that does not require 4 banks mode. You can either map only one deck page of it to your controller, or set up pages (banks) on your controller if it supports that feature.

OK thanks. So I need to read through all the banks figuring out the midi messages for each of the buttons. I take Bank A, map those, make a new page, take Bank B and map those and so on.

Does someone not have a list of the midi messages with corresponding buttons and banks? I presume it’s already been done…

i’d be keen to see your glovepie script once done. today i’ve just written a lua script for my homebrew midimashing app to add a virtual midifighter to a page on my launchpad. it uses a 2extra midifighter virtual midi ports in loopMIDI so i can connect those to traktor while also using other output from the lp for other stuff etc.

this is the mf normal mode not 4banks mode (which i’ll have a play with in a bit). pasting here in case anyone else is doing something as mad as using lua or some other ‘glue’ to xlate between devices and/or in case the logic is any use. the 4banks mode shouldn’t be much harder to do.

still don’t know what extra combo messages might get send by the mf though - or are all combos just from traktor modifiers etc?

any2mf_map = {
["0,0"] = "C3", ["1,0"] = "C#3", ["2,0"] = "D3", ["3,0"] = "D#3",
["0,1"] = "G#2", ["1,1"] = "A2", ["2,1"] = "A#2", ["3,1"] = "B2",
["0,2"] = "E2", ["1,2"] = "F2", ["2,2"] = "F#2", ["3,2"] = "G2",
["0,3"] = "C2", ["1,3"] = "C#2", ["2,3"] = "D2", ["3,3"] = "D#2"
}

mf2any_map = {}
for k,v in pairs(any2mf_map) do mf2any_map[v] = k end

function create_midifighter(rdev, rdevpage, vdev, off_color, on_color)

for x=0,3 do
for y=0,3 do
btn = y..","..x

-- init off color

send_event(rdev, btn, off_color)

-- map input to the virtual midifighter

capture_event(rdev, btn, rdevpage, function(d, e, p, v)
if any2mf_map[e] ~= nil then
send_event(vdev, any2mf_map[e], v, 3)
end
end)

-- route mf input back to real surface

capture_event(vdev, any2mf_map[btn], 0, function(d, e, p, v)
if mf2any_map[e] ~= nil then
if v == 0 then
send_event(rdev, mf2any_map[e], off_color)
else
send_event(rdev, mf2any_map[e], on_color)
end
end
end)
end
end
end

create_midifighter("launchpad", 0, "midifighter", lp_lo_red, lp_hi_green)

i’ve just got some code working that emulates the midifighter 4bank mode. the code might not be any use to anyone but the logic and note info in it might be.

the function:

any2mf_4banks_map = {

["select"] = {
["0,0"] = { ["note"] = "C-1", ["bank"] = 1 },
["1,0"] = { ["note"] = "C#-1", ["bank"] = 2 },
["2,0"] = { ["note"] = "D-1", ["bank"] = 3 },
["3,0"] = { ["note"] = "D#-1", ["bank"] = 4 }
},

["banks"] = {
{
["0,1"] = "G#2", ["1,1"] = "A2", ["2,1"] = "A#2", ["3,1"] = "B2",
["0,2"] = "E2", ["1,2"] = "F2", ["2,2"] = "F#2", ["3,2"] = "G2",
["0,3"] = "C2", ["1,3"] = "C#2", ["2,3"] = "D2", ["3,3"] = "D#2"
},
{
["0,1"] = "G#3", ["1,1"] = "A3", ["2,1"] = "A#3", ["3,1"] = "B3",
["0,2"] = "E3", ["1,2"] = "F3", ["2,2"] = "F#3", ["3,2"] = "G3",
["0,3"] = "C3", ["1,3"] = "C#3", ["2,3"] = "D3", ["3,3"] = "D#3"
},
{
["0,1"] = "G#4", ["1,1"] = "A4", ["2,1"] = "A#4", ["3,1"] = "B4",
["0,2"] = "E4", ["1,2"] = "F4", ["2,2"] = "F#4", ["3,2"] = "G4",
["0,3"] = "C4", ["1,3"] = "C#4", ["2,3"] = "D4", ["3,3"] = "D#4"
},
{
["0,1"] = "G#5", ["1,1"] = "A5", ["2,1"] = "A#5", ["3,1"] = "B5",
["0,2"] = "E5", ["1,2"] = "F5", ["2,2"] = "F#5", ["3,2"] = "G5",
["0,3"] = "C5", ["1,3"] = "C#5", ["2,3"] = "D5", ["3,3"] = "D#5"
}
}
}

-- map mf notes back to our surface

mf2any_4banks_map = {}

for k,v in pairs(any2mf_4banks_map["select"]) do
mf2any_4banks_map[v["note"]] = k

for k2, v2 in ipairs(any2mf_4banks_map["banks"]) do
for k3, v3 in pairs(any2mf_4banks_map["banks"][k2]) do
mf2any_4banks_map[v3] = k3
end
end
end

mf_4banks_curr_bank = {}

function create_midifighter_4banks(rdev, rdevpage, vdev, off_color, on_color)

-- set our current bank to 1

local mf_4banks_id = #mf_4banks_curr_bank + 1
mf_4banks_curr_bank[mf_4banks_id] = 1

for x=0,3 do
for y=0,3 do
btn = y..","..x

-- init off color

send_event(rdev, btn, off_color)

-- map input to the virtual midifighter

capture_event(rdev, btn, rdevpage, function(d, e, p, v)

local curr_bank = mf_4banks_curr_bank[mf_4banks_id];

if any2mf_4banks_map["select"][e] ~= nil then

-- save bank number and send message out to virtual mf
mf_4banks_curr_bank[mf_4banks_id] = any2mf_4banks_map["select"][e]["bank"]
send_event(vdev, any2mf_4banks_map["select"][e]["note"], v, 3)

elseif any2mf_4banks_map["banks"][curr_bank][e] ~= nil then

-- send the message out from a multi bank row (2,3,4)
send_event(vdev, any2mf_4banks_map["banks"][curr_bank][e], v, 3)
end
end)

-- route mf input back to real surface

capture_event(vdev, any2mf_map[btn], 0, function(d, e, p, v)
if mf2any_4banks_map[e] ~= nil then
if v == 0 then
send_event(rdev, mf2any_4banks_map[e], off_color)
else
send_event(rdev, mf2any_4banks_map[e], on_color)
end
end
end)
end
end
end

then i just use these lines to set it up using lo red for off and green for lit up leds:

open_midi_device("traktor", "traktor", "Traktor Output", "Traktor Input");
open_midi_device("launchpad", "launchpad", "Launchpad", "Launchpad", 8)
open_midi_device("midifighter", "midifighter", "MidiFighter Input", "MidiFighter Output")
create_midifighter_4banks("launchpad", 0, "midifighter", lp_lo_red, lp_hi_green)

seems to work ok - but it’s going to take me a while to understand this midifighter IG mapping :stuck_out_tongue:

the plan is to add the ability to offset the virtual fighters and then have 2 normal mode MF’ers and two 4bank mode MF’ers on one launchpad page.

edit: the code looks a bit complicated but 99% of it is run at startup time - only small snippets of code (the functions passed to capture_event()) actually get run when a button is pressed or traktor sends an event.

THANK YOU!

I will be posting a mapping for the Remote SL 25 in due course.

you could always use bomes to do translation and then you can use the vanilla mf tsi’s? also means ofc any new ones you can then use without any effort at all.

that was my theory above anyway.

fyi - that image posted by fullenglishpint does seem correct as i found that on the forum the other week and it’s what i based my code on.