"Intermediary midi mapping" software *discussion thread* (Traktor mapping is a pain)

Home :: Post and find Controller Mappings :: "Intermediary midi mapping" software *discussion thread* (Traktor mapping is a pain)Reply
"Intermediary midi mapping" software *discussion thread* (Traktor mapping is a pain)
Posted on: 16.06.2011 by Arcelia Siebeneck
Introduction

Just wanted to start a discussion thread regarding the shortcomings of mapping midi controllers using Traktors default mapping options. And by that, I don't just mean the annoying non-resizeable window, lack of serious copy/paste/clipboard functions and the recent inablity to directly edit the xml mapping files with a text editor. What I'm really talking about is the limitations of the default Traktor midi mapping window to achieve more powerful, dynamic and complex mappings... mappings that go well beyond what Traktor is normally capable of.

So what do I mean by this? Well if we look at the djtt firmwares for the vci-100 and midifighter as an example you can see that Traktor is capable of some amazing things. Superfaders, fx triggers, etc are made possible by combining various midi commands into one control which are then executed in a certain way. The only realistic way to achieve this is by re-writing the firmware on a midi controller at a hardware level. Yes, it's true that some of these effects can be done via a plain old Traktor mapping - but it gets very complicated and isn't as full featured.

The obvious disadvantage with using modified firmwares is that only a few people have the skill and know how to write them. Also, the firmware will only work on specific midi hardware. What I propose is some sort of intermediary midi software that sits between Traktor and your hardware. A utility that allows full access to every midi command available in Traktor with the aim of achieving the kind of custom mappings only normally available via custom firmwares.

The solution

This isn't an easy undertaking so I'm hoping that the clever people on DJTT can get involved in the discussion and hopeful development of such a tool. In the absence of any sort of Traktor public SDK, here's how it could be achieved:

Traktor - A mapping is created that maps literally every control to a different midi CC. All these controls are set to receive midi from a virtual midi device such as LoopBe. The midi commands are then routed via LoopBe from the mapping utility which could be created via one of the following programs:

Synthmaker/SynthEdit - Both Windows programs which allow the creation of midi plugins/vst's. Usually the plugins are effects/synths for DAW's such as Cubase, Ableton Live, etc however they can also export standalone Windows executables with midi in/out functionality.

Reaktor - Same as Synthmaker/Synthedit but probably more powerful and there may be more people on here that know how to use Reaktor properly. Trouble is, I don't believe there's a plugin export function so you'd need to run Reaktor in the background.. not ideal.

Emulator - the new version of Emulator allows you to design your own touchscreen interface GUI and map midi commands to each button/control.

GlovePie - probably quite a good option as their is decent scripting and midi support. Disadvantage is that it's a bit unstable in my experience.

Autohotkey - my area of expertise (lol) but not really designed for such a job... I might use it to knock up a prototype though.

VisualStudio - probably the most viable and professional option... a decent programming language that is stable, fast and powerful.


So what would the custom midi mapping software look like? and what kind of things could it do?

This is obviously up for discussion, but the first and most important function should be a wholesale replacement of the standard Traktor mapping window. The tool should allow easy duplicating, adding, deleting, etc of all the various Traktor controls and the ability to setup modifiers etc.

Once this is implemented, we can look at ways to achieve complex midi mappings based on rules, scripts, etc. This might enable functions such as superfaders and other midifighter features but also:

- complex ADSR/LFO based controls
- sequenced/pre-scripted midi control
- Serato-style continuous play in the background after beatjuggling has ended
- GUI editor for custom diy controllers (edit the midi controls in a more visual manner)
- simpler midi LED mappings
- stuff I haven't even thought of...!

How you can help

Feel free to contribute to this thread... let me know if this is something that you would find useful and what you would do differently. The suggestions I've listed above are just ideas and I'm keen to get something developed that will be useful for everyone so get posting
Chasidy Heckenbach
11.02.2012
this all seems a bit too easy... but here's output from midimasher running on osx with a midifighter classic and gamepad for input.

i used the builtin iac midi driver which prepends "IAC Driver " to the start of each port name, so after first looking for the full name midimasher strips off that and looks again when opening ports. similar to having to strip off stuff like "1- " on windows when u connect a controller to different usb ports.

only thing now i'm on macosx is i realise how important usb hubs are when a macbook pro only has 2

Code:
bash-3.2$ ./mm -f debug.lua
midimasher: build 20120212
midi: scan devices...
midi.in.0: IAC Driver Bus 1
midi.in.1: Midi Fighter Classic
midi.in.2: IAC Driver MM to Traktor
midi.in.3: IAC Driver Traktor to MM
midi.in.4: IAC Driver MidiFighter1 Input
midi.in.5: IAC Driver MidiFighter1 Output
midi.out.0: IAC Driver Bus 1
midi.out.1: Midi Fighter Classic
midi.out.2: IAC Driver MM to Traktor
midi.out.3: IAC Driver Traktor to MM
midi.out.4: IAC Driver MidiFighter1 Input
midi.out.5: IAC Driver MidiFighter1 Output
hid: scan devices...
hid.0: Apple IR 
hid.1: Apple Internal Keyboard / Trackpad 
hid.2: Apple Internal Keyboard / Trackpad 
hid.3: USB Gamepad  
hid.4: Apple Mikey HID Driver 
hid.5: Apple Internal Keyboard / Trackpad 
hid.6: Apple Internal Keyboard / Trackpad 
lua: register functions...
lua: run embedded lua...
loading: lib/startup.lua
loading: config/debug.lua
traktor: open midi.in.3: Traktor to MM
traktor: open midi.out.2: MM to Traktor
loading: devices/traktor.lua
loading: lib/traktor.lua
gp: open hid.3: USB Gamepad
loading: devices/gamepad_12btn.lua
mf1: open midi.in.4: MidiFighter1 Input
mf1: open midi.out.5: MidiFighter1 Output
running... <ctrl>-<c> to quit.
i'll still be using windows (as well as linux for that matter) so will be building windows versions each time i build a macosx one. could also build linux ones probably if anyone is interested but i suspect not...
Chasidy Heckenbach
11.02.2012
wasn't all that tricky to do, as i hoped. mostly due to developing on cygwin for windows i guess.

