This is a patch to enables the sending of MIDI-controller data from the Korg Electribe ES-1 to maxMSP.

ES-1.jpg

es-1_patch.png

Some technical details:

The ES-1 only sends MIDI note values on the MIDI-out port. The controllers are only sent by so called NPRN-Data. Usual audio-applications can’t handle this kind of data hidden in the MIDI-stream. MaxMSP allows to handle every kind of incoming data, so I figured out to convert the controller values into the max format. The single sample-channels 1 till 7B changes the controller values of the knobs. All in all you can control over 68 controller values in addition to the ordinary MIDI note data with that patch! Using the patch is pure fun, because the Electribe ES-1 it is still one of the best hardware controller interfaces available.

To use it, simply copy the content of the .txt-file into the copy-buffer and select in maxMSP “open from clipboard”. Done, that’s all. Download here.

If you port this patch to pure data or vvvv, leave a comment and we will link to your place or host your patch at this place. Use this patch for a performance? (It doesn’t have to be necessarily a music performance…) Then please feedback and post a comment here.

Download - Date published: March 7, 2007 | 33 Comments

Readers have left 33 Comments. Join them!

  1. Okan said:

    Hi,
    it looks great. i buyed a es-1 and will try this patch soon.

    do you have a patch for sending midi control data from computer(from ableton maybe) to es-1 ?
    i am looking for one patch that does the job exactly inverse of yours.
    maybe it can be built easily. i need to learn about binary codes of these midi control messages. but still dont know how to assign control messages with es-1 messages.
    all i need is writing and saving automations (of a song) to the computer.

    Thanks for the interest …

    Regards from Istanbul

  2. Hello Okan.

    – First of all you can make use of Pluggo, to make VST PlugIns out of maxMSP patches to make use in Abletome Live. Pluggo again cost money, but I am almost sure that threre are similar tools out there for free, maybe in the pure data community.

    – I was wondering why you would make use of NPRN-Data from your applications into the ES-1. From my point of view this did not make sense.
    To control MIDI-Note Data (Notes on, offs etc.) there are better solutions on board of the ES-1. And for making a dump of all data at once you can write a simple patch. Once I made a quick patch. If you want I can mail it to you.

  3. okan said:

    hi martin,

    this patch is really functional. it works! i simply want to write some automations (like volume control) on ableton to control es-1. it is because that i want to use es-1 in my track arrangements. there isnt any related info on the web. even korg didnt answer. i am very thankful if ou have a patch that sends midi cc# automations(written in ableton) to es-1.
    i am not good at coding. i’ll try to write this patch on puredata and then can send messages by using midiyoke midi ports maybe. i will send you if i will have achieved something working correctly.

    thanks again for this patch!!

    okan

  4. Thanks Okan. Interesting thoughs though. Would be an interesting enhancement to make the patch bi-directional and to also make a vst-version of it.

    Greetings to Istanbul!

  5. mclean said:

    I just ported this to pure data. If you run the cyclone library, the patch is identical to the max one.

  6. kraku said:

    Will it be hard to change this file to be usefull on ER-1 MK2?

  7. Hello Kraku.

    I don’t have an ER-1 MK2 available, but it should be really no problem to customize this device. I could imagine that the engineers at Korg simply used the same layout of controller numbers for the ER-1. If not, that you can simply analyze the incoming controller values in the patch and customize it to the ER-1 MK2 and your needs.

  8. Nick said:

    Hey there Martin,

    I have an ER 1 and was testing his patch out in Ableton Live. How can I send the midi data produced in max/msp to ableton?

    when I currently test it, the midi data is not being recognised in abelton.

    Cheers

    nick

  9. Hi Nick!

    What exactly are you trying to do? This one is a patch for maxMSP, unfortunately I did not managed to make a VST-version of it. As far as I know Ableton does not understand maxMSP files, but only VST.

    If someone would make this possible, it would be a pleasure to publish it here.

  10. nick said:

    hi Martin.

    In Ableton there is a function that allow us to map midi parameters to effects. I was thinking of using one the knobs on the ER1 to control Ableton based reverb wet/dry controls. This would be really good :)

  11. Hi Nick.

    Like I already said… Ableton does not understand maxMSP patches. It is possible to make a VST out of the patch above. But you need special software to do so. I think it was called Pluggo, or any other thing from Cycling 74. I would really appreciate it, if someone could just VST the patch, test it and send it to me, in order to please people like you. ;)

  12. Nick said:

    Oh I found out a way in the ableton forum :) no worries !

    ——————-

    its really easy, just takes a while to get all the pieces.

    I have successfully mapped every knob and button on my KORG ES1 mkII to ableton to use as a sequencer/controller.

    First things first, the only buttons that will work right after you hook it up to ableton are the part keys.(i.e. where you samples are arrnaged and selected on the korg) all the other knobs and faders will not.

    These knobs and faders do send information. If you havn’t tried already, try to midi map a knob into ableton. Any knob will send a CC# (controller change) normally either 6/….or98/, followed by some more information…. these are useless without being properly translated, and in reality are NRPN(

    Step 1 = Get MIDI-OX and MIDI Yoke installed on your computer. Detailed instructions can be found at midiox.com.

    Step 2 = After these programs have been installed, hook up your electribe to your computer via your MIDI connection.

    Step 3 = Open up MIDIOX, and go to options at the top, click on MIDI devices. You should see your input MIDI device on the list. Select your IN device and then select and OUT device(a MIDI YOKE channel). We have setup a kind of translation bay. NRPN will come in on the INPUT, translated, spit back OUT immediately on the OUTPUT. Close this list.

    Step 4 = Open up a input and output monitor in MIDI-OX, if all is connected properly you should see the input start scrolling. I came to believe this is my korgs timeclock. Now the fun begins.

    Step 5 = Click on view>MIDI status..this will open up a sort map. Move a knob on your electribe and look in this map. a NRPN # and min-maxrange will show up. The range is almost 99% always 0-16256. Ok so we now have the NRPN # and range for one of your knobs, write these down, i swear it will help.

    Step 6 = Now, with this information we can start translating this knobs NRPN to a usable CC signal. Click options and then data mapping. This will open up a translation map. Nothing should be checked in here except, (TURN MAP ON). Click on insert.

    Step 7 = After clicking insert it will bring up Define Mapping window. Do as follows

    WHEN INPUT MATCHES
    Channel=Any Event=NRPN Min1=NRPN # Max1=(same NRPN as before) Min2=0 Max2=16256
    WHEN OUTPUT MATCHES
    Channel=Any Event=Controller Change Min1=AnyCC you want 1-97(excluding 6,98, and the channel you are sending on) Max1=the same CC as Min1 Min2=0 Max2=127

    Click ok.

    Step 8 = to check move the knob, make sure you are still getting chages on the input monitor. ( the turn map on after ok button) had to be checked or the data mapping will no be turned on. We have now taken a unusable NRPN and converted it to a usable CC.

    Last step is to open Ableton and setup your MIDI options to recieve on all channels. You also have to go into the MIDI options and on whatever MIDI yoke channel you used( i used 1) make sure the sync and remote keys are solid. Now, turn midi mapping on, click on a parameter and move your knob. If all went well it will show up as whatever CC you assigned it. Have fun.

    On my ES1 mkII I have 8 sample parts. Each on of these parts is assigned to a part in IMPULSE. If i have part 1 selected i have knobs for everything, time,decay,start,vol,drive,filter……all of these are just for the kick…..i select my part 2 button on my korg(which makes all my knobs send different NRPN when selected) and i have the same control over part 2.

    Basically it turned impulse into a bad ass because i can eff up each hit respectively. I

  13. jason heirl said:

    hey, it’s all this possible if i use logic pro 8 ??
    i can only use the keys but not the faders..

  14. I think not directly, because you can’t load any patch into Logic 8, I guess. Check if Logic 8 support direct manipulation of NPRN-Data. Otherwise I definitely will have to check, to finally make a VST out of the patch..

  15. james said:

    Hi could somebody explain how to port this patch to Pure Data? I know it must be relatively simple, but I’m new to all this.
    Also has anybody modified it to work with the EA-1 or the MK-2? If so please explain how it’s done???

    This would all make me very happy indeed!

  16. Phaco said:

    Hi there,
    Can somebody explain this?
    I try to use my ES1 with battery3 (NI)as controller. I can assign note as I want but when I play patterns, I have a terrible result (to many midi info?):samples are sometimes slowing down and then running after the tempo… Do you think i can use it as told before (then solution??) or do you think the midi port of the ES1 is not able to manage so many output informations?
    PS: any idea wher can I find a Midi device Map for ES1MK2?

    thank you so much for your help.

  17. 020200 said:

    @Phaco: Hm, this issue is not really related to this patch, isn’t it? Unfortunately I am not that deep into the ES-1 and MIDI-things to give you a help on this. Maybe anyone else?

  18. andy said:

    Hi,

    I’ve followed the ableton method of mapping my ER1 Mk2, I noticed in nicks post he said he managed to get it to change the nprn for each part so you can control the decay, pitch, modulation etc of each part. How can I map this in midiox so that when I select a different part key all the knobs a assigned a different value in order to map them for each individual part in ableton?

    Also has anyone tried reverse mapping, so that the er1 can be controlled from ableton?

    Any ideas would be very interesting!

    Andy

  19. Adriano said:

    Hi,
    I’m triyng to control a digitech whammy pedal with the Electribe es-1….

    Here the midi capablities of the whammy:
    “The WhammyTM is capable of remotely adjusting the treadle position, as well as turning the WhammyTM effect on and off through the use of MIDI continuous control commands. MIDI CC11 adjusts the treadle position. A value of 0 on MIDI CC11 corresponds to a toe up position and 127 corresponds to a toe down position.
    MIDI CC0 is used to turn on and off the Whammy effect. Values from 0 through 64 on MIDI CC0 will turn the WhammyTM effect off, and values from 65 through 127 will turn the effect on.”….

    Now, it’s possible to create a kind of “arpeggio” with a pattern from the electribe?
    I hope the question is clear (my english is very poor!!!)….

    Thanks….

    Adriano

  20. 020200 said:

    I don’t see a reason, why it should be impossible to do this effect. You of course will need a software, that is capable of doing the MIDI-data action while sending it to the pedal.

  21. Adriano said:

    The reason is to have a live set “easy-to-program”….
    I know that it’s possible with the softwares, but it’s not immediate…and in a live set you can’t “improvvise”….

    My idea is to have a midi pedalboard to switch the pattern on the electribe connected to the whammy to create the arpeggios…

  22. attila said:

    Hello!
    i would like to circuit bend my electribe es1..
    it is possible isnt it?
    could anyone send me an email with any projects that have been made done before like this?
    please!!
    attila

  23. attila said:

    bit off topic i know…..sorry.
    forgive me..

  24. 020200 said:

    Hm attila,
    did you tried google? I’m not an expert at circuit-bending, but I am not sure, if it is a good idea, to circuit-bend the ES-1. Especially not for beginners! Start small, use toys.

  25. Ludwig said:

    Hi guys,

    Pretty cool thread here. Saved my day. I extended the patch so that it is a bit more robust and also has a CC -> NRPN back conversion.

    I tested against an Electribe ER1 and EM1, Live 8.1 and Max 5.

    I got rid of the [thresh] object, as it seemed to introduce some faulty messages in the stream as well. Adapted the js from http://tetradev.blogspot.com/2010/03/nrpns-part-1-basics.html

    Please post here, if you are continuing on my patch somehow.

    Cheers,
    Ludwig

    ———

    {
    “boxes” : [ {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “unpack 0 0″,
    “outlettype” : [ “int”, “int” ],
    “id” : “obj-177″,
    “fontsize” : 12.0,
    “patching_rect” : [ 351.0, 252.0, 69.0, 20.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 2
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “js filter_nrpn.js”,
    “outlettype” : [ “” ],
    “id” : “obj-175″,
    “fontsize” : 12.0,
    “patching_rect” : [ 350.0, 215.0, 88.0, 20.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 1
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “t b b b i”,
    “outlettype” : [ “bang”, “bang”, “bang”, “int” ],
    “id” : “obj-162″,
    “fontsize” : 12.0,
    “patching_rect” : [ 336.0, 356.0, 59.5, 20.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 4
    }

    }
    , {
    “box” : {
    “maxclass” : “number”,
    “outlettype” : [ “int”, “bang” ],
    “id” : “obj-161″,
    “fontsize” : 9.0,
    “triscale” : 0.9,
    “patching_rect” : [ 482.0, 398.0, 35.0, 17.0 ],
    “htextcolor” : [ 0.870588, 0.870588, 0.870588, 1.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “bgcolor” : [ 0.866667, 0.866667, 0.866667, 1.0 ],
    “numoutlets” : 2
    }

    }
    , {
    “box” : {
    “maxclass” : “number”,
    “outlettype” : [ “int”, “bang” ],
    “id” : “obj-160″,
    “fontsize” : 9.0,
    “triscale” : 0.9,
    “patching_rect” : [ 470.0, 212.0, 35.0, 17.0 ],
    “htextcolor” : [ 0.870588, 0.870588, 0.870588, 1.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “bgcolor” : [ 0.866667, 0.866667, 0.866667, 1.0 ],
    “numoutlets” : 2
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “midiparse”,
    “outlettype” : [ “”, “”, “”, “int”, “int”, “int”, “int” ],
    “id” : “obj-145″,
    “fontsize” : 12.0,
    “patching_rect” : [ 352.0, 144.0, 100.0, 20.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 7
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “t b i”,
    “outlettype” : [ “bang”, “int” ],
    “id” : “obj-144″,
    “fontsize” : 12.0,
    “patching_rect” : [ 809.0, 355.0, 32.5, 20.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 2
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “t i i i”,
    “outlettype” : [ “int”, “int”, “int” ],
    “id” : “obj-143″,
    “fontsize” : 12.0,
    “patching_rect” : [ 899.0, 425.0, 46.0, 20.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 3
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “i”,
    “outlettype” : [ “int” ],
    “id” : “obj-139″,
    “fontsize” : 12.0,
    “patching_rect” : [ 899.0, 394.0, 32.5, 20.0 ],
    “numinlets” : 2,
    “fontname” : “Arial”,
    “numoutlets” : 1
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “+ 175″,
    “outlettype” : [ “int” ],
    “id” : “obj-136″,
    “fontsize” : 12.0,
    “patching_rect” : [ 913.0, 363.0, 41.0, 20.0 ],
    “numinlets” : 2,
    “fontname” : “Arial”,
    “numoutlets” : 1
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “midiout b”,
    “id” : “obj-114″,
    “fontsize” : 12.0,
    “patching_rect” : [ 817.0, 539.0, 59.0, 20.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 0
    }

    }
    , {
    “box” : {
    “maxclass” : “comment”,
    “text” : “cc to nrpn conversion”,
    “id” : “obj-109″,
    “fontsize” : 12.0,
    “patching_rect” : [ 804.0, 267.0, 150.0, 20.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 0
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “pack 0 99 6 0 98 0 0 6 0″,
    “outlettype” : [ “” ],
    “id” : “obj-108″,
    “fontsize” : 12.0,
    “patching_rect” : [ 816.0, 506.0, 139.0, 20.0 ],
    “numinlets” : 9,
    “fontname” : “Arial”,
    “numoutlets” : 1
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “ctlin b”,
    “outlettype” : [ “int”, “int”, “int” ],
    “id” : “obj-106″,
    “fontsize” : 12.0,
    “patching_rect” : [ 804.0, 295.0, 46.0, 20.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 3
    }

    }
    , {
    “box” : {
    “maxclass” : “comment”,
    “text” : “pitch, velocity, channel”,
    “id” : “obj-81″,
    “fontsize” : 12.0,
    “patching_rect” : [ 44.0, 589.0, 150.0, 20.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 0
    }

    }
    , {
    “box” : {
    “maxclass” : “comment”,
    “text” : “pass midi notes -> electribe”,
    “id” : “obj-82″,
    “fontsize” : 12.0,
    “patching_rect” : [ 46.0, 443.0, 185.0, 20.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 0
    }

    }
    , {
    “box” : {
    “maxclass” : “number”,
    “outlettype” : [ “int”, “bang” ],
    “id” : “obj-83″,
    “fontsize” : 9.0,
    “triscale” : 0.9,
    “patching_rect” : [ 44.0, 561.0, 35.0, 17.0 ],
    “htextcolor” : [ 0.870588, 0.870588, 0.870588, 1.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “bgcolor” : [ 0.866667, 0.866667, 0.866667, 1.0 ],
    “numoutlets” : 2
    }

    }
    , {
    “box” : {
    “maxclass” : “number”,
    “outlettype” : [ “int”, “bang” ],
    “id” : “obj-84″,
    “fontsize” : 9.0,
    “triscale” : 0.9,
    “patching_rect” : [ 84.0, 561.0, 35.0, 17.0 ],
    “htextcolor” : [ 0.870588, 0.870588, 0.870588, 1.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “bgcolor” : [ 0.866667, 0.866667, 0.866667, 1.0 ],
    “numoutlets” : 2
    }

    }
    , {
    “box” : {
    “maxclass” : “number”,
    “outlettype” : [ “int”, “bang” ],
    “id” : “obj-85″,
    “fontsize” : 9.0,
    “triscale” : 0.9,
    “patching_rect” : [ 123.0, 562.0, 35.0, 17.0 ],
    “htextcolor” : [ 0.870588, 0.870588, 0.870588, 1.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “bgcolor” : [ 0.866667, 0.866667, 0.866667, 1.0 ],
    “numoutlets” : 2
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “notein b”,
    “outlettype” : [ “int”, “int”, “int” ],
    “id” : “obj-86″,
    “fontsize” : 9.0,
    “patching_rect” : [ 181.0, 475.0, 46.0, 17.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 3
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “noteout b”,
    “id” : “obj-87″,
    “fontsize” : 12.0,
    “patching_rect” : [ 172.0, 560.0, 61.0, 20.0 ],
    “numinlets” : 3,
    “fontname” : “Arial”,
    “numoutlets” : 0
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “i”,
    “outlettype” : [ “int” ],
    “id” : “obj-60″,
    “fontsize” : 12.0,
    “patching_rect” : [ 483.0, 423.0, 32.5, 20.0 ],
    “numinlets” : 2,
    “fontname” : “Arial”,
    “numoutlets” : 1
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “i”,
    “outlettype” : [ “int” ],
    “id” : “obj-59″,
    “fontsize” : 12.0,
    “patching_rect” : [ 394.0, 424.0, 32.5, 20.0 ],
    “numinlets” : 2,
    “fontname” : “Arial”,
    “numoutlets” : 1
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “i”,
    “outlettype” : [ “int” ],
    “id” : “obj-58″,
    “fontsize” : 12.0,
    “patching_rect” : [ 438.0, 424.0, 32.5, 20.0 ],
    “numinlets” : 2,
    “fontname” : “Arial”,
    “numoutlets” : 1
    }

    }
    , {
    “box” : {
    “maxclass” : “comment”,
    “text” : “mind message creation:\nfirst compile, then send”,
    “linecount” : 2,
    “id” : “obj-53″,
    “fontsize” : 12.0,
    “patching_rect” : [ 531.0, 367.0, 150.0, 34.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 0
    }

    }
    , {
    “box” : {
    “maxclass” : “comment”,
    “text” : “nrpn to cc conversion”,
    “id” : “obj-44″,
    “fontsize” : 12.0,
    “patching_rect” : [ 393.0, 53.0, 150.0, 20.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 0
    }

    }
    , {
    “box” : {
    “maxclass” : “comment”,
    “text” : “pitch, velocity, channel”,
    “id” : “obj-38″,
    “fontsize” : 12.0,
    “patching_rect” : [ 45.0, 307.0, 150.0, 20.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 0
    }

    }
    , {
    “box” : {
    “maxclass” : “comment”,
    “text” : “pass midi notes -> ableton”,
    “id” : “obj-36″,
    “fontsize” : 12.0,
    “patching_rect” : [ 47.0, 161.0, 150.0, 20.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 0
    }

    }
    , {
    “box” : {
    “maxclass” : “number”,
    “outlettype” : [ “int”, “bang” ],
    “id” : “obj-28″,
    “fontsize” : 9.0,
    “triscale” : 0.9,
    “patching_rect” : [ 439.0, 398.0, 35.0, 17.0 ],
    “htextcolor” : [ 0.870588, 0.870588, 0.870588, 1.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “bgcolor” : [ 0.866667, 0.866667, 0.866667, 1.0 ],
    “numoutlets” : 2
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “split 0 100″,
    “outlettype” : [ “int”, “int” ],
    “id” : “obj-29″,
    “fontsize” : 9.0,
    “patching_rect” : [ 352.0, 322.0, 51.0, 17.0 ],
    “numinlets” : 3,
    “fontname” : “Arial”,
    “numoutlets” : 2
    }

    }
    , {
    “box” : {
    “maxclass” : “number”,
    “outlettype” : [ “int”, “bang” ],
    “id” : “obj-9″,
    “fontsize” : 9.0,
    “triscale” : 0.9,
    “patching_rect” : [ 45.0, 279.0, 35.0, 17.0 ],
    “htextcolor” : [ 0.870588, 0.870588, 0.870588, 1.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “bgcolor” : [ 0.866667, 0.866667, 0.866667, 1.0 ],
    “numoutlets” : 2
    }

    }
    , {
    “box” : {
    “maxclass” : “number”,
    “outlettype” : [ “int”, “bang” ],
    “id” : “obj-10″,
    “fontsize” : 9.0,
    “triscale” : 0.9,
    “patching_rect” : [ 85.0, 279.0, 35.0, 17.0 ],
    “htextcolor” : [ 0.870588, 0.870588, 0.870588, 1.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “bgcolor” : [ 0.866667, 0.866667, 0.866667, 1.0 ],
    “numoutlets” : 2
    }

    }
    , {
    “box” : {
    “maxclass” : “number”,
    “outlettype” : [ “int”, “bang” ],
    “id” : “obj-11″,
    “fontsize” : 9.0,
    “triscale” : 0.9,
    “patching_rect” : [ 124.0, 280.0, 35.0, 17.0 ],
    “htextcolor” : [ 0.870588, 0.870588, 0.870588, 1.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “bgcolor” : [ 0.866667, 0.866667, 0.866667, 1.0 ],
    “numoutlets” : 2
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “notein a”,
    “outlettype” : [ “int”, “int”, “int” ],
    “id” : “obj-12″,
    “fontsize” : 9.0,
    “patching_rect” : [ 182.0, 193.0, 46.0, 17.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 3
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “midiin a”,
    “outlettype” : [ “int” ],
    “id” : “obj-31″,
    “fontsize” : 9.0,
    “patching_rect” : [ 394.0, 90.0, 42.0, 17.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 1
    }

    }
    , {
    “box” : {
    “maxclass” : “comment”,
    “text” : “valid controller value (are based between 0 and 100)”,
    “id” : “obj-17″,
    “fontsize” : 9.0,
    “patching_rect” : [ 408.0, 325.0, 236.0, 17.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 0
    }

    }
    , {
    “box” : {
    “maxclass” : “number”,
    “outlettype” : [ “int”, “bang” ],
    “id” : “obj-20″,
    “fontsize” : 9.0,
    “triscale” : 0.9,
    “patching_rect” : [ 398.0, 397.0, 35.0, 17.0 ],
    “htextcolor” : [ 0.870588, 0.870588, 0.870588, 1.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “bgcolor” : [ 0.866667, 0.866667, 0.866667, 1.0 ],
    “numoutlets” : 2
    }

    }
    , {
    “box” : {
    “maxclass” : “number”,
    “outlettype” : [ “int”, “bang” ],
    “id” : “obj-21″,
    “fontsize” : 9.0,
    “triscale” : 0.9,
    “patching_rect” : [ 352.0, 298.0, 35.0, 17.0 ],
    “htextcolor” : [ 0.870588, 0.870588, 0.870588, 1.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “bgcolor” : [ 0.866667, 0.866667, 0.866667, 1.0 ],
    “numoutlets” : 2
    }

    }
    , {
    “box” : {
    “maxclass” : “comment”,
    “text” : “controller”,
    “id” : “obj-34″,
    “fontsize” : 9.0,
    “patching_rect” : [ 394.0, 297.0, 100.0, 17.0 ],
    “numinlets” : 1,
    “fontname” : “Arial”,
    “numoutlets” : 0
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “noteout a”,
    “id” : “obj-26″,
    “fontsize” : 12.0,
    “patching_rect” : [ 173.0, 278.0, 61.0, 20.0 ],
    “numinlets” : 3,
    “fontname” : “Arial”,
    “numoutlets” : 0
    }

    }
    , {
    “box” : {
    “maxclass” : “newobj”,
    “text” : “ctlout a”,
    “id” : “obj-19″,
    “fontsize” : 12.0,
    “patching_rect” : [ 410.0, 612.0, 85.0, 20.0 ],
    “numinlets” : 3,
    “fontname” : “Arial”,
    “numoutlets” : 0
    }

    }
    ],
    “lines” : [ {
    “patchline” : {
    “source” : [ “obj-21″, 0 ],
    “destination” : [ “obj-29″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-12″, 0 ],
    “destination” : [ “obj-9″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-12″, 1 ],
    “destination” : [ “obj-10″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-12″, 2 ],
    “destination” : [ “obj-11″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-12″, 0 ],
    “destination” : [ “obj-26″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-12″, 1 ],
    “destination” : [ “obj-26″, 1 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-12″, 2 ],
    “destination” : [ “obj-26″, 2 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-28″, 0 ],
    “destination” : [ “obj-58″, 1 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-20″, 0 ],
    “destination” : [ “obj-59″, 1 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-59″, 0 ],
    “destination” : [ “obj-19″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-58″, 0 ],
    “destination” : [ “obj-19″, 1 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-60″, 0 ],
    “destination” : [ “obj-19″, 2 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-86″, 0 ],
    “destination” : [ “obj-83″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-86″, 1 ],
    “destination” : [ “obj-84″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-86″, 2 ],
    “destination” : [ “obj-85″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-86″, 2 ],
    “destination” : [ “obj-87″, 2 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-86″, 1 ],
    “destination” : [ “obj-87″, 1 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-86″, 0 ],
    “destination” : [ “obj-87″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-136″, 0 ],
    “destination” : [ “obj-139″, 1 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-106″, 2 ],
    “destination” : [ “obj-136″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-139″, 0 ],
    “destination” : [ “obj-143″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-143″, 0 ],
    “destination” : [ “obj-108″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-143″, 1 ],
    “destination” : [ “obj-108″, 3 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-143″, 2 ],
    “destination” : [ “obj-108″, 6 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-106″, 1 ],
    “destination” : [ “obj-108″, 5 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-106″, 0 ],
    “destination” : [ “obj-144″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-144″, 1 ],
    “destination” : [ “obj-108″, 8 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-144″, 0 ],
    “destination” : [ “obj-139″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-108″, 0 ],
    “destination” : [ “obj-114″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-31″, 0 ],
    “destination” : [ “obj-145″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-145″, 6 ],
    “destination” : [ “obj-160″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-160″, 0 ],
    “destination” : [ “obj-161″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-161″, 0 ],
    “destination” : [ “obj-60″, 1 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-145″, 2 ],
    “destination” : [ “obj-175″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-175″, 0 ],
    “destination” : [ “obj-177″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-162″, 0 ],
    “destination” : [ “obj-59″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-162″, 1 ],
    “destination” : [ “obj-58″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-162″, 2 ],
    “destination” : [ “obj-60″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-177″, 0 ],
    “destination” : [ “obj-21″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-177″, 1 ],
    “destination” : [ “obj-20″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-29″, 0 ],
    “destination” : [ “obj-162″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    , {
    “patchline” : {
    “source” : [ “obj-162″, 3 ],
    “destination” : [ “obj-28″, 0 ],
    “hidden” : 0,
    “midpoints” : [ ]
    }

    }
    ]
    }

  26. Ludwig said:

    Oh, and here the filter_nrpn.js file…

    // MIDI CC constants
    const CC_DATA_MSB = 6;
    //const CC_DATA_LSB = 38; // not used
    const CC_NRPN_LSB = 98;
    const CC_NRPN_MSB = 99;

    // inlets and outlets
    inlets = 1;
    outlets = 1;

    // global variables and arrays
    var nrpn_index;
    var value;
    var cc_index;
    var cc_value;

    function list(val)
    {

    if(arguments.length==2)
    {
    cc_index = arguments[0];
    cc_value = arguments[1];

    switch(cc_index)
    {

    case CC_DATA_MSB:
    // If we have a valid NRPN index, then the data is valid
    if(nrpn_index)
    {
    send_cc(nrpn_index, cc_value);
    }
    break;

    case CC_NRPN_LSB:
    nrpn_index = cc_value;

    break;
    default:
    break;
    }
    }
    }

    // Send NRPN: Send NRPN index and value to output 1
    function send_cc(i, v)
    {
    outlet(0, i, v);
    nrpn_index = null;
    value = null; // reset the parsed value
    value_lsb = null; // reset the LSB of the value
    }

  27. 020200 said:

    Great. Thanks Ludwig for your contribution.

  28. walidg said:

    hi people,

    is it possible tp link this script to Ableton’s control surface ?

  29. samE said:

    here is the patch for MAX FOR LIVE, this is for abelton live so you can use it as a plugin.

    https://www.yousendit.com/download/M0RveUNKYUlUME4zZUE9PQ

  30. samE said:

    its only up till the 16th of Sep’ (2011) but I will repost it for a month or so.

  31. james said:

    hello, i am a complete noob when it come to max, could someone please give me the dummies guide to setting this up?

  32. colo said:

    I would like to see a VIDEO ! :)

    1) Are the 16th sequencer buttons also traduced?

    2) So you can send a different midi message (CC?) for EVERY KNOB on EVERY PART?

  33. pOOL said:

    Hello,
    Please up the MAX for LIVE pathch again. The link has expired!!
    Thanks!