Forum Replies Created
-
AuthorPosts
-
Tried your function and it works fine…
Using console(tostring(myLookup(13))) to check the result>>> console(tostring(myLookup(13)))
29Do you get this in the console?
Type the above at the bottom of the console window then press Enter
Your function can be anywhere (I mean in any compiled method).Hi, this is very strange… I don’t get any crash on PC and I’m using different versions on different PC’s…
Save as versioned: at panel level you have 2 properties, Major version and Minor version.
You set Major version for example to 0.
Each time you will select Save versioned, a file will be saved with a name indicating the version (major.minor) with a time stamp and the minor version will be incremented.
PAY ATTENTION that you are still in the opened panel file and not in this saved copy.
So you need to Save your changes as usual to keep them.In summary, Save versioned saves a copy of your current work in a time stamped file.
🙂
Hi again. I searched in Juce API and found the details…
In a custom component you have used different functions like graphics.drawLine().
So, you are using the Graphics class.
In that class there are different drawText() functions available 🙂- Goto Juce API documentation at https://www.juce.com/doc/classes
- Select “G” then Graphics
Direct link: https://www.juce.com/doc/classGraphics
No idea (but will also look when I have some time and to learn)…
You can maybe use the workaround to use classical uiLabels in Ctrlr and to position them in front of the uiCustomComponent?
At least this would be a temporary solution (not so nice but working) 🙂Hi all,
to compare dumps I have used with great satisfaction the software “HxD”. You can compare hexa files and search for differences using F6.
Extremely easy and great…Hi, why not just copying the functions mentioned in http://stackoverflow.com/questions/18886447/convert-signed-ieee-754-float-to-hexadecimal-representation?
In my panels, I have implemented a series of functions (like trim and co…) in a method I called Miscellaneous.
You can call any function in Miscellaneous from any other method and the only thing to do is copy/paste…I suspect that going to Lua 5.3 will mean a lot of work and tests for atom…
Anyway, very good topic (I mean the conversion hex-float)!
Hi Sylvain,
please look at my last post on August 3rd in http://ctrlr.org/forums/topic/ctrlr-step-by-step-guide/ (and by the way at Appendix B of the pdf doc).
Good reading…DominiqueThx for the explanation!
I didn’t know this serializing/parsing of all modulators. Can indeed be useful.
On my side, I rely on the sysex dumps from the synth manufacturer and I load/save based on their structure.
Maybe that, as a workaround, you can read the vstindex and value of each modulator and set them one by one with the simple setValue?My 5 cents… What do you want to achieve? Why using the VST indexes? What are the advantages/inconvenients in comparison to basic modulator get/set values?
I agree with you about the Wiki and the need for help but I don’t have the control of that and atom is probably already spending a lot of time coding the software so he has probably also no time for writing an help/wiki.
ADSR tuts is laready included in the Step by Step 2.0 guide I’m busy to write. You will have ADSR but also DADSR and DAHDSR. All the same principle…
WIthin Ctrlr you have only what() available.
To learn about syntax and find interesting functions, the only place are:- the different folders in https://sourceforge.net/p/ctrlrv4/code/HEAD/tree/nightly/Source/ and within those the end of the .cpp files (but sometimes also the code of each function). Look for example at Lua/CtrlrLuaUtils.cpp
- the Juce API that Ctrlr is based on https://www.juce.com/doc/classes. Here you can see all the different functions available for a certain object (search with first letter) and see the possibilities and syntax. Please note that it doesn’t mean the function is available in Ctrlr but in most cases well.
I learned a lot with those but it takes also a lot of time…
Hi,
just look at topic raised by Hi-tech in http://ctrlr.org/forums/topic/midi-in-activity-led/. This is exactly the same stuff…Then you can proceed as I explained above…
- 16 uiImageSliders components (1 by LED)
- 1 LED image with 2 frames (On/Off)
- MidiMessageReceived method reacting on the messages you want (if…elseif…) and within each “if” a call to another function that you give the LED number in argument. This function would change the value of the LED whatever On or Off. The advantage of a separate function is that you need to code the if channel==1 then elseif channel==2 then… only once 🙂
FYI,I’m busy to write Step by Stepo guide 2.0 and it will be probably 3x bigger because full of Lua explanations…
Hi/Bonjour,
you will need Lua for sure but what do you want to achieve?
A LED lighting ON when a Midi msg is received? When should it turn OFF (midi messages are going very fast)?
Should it react on all messages or only on some?
…The general principle should be:
- create a uiImageSlider modulator with a png image containing the LED ON and the LED OFF (vertical stacked
- create a method MidiMessageReceived that you attach to the panel property “Called when the panel receives a Midi message”
- In that method, you can build an if…elseif..elseif…end structure to sort the messages received based on their length or some byte
- within each elseif you can decide to set your LED uiImageSlider value to 1 and you could launch a timer to leave it on for x ms
- In the timer method, you stop the timer and set the LED value to 0 which will change the picture of the LED so it shows OFF
For the LED, look at my Step by step guide…
Good luck…Dominique
It is of course easier when you have the real synth and can test it, héhé…
FYI, for this Pro 2 panel and after having made an almost complete Sub37 panel (that I could re-use some principles) I have spent a huge amount of time designing, writing, testing my panel (1 to 2 hrs a day since mid february – so, probably a bit more than 300 hours).
- Learning specific functions and syntax in Juce/Lua/Ctrlr, properties
- getting bugs when you think it will work
- getting things working in a different ways than the logic would say and finding workarounds
- finding bugs on the synth
- having the synth not acting always in a logic way when using an editor
- having to reverse engineer the sysex dumps because not documented
- testing, re-testing, re-re-testing to find some small issues or to make the panel more fool-proof
- etc…
But OK, you get the great reward of building a nice panel for you (and the others) and it is a great challenge and fun doing it. So no regret at all and a lot of pleasure 🙂
Possemo is right: use one way to send to your synth then MidiMessageReceived to process the reception with an elseif series based on Offset which indicates the different parameters.
I’m surprised about your sysex string. In DW8000 manual, param change is a 8 bytes long sysex…
In pseudo code for MidiMessageReceived:
if MidiMessage.getSize()==8 then offset = MidiMessage:getData():getByte(6) value = MidiMessage:getData():getByte(7) if offset==1 then -- OSC1 Wave form modOsc1WF:setValue(value, true) elseif offset==2 then ...
When one way doesn’t work, always try to find a working workaround and in parallel secure a solution / understand the main/initial issue 🙂
Difficult to help you on that one… However, when I encounter an issue I’m always trying to find another way to reach the same 🙂
I don’t know what you want to achieve but you should simply have one modulator for each param and use the sysex to transmit/receive.
To each mod you create a method “xxx_OnChange” that will be called each time the modulator value changes. In that one you can do an if value==…elseif…elseif…end statement that will handle the value of the modulator to what you want to achieve.Don’t forget to put the classical
if panel:getBootstrapState() == true or panel:getProgramState() == true then return else ... end
in the beginning of each method to avoid it fired at panel load.
I downloaded the DW8000 manual (http://www.pallium.com/bryan/dw/DW-8000_Manual.pdf) and saw it doesn’t handle CC or NRPN communication for modifying parameters…
You need to setup your Slider to handle sysex.
So, set Midi Message Type to Sysex
In Sysex, you can use the Edit button to build something (see in forum under Documentation – Getting started) or directly type something.To modify OSC1 WaveForm you need to build a message like: F0 42 3y 03 41 01 ls F7
Look at p65 and p68.
3y is for the Midi channel. The y will take the value in Midi Channel property. If this doesn’t work, you can also put 30 for channel 1 for example
01 is the offset of OSC1 Wave Form (see p68)
ls is the 4 bytes value of the slider (WF can be 1-16 so ls 4 bytes is enough)
Set Min and Max values of your slider to 1 and 16Turn it and watch the OSC1 Wave form changing. Then try the opposite.
You should also open the Midi Monitor (output and input enabled) to see what is passing in and out. You should check that the correct message is there in and out.Hi, first thing is to try in standalone mode…
Take Ctrlr standalone, create a new empty panel, add uiSlider, put Midi information (CC or NRPN messages) and check if the synth reacts when turning the knob in Ctrlr.
Next step: check Ctrlr reacts when you modify the param on the synth.
Next step: take the DW-8000 panel (I didn’t check if there was one) and try.
Check Midi channels of course.When running in standalone, then time to check in plugin mode 🙂
Seems to work fine now (sent you a PM 🙂 ).
Thx atom! -
AuthorPosts