will probably release in a day or so, was believeing about maybe adding some more controls to my launchpad mapping and then creating a new thread with info on that and download links for mac and windows

edit: hid input support in midimasher for mac osx is even better than the windows version. in the windows version i couldn't get blocking i/o to work so it just processes any hid input every 1ms which could be fixable, might be due to me compiling under cygwin. all fine on the osx version so midimasher just processes any input as soon as u use them. i don't believe a 1ms delay is any big deal for gamepad inputs anyway but i do hope to fix that in the windows version too. the windows version still should have less latency than something like glovepie tho in theory.
Chasidy Heckenbach
11.02.2012
Originally Posted by JimE3
I like that idea, more banks are always good.
i believe there's times when u just need everything available in a single layer (ish) so u can get to it in a split second when u need to - but i do like layers... esp if it means i can just keep my midifighter plugged in by my laptop and have access to anything i need at all times
Josephine Flemens
10.02.2012
I like that idea, more banks are always good.
Chasidy Heckenbach
08.02.2012
i figured i'd use my midi fighter a lot more if it just had more banks... with the 4 buttons in various combos you could have a heap of banks, tho if just using those with adjacent buttons it gives you 10 which is plenty and the 10th one (where u have to hold down all 4) is a bit much anyway... still 9 useful ones

then the normal 4 ones could be configured to send the usual 4banks messages direct to traktor (for instant grat etc) leaving the rest (5 or 6) for other stuff...

the led's stay lit to tell u which bank you're in so u have decent feedback. not sure i'd ever use as much as 10 but a couple more than the standard 4 seem pretty handy anyway...

code will be in the next release if anyone is interested...
Chasidy Heckenbach
08.02.2012
new version 20120208 u can grab from http://midimasher.djism.com/downloads/

* fix to the new delayed message queue code
* new hid (input) support
* new apps hiddump.exe and hidlearn.exe
* included a config gamepad_midifighter_4banks.lua that turns a 12button gamepad into a 4banks midifighter (tho only 2 banks really as it only has 12 buttons )

since the delayed message queuing fully works now u can set up auto-repeat for buttons. i haven't worked out how best to fit it into the existing functions but this is essentially what it will do. this example causes that action to be repeated every 100ms until the button is released:

Code:
capture("gp", "0,0", ALL, 0, function(d,e,v,p)
    if v > 0 then
        print "do something..."
        create(d,e,v,p,100)
    else
        clear(d, e)
    end
end)
it basically just queues up another instance of the button press 100ms in the future and on release clears the last one it queued up. very simple but works fine...

in theory the hid support should be much more responsive and efficient than using something like glovepie. glovepie processes your entire script approx 20 times a second (so once every 50ms) and performs any actions needed.

midimasher doesn't do anything until u actually press a button/fader on your hid controller and then just runs the code needed for that individual control.

i fancy the idea of adding some kind of sequencer next... i could really use some kind of real time rhythm recorder where i can add/delete individual beats, select quantize etc. i don't believe that will overlap with whatever NI has planned for 2.5. some kind of clips launching/relaunching might also be cool - so then i can just use some external sample player or something without relying on a full blown ableton live and/or what NI does put in 2.5...

i believe maybe it's time for me to finally put together a decent launchpad config and create a new thread for it with images etc will probably wait until i have the mac port done tho.
Chasidy Heckenbach
08.02.2012
for anyone wanting a simple way to try out the instant grat tsi from a cheapo gamepad this little config works fine:

Code:
open_hid_device("gp", "gamepad", "USB Gamepad")
open_midi_device("mf1", "generic", "MidiFighter1 Input", "MidiFighter1 Output")
virtual_midifighter_4banks("gp", 0, "mf1", 0, 0)
ofc you'll need my latest (unreleased) version. my gamepad only has 12 buttons. start+stop, directional buttons, 4 right hand buttons and 4 shoulder buttons so this maps the start+stop to the first "row" of the grid, leaving the next 3 rows full. this means i can use the instant grat on decks A+B but not C+D as i don't have buttons for those midi fignter banks. buttons can be rearranged very easily by editting the devices/gamepad.lua file i created and/or more controls added for gamepads that have more...
Chasidy Heckenbach
07.02.2012
just added hid/gamepad support... only have a 14 button gamepad here to test with but seems to work well. for most purposes a hid device is treated just like a midi controller. quick example that maps my start and select buttons to cue+play in traktor:

Code:
open_midi_device("traktor", "traktor", "Traktor to MM", "MM to Traktor")
open_hid_device("gp", "gamepad", "USB Gamepad")

toggle("gp", "start", 0, ON, OFF, "traktor", "play_a")
button("gp", "select", 0, ON, OFF, "traktor", "cue_a")
creating the hid devices files is a bit more fun than midi ones, tho i have created a hidlearn.exe and hiddump.exe to help. "fader" type controls need a manual edit atm afterwards. this is the config for my gamepad, which afaik should work on most. will just need to add in some extra lines to make it work on a gamepad with more controls:

Code:
--
-- direction buttons act as faders even on digital gamepads
--

add_hid_control("left_right", "fader", 3, 0xff)
add_hid_control("up_down", "fader", 4, 0xff)

--
-- bit masks for the rest of the buttons
--

add_hid_control("select", "button", 6, 0x10)
add_hid_control("start", "button", 6, 0x20)

add_hid_control("button1", "button", 5, 0x10)
add_hid_control("button2", "button", 5, 0x20)
add_hid_control("button3", "button", 5, 0x40)
add_hid_control("button4", "button", 5, 0x80)

