Forum
    • Categories
    • Register
    • Login
    1. Home
    2. Orvillain
    • Profile
    • Following 1
    • Followers 0
    • Topics 92
    • Posts 703
    • Groups 0

    Orvillain

    @Orvillain

    176
    Reputation
    86
    Profile views
    703
    Posts
    0
    Followers
    1
    Following
    Joined
    Last Online

    Orvillain Unfollow Follow

    Best posts made by Orvillain

    • I wrote a reverb

      Don't know if this is the done thing really, but I wanted to show off:
      https://youtu.be/1kMHloRQLcM

      posted in C++ Development
      OrvillainO
      Orvillain
    • I wrote a bbd delay

      Again, wasn't sure where to put this. But I created my own node.

      https://youtu.be/-siB1UJfrD0

      Modelled analog bucket brigade delay. I'm starting to build up quite a nice collection of delay and reverb utilities now!

      posted in C++ Development
      OrvillainO
      Orvillain
    • RE: I wrote a reverb

      @Chazrox I might do a video or two on everything I've learned!

      posted in C++ Development
      OrvillainO
      Orvillain
    • RE: Need filmstrip animations

      @d-healey I really like that UI. Very simple, accessible, and smooth looking - for lack of a better word!

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Transient detection within a loaded sampler - SNEX ????

      @HISEnberg
      Yes I wrote a custom transient detector in a c++ node, and made sure it utilised an audio file, which I can load in my UI using the audio waveform floating tile.

      I implemented spectral flux extraction:

      • Take your audio.
      • Perform an FFT on it.
      • Extract the spectral flux envelope from the FFT.
      • Downsample the spectral flux envelope (optional but can help accuracy)
      • Perform peak picking on the spectral flux envelope.

      I used the stock JUCE FFT processor.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Can We PLEASE Just Get This Feature DONE

      Free mankini with every commercial license???

      posted in Feature Requests
      OrvillainO
      Orvillain
    • RE: I wrote a reverb

      @Chazrox said in I wrote a reverb:

      @Orvillain Please. 🙏 I've been waiting for some dsp videos! I've been watching ADC's everyday on baby topics just to familiarize myself with the lingo and what nots. I think im ready to start diving in! There are some pretty wicked dsp guys in here for sure and I'd love to get some tutuorials for writing c++ nodes.

      There's two guys who got me started in this. One is a dude called Geraint Luff aka SignalSmith. This is probably his most accessible video:
      https://youtu.be/6ZK2Goiyotk

      Then the other guy of course is Sean Costello of ValhallaDSP fame:
      https://valhalladsp.com/2021/09/22/getting-started-with-reverb-design-part-2-the-foundations/
      https://valhalladsp.com/2021/09/23/getting-started-with-reverb-design-part-3-online-resources/

      In essence, here's the journey; assuming you know at least a little bit of C++

      1. Learn how to create a ring buffer (aka my Ring Delay thread)
      2. Learn how to create an all-pass filter using a ring buffer.
      3. Understand how fractional delays work, and the various types of interpolation.
      4. Learn how to manage feedback loops.

      Loads of resources out there for sure!

      posted in C++ Development
      OrvillainO
      Orvillain
    • RE: Orv's ScriptNode+SNEX Journey

      Lesson 5 - SNEX code in a bit more detail.

      So I'm by no means an expert in C or C++ - in fact I only just recently started learning it. But here's what I've sussed out in regards to the HISE template.... and template is exactly the right word, because the first line is:

      template <int NV> struct audio_loader
      

      Somewhere under the hood, HISE must be setup to send in an integer into any SNEX node, that integer corresponding to a voice. NV = new voice perhaps, or number of voices ????

      The line above declares a template that takes this NV integer in, and creates a struct called audio_loader for each instance of NV. Indeed we can prove this by running the following code:

      template <int NV> struct audio_loader
      {
      	SNEX_NODE(audio_loader);
      	
      	ExternalData data;
      	double note = 0.0;
      	
      	// Initialise the processing specs here
      	void prepare(PrepareSpecs ps)
      	{
      
      	}
      	
      	// Reset the processing pipeline here
      	void reset()
      	{
      		
      	}
      	
      	// Process the signal here
      	template <typename ProcessDataType> void process(ProcessDataType& data)
      	{
      
      	}
      	
      	// Process the signal as frame here
      	template <int C> void processFrame(span<float, C>& data)
      	{
      
      	}
      	
      	// Process the MIDI events here
      	void handleHiseEvent(HiseEvent& e)
      	{
      		double note = e.getNoteNumber();
      		Console.print(note);
      
      	}
      	
      	// Use this function to setup the external data
      	void setExternalData(const ExternalData& d, int index)
      	{
      		data = d;
      	}
      	
      	// Set the parameters here
      	template <int P> void setParameter(double v)
      	{
      		
      	}
      };
      
      

      There are only three things happening here:

      1. We set the ExternalData as in a previous post.
      2. We establish a variable with the datatype of double called 'note' and we initialise it as 0.0. But this value will never hold because....
      3. In the handleHiseEvent() method, we use e.getNoteNumber() and we assign this to the note variable. We then print the note variable out inside of the handleHiseEvent() method.

      Now when we run this script, any time we play a midi note, the console will show us the note number that we pressed. This is even true if you play chords, or in a scenario where no note off events occur.

      That's a long winded way of saying that a SNEX node is run for each active voice; at least when it is within a ScriptNode Synthesiser dsp network.

      The next line in the script after the template is established is:

      SNEX_NODE(audio_loader);
      

      This is pretty straight forward. The text you pass here has to match the name of the script loaded inside your SNEX node - not the name of the SNEX node itself.

      2aa2dbe0-4ea2-40b8-8a45-49d96ada26ec-image.png

      Here you can see my SNEX node is just called: snex_node.

      But the script loaded into it is called audio_loader, and so the reference to SNEX_NODE inside the script has to also reference audio_loader.

      posted in ScriptNode
      OrvillainO
      Orvillain
    • RE: scriptAudioWaveForm and updating contents

      @d-healey said in scriptAudioWaveForm and updating contents:

      @Orvillain Did you try, AudioWaveform.set("processorId", value); ?

      Yeah I did, and it does update it based on a follow up AudioWaveform.get('processorId') call - but the UI component doesn't seem to update, and still shows data from the previous processorId. When I compile the script, then the UI updates one time... but not on subsequent calls to the set method.

      I figured I needed to call some kind of update() function after setting the processorId, but no such luck so far.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: How to make a basic distortion Effect

      Start off with a tanh function.

      Then put a high-pass filter before it. Set the range on the tanh to be quite high. 1-10 would do. Then tweak the high-pass cutoff and notice how it impacts the distortion.

      Now add a low-pass filter after the tanh. Tweak the cutoff and notice how it cleans up the high frequencies.

      Start from there.

      posted in General Questions
      OrvillainO
      Orvillain

    Latest posts made by Orvillain

    • RE: How do I flush the UI parameters on first run??

      God I hate my stupid brain sometimes.

      So yes... that is exactly what it was....

      In my c++ I run these smoothers for some parameters. To avoid discontinuities when turning a parameter. You generally don't want to flush 1000's of parameter updates on things like delay times, so you smooth it out over time. Maybe only 10ms, but it helps to make it sound better and brings down CPU too. Cool.

      And that was all well and good. Worked fine.

      But in my setParameter callbacks, I was only setting the target. I wasn't setting the initial value. Which now I read it, is literally the dumbest stupidest mistake that I could've made.

      Time for more Guinness.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: How do I flush the UI parameters on first run??

      @David-Healey said in How do I flush the UI parameters on first run??:

      @Orvillain said in How do I flush the UI parameters on first run??:

      So now I'm thinking, maybe this is a custom C++ code or script node problem.

      Could be...

      ooooo... looks like it might be any of my effects that uses my ExpSmoothedFloat class to smooth the incoming parameter changes!

      I've genuinely been slamming my head against this for the past 4 hours.... and it was nothing to do with the UI side after all... at least it seems like.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: How do I flush the UI parameters on first run??

      hmmm... no that didn't seem to work either.

      Now, I might've been being dumb all along... but on a hunch, I tried a different effect.... and it seems like at least some of those parameters DO flush on init correctly... and some of them don't.

      So now I'm thinking, maybe this is a custom C++ code or script node problem.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: How do I flush the UI parameters on first run??

      @David-Healey said in How do I flush the UI parameters on first run??:

      Ok, what about using a timer that is started at the end of the callback, and in the timer you call .changed()

      I'll give it a go!

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: How do I flush the UI parameters on first run??

      @David-Healey said in How do I flush the UI parameters on first run??:

      @Orvillain Are you calling .changed() from the menu's callback?

      Yeah I am, there's no other callback to use right now.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: How do I flush the UI parameters on first run??

      @David-Healey said in How do I flush the UI parameters on first run??:

      What happens if after this stage you call .changed for each of those components?

      I get this in the Console:

      Interface: Skipping changed() callback during onInit for grf_FXEngine1_FX1_Graph1
      Interface: Skipping changed() callback during onInit for btn_FXEngine1_FX1_Sw1
      Interface: Skipping changed() callback during onInit for menu_FXEngine1_FX1_Menu1
      Interface: Skipping changed() callback during onInit for btn_FXEngine1_FX1_Sw2
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param1
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param2
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param3
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param4
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param5
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param6
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param7
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param8
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param9
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param10
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param11
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param12
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param13
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param14
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param15
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param16
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param1
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param2
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param3
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param4
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param5
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param6
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param7
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param8
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param9
      Interface: Skipping changed() callback during onInit for knb_FXEngine1_FX1_Param10
      
      
      posted in General Questions
      OrvillainO
      Orvillain
    • RE: How do I flush the UI parameters on first run??

      @David-Healey said in How do I flush the UI parameters on first run??:

      @Orvillain said in How do I flush the UI parameters on first run??:

      run script init / callbacks

      This is the important part. The last thing to run are the callbacks, in the order that the components appear in the module list.

      So if you have a callback that sets the active effect, and then other callbacks that set the effect's parameter values, you might get what you want by changing their order.

      oooooooo... I've just realised something .....

      My generic UI parameters themselves do not have a callback assigned to them. IE: I never call uiParam.setControlCallback(blahblahblah)

      I currently rely entirely on my effect load menu to do the following, and in this order:

      1. Get the menus component id.
      2. Derive the effect slot id string from the menu id.
      3. Read the menu item text - force it to lower case.
      4. Get the slotFX processor for the slot we want to address.
      5. Look up the hardcoded effect name for the chosen effect; using a map that takes in the lowercase menu item, and returns the name of the hardcoded effect to load.
      6. call setEffect(effectToLoad) on the slotFX instance.

      At this point, my effect is loaded.

      1. If the effect we loaded was the "empty" one, then just hide all of the parameters, and reset all of their attributes to blank slates.

      If it wasn't "empty"... then do this:
      8. Fetch the UI layout+binding spec for the effect.
      9. Bind the generic UI controls to that effects parameters.

      9.1 - build the UI prefix for the slot.
      9.2 - collect the UI components.
      9.3 - clear existing bindings.
      9.4 - set processorId to the correct effect slot name.
      9.5 - set the parameterId to the correct effect parameter name.

      At this point, the knob does control the DSP.

      10 - setup the other binding parameters (min, max, stepSize, colours, etc)
      11 - Hide any UI widgets that were not used.

      ... so in effect.... my actual UI parameters within each of my effect slots, do not have callbacks themselves. I rely entirely on the menu... which thinking about it... feels a bit stupid.

      Effectively, I'm relying entirely on HISE's attachment of processorId and parameterId - and I don't really know when that happens in relation to the callback.

      As I say; my UI parameters always look correct. They sound correct when I load a preset. They do not sound correct when I load a DAW project.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: How do I flush the UI parameters on first run??

      @David-Healey said in How do I flush the UI parameters on first run??:

      @Orvillain said in How do I flush the UI parameters on first run??:

      I would guess that what is happening is, the parameters push through their values before the processorId or parameterId has been assigned.

      Can you change the order that this happens? If it's all triggered by control callback then the order is based on the component list.

      I'm not sure, but is that actually under my control? I imagine the order of operations that HISE uses is something like:
      construct UI components
      restore UI component values
      restore processor graph / SlotFX state
      run script init / callbacks

      ???

      posted in General Questions
      OrvillainO
      Orvillain
    • How do I flush the UI parameters on first run??

      In my synth project, I have hardcoded effect slots. I have menus to load effects into them. I have a set of 16 generic knobs in the UI. These get bound to the DSP parameters when I load an effect - this is all triggered in my menu callback.

      It all works. I open my menu, I load an effect. The UI parameters get assigned to the correct processorId and parameterId. Then I can control the effect on screen.

      But, I save the project and reload it.... and my effect recalls correctly, and the UI positions of the knobs recall correctly, but the underlying DSP parameters are at their default values.

      This only happens when saving the .xml project, or saving the host project in a DAW. If I save and recall a preset, then it all seems to work fine. Any ideas on what to look into???

      The essential problem: I think I need a way to flush the positions of all parameters in the plugin, on first launch.

      I would guess that what is happening is, the parameters push through their values before the processorId or parameterId has been assigned.

      posted in General Questions
      OrvillainO
      Orvillain
    • RE: Custom envelopes or LFO's locking up when set to monophonic mode???

      @Christoph-Hart Still experiencing this.

      posted in General Questions
      OrvillainO
      Orvillain