Forum Replies Created
-
AuthorPosts
-
Thanks Thomas for the nice compliment.
Well the problem there as I see it, is as soon as you start implementing too many customisation options, it is taking away from the simplicity of the original idea. I know that a Roland JD-990 dump is sent back exactly the same and the OP’s (Synthtoast’s) synth too. That’s the beauty of it; I don’t even know what synth he’s running these dump requests on; but … if you wanted to customise it for that Roland (Which model is it? I take it your Roland unit changes its header and therefore checksum when re-uploading?) then this would offer a good template and we all know how complex stuff gets as you start introducing more options to a panel. Stuff starts breaking everywhere. This one is on the border of that, but still simple enough I suppose!
Hey Tedjuh!
Well this panel can open a .syx file, which can then be uploaded. So yes, it can both save and load to/from file. That’s the LOAD SYSEX TO PANEL button – maybe that could be re-worded?
Regards,
- This reply was modified 3 years, 7 months ago by dnaldoog.
I’m back!
Here is another refinement to the previous panel. I realised you really need to be able to switch recording off, otherwise any subsequent Sysex will keep getting added to the dump/snapshot you want to save, so this version has a record/stop button.
Let me know if this one works well and I will probably release it as a panel. I haven’t fully fully tested it and it is getting more complex code-wise, which means problems could start creeping in.
Of course this panel should be used with Windows 5.3.201 and presumably MacOS 5.3.198
Regards,
JohnAttachments:
You must be logged in to view attached files.This is a new version that should now be able to save sysex across sessions!
Attachments:
You must be logged in to view attached files.Thanks Goodweather! ‘?
Here’s another one that includes an extra dump request field for synths that require a sysex request message be sent. Version 1.1 alpha
- This reply was modified 3 years, 7 months ago by dnaldoog. Reason: bulk dump
- This reply was modified 3 years, 7 months ago by dnaldoog.
Attachments:
You must be logged in to view attached files.Great Synthtoast,
I think I forgot to attach the actual panel though! (Should be there now!)
?
I thought that was an interesting idea, so I put together a quick panel to do that.
If it works, let me know and I might refine it and release it as a panel.This panel automatically receives any sysex messages and those messages can then be saved to PC and resent to the machine.
Regards,
Attachments:
You must be logged in to view attached files.Hi BAUS,
You would need to remove all the sysex code from Ctrlr MIDI message type field – set to None and send the sysex all from lua.
ProgramSelect = function(--[[ CtrlrModulator --]] mod --[[ number --]], value --[[ number --]], source) if source == 4 then local sName = L(mod:getName()) local t = {"PROGRAM01", "PROGRAM02", "PROGRAM03", "PROGRAM04", "PROGRAM05", "PROGRAM06", "PROGRAM07", "PROGRAM08", "PROGRAM09", "PROGRAM10", "PROGRAM11", "PROGRAM12", "PROGRAM13", "PROGRAM14", "PROGRAM15", "PROGRAM16", "PROGRAM17", "PROGRAM18", "PROGRAM19", "PROGRAM20", "PROGRAM21", "PROGRAM22", "PROGRAM23", "PROGRAM24", "PROGRAM25", "PROGRAM26", "PROGRAM27", "PROGRAM28", "PROGRAM29", "PROGRAM30", "PROGRAM31", "PROGRAM32"} -- local table of buttons in radio for i, v in pairs(t) do if sName == v then local sysMess=string.format("F0 00 00 23 01 43 C1 00 %.2X F7",i-1) panel:sendMidiMessageNow(CtrlrMidiMessage(sysMess)) else _G[v]:setValue(0, true) end -- fi end -- for end -- source == 4 (user clicked on a button - not lua generated - that would be 5 or 6) end
Regards,
Hi Jsh,
You are casting a number as a string then assigning it to the table, when in fact it’s already a number.
The two character hex form is just a printing convention for a number, not the number itself if that makes sense.
local portaVal = tostring(string.format(“%.2X”, portaValRaw))
Should be:
myMethod = function(--[[ CtrlrMidiMessage --]] midi) local msgSize = midi:getSize() if msgSize == 1179 then -- If message is program dump local portaValRaw = panel:getModulatorByName("Portamento"):getModulatorValue() progDump = {} midi:getData():toLuaTable(progDump) progDump[28] = portaValRaw progDumpMsg = CtrlrMidiMessage(progDump) panel:sendMidiMessageNow(progDumpMsg) end end
- This reply was modified 3 years, 8 months ago by dnaldoog.
Hi there Jsh,
See here for a way of doing this .
You can also convert midi:getData() to a lua table using:
t={} midi:getData():toLuaTable(t)
You could then modify the contents of the table and repack as a MemoryBlock and resend to the Synth: … or send the table as you did!
m=MemoryBlock() m:createFromTable(t) panel:sendMidiMessageNow(CtrlrMidiMessage(m:toHexString(1)))
or
panel:sendMidiMessageNow(CtrlrMidiMessage(t))
The other option would be to work solely with MemoryBlocks:
Regards,
?
- This reply was modified 3 years, 8 months ago by dnaldoog. Reason: replied to post in future but didn't create new post
Thanks An0n3mau5 – Good luck with your journey into lua. I think it’s an amazing language and you will find Ctrlr is an amazing program as you get to know it. ?
You’ll be getting into lua territory there for sure. To disable a control on the interface, you would need a method like:
panel:getComponent("pulse_width_control"):setEnabled(false)
orsetEnabled(true)
Changing a single uiSlider or uiFixedSlider’s MULTI message to NRPN and back again is possible, but a bit complex. Instead you could create to different buttons in different layers that sit in the same position, but even that is a little complex.
Goodweather’s DS2 panel is a popular one for learning from, but it’s pretty complex.
My JD-990 panel uses layers, so that is a good reference for learning how to do it that way, or maybe start with some simpler panels first?When I first got started, I studied this panel: ctrlr.org/akai-sg01v-panel/
?
I found that in Reaper 32bit version when importing a .panel file into the VST instance of Ctrlr, only 64 VST indexes showed, but when I exported the panel as restricted instance .dll and then opened it in Reaper as a VST it showed all the VST indexes I had assigned.
Very interesting – it’s a strange beast indeed that synth!
Well done working that one out!
Strange that Ctrlr isn’t working on Windows 10 with 5.3.201!
?
Hi An0n3mau5,
I checked the panel I sent you. It is working fine for me. What OS and version of Ctrlr are you using?
Also in the manual I see osc 1 coarse cc 27:59 -12. to 12. What does the MIDI out message look like?
Is that supposed to read osc 1 coarse cc 27:59 -120 to 120
If so, using a uiSlider, you would just make modulatorMin=-120 modulatorMax=120 with expression:
(modulatorValue+120)*64
CC,ByteValue,MSB7bitValue,27,-1 CC,ByteValue,LSB7bitValue,59,-1
Does that work?
See attached panel: ✨
Attachments:
You must be logged in to view attached files.Hi Robin,
All you should have to do is add the 32 button names to the
localtable in the init function, but don’t change theif source == 4
part. That’s crucial that it be left in there otherwise you’ll get an infinite loop and crash Ctrlr.You would then need to add 32 modulator names to the initial script.
There is a more elegant way to do this. In the init script each button is assigned to a variable, which is then accessed instead of
panel:getModulatorByName()
in the function loop. See attached panelRegards,
?
Attachments:
You must be logged in to view attached files.Hi Robin,
I think for me to offer an answer I would have to see your work so far.
If you don’t want to make it public, send me a private message and I’ll send you my email address then you can send it as an attachment.
Regards,
John
Hi An0n3mau5,In reply to your message, which was probably under moderation due to containing a url in it, no one would be expected to immediately grasp what was going on with Novation’s implementation there of left bit shifting every value 6 places (multiplying by 64). There’s no explanation in the manual! Usually an explanation is there, but hard to understand, like Roland’s perennial explanation of Checksum calculation which is confusing, but at least they offer an explanation. But once you know, it seems easy, but isn’t that life?
Here is another panel, this time using Possemo’s uiFixedSlider solution as well as my original lua solution plus a new lua function that uses the JUCE class BigInteger() for your perusal. It is much similar and basically just emulates the Ctrlr way!
It has been very interesting seeing an answer to this emerge! In the end the best most elegant solution supplied by Possemo, seems simple in hindsight. Great thing – hindsight.
lfo_new = function(--[[ CtrlrModulator --]] mod, --[[ number --]] value, --[[ number --]] source) local mValue=mod:getValueMapped() local channelOut = panel:getProperty("panelMidiOutputChannelDevice") local statusByte = 0xb0 + (channelOut - 1) -- use this code for dynamic channel changes local bi=BigInteger(mValue) local msb7=bi:getBitRangeAsInt(7,14) local lsb7=bi:getBitRangeAsInt(0,7) local mb= CtrlrMidiMessage({statusByte, 17, msb7}) panel:sendMidiMessageNow(mb) local lb= CtrlrMidiMessage({statusByte, 49 ,lsb7}) panel:sendMidiMessageNow(lb) end
?
- This reply was modified 3 years, 8 months ago by dnaldoog. Reason: added BigInteger() lua function
- This reply was modified 3 years, 8 months ago by dnaldoog. Reason: added extra message in reply to a message that was under moderation
Attachments:
You must be logged in to view attached files.I had to stare at Possemo’s suggestion for a long time, before I understood it! Brilliant!
Does this work? No lua, just
CC,ByteValue,MSB7bitValue,18,-1 CC,ByteValue,LSB7bitValue,50,-1
with
(modulatorValue+128)*64
in the expression field and no uiFixedSlider necessary.
✨
Attachments:
You must be logged in to view attached files. -
AuthorPosts