--
-- the 4 buttons on the back of a gamepad
--

add_hid_control("left1", "button", 6, 0x01)
add_hid_control("right1", "button", 6, 0x02)
add_hid_control("left2", "button", 6, 0x04)
add_hid_control("right2", "button", 6, 0x08)
edit: anyone with a 16 button gamepad could then ofc just use the builtin mdimasher normal or 4banks mode midifighter emulation... from basically a 3 line config file
Chasidy Heckenbach
03.02.2012
porting to osx... all going to plan i'll be getting a macbook pro next week or the week after, so then i'll ofc be porting midimasher to osx

i'll probably also check+build it on linux while i'm at it, tho i'm not sure anyone would really need a linux version.

trickiest bit after that will be building/testing on each platform for each release tho i presume i'll be able to ssh into the macbook from my windows laptop and automate the build at least
Chasidy Heckenbach
02.02.2012
hopefully i haven't broken anything too royally but there's a new version if you want it: http://midimasher.djism.com/downloads/midimasher-20120202.zip

i believe there's been some tweaks to the tsi since last time so you'll need to (re)load the tsi from the settings dir

this has a completely rewritten core for processing incoming midi messages, that should be faster, more efficient with hopefully less latency.

i've tested the launchpad and lpd8 configs - both have twitch style slicers, which now doesn't hold up the processing of other messages when it needs to stack messages for traktor that need a delay in between.

install info etc as usual is here and api docs here tho i haven't updated those docs yet with the extra 'delay' param that send()/create() etc can use

midi clock stuff is in - it's just not used by anything yet. but i suspect some kind of sequencer will be appearing this weekend... i'm really dying to know what will be in traktor 2.5 tho to really know what would be useful.

edit: first update in over 2 months... just took me a while to work out what/how to improve on latency etc
Chasidy Heckenbach
02.02.2012
the calculated bpm (from the midi clock ticks) seems to fluctuate a bit from about 140.6 to 139.7 when i have it set to 140.0 in traktor. be interesting to see how it works anyway once we have some actual sequencer code in

this bit of code prints out the current bpm once a second. we need to reset the print_bpm value to OFF else the next ON event won't fire, so we queue up a value of OFF (0) 1 millisecond after the ON (127) one. as well as set() the functions send(), send_midi(), send_midi_raw() and create() all take an optional final parameter which is how many milliseconds in the future to execute it.

Code:
capture("_varchange", "print_bpm", ON, 0, function()
    print("bpm=" .. get_bpm())
    set("print_bpm", ON, 1000)
    set("print_bpm", OFF, 1001)
end)

set("print_bpm", ON, 1000)
good little test of the event queuing stuff anyway and is how auto-repeat controls could be implemented (tho will remove the need for needing to send an OFF event as that's a pain - just makes sense for variables, as if the value hasn't changed we don't want any code depending on that variable to be run)
Chasidy Heckenbach
02.02.2012
Originally Posted by muffintop
I'm about to build a serious ableton layout... Is there any possibility of a MM step sequencer anytime? I would love to have one ( or 8 )on a page with some basic controls at least.
as the delayed message queuing seems to be working so well i started some sequencer code...

messages can be queued at fractions of millisecs in the future but they're all checked approx once every millisec.

sequencer code needs to be slightly different as we'd want to be able to say something like "send X to ableton on beat Y each time". i guess we're only talking about a 8beat sequence here or 16 or 24 maybe? if it was 16 and u had specified something to trigger on the 1st beat of a 8bar loop - then ofc it would actually have to trigger on beats 1 and 9 of a 16 one. just want to work out how complicated this needs to be so it's flexible enough.

it now decodes the midi 'start playing' message which resets the current beat number and the midi 'timing ticks' to work out the current tempo. we get 24 of those ticks per beat which equates to something like 30ms between each 16th note for a tempo around 120bpm

so the new sequencer, once we've worked out what it needs (and doesn't need) to be able to do, will use all that stuff.

not sure whether i can just fire off the midi when we need to, or whether we would also need to send out midi clock too as then u can specify ahead of time that a midi message should be sent "on the next click" etc. will only know if it sounds tight enough when trying i guess...
Chasidy Heckenbach
02.02.2012
Originally Posted by bascurtiz
Hey Zestoi,

I hope this *bump* will make u consider to do a new version, whereas the LPD8 will function properly

I've tried out an earlier version, and in that, I don't get the suddenly shut-down of Midimasher after loading the LPD8-config, so yeah, I guess indeed, there's a bug when it comes down to the LPD8.
lpd8 code is fixed, will def release it today, just need to do at least a bit of testing as so much has changed in mm this time round.

i forgot i had managed to cram in so many controls in that lpd8 mapping... i *believe* it still makes sense?

pots: eq+levels for decks A+B
PAD mode: 7 transport type controls, 1 button toggles between decks A+B
CC mode: itch style slicer (if activated) else hot cues
PC mode: beat jumps (are limitted to what can go here)

maybe i'll do some graphics for the layout and create a new thread for this one.

the slicer "loop mode toggle" isn't uber important and could then be used for something else - and the PC mode buttons could be change, tho since the lpd8 doesn't send out a message on pad release not many things can use that.

maybe a 4beat slicer would make more sense for an lpd8? would free up some pads - tho would only be half as fun
Chasidy Heckenbach
28.01.2012
Originally Posted by JoeM
You're biggest flaw is probably your runloop. You should try to find a way to use an even queue with no polling and async events. Try googling for realtime runloops, as most of the types you'll find are usually game oriented with UI runloops synced to FPS.
cheers for the pointer which made me rebelieve the processing loop and i've just tested some code that goes back to how i originally wanted it to work.

for some reason i had no luck mutex locking before. either i was just being stupid (quite possible) or putting them in the wrong place and/or it was my use of pthread_mutex_lock() which i assumed would work under cygwin. i've changed to using native windows calls and it seems fine...

