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