In the deep, dark world of Bome’s MT there is still yet more I have to learn to exploit. Over years of building, designing, debugging & starting again with my APC40 I thought I knew how much I could do and the limits were vastly greater than my ability to fill them, until now: Along came an Ableton Push into my possession, a long awaited prize, with many new features I just didn’t have with the APC.
Screen for starters… “Can I write to that?”, “Oh yes of course you can” went my little brain! Velocity sensitive buttons with polyphonic repeat and knobs that glide and send on/off codes when you touch them… ooooooh.
So what’s this post all about? Well we’re all about to find out when Steve gets onboard and starts melting and bending our minds, but first we have more scene to set.
The Push then:
There are 360 globals available in MT (ga through n9 and ya through z9) to record values for later recall and use cross translator and cross preset.
I have managed to run out!
Attached is a spreadsheet that I clear out for new projects in which I record my globals. This is butchered from my 1st Traktor mapping that I did with Push and has been transferred to RekordboxDJ by Pioneer. I like to keep my options open and I have owned Pioneer Mixers and CDJ’s for years so it makes sense to keep up to date with them too.
Looking at this Spreadsheet you will immediatly notice large areas of colour totalling 68 globals per block. ga-nt are used solely for writting to the screen. There are 68 cells per row and 4 rows to write. you must write the entire row in sysex even for a single cell change so you must remember all these values. That only leaves me from nu-n9 + ya-z9.
With Traktor this matters less as you have full control of the MIDI IN and OUT of it and so you can happily let Traktor deal with LED states etc and isolate incoming values in MT then SEND MONITOR STATE and the lights update, but Rekordbox is different; for the worse.
In RBDJ there is no control over the output of the control, it returns what it receives. What’s worse is it does not understand values below 63 as on and so if I wish my light to switch from value 3 when off to 4 when on it won’t trigger the control in program. This means long translation to send only 127 and 0 into RB and convert those to 3 and 4 on the way back, but what about when I change page to a different set of controls? RBDJ has no feature for this… no Send Monitor State. So now I need to remember the value of each of these buttons and across multiple pages… Omg I have no globals left and I’ve only done 1 quadrant 7 times…
I’m exagerating slightly of course, if you look at the spreadsheet you willl see then that the next blocks are in 16’s, 4 of them, for each quadrant. You will hopefully notice I can’t record the state of each page here, only the state for each page. Meaning On/Off the button is this colour. But at least I have 8 pages for 4 quadrants and 1 state to differentiate these buttons, right?
Wrong. Apparently there’s more information available in these globals than we are used to using and this is where Steve will chime in below to show us how we can control 10 lights he reckons with 1 global with 2 spare bits. Something to do with 32bits and 3*10 RGB values, but lets try to do this practically and applicably.
Also attached then is a new bmtp with the basic button layout of the Push inside. 1 button 1 translator for the On state of each button. The top left grid of 16 pads triggering their lights on when you push them and off when u release, velocity denotes colour and 3 Presets for the screen rows.
Firstly condensing this ASCII into less than 68 globals per row would be great. then controlling the on/off state of 16 pads by as few globals as possible; being able to remember the state of each individually and return a state change if pushed.
This is Row 1 Sysex currently:
Which is this in reality:
These 4 are separators and stay the same whatever:
the others are blocks of 8 for words or symbols and will likely change together.
You must send the entire 68 to change 1 cell.
Hopefully this won’t be so difficult and it will massively streamline the project and all future projects.
Before I go and await the pending destruction of my mind, I have a couple of questions I would like addressed within the reply/solution:
To my basic understanding of what you seem to be saying with the colours in RGB: If we take it that a single bit can have a value of 0 or 1 and we give 3 for R G and B then we can only mix very basic full brightness colours with this. Red 100, Green 010, Blue 001, etc. Please elaborate on what we are storing and how we are translating that back to a meaningful spectrum of colours. Also Push has defined MIDI values for colours and can’t/don’t we just use them?
Second question: If I have say 16 buttons and I combine them to have On/Off states for 1 bit each how can I know that it is button 14 which is on and not button 1 when the value of the whole number is still 1. To me it seems that any given value can only produce 1 effect but maybe there are 8 active and 8 not active? Then which 8 are or are not? etc.
I’m sure this is the point and you are going to show me some weird magic that I’m gonna twist and turn over for sometime, I thank you in advance.
Marked as spam
For ascii compression of 68 characters you can use 1 global for 4 charachters (28 bits of the 32 bits) so 68/4 will give you 17 variables
To you can pack them in what ever order you want but be consistant.
so for example ga you could use bits 0-6 for first character, bits 7-13 for second character, bits 14-20 for 3rd character and 21-27 for 4th character.
Using the above methodology, you extract first character as follows
Yes and No… where is gg plucked from? it seems to have been inserted with no reference and then used to XOR ga?
the rest of it i’m good… using 127 I get 6 bits and thus a HEX code for my ASCII letter and that groups those bits after shifting to the start bit. 🙂
Also of note, I only need 64 letters to be saved as there are 4 dividers that are the same permanently and may aswell just get a hard code ascii. so 64/4= 16 so I save a global and make my numbers even again and divisible by 8 yay!
pp=gg^ga us typo sorry should be pp=pp&0x7f
For stuffing values back in it will require a bit more work. Basically we have to ensure we only touch the bits we want to stuff.
Yeah cool if they’re all the same then you have +7 on each no problem, gives 8 bits not 6 sorry and then there is 4 spare.
This is all starting to come together in my brain, still a few holes, but I’m geting there.
Hi Steve, I’ve been mulling this over in my brain whilst working on the buttons, which are now fully coded and working with many less globals thanks to your good self. I don’t actuially think it is possible to control the screen with less globals though, here’s why: As I point out in the original post, you must update the entire row even for a single cell change. the Sysex looks like this: F0 47 7F 15 1A 00 45 00 j2 j3 j4 j5 j6 j7 j8 j9 ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz k0 k1 k2 k3 k4 k5 k6 k7 k8 k9 la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx F7 there are not enough locals to replace the 68 globals here for output to the Push, no matter how lovely 17 Globals for the storage of the current Letter may be you still nedd to somehow get 68 values on the output and thus it makes it impossible I think to do this without a discrete global for each… If you have any thoughts on this please feel free but for now I’m gonna stick to light state reduction! Peace dude
You may be able to use a timer as a loop and output the same local variable each iteration of the loop.
What do you think?
hang on… have I missed a trick here?
you can send SysEx over multiple translators by leaving it open and closing in the last omne, so long as you don’t put any other translator inbetween, e.g.
Translator 1 Out: F0 00 00 00 00 00…
That’s sick as !”£$.
Well I think you can if you are sending to external MIDI device. Not sure if the Windows or MAC midi drivers would like it though. I would suggest testing my theory before going through too much work.
Ofc. but it makes sense, and I can’t believe I missed it as an option. in this manner you can either have 70 translators to deal with each letter individually or you can condense it to 8 sending 1 byte per time, definitely an interesting possibility man.
I’ll let you know when I’ve tested it. Won’t be for a week probably, t’is the Missus b’day weekend and we got a rave to go to in Saturday, I won’t be capable until mid next week I don’t feel.
You can test it on your APC mini if it still has the 3 modes? My APC40 had 3 1 for switching it on, 1 when ablechum connected and 1 when ablechum disconnected and i used to control this with a SysEx string where the defining byte was either 40, 41 or 42 for each mode. You probably know this already but it’s worth pointiing out if you wann give it a test yourself. laters
Also to check, if I have a Timer that repeats multiple times and I set it to 68; 0 init delay; 1ms repeat delay, how do I know what iteration it is on in another translator and isolate/change the position of the byte to suit? I don’t see anything in the Timer that does this.
Alas you would need a global variable for the timer to track it’s iterations.
Re APC Mini. Yeah I have one. Pretty much only use it to test out MT Pro projects for helping users here. Take care of your Missus.!
Ok so alas I don’t think we can do it…
125: IN 40.2 On timer “Sysex Itera”
Yes, I think this might be a driver issue. My guess is if you were to send it directly to an external MIDI device it would work because it really doesn’t evaluate the bits. In Windows driver if it recognizes as a partial Sysex and it doesn’t complete, it closes it off.
I tried to send this F0 7D 42 4F 4D 45 7F 05 05 F7
F0 7D 42 4F 4D 45 7F F7
No errors where reported however :
Here is what MT Pro output reported
So that’s odd…. each byte was a seperate iteration right?
i haven’t gone to LoopMIDI yet cos I didin’t see the need but perhaps i’ll try this:
Push -> LoopMIDI -> BMT
I used to use Jack for audio routing and it had MIDI transfer in it too, but it’s a dick to install.
Ah I just realised what I said and how wrong I was, LoopMIDI works between software not hardware, damn.
Have you tried sending Sysex directly to your Pioneer display?
Ok so I got it to send and close properly but nothing has happened pon the push, might be too many characters or something but the solution is to iterate only what you need to change and leave the original lead in identifiers with the F0 like this for me:
Translator 1 Out on release of button:
Translator 2 Timer start on Release of button
3rd translator outputs pp as normal 69 times
Port opens and closes with F7
Here with 1ms init delay and 0ms repeat it still doesn’t do the push but closes properly:
IN 40.1 Note Off on ch. 1 with note:41 (0x29) and velocity:0 (0x00)
…412: IN 40.3 On timer “Sysex Itera”
I’m not gonna try to mess with the pioneer connection btw, the screen in question is on my Push and i’ve already got 4 lines of text on the display, but this sysex iterationhas no effect.