now my callback function gets called by RtMidi as soon as a message comes in, i lock/wait on a mutex and release when all processing has been done - nice and simple and none of that processing loop shenanigans or any extra delays...

does mean i need an extra thread now to handle queued up messages to be sent out in the future (stacked traktor messages needed a delay inbetween and/or arpeggios etc) but that's no biggie.
Chasidy Heckenbach
28.01.2012
Originally Posted by muffintop
I'm about to build a serious ableton layout... Is there any possibility of a MM step sequencer anytime? I would love to have one ( or 8 )on a page with some basic controls at least.
interesting idea, i had thought before it should be possible once this message queuing is in. just in the process of a major change in the way events are processed which should remove some latency - and then will get back to implementing that. what i had before for message queuing won't quite work now due to the other changes i've made, but it should be in for the next version which i want to release tomorrow.

we'd need midimasher to process midi timeclock, but apart from that the standard queuing stuff i'm adding, with some custom code should be enough.

I would also be interested in helping getting it to work if need be. Just would need a push or 2 in the right direction.

Thanks again for all of your hard work. Looking forward to making a logical layout for the LP in ableton
cheers i've been pretty busy the last couple of months - this weekend is the first time i've really had to do some decent work on it - been a while since i pushed out a release.

also will be fixing the lpd8 issue that someone pointed out the other week
Nana Mohs
27.01.2012
I'm about to build a serious ableton layout... Is there any possibility of a MM step sequencer anytime? I would love to have one ( or 8 )on a page with some basic controls at least.

I would also be interested in helping getting it to work if need be. Just would need a push or 2 in the right direction.

Thanks again for all of your hard work. Looking forward to making a logical layout for the LP in ableton
Chasidy Heckenbach
27.01.2012
Originally Posted by JoeM
Secondly, if you're not in love with LUA, I'd recommend running away while you still can.
last bit of waffle - and my last post was already too big one thing i like about lua is that it's really a language for non-coders, which i believe is important.

anyone, if they tried hard enough, should be able to add in some simple logic using lua as it's constructs are just so simple.

also - i don't see lua being the only/main front end to midimasher long term as most things people want to do should be possible with an even simpler config format, that would then in turn call internal functions or lua.

most of the time people only need to be able to do stuff like:

* route midi event X to output target Y with value Z

* toggle the input midi event

* when midi event X comes in send back event Y to light up the pads led

* any of the above but only when some other pad is held down or toggled

so that's what i'll be looking at sometime - simplifying custom configs for users while allowing them to use lua, or define custom lua funcs when what they need to do doesn't quite fall into that set

cheers for your feedback - much appreciated
Chasidy Heckenbach
27.01.2012
Originally Posted by JoeM
You're biggest flaw is probably your runloop. You should try to find a way to use an even queue with no polling and async events. Try googling for realtime runloops, as most of the types you'll find are usually game oriented with UI runloops synced to FPS.
latest version to be released still runs in a main loop but an alarm is triggered from RtMidi that causes the loop to bail from it's 1ms sleep and process any messages. the only other way afaik with RtMidi is to process each incoming event in it's own thread with copious mutex locking. ofc another option is to not use RtMidi or make it work differently - tho RtMidi atm works by having one new thread to listen to each incoming midi port.

ideally i'd like to just process each RtMidi event as it comes in, multi threaded. the only reason for me not doing that now is that any calls to (and from) lua causes all worlds of pain and crashes. execution can ping ping between the C core and LUA several times of depending on whether the LUA code is creating events or sending out midi and/or calling extra funcs from C.

Secondly, if you're not in love with LUA, I'd recommend running away while you still can. I have to use it for my job, but it's a horrible language really. There's not enough cross platform frameworks and the OO frameworks always seems hacky to me. Since a lot of controllers share similiar concepts (pots, pads, grids, faders, leds) it's just easier to use a scripting language with better OO support.
personally i quite like lua - i don't see anything wrong with it. it's a very simple language to get into compared to most others and lets you define functions onn the fly ala javascript. i use jquery for most of my website coding - and lua lets you code in a very similar way - assigning dynamic functions to callbacks.

edit: i wouldn't say having some kind of OO framework would be an advantage for what midimasher wants the LUA config to do. it would certainly raise the bar for who could even use it. OO is fine in it's place - but that place isn't everywhere.

Also for your host app, you might want to look into C# over C++ if you plan to support OS X. The addition of interfaces and the fact that you can run the same binaries (if you're careful to split OS specific functions in a sane way) using Mono and .Net on Windows make help in the long run. MonoMacs C# support for the CoreMIDI/Audio apis is very thorough (I help port those as well ) and you'll get all sort of bonus in async thread handling that can be a evening mare to do cross platform. My current app for my employer is a cross platform realtime audio app and we've had a lot of success plugging in different audio modules for CoreAudio, Windows sound, alsa and port audio on linux. Interfaces really save the day with cross platform.
interesting - not likely anytime soon to stray away from C/C++. what i've seen of C# tho is that it looks quite good, similarish to java without all the annoyingness of java (damn... i hate java! had to code in java/jsp for about 3 years and if they ever wanted me to again they'd have to pay me a lot more )

there again maybe a midimasher2 could see the light of day in C# if i fancied it - just not had any real experience of C# so not an option for me at this point. i don't have enough free time from my work clients as it is to work on midimasher as much as i'd like to.

Then again, you could also do what I'm doing and use Max since it already handels MIDI in realtime across platform, and you can distribute the compiled patches for free. The lua interprator libs are really basic and compile without hassle on all platforms and you could probably easily write a Max C/Java interface to pass midi along, if someone hasn't already written this.
if MAX was free then sure but i don't fancy shelling out that kind of cash just so i can code a MAX patch etc.

i'm not worried about cross platform issues atm - my code has been mostly written so it should compile anywhere and the only libs i am using (LUA, RtMidi and hidapi) all support osx and windows. i should be getting a mac in a month or so will look at osx support then.

