multi parameter sysex packets?

Home Forums General Panels, Components, Macros multi parameter sysex packets?

Viewing 5 posts - 1 through 5 (of 5 total)
  • Author
    Posts
  • #68259
    motosega
    Participant
    • Topics: 2
    • Replies: 11
    • Total: 13

    the synths i want to build pannels for are both fairly old synths that use a big sysex packet that contains all the parameters for a patch. (orla dse 12 fm synth, and simmons sds9 drum brain.)

    is there a existing panel that works like this so i can get an idea of how to do it? all the ones i looked at so far have separate sysex message for each parameter.

    i imagine that i have to create an object that has a sysex message full of variables and chnage the variables with gui sliders, then send that object when i want to update the patch on the synth. any pointers?

    #68326
    Possemo
    Participant
    • Topics: 14
    • Replies: 638
    • Total: 652
    • ★★★

    In Roland language there are IPR sysex messages (Indvidual Parameter), APR (All Parameter) and BULK (All Patches – the wohle memory of the synth). Older synths probably just feature BULK or APR. So you will not be able to send single parameter values with a Ctrlr-fader or switch. You will have to use Lua scripting for this. With Lua scripting Ctrlr is able to do almost everything. APR and BULK are more features of a Librarian than an Editor. Look at my SuperJX-OS4.x panel. It is able to handle APR and DUMP. You can ask me if you have questions about the SuperJX panel.
    I have to say that the SuperJX-OSv4.x Dumps are relatively simple. Most complex is the BULK. Some bytes are used for several different parameters which do not require an entire byte (switches and selectors).

    • This reply was modified 6 years, 4 months ago by Possemo.
    • This reply was modified 6 years, 4 months ago by Possemo.
    #68329
    motosega
    Participant
    • Topics: 2
    • Replies: 11
    • Total: 13

    thanks, i’ll have a look at your superjx pannel
    i’d rather avoid lua if possible, maybe there’s another way

    i’ve been getting a bit deeper into ctrlr and i discovered global variables.
    Can’t i just create a load of controllers attatched to global variables, then create a ‘send’ button with a sysex formula that contains the variables in the right order?

    i checked and there are enough global variables for all the voice parameters on the orla dse12. its’s a pretty simple synth, unfortunaty it dosen’t respond to Control Changes and it only has a single patch sysex format.
    nobody has ever made a sysex editor for it.(maybe there was an atari editor, but it’s been lost in the mists of time)

    it sounds great but it’s really a pig to program from the front panel

    #68397
    Possemo
    Participant
    • Topics: 14
    • Replies: 638
    • Total: 652
    • ★★★

    Your idea with the global variables goes in the right direction. But global variables are part of Lua. Btw if you dont declare variables to be “local” variables in Lua are always global.
    You could get all parameter values and put them in the right order into a string and send it to the synth. For this it is easiest to usea a Lua table where you put all parameter values – look at my panel, procedure called “getPanelValues”:

    -- make a table called "PatchDataValuesTable"
    	PatchDataValuesTable={}
    
    -- start to fill the table
         -- byte (1) to (7) used for message prefix
    	PatchDataValuesTable[1]="f0"
    	PatchDataValuesTable[2]="41"
    	PatchDataValuesTable[3]="38"
    	PatchDataValuesTable[4]="00"
    	PatchDataValuesTable[5]="24"
    	PatchDataValuesTable[6]="30"
    	PatchDataValuesTable[7]="01"
    
    -- GET the Patch Parameters (Global Parameters)
    	PatchDataValuesTable[26]=string.format("%.2x",panel:getModulatorByName("A/B_Balance")    :getModulatorValue())
    	PatchDataValuesTable[27]=string.format("%.2x",panel:getModulatorByName("DualDetune")     :getValueMapped())
    	PatchDataValuesTable[28]=string.format("%.2x",panel:getModulatorByName("SplitPointUpper"):getValueMapped())
    	PatchDataValuesTable[29]=string.format("%.2x",panel:getModulatorByName("SplitPointLower"):getValueMapped())
    	PatchDataValuesTable[30]=string.format("%.2x",panel:getModulatorByName("PortaTime")      :getModulatorValue())
    

    Then you only need a small part of my procedure called “sendPatchToSynth”. On my example the length of the sysex message is 279.

    -- Get current patch data from panel by executing "getPanelValues"
    getPanelValues()
    	
    -- Concatenate all Table values to a string. Put a Space between values
    PatchDat=table.concat(PatchDataValuesTable," ",1,279)
    
    -- Convert the String to a Memoryblock
    MemB=MemoryBlock(PatchDat)
    
    -- send the Memoryblock to the synth
    panel:sendMidiMessageNow(CtrlrMidiMessage(MemB))

    then you just nee a Button in Ctrlr and set the script “sendPatchToSynh” to “called when mouse is down…” in the Button settings.

    • This reply was modified 6 years, 4 months ago by Possemo.
    • This reply was modified 6 years, 4 months ago by Possemo.
    #68401
    Possemo
    Participant
    • Topics: 14
    • Replies: 638
    • Total: 652
    • ★★★

    But this will only work if your synth uses entire Bytes in the sysex-dump. there are some synths that are using “nibbleized” Bytes. Then it will start to get complicated…

Viewing 5 posts - 1 through 5 (of 5 total)
  • The forum ‘Panels, Components, Macros’ is closed to new topics and replies.
There is currently 0 users and 68 guests online
No users are currently active
Forum Statistics
Threads: 2,495, Posts: 17,374, Members: 77,605
Most users ever online was 12 on January 22, 2019 3:47 pm
Ctrlr