C++ API: How to connect Intensity to a Slider?
-
It's a little bit more complicated unfortunately. You need to create a template class that calls
Modulator::setIntensity()
andModulator::getIntensity()
and pass that to theUIConnection
- actually it should be part of theraw
namespace so I try to find some time tomorrow to add this. -
@Christoph-Hart thanks Christoph. Will be super useful :)
-
@Christoph-Hart any luck?
-
I was busy with the expansion stuff, but it's the next thing on my list.
-
Alright, it's there.
Class Definition:
juce::Slider mySlider; // must not be a HiSlider as this expects to be connected to a parameter raw::UIConnections::SliderBase intensityConnection;
Constructor:
MyClass(): mySlider("SomeName"), intensityConnection(&mySlider, mc, "SomeModulator") { // ... intensityConnection.setData<raw::Data<float>::Intensity>(); // ... }
Data<float>::Intensity>
can also be used in the storage process to save the intensity to a preset / value tree, but that's a nice little homework to figure out yourself :) -
@Christoph-Hart said in C++ API: How to connect Intensity to a Slider?:
intensityConnection
thanks :) !!!
Just one error I guess:
No type named 'SliderBase' in 'hise::raw::UIConnection'
-
Have you pulled the latest scriptnode?
-
@Christoph-Hart mmmm nope!!! I was using Master to work with the C++ API. Should I jump to Scriptnode?
-
@hisefilo said in C++ API: How to connect Intensity to a Slider?:
@Christoph-Hart mmmm nope!!! I was using Master
You've been in the stone age!
-
@d-healey I'm on lastest scriptnode for non-C++ API projects! :)
-
@Christoph-Hart got it working!!! Thanks a lot @Christoph-Hart
Now I'm working on replicating HiSlider stuff for the juce::Slider we are using. (MidiLearn, and LookAndFeel) -
@Christoph-Hart it's possible to tweak HiSlider to receive Intensity? Will be much easier than adding Midilearn and flaf to Juce slider?
-
Yes that‘s a valid point.
-
Ah damn, I just noticed that it's super hard to MIDI learn the intensity - the entire system uses a parameter index and the intensity is not a parameter so the HiSlider is the smallest problem.
One option would be to write a MIDI processor class that uses one slider and forwards this to the intensity that you need - it's super verbose for a simple task though...
class IntensityForwarder: public HardcodedMidiProcessor { IntensitySlider(MainController* mc, const String& modId): HardcodedMidiProcessor(mc, "IntensityForwarder") { modToUse = dynamic_cast<Modulator*>(ProcessorHelpers::getFirstProcessorWithId(mc->getMainSynthChain(), modId)); jassert(modToUse != nullptr); // Add one slider that will forward the value to the intensity. Content.addSlider("modIntensity", 0, 0); } // add all callbacks void onControl(var c, var value) { modToUse->setIntensity((float)value); } WeakReference<Modulator> modToUse; }; // creation: raw::Builder b; b.createTheModulatorYouWantToControlBeforeTheOtherOne(); b.create<IntensityForwarder>(mc->getMainSynthChain(), whateverParameters); raw::UIConnection::Slider<0> c; // connect it to the IntensityForwarder
This is pseudo code and will definitely not work, but it should get you started.
-
@Christoph-Hart Thanks !!!!!!! Working on it. Will post results!
-
@Christoph-Hart
cannot get it working. Compiles, runs but onController never gets executed.This is what I did:
Changed HardcodedMidiProcessor to HardcodedScriptProcessor because does not exist.
Changed Modulator for LfoModulator since Modulator does not have setIntensityclass IntensityForwarder: public hise::HardcodedScriptProcessor { public: /** Set the name and default ID of the processor. */ SET_PROCESSOR_NAME("IntensityForwarder", "IntensityForwarder", "IntensityForwarder"); IntensityForwarder(MainController* mc, const String& id, const String& modId): HardcodedScriptProcessor(mc, id, mc->getMainSynthChain()) { modToUse = dynamic_cast<LfoModulator*>(ProcessorHelpers::getFirstProcessorWithName(mc->getMainSynthChain(), modId)); jassert(modToUse != nullptr); // Add one slider that will forward the value to the intensity. Content.addKnob("modIntensity", 100, 100); } // add all callbacks void onControl(var c, var value) { std::cout << "on Control" << std::endl; modToUse->setIntensity((float)value); } private: WeakReference<LfoModulator> modToUse; JUCE_DECLARE_WEAK_REFERENCEABLE(IntensityForwarder); };
then I had to build it using add, instead of create
builder.add<IntensityForwarder>(new IntensityForwarder(mc, "IntensityForwarder1", "LfoGain"), mc->getMainSynthChain(), raw::IDs::Chains::Midi);
and lately conected it using this:
sliderForwarder.connect("IntensityForwarder1");
template <int ParameterIndex> class StrippedSlider : public hise::HiSlider, public ControlledObject { public: StrippedSlider(MainController* mc, const String& name) : HiSlider(name), ControlledObject(mc) { raw::Pool pool(mc, true); // flaf.setFilmstripImage(pool.loadImage("Strip.png"), 100); flaf.setFilmstripImage(pool.loadImage("StripBigNew.png"), 64); flaf.setScaleFactor(0.3); setName(name); setSliderStyle(Slider::RotaryHorizontalVerticalDrag); setLookAndFeel(&flaf); setTextBoxStyle(Slider::NoTextBox, false, 0, 0); } ~StrippedSlider() { connection = nullptr; } void connect(const String& id) { auto p = ProcessorHelpers::getFirstProcessorWithName(getMainController()->getMainSynthChain(), id); setup(p, ParameterIndex, Slider::getName()); connection = new raw::UIConnection::Slider<ParameterIndex>(this, getMainController(), id); setLookAndFeel(&flaf); } bool tempoSyncMode = false; FilmstripLookAndFeel flaf; ScopedPointer<raw::UIConnection::Slider<ParameterIndex>> connection;