Forum Replies Created
-
AuthorPosts
-
Your window only shows the plugins that are loaded. You need to open the editing panel of the plugin.
This is what it looks like in Ableton
https://1drv.ms/i/s!AizOTNL34REBmuFLtAff537l2hDpOw
The Puppeteer
http://godlike.com.auOpen the Ctrlr VSTi,
In Ctrlr, there will be a menu. Open the panel from there and it will launch inside the Ctrlr VSTi
The Puppeteer
http://godlike.com.auIn the combo box controls on the right, there is a field called OnValuechange
You need to have the name of your method here.The method will pretty much be
If combobox == value then
SendMIDINow(sysexString1)
elseif
combobox == value2 then
…The Puppeteer
http://godlike.com.auJust one more thing. You can build an effective librarian, without editing based on the SYSEX spec that is available in the manual. All of the dumps are outlined for this, and you can just save the patch dumps for management. You can read the names of the objects directly from the SYSEX dump headers.
I built modules for Studio Connections that did this effectively, though it was for session sync in a DAW, rather than as a full blown librarian.
The Studio Connections GTRC modules are available from my website at http://godlike.com.au and if you open them in the GTRC editor, all of the dump requests are there, but they are “mostly” the same as the manual.
There are a few errors in the manuals, but they are minor.
The Puppeteer
http://godlike.com.auThe patch data isn’t published. We have some of it at Mastering VAST. If you are actively working on this project PM me and I’ll look at letting you into our software development forum where we have a lot of documentation.
There is some great software already that functions as a front panel editor for the K series synths made by tangent cats. I’m trying to get hold of a copy for hosting at the Mastering VAST forums.
I’m working on a PC3/Forte panel at the moment, and have most of the data dump format reverse engineered, but the patch format is different to the K-series.
One thing to be aware of is that the sysex dump is a bit stream, so it will need to be converted to 8 bit bytes from 7 bit sysex bytes to be useful. This only applies to the data segment of the dumps. The headers are all encoded in useful sysex bytes.
The Puppeteer
http://godlike.com.auLUA is a bit weird in this instance. Variables are global by default, unless you specifically declare them as local.
According to the LUA documentation you don’t need to explicitly declare a variable to use it. LUA assumes that every single possible variable is declared. nil is a special value and essentially it marks the variable as empty.
In many cases if you try to do operations on a variable with a value nil you will generate errors, so having checks, such as the one above, or setting variables to initial values is good practice, but programmatically is not strictly required.
The Puppeteer
http://godlike.com.auYou may be able to do this using the global variables available from the front panel. I tried this early on, but could never get it to work for what I wanted to do.
So essentially set a global variable to the MIDI channel, and then include that in the SYSEX string from the GUI editor interface, rather than using LUA for each modulator.
The Puppeteer
http://godlike.com.auYes. When the MidiCh modulator value changes.
I’d do it something like this. Use Mch2-4 for your consecutive channels. You may need some logic in there to deal with the case where Mch is set to 13 or higher, as Mch 4 would end up as Ch 17 in that case.
SetMch = function(–[[ CtrlrModulator –]] mod, –[[ number –]] value)
— ch = panel:getModulatorByName(“MidiCh”):getModulatorValue()
ch = value
cntch = value + 1
Mch = 176 + ch — 176 == b0
Mch2 = 177 + ch
Mch3 = 178 + ch
Mch4 = 179 + ch— Change all of the MIDI sliders. This changes channel for the panel as a whole.
panel:setPropertyInt(“panelMidiOutputChannelDevice”, cntch)— Reset Last Modulator. This is specific to the panel I was making and can be
— ignored. I used this for MIDI data compression of some custom MIDI messages.
LastModulator = “None”— This works for an individual controller
— panel:getModulatorByName(“Vol”):getMidiMessage(0):setPropertyString(“midiMessageChannel”, tostring(cntch))— Refresh the panel
redraw = panel:getPanelEditor():getCanvas()
redraw:repaint()end
The Puppeteer
http://godlike.com.auIt depends on how it’s programmed. If the sysex numbers are hard coded in LUA, then you’ll need to go and edit each string and replace the b0 with a variable such as midiCh, that you can set with another modulator.
There might be a way that this is handled in the GUI editing interface for the modulators, but from memory most of the Kiwi3P panel is programmed in LUA.
The Puppeteer
http://godlike.com.auMarch 28, 2017 at 3:33 am in reply to: Create NRPN where first message is different than the rest #71761You’ll need to do this with LUA, where you check if you are using a different slider and if you are send the ID message before the value change message, otherwise just send the value message.
I’m facing a similar problem with the Jupiter 8. I’m going to build a method that sends out the latest values as a dump at a maximum rate, probably around 100ms depending on what the processor can handle.
The Puppeteer
http://godlike.com.auModulator, component etc refer to specific assets that are displayed on the ctrlr panel, such as a knob or slider, or picture or some other property. There are also sub-properties etc. I’ve found they tend to be a bit arbitrary, so searching other code examples is the fastest way to work out what’s what.
For modulators with MIDI, they can support high resolution MIDI (such as pitch bend and NRPN’s, which use 2 or more MIDI controller messages to send higher resolution information.
Within modulators, there is the MIDI value that sits behind it, but you can map values to different display values. For example an oscillator may display Square, Saw, Sine on the panel, but transmit 0,1,2 to the synth
The Puppeteer
http://godlike.com.auThey may be disabled or hidden
The Puppeteer
http://godlike.com.auThere are timers available in LUA. Do a search for callback functions as a lot of them use timers.
The Puppeteer
http://godlike.com.auGlad you got it working
The –[[ stuff –]] are in line comments. They can be omitted, but are useful for documenting your code.
Using
— stuff
Will comment the entire lineThe Puppeteer
http://godlike.com.auLine 6 should look more like this.
Structure12_showCombo = function (–[[CtrlrModulator –]] mod, –[[number –]] value)
The Puppeteer
http://godlike.com.auRun the 32 bit ctrlr program, load the panel up. Export the instance. Same with 32 bit VST’s and AU’s. You just load the appropriate ctrlr version, load up the panel and export the instance.
That’s how it’s always worked for me.
The Puppeteer
http://godlike.com.auYou’ll need to do them in order.
So for the Structure control, you’ll need a method in the luaModulatorValueChange parameter.
Pretty much
if panel:getModulatorByName(“Structure”):getValue() == 0 then
panel:getModulatorByName(“Partial_Wave”):getComponent():setVisible(true)
panel:getModulatorByName(“Partial_PCM”):getComponent():setVisible(false)elseif panel:getModulatorByName(“Structure”):getValue() == 1 then
panel:getModulatorByName(“Partial_Wave”):getComponent():setVisible(false)
panel:getModulatorByName(“Partial_PCM”):getComponent():setVisible(true)etc.
Then for the two controls Partial_Wave and Partial_PCM do the same thing to determine Square/Saw or PCM1/PCM2.
The Puppeteer
http://godlike.com.au[code]
— Change Visibility
panel:getModulatorByName(“SlidA”):getComponent():setVisible(true)
panel:getModulatorByName(“FortSlidA”):getComponent():setVisible(false)
panel:getModulatorByName(“FortSlidA”):setPropertyInt(“vstIndex”,848)
panel:getModulatorByName(“SlidA”):setPropertyInt(“vstIndex”,48)
[/code]The VST Index changes I used in my panel to make sure that things mapped properly to default controllers, so that moving controllers modified a slider on screen, rather than a hidden one.
The Puppeteer
http://godlike.com.auI’d say that this might be similar to how text is sent over Sysex, where it is sent as hex either as MIDI bytes, or as a bitstream.
This is how I do it for SYSEX
receiveProgramName = function(sysexData) -- assume checks that data is valid PC3 program header have passed local messageSize = sysexData:getSize() local name = "" -- check received data is for same program as request local a={} for i=0,30 do -- this collects first 23 bytes and puts them into array a. This should include the program name. a=data:getByte(i) end --for receivedProgramNum = a[5]*128+a[6] -- need to add a flag for Forte to push byte numbers up by 1 -- For Debug -- console (string.format("Received Program: %s", receivedProgramNum)) -- console (string.format("Sent Program: %s", nPrg)) if nPrg ~= receivedProgramNum then -- this is required because PC3 returns next valid object if requested object doesn't exist return else if messageSize < 12 then return else j=11 while a[j] ~= 0x00 do name = name..symbols[a[j]] j=j+1 end --while prgName[receivedProgramNum]=": "..name -- update Program Received currentProg = string.format(nPrg) panel:getComponent("recProg"):setComponentText(currentProg) -- This needs to be moved outside of this function and called when all dumps are completed. Temporarily called though the if below -- We don't need to waste resources and time building the string every time we receive a request. if writeListBoxStringFlag==true then str = "" for i = 1,4224 do str = string.format("%s%04d%s\n", str,i,prgName) end --for updateListBoxes() writeListBoxStringFlag = false end --if end --if end --if end
The symbols are as below. I think I pinched this from the Miniak panel, so kudos to the author.
initializePanel = function() symbols = { [0]="","|","|","|","|","|","|","|","|","|","|","|","|","|","|","|", "|","|","|","|","|","|","|","|","|","|","|","|","|","|","|","|", " ","!","\"","#","$","%","&","'","(",")","*","+",",","-",".","/", "0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?", "@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O", "P","Q","R","S","T","U","V","W","X","Y","Z","[","\\","]","^","_", "'","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o", "p","q","r","s","t","u","v","w","x","y","z","{","|","}","~","|"} symbols2 = { [0]="","|","|","|","|","|","|","|","|","|","|","|","|","|","|","|", "|","|","|","|","|","|","|","|","|","|","|","|","|","|","|","|", " ","!","\"","#","$","%","&","\'","(",")","*","+",",","-",".","/", "0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?", "@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O", "P","Q","R","S","T","U","V","W","X","Y","Z","[","\\","]","^","_", "'","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o", "p","q","r","s","t","u","v","w","x","y","z","{","|","}","~","|"}
- This reply was modified 7 years, 4 months ago by Puppeteer.
- This reply was modified 7 years, 4 months ago by Puppeteer.
- This reply was modified 7 years, 4 months ago by Puppeteer.
- This reply was modified 7 years, 4 months ago by Puppeteer.
The Puppeteer
http://godlike.com.auNovember 4, 2016 at 7:24 am in reply to: Is it possible to create a keyboard split with ctrlr? #70226This shouldn’t be too hard with a LUA script
The Puppeteer
http://godlike.com.au -
AuthorPosts