goodweather

Forum Replies Created

Viewing 20 posts - 1 through 20 (of 550 total)
  • Author
    Posts
  • in reply to: Build CTRLR on Windows 10 Manual #121269
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    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.

    in reply to: Send whole page at once #120646
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    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…) 😉

    in reply to: Send whole page at once #120645
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    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 😉

    in reply to: “Global” On Mouse Down #120488
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    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)"
    
    in reply to: Need a working VST.so 32 or 64 #120459
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    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).

    in reply to: Looking to change button image on value change #120458
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    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-3

    When 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 😉

    in reply to: Ctrlr can’t be reached sometimes and somewhere #120450
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    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…

    in reply to: What ver of CTRLR to use for linux that exports Instance #120449
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    As 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.

    in reply to: Using Layers Tutorial 1.0 #120448
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    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)

    in reply to: Reaching tabs properties #120260
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    I’ll try that. Thx!

    in reply to: Reaching tabs properties #120244
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    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!

    in reply to: Reaching tabs properties #120242
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    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”

    in reply to: Reaching tabs properties #120238
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    I looked further and found
    https://github.com/RomanKubiak/ctrlr/blob/master/Source/UIComponents/CtrlrComponents/Groups/CtrlrTabsComponent.h

    Is 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…

    in reply to: Reaching tabs properties #120233
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    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!

    in reply to: VST2 Graphics Missing on Tab2 #120230
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    @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?

    in reply to: Getting Panel reflect Patch & Program Settings #120164
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    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 good

    3. 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 modulators

    in reply to: Build Ctrlr on Windows 10 and others #120156
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    Fantastic!!!!

    in reply to: Build Ctrlr on Windows 10 and others #120133
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    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!

    in reply to: Getting Panel reflect Patch & Program Settings #120132
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    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 😉

    in reply to: Midi Input Overload on Multiple Sysex Dump Requests #120087
    goodweather
    Participant
    • Topics: 45
    • Replies: 550
    • Total: 595
    • ★★★

    Hi,
    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 block

    Extract 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
    				...
    
Viewing 20 posts - 1 through 20 (of 550 total)
Ctrlr