Forum Replies Created
-
AuthorPosts
-
Heel bedankt Tedjuh!
Thx a lot for that one, I was not aware.
In fact wanted to contact you to have some Skype/Zoom meeting together.
Question: why using VS2010 and not the latest? What is the issue?I will look at the doc and try to understand/follow what you did.
Something else… I’m personally using a different technique than a table:
– I assign all modulators to a variable at panel load
modPanelSubOnOff = panel:getModulatorByName(“PanelSubOnOff”)
– you get a nice list but then it is easy to manage afterwards
– for loading/saving/sending, rather than looping on a table, I’m working in a line by line way like
modProgramOctave:setValue(LoadedProgramData:getByte(16), true)
modPanelSubOnOff:setValue(LoadedProgramData:getByte(17), true)
modEditTimbre:setValue(LoadedProgramData:getByte(18), true)In programming there are always different roads to reach the same goal. Up to you to feel which one is the best for you (readable, maintainable…) 😉
Yes, this is possible. If needed, I’m also advising you to mark the modulators you want to send with a specific Custom Modulator index Group.
Here is the code:-- Loop on all modulators in custom group 2 n = panel:getNumModulators() for i=0,n-1 do local mod = panel:getModulatorByIndex(i) -- local Name= L(mod:getName()) if mod:getPropertyInt("modulatorCustomIndexGroup") == 2 then -- console(tostring(i.." "..Name)) do_something end end
To get the Midi Controller Number use:
mod:getMidiMessage():getProperty(“midiMessageCtrlrNumber”)Pay attention that not all modulators have a Midi Message (uiLabels…); therefore the trick is to only take the “Dynamic” modulators.
Good luck 😉
Interesting way of working for the randomizer!
Exactly as dnaldoog explained; I’m doing that all the time by sending the same type of modulator (button, rotary, rotary negative/postivie, pulldown, triple switches…) to a unique method then based on the name you adjust what you want.
If you assign all your mods to variables as well then you can write a complete generic code.
This is working for “value on change” or “component on click”, you just need to secure the distinction for name and value in your code.
You can also call your on click method from the on change one to avoid running the same code (but this is depending on what you doing in your code of course).“value on change” method:
-- -- Called when a modulator value changes -- @mod http://ctrlr.org/api/class_ctrlr_modulator.html -- @value new numeric value of the modulator -- PositiveValue_OnChange = function(--[[ CtrlrModulator --]] mod, --[[ number --]] value, --[[ number --]] source) -- No action while loading a program or if the panel is in bootstrap or program states if bLoadingProgram or not isPanelReady() then return end PositiveValue_OnClick(mod:getComponent()) sName= L(mod:getName()) end
“Component on click” method:
-- -- Called when a mouse is down on this component -- Used to display parameter name and description for components with 0..n values -- PositiveValue_OnClick = function(--[[ CtrlrComponent --]] comp, --[[ MouseEvent --]] event) -- No action while the panel is in bootstrap or program states if not isPanelReady() or not bLCD then return end local sName = L(comp:getOwner():getName()) -- Get parameter name and description to be displayed if sName == "VCO1Shape" then sParameter = "Oscillator 1 Shape (0..1023)" elseif sName == "VCO2Shape" then sParameter = "Oscillator 2 Shape (0..1023)"
I’m not sure if a Linux VST export has ever been implemented.
Linux Ctrlr version yes but export (standalone or VST) not sure.
I’m also getting that request from users of my panel.
Was just going to try again by using the Windows VST versions either with WINE or directly in Ardour for example (I installed Ubuntu Studio in a VM).Well, even if the code above is working, the simplest is just to have 2 uiImageSliders modulators:
– one to select the waveform: use an image of a 4 position button, values 0-3
– one to display the wave: use an image with your 4 waveforms, values 0-3When changing the waveform button, change the value of the wave modulator to the same value with a small Lua code (uncomplete code below but to give you the idea)
-- -- Called when a modulator value changes -- @mod http://ctrlr.org/api/class_ctrlr_modulator.html -- @value new numeric value of the modulator -- Wave_OnChange = function(--[[ CtrlrModulator --]] mod, --[[ number --]] value, --[[ number --]] source) modWaveform:setValue(value, true) end
Look at my OscShape_OnChange method in my Pro2 panel. Button OSC 1 Shape/noise for example.
It is more complex than what I describe above because I’m also adapting the LCD screen, enabling/disabling other pulldowns based on the wave selection…But the way I propose is easier than using custom components.
Anyway, in programming, there are always many different ways to achieve the same objective 😉I think that the web site /technology Ctrlr is built upon is also not fully stable.
@dasfaker is handling that and maybe he knows more…October 25, 2020 at 9:03 pm in reply to: What ver of CTRLR to use for linux that exports Instance #120449As Possemo indicates it is not possible to create instances from the Linux version.
But as I got the question as well, I’m currently looking to use AU or VST versions created on Mac/Windows in Linux.Excellent thread and discussion.
Thx a lot dnaldoog!!!
If OK for you, I add this info in my ever expending and never ending Step by Step guide (I continued filling it and revising it even if only published the 1.x version)I’ll try that. Thx!
OK. I searched a bit and found the Layers editor (never used it).
What is the top layer? 0?
What means the 0000000 in the middle and that you can edit?
How do you assign a modulator to a layer? The “component layer ID” field is not editable
Thx!Thx. I will look at that.
Funny enough, I was going to ask you to make a short tutorial about layers as I know you have been using that in one of your panel.
Maybe create a new topic about “How to create and use layers”I looked further and found
https://github.com/RomanKubiak/ctrlr/blob/master/Source/UIComponents/CtrlrComponents/Groups/CtrlrTabsComponent.hIs there a way to go to a specific level of a value tree in order to set the property?
I want to change the background image of a specific tab…
void setBackgroundImage (const Image &_tabBackgroundImage) { tabBackgroundImage = _tabBackgroundImage; }Is it mandatory to have uncommented lines in LComponents.cpp? Maybe that those functions have been replaced by others…
Also, when doing what () on a component, you are getting the getChildComponent() function listed
So frustrating to not have any explanations…Shit… Well found dnaldoog!
That must be it…
I think I need to prioritize the build and compilation work of Ctrlr 5.3.201 in order to make some changes.
I put it in my to-do list of bug corrections / small enhancements.
Thx!@spiffo Did you solve your issue?
I have also Cakewalk and can help.
However, never had the issue you mention.
Did you completely deleted the cache folder? Are you on PC or Mac?
Did you try with some test panel and a similar setup?I think you should use another simpler method for requesting your programs. I will describe it here in a generic way and you need to adapt what I write to your specific sysex request program string.
The example is for the Korg Prologue that I just did.1. Create a uiImageSlider modulator with a nice button look as image.
Set Values 0-99 for example if the Mirage has 100 programs.
This is used to decide the program to load
2. Create a uiIMageButton modulator (2 images) and set Called when modulator value changes to a method “Receive_OnChange”
In that method you should have a code similar to this one:iProgram = modProgramSelector:getModulatorValue() local iMSB = math.modf(iProgram/128) local iLSB = iProgram - iMSB * 128 msg = string.format("F0 42 30 00 01 4B 1C %.2x %.2x F7", iLSB, iMSB) panel:sendMidiMessageNow(CtrlrMidiMessage(msg))
modprogram has been declared at panel opening as modProgramSelector = panel:getModulatorByName(“ProgramSelector”)
you can also do this in this method but it is less good3. Define a MidiMessageReceived method that will be used to receive and process incoming midi messages
if size = xxx then use dnaldoog’s method to store and update your modulatorsFantastic!!!!
Impressive!
FYI, didn’t have time to look at this further but this is not forgotten 😉A question: how do you download a repository from a specific date / version?
I found how to go back to a certain commit (but didn’t tried it) but not how to get a specific version for example in this case of Juce.Thx!
Woauww dnaldoog! This is support 🙂
@BAUS, please try the above.
I’m using another method (memoryblocks instead of tables) but don’t want to confuse you.
If needed, just ask 😉September 30, 2020 at 9:43 pm in reply to: Midi Input Overload on Multiple Sysex Dump Requests #120087Hi,
using the sleep method is not too good because relying on the OS and I remember having issues with that.
The method is to use a timer to perform the loop automatically.
I’m receiving full banks like that (a full bank of n programs is received by doing loop requesting each individual program).
I have implemented a timer with a 150ms loop but you can set it to the most appropriate value according to your case. Not too slow because you loose time but not too fast because you will have bouncing errors and miss dumps. 100 – 150ms by program is quite OK.You need:
– one button to start the dumps and initialize the memory block that will hold the bank
– a timer that is performing the loop then when finished that will do something with your bank or just say “received”. A timer is simply a piece of code that is repeated at a certain time interval until it is stopped.
– RequestProgramDump method to send the program dump request
– MidiMessageReceived method to capture the each single dump and add it to the memory blockExtract of code for the button:
mbTempBank = MemoryBlock() bReceivingBank = true iCounter = 0 timer:setCallback (4, timerCallback) timer:startTimer(4, 150)
Extract of timer code:
-- Receive bank timer elseif timerId == 4 then if iCounter<500 then -- 500 is the number of programs to receive RequestProgramDump(iCounter) else timer:stopTimer(timerId) iCounter = 0 -- Check if not empty and if size is correct if mbTempBank~=nil then do_something...
RequestProgramDump method:
function RequestProgramDump(iProgram) -- No action if the panel is in bootstrap or program states if not isPanelReady() then return end -- Request Program Data dump (0-499) local iMSB = math.modf(iProgram/128) local iLSB = iProgram - iMSB * 128 msg = string.format("F0 42 30 00 01 4B 1C %.2x %.2x F7", iLSB, iMSB) -- msg = CtrlrMidiMessage({0xF0, 0x42, 0x30, 0x00, 0x01, 0x4B, 0x1C, 0xF7}) panel:sendMidiMessageNow(CtrlrMidiMessage(msg)) end
Extract of MidiMessageReceived method:
-- -- Called when a panel receives a midi message (does not need to match any modulator mask) -- @MidiMessage CtrlrMidiMessage object -- MidiMessageReceived = function(--[[ CtrlrMidiMessage --]] MidiMessage) -- console ("MIDI message received...") -- Find the Midi message type based on its size s = MidiMessage:getSize() if s == 15 then ... elseif s == 394 then if MidiMessage:getData():getByte(6) == 0x4C then -- console ("Program Dump recognized") if bReceivingBank then -- console ("Appending program "..tostring(iCounter)) mbTempBank:append(MidiMessage:getData()) iCounter = iCounter + 1 else ...
-
AuthorPosts