cheers for the info i'll be sticking with C+LUA most likely but am open to other ways of handling the main run loop - tho atm this latest version i have here doesn't seem to add any extra delays in.

some more complicated callbacks, like the one to enabled/setup various effects unit parameters can take around 0.4ms to complete. doesn't sound like a lot but i guess it all adds up.

the biggest issue (i believe) i was having before this latest version was with with my slicer implementation enabled - since that had to add delays in between messages which then delayed the whole process (kind of like the audio glitches that used to come from traktor pro1 when sending lots of led updates to a launchpad)

it's not the absolute latency i'm so worried about, it's the jitter (the variance) and the actual "feel" of using it. if it "feels" laggy then ofc people won't want to use it.

having native virtual midi ports instead of using an external loopback device would help too - as then processing wouldn't be going via the windows midi stack twice.
Chasidy Heckenbach
27.01.2012
Originally Posted by bascurtiz
Hey mate,
How's the new version working out 4 ya?
hopefully releasing a new version today with improved slicer-goodness
Vince Donohoue
26.01.2012
Originally Posted by zestoi
cheers



sounds very cool. tbh my code is more C than C++, tho it's all class based. i haven't coded in C++ in anger for maybe 20 years so am a bit rusty.

i guess python would be too slow. you found java was fast enough? i find LUA pretty quick, tho still could be better, when fractions of milliseconds matter. current unreleased version is quite a bit better i believe as i had a main event loop which slept for 1ms if there were no incoming events to process and functions like the slicer had to have embedded sleeps in to send out multiple commands to traktor and have them all recognised. code is almost finished that lets any function queue up messages to be send out a certain time in the future which prevents all the midi not being processed during that time.

could also be used to trigger a set of samples for a drum riff or arpeggio ofc i also fancy having a built in sequencer so i can use sample decks in traktor like a mini ableton.

it's just single threaded atm (apart from the use of RtMidi which is threaded to listen to multiple midi ports) which seems the best way when using LUA.

RtMidi seems to work nicely with multithreaded apps - but even with more mutex locks than i can remember i still for some odd reason had issues with the LUA.



i'm hoping to get a mac in the not too distant future - so if i do then i'll certainly maintain a windows and osx version. i don't have any plans atm i'm afraid to release the core code itself - but i might change my mind on that. i wanted to retain some kind of control over it - tho maybe at some point going open source would make sense, not really sure.
Some constructive feedback, I'm a "professional" lua dev and I've written MIDI apps in C# and a few FOSS MIDI drivers for OS X.

First, at this point most any scripting language will be fast enough. My major project right now uses OO Javascript (Mootools) with lots of inheritance running inside of a Max patch. I'm able to "crab scratch" effects on my padKontrol faster than the Traktor UI can update the LEDs. The JS engine in Max 5 isn't even the best, though I hear they're using the newer stuff in Max 6. My point is, anything will probably be fast enough. I'm using a 4 year old computer and through a USB hub (adds a few ms of delay, did I mention I've written USB drivers before too). You're biggest flaw is probably your runloop. You should try to find a way to use an even queue with no polling and async events. Try googling for realtime runloops, as most of the types you'll find are usually game oriented with UI runloops synced to FPS.

Secondly, if you're not in love with LUA, I'd recommend running away while you still can. I have to use it for my job, but it's a horrible language really. There's not enough cross platform frameworks and the OO frameworks always seems hacky to me. Since a lot of controllers share similiar concepts (pots, pads, grids, faders, leds) it's just easier to use a scripting language with better OO support.

Also for your host app, you might want to look into C# over C++ if you plan to support OS X. The addition of interfaces and the fact that you can run the same binaries (if you're careful to split OS specific functions in a sane way) using Mono and .Net on Windows make help in the long run. MonoMacs C# support for the CoreMIDI/Audio apis is very thorough (I help port those as well ) and you'll get all sort of bonus in async thread handling that can be a evening mare to do cross platform. My current app for my employer is a cross platform realtime audio app and we've had a lot of success plugging in different audio modules for CoreAudio, Windows sound, alsa and port audio on linux. Interfaces really save the day with cross platform.

Then again, you could also do what I'm doing and use Max since it already handels MIDI in realtime across platform, and you can distribute the compiled patches for free. The lua interprator libs are really basic and compile without hassle on all platforms and you could probably easily write a Max C/Java interface to pass midi along, if someone hasn't already written this.

Just some thoughts, hope it helps.
Neoma Picklesimer
21.01.2012
Hey mate,
How's the new version working out 4 ya?
Chasidy Heckenbach
15.01.2012
Originally Posted by bascurtiz
Hey Zestoi,

I hope this *bump* will make u consider to do a new version, whereas the LPD8 will function properly

I've tried out an earlier version, and in that, I don't get the suddenly shut-down of Midimasher after loading the LPD8-config, so yeah, I guess indeed, there's a bug when it comes down to the LPD8.
cool, will do. i'll do my best to look at fixing that this week. it's bound to just be some minor-ish lua issue. if this kind of thing happens the best way to debug is to open a cmd window and then run mm.exe -i directly instead of clicking on the .bat file. it'll still die - but it'll also output the error.

it's about time i finished testing the version i was working on before new year too which has some performance improvements in. also about time i got my lpd8 out again anyway
Neoma Picklesimer
15.01.2012
Hey Zestoi,

I hope this *bump* will make u consider to do a new version, whereas the LPD8 will function properly

I've tried out an earlier version, and in that, I don't get the suddenly shut-down of Midimasher after loading the LPD8-config, so yeah, I guess indeed, there's a bug when it comes down to the LPD8.
Chasidy Heckenbach
11.01.2012
Originally Posted by Mitchell1122
Just a question, will this program be windows only or will it support other operating systems?
windows only for now tho should build fine on linux. i haven't tried in a while as i only really use windows for music/dj stuff.

osx if i get a mac (which hopefully is likely) or i might try to build/test in a virtual osx session - just don't have any spare time atm. there's no technical reason why it shouldn't build on any platform. i chose the RtMidi lib for that reason - and LUA builds on just about anything.

some beta code i've been working on for HID support should be fine too - as uses hidapi which says it works on linux/win/osx

i guess those are the big 3 u are referring to? or some curve ball like BeOS?

edit: pretty sure i just replied to a bot looking at those image urls - but it was a sensible question anyway
Chasidy Heckenbach
11.01.2012
Originally Posted by tdmusic
This looks pretty amazing.
cheers

I've had the same idea before, the closest I got was writing a C++ application a few years ago which converted Traktor's OSC output to MIDI (as Traktor 2 and 3 used to only output OSC for control values if I remember correctly, no MIDI feedback), and did some special mapping for the BCR2000 (e.g. storing effect parameters in arrays so it would recall the correct effect parameteers)... started out as Python, which was too slow (although I didn't know a lot about performance optimization back then so I'm sure I could improve that) and then ported to Java for the Mac, but stopped needing it when Traktor Pro came out so that was as far as I got!
sounds very cool. tbh my code is more C than C++, tho it's all class based. i haven't coded in C++ in anger for maybe 20 years so am a bit rusty.

i guess python would be too slow. you found java was fast enough? i find LUA pretty quick, tho still could be better, when fractions of milliseconds matter. current unreleased version is quite a bit better i believe as i had a main event loop which slept for 1ms if there were no incoming events to process and functions like the slicer had to have embedded sleeps in to send out multiple commands to traktor and have them all recognised. code is almost finished that lets any function queue up messages to be send out a certain time in the future which prevents all the midi not being processed during that time.

could also be used to trigger a set of samples for a drum riff or arpeggio ofc i also fancy having a built in sequencer so i can use sample decks in traktor like a mini ableton.

it's just single threaded atm (apart from the use of RtMidi which is threaded to listen to multiple midi ports) which seems the best way when using LUA.

RtMidi seems to work nicely with multithreaded apps - but even with more mutex locks than i can remember i still for some odd reason had issues with the LUA.

Any plans to port to the Mac, or to release the source, in which case I'd love to try and get it up and running?
i'm hoping to get a mac in the not too distant future - so if i do then i'll certainly maintain a windows and osx version. i don't have any plans atm i'm afraid to release the core code itself - but i might change my mind on that. i wanted to retain some kind of control over it - tho maybe at some point going open source would make sense, not really sure.
Maybell Corb
11.01.2012
This looks pretty amazing. I've had the same idea before, the closest I got was writing a C++ application a few years ago which converted Traktor's OSC output to MIDI (as Traktor 2 and 3 used to only output OSC for control values if I remember correctly, no MIDI feedback), and did some special mapping for the BCR2000 (e.g. storing effect parameters in arrays so it would recall the correct effect parameteers)... started out as Python, which was too slow (although I didn't know a lot about performance optimization back then so I'm sure I could improve that) and then ported to Java for the Mac, but stopped needing it when Traktor Pro came out so that was as far as I got!

Any plans to port to the Mac, or to release the source, in which case I'd love to try and get it up and running?
Chasidy Heckenbach
05.01.2012
Originally Posted by cantaloop
okay i got it...i forgot to extrakt...
ah cool
Tyra Fines
05.01.2012
Originally Posted by cantaloop
hi there!

i tried to install midimasher but it said it cant find mm.exe !

do u have any suggestion?

running windows 7 on Macbook...


okay i got it...i forgot to extrakt...
Tyra Fines
05.01.2012
hi there!

i tried to install midimasher but it said it cant find mm.exe !

do u have any suggestion?

running windows 7 on Macbook...
Chasidy Heckenbach
03.01.2012
Originally Posted by ZiiK
sorry for the mammoth post the other day.
np lol - it's all good. just wish i hadn't been so busy recently...

Just checking if it would be possible to make the launchpad 8x8 grid a device similar to the virtual midifighter and use pre made launchpad mappings for each page.
sure. you'd just want to create some function that u can pass the page number u want to assign the controls to - which is all the virtual midifighter code does really. like:

Code:
function lp_something(device, page)
   pipe(device, "0,0", page, "traktor", "play_a")
   pipe(device, "0,1", page, "traktor", "play_b")
end

lp_something("launchpad", 2)
which would then assign whatever controls u define in lp_something() to page 2 of your lp.

if you put those functions in lib/launchpad.custom.lua then it will get automatically loaded when u attach a launchpad device in your main config. or just load via a require() in your config
Chasidy Heckenbach
03.01.2012
Originally Posted by ZiiK
Think I read about noterepead somewhere in this thread, is that availible, will it be added later or do I have to sort that out in traktor?
no native note repeat in mm yet - should be soon. for now you'd just create a new mini tsi in traktor, link it to the same midi ports as the default mm tsi and add any extra mappings u want in there. had a similar discussion with someone else recently and concluded that it'd be safe to use any note's in custom tsi's as mm is only using CC's in it's traktor config and i have plenty of free midi channels to use yet.

Don't quite get the color array set up for hotcues in your launchpad config. It still just use the first color right? Hi yellow are typed in five/six times followed by red. A little puzzled. It all works just fine, I'm just curious.
different cue types have different midi values in traktor. if u don't mind them all being the same color u can just specify one. if u want them to be diff then u can specify a "table" like the launchpad config does. i know a normal hotcue sends out 1 and a loop sends out 6 - which is why i made the 6th element in that table 'red'. not sure what all interrim values are.

Is there a list of all your "named" colors somewhere? I ended upp using the midinumbers since I wanted some other colors then used in your examples. Which is cool. Real easy to get flashing to since half the midi notes give flashing leds... The flashing is somewhat unpredictable though. I know it's synced to traktor. So obviously it will be faster when messing with short loops etc. but it slows down when the warning for track ending is sent, somewhat annoying.
launchpad colors are defined in lib/launchpad.lua - other controllers will be diff ofc. that file gets loaded if a controller of type "launchpad" is in your main config.

hadn't noticed the slowing down... the call to launchpad.traktor_sync("lp") makes any flashing ones flash to whatever the beatphase is. without calling that they flash at the launchpads internal rate.

the flashing leds have been the biggest pain for me with the launchpad support - esp keeping them flashing on page switches/refreshes.

Would it be possible to use other "gates" that if & and? I would love to have access to the or command. That would give great possibility for instant grat mappings...
the config is lua - u can use whatever logic u want...

Code:
capture("traktor", "play_a", ALL, 0, function(d,e,v,p)
    if get('foo') and get('bar') or get('fish') then
        send("launchpad", "3,4", 127)
        set('fubar', 42)
    end
end)
General q, you use cc's for everything in the traktor.tsi is there a reason for that? I lack some knowledge in midi and read as much as I can but don't get everything yet. Seems like notes should be sufficient for a lot of things...
yep - all cc's but they could also be notes. makes no real difference for how midimasher is using them. internally a noteoff with any value is treated the same as a noteon with zero value anyway - which is the only real diff between notes and cc's. cc's can also be hires where notes can't, but mm doesn't have full support for that yet.

And also, I would be greatful if someone could explain what a midi pc is, can't seem to find that. No problem looking other stuff up in midi documentations.
a program change message. allows the PC bank of an lpd to be used for example - when u can't normally. not completely useful tho as a client doesnt have to send a zero PC message on release - and the lpd8 doesn't. in fact on the lpd8 a PC message is only 2 bytes i believe as that's all that is needed. just means u can't map a pad-release if the client/controller behaves like that.

A small "bug" the play button willl remain lit when track has ended since no off message is sent.
ah ok - didnt realise that- odd traktor doesnt send an off event? guess i never let tracks play out right to the end. i suspect the play led will go out when u load a new track tho?

And one more thing, to be able to make the specific mappings I'm after I would have to make a lot of custom traktor stuff and add them to the tsi. Is there a simple way to keep my customizations separate? Is there a certain note or cc range I should stick to? I want my setup to be compatible with future versions
use a sep tsi - connect to the same midi ports as the main one - and just use note's to be 100% safe.

I hope I don't sound ungreatfull with all these q's and ideas... I love the extra power this gives my launchpad and have a hard time deciding how to proceed.
questions and ideas are always welcome i'll reply much faster from now on. usually check the community several times a day - just had no time recently.

Going the midimasher route all the way or to create traktor tsi's for each layer since I seem to need a lot of custom stuff anyways. I know leds are harder...
But some work has do be done twice with the masher, first mapped then coded. Think the code setup is great though! So much faster. BTW, could I debug my config if I make a mistake in code? Now I just know that there is a problem if the app shut down on initiation =) No big deal, but I might aswell ask.
i usually add in debug print() statements if i'm using capture() or even in the api code sometimes and/or run with debug mode turned on. biggest pain with debug mode is the streaming of beatphase and levels - so i might add some option to dump debug but skip those.

I'm stoked and seem to spend to much time experimenting and learning and to little sleeping

I'm willing to help out with mappings and such if help is needed. Just send a PM if so.

cheers and keep up the good work!
cool - cheers i'm planning on getting back to mm coding in a day or so - and have lots i want to do....
Santiago Brasier
03.01.2012
sorry for the mammoth post the other day.

Just checking if it would be possible to make the launchpad 8x8 grid a device similar to the virtual midifighter and use pre made launchpad mappings for each page.

Can't see why it would not work, but would like confirmation since I am very new to this.

Been having great fun learning so far!

Thanks zestoi for this awesome app!

Cheers
Chasidy Heckenbach
02.01.2012
Originally Posted by bascurtiz

Ehh... is this ok ?
i would say i have broken it

i reworked almost all of the slicer code the other month and tested on a launchpad. pretty sure i didn't go back and check the lpd8 slicer config to make any changes. will make sure i look at that in my next set of updates.
Chasidy Heckenbach
02.01.2012
Originally Posted by ZiiK
That was a massive read!
wow yep... that would be one mahoosive read sorry for the delay - not been checking this community for a while due to too much work.

Automation of fx from counters or some other great solution.
easy enough to do - u can capture() the beatphase/heartbeat and do what u want with it. next version will use a lower granularity for the beatphase tho. using 16 per beat atm - which is overkill for most things and means more midi streaming thru all the time when we don't need it. believeing of latency mostly. probably going to change the tsi to send out a noteon+off per beat - and mod the code to use that.

Soft fadermovements like in katapult. So that the fader doesn't jump straight to the 5th value when pressed. could be messy to for sure. But nice to have the choice =)
sure - should be possible soon - which will allow events to be queued up. i know katapult does that but i've always had it turned off. when i press a button i want it to go there asap. but if useful it could be implemented.

Another q, a mate of mine wants to make a very specific mapping. And would need to ignore the note of in a clever manner if other buttons are pushed.
by default using trigger() only processes the 'on' event - but you could capture() any event u want and just send out the on event and/or both depending on the condition etc.

something like this which would always send out the ON event but only the OFF event when the modifier is set/pressed:

Code:
capture("launchpad", "0,0", ALL, 0, function(d,e,v,p)
    if v > 0 or get("some_modifier") > 0 then
        send("traktor", "some-event", v)
    end
end)
Suppose it would also be possible to make a different TSI for torq or other software... Could perhaps help with that to in time.
yep cool - with torq u can manually edit it's xml config file afaik - so might not be as much of a pain as traktor. could even have the torq xml modified by mm - tho a static one like the traktor tsi would do.

One q about the slicer. Spent some time on the real one since I used to own a twitch. Suppose the slice size and playback length functions are left out?
for now yep - but should be simple enough (?) to put in
Neoma Picklesimer
26.12.2011


Ehh... is this ok ?

(happens with Debug / Midimasher.bat / and the other one)

After it, it closes the software.


This does look good tho..?



Then again... end result:

- Instant Grat FX MF 1.03.tsi seems to be working, just have to figure out, the mapping.

- Slicer mode doesnt work at all.

Any suggestions Zestoi?
Santiago Brasier
24.12.2011
Merry christmas fellas!

Been playing around with the midimasher now and then...
Since new to programming it sometimes takes a little time before I sort things out, but being stubborn helps

I'm a bit torn at this point, believe the midimasher is great in some ways and at the same time a little cumbersome at times.

A lot easier to map LEDs for sure. Have some issues with a couple of things and a lot of q's....

So I'll just throw then out. Some are probably stupid and others might not be. We'll see.

Think I read about noterepead somewhere in this thread, is that availible, will it be added later or do I have to sort that out in traktor?

Don't quite get the color array set up for hotcues in your launchpad config. It still just use the first color right? Hi yellow are typed in five/six times followed by red. A little puzzled. It all works just fine, I'm just curious.

Is there a list of all your "named" colors somewhere? I ended upp using the midinumbers since I wanted some other colors then used in your examples. Which is cool. Real easy to get flashing to since half the midi notes give flashing leds... The flashing is somewhat unpredictable though. I know it's synced to traktor. So obviously it will be faster when messing with short loops etc. but it slows down when the warning for track ending is sent, somewhat annoying.

Would it be possible to use other "gates" that if & and? I would love to have access to the or command. That would give great possibility for instant grat mappings...

General q, you use cc's for everything in the traktor.tsi is there a reason for that? I lack some knowledge in midi and read as much as I can but don't get everything yet. Seems like notes should be sufficient for a lot of things...

And also, I would be greatful if someone could explain what a midi pc is, can't seem to find that. No problem looking other stuff up in midi documentations.

A small "bug" the play button willl remain lit when track has ended since no off message is sent.

And one more thing, to be able to make the specific mappings I'm after I would have to make a lot of custom traktor stuff and add them to the tsi. Is there a simple way to keep my customizations separate? Is there a certain note or cc range I should stick to? I want my setup to be compatible with future versions

I hope I don't sound ungreatfull with all these q's and ideas... I love the extra power this gives my launchpad and have a hard time deciding how to proceed.

Going the midimasher route all the way or to create traktor tsi's for each layer since I seem to need a lot of custom stuff anyways. I know leds are harder...
But some work has do be done twice with the masher, first mapped then coded. Think the code setup is great though! So much faster. BTW, could I debug my config if I make a mistake in code? Now I just know that there is a problem if the app shut down on initiation =) No big deal, but I might aswell ask.

I'm stoked and seem to spend to much time experimenting and learning and to little sleeping

I'm willing to help out with mappings and such if help is needed. Just send a PM if so.

cheers and keep up the good work!
Neoma Picklesimer
21.12.2011
Okies, ordered the Akai LPD8, and I expect it to be delivered tomorrow

I'm very excited to play with it, and esp. the Slicer-function by u, Zestoi...
Where do I start?

Download Midimasher... what's next?
Santiago Brasier
19.12.2011
That was a massive read!

Just plowed through the 28 pages of thread... Been using MM for a couple of days now. Got it up and running after some trial and error... The thing I got wrong at first was the ins and outs for virtual mf's in traktor. I was looking at it from traktors viewpoint and nott from mm's so first tried to set them the other way around.

Anyways, superstoked and all good so far! From now on it seems the controllers without layers in firmware will be superior due to the flexibility this app add's.

A couple of things that spring to mind that could be implemented.
Automation of fx from counters or some other great solution.

Soft fadermovements like in katapult. So that the fader doesn't jump straight to the 5th value when pressed. could be messy to for sure. But nice to have the choice =)

Think I had something else in mind around page 15 but can't seem to recall that at the moment.

Due to my limitations in pragramming skills I probably won't add much in that department. Could however do some labor when it comes to adding traktorfunctions. Liked the idea with a slit tsi. either by deck or by functiongroup.

Suppose in the end since we all have our own workflow it's hard to find a standard that fits everyone...
Checking so I got it right, for now it's best to leave traktor buttons on hold to be able to hold or toggle in mm.

Another q, a mate of mine wants to make a very specific mapping. And would need to ignore the note of in a clever manner if other buttons are pushed.

It's the next logical step from the instant grat mapping. Instead of firing supercombos he would like to be able to let go of the first buttons in a combo and start executing a different one with two or three fingers.

Not sure that made sense...

Probably won't find time to make my own confic for a few more days but looking forward to get it done. I will need deck C and D though. Pretty much decided to trigger samples in external software.

Suppose it would also be possible to make a different TSI for torq or other software... Could perhaps help with that to in time.

One q about the slicer. Spent some time on the real one since I used to own a twitch. Suppose the slice size and playback length functions are left out?

Didn't have much time to try stuff out the other day.

I'll stop for now, seems like I produced an awful lot of text!

Cheers
//Joel
Arcelia Siebeneck
18.12.2011
I'll sell my LPD8 for 25 euros if anyone's interested?
Chasidy Heckenbach
18.12.2011
Originally Posted by bascurtiz
Found one on marktplaats.nl, the Dutch kinda ebay version
Btw, I found some cool mappings on traktorbible.com for the LPD8.
To give yourself some more groupies , why not post yours, aswell there?
yep, i will do sometime. ofc i can't upload a copy of mm to the traktorbible as it'd be out of date as soon a newer one was released but maybe a link to the download along with the config for a particular controller or something...

<< Back to Post and find Controller MappingsReply

Copyright 2012-2023
DJRANKINGS.ORG n.g.o.
Chuo-ku, Osaka, Japan

Created by Ajaxel CMS

Terms & Privacy