Don't know if this is the done thing really, but I wanted to show off:
https://youtu.be/1kMHloRQLcM
Best posts made by Orvillain
-
I wrote a reverbposted in C++ Development
-
I wrote a bbd delayposted in C++ Development
Again, wasn't sure where to put this. But I created my own node.
Modelled analog bucket brigade delay. I'm starting to build up quite a nice collection of delay and reverb utilities now!
-
RE: I wrote a reverbposted in C++ Development
@Chazrox I might do a video or two on everything I've learned!
-
RE: Need filmstrip animationsposted in General Questions
@d-healey I really like that UI. Very simple, accessible, and smooth looking - for lack of a better word!
-
RE: Transient detection within a loaded sampler - SNEX ????posted in General Questions
@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.
-
RE: Can We PLEASE Just Get This Feature DONEposted in Feature Requests
Free mankini with every commercial license???
-
RE: I wrote a reverbposted in C++ Development
@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/6ZK2GoiyotkThen 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++
- Learn how to create a ring buffer (aka my Ring Delay thread)
- Learn how to create an all-pass filter using a ring buffer.
- Understand how fractional delays work, and the various types of interpolation.
- Learn how to manage feedback loops.
Loads of resources out there for sure!
-
RE: Orv's ScriptNode+SNEX Journeyposted in ScriptNode
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_loaderSomewhere 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:
- We set the ExternalData as in a previous post.
- 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....
- 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.

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.
-
RE: scriptAudioWaveForm and updating contentsposted in General Questions
@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.
-
RE: How to make a basic distortion Effectposted in General Questions
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.
Latest posts made by Orvillain
-
RE: Flex Envelope - No UI control for Holdposted in General Questions
Is there a way to draw a custom point shape, instead of the squares ?? I've managed to do it for the curve points, but the squares remain.
-
RE: NI Insolvencyposted in General Questions
One of my fxpansion colleagues ended up at Native. The tldr is; he only stayed a year before moving on elsewhere.
-
RE: NI Insolvencyposted in General Questions
@griffinboy said in NI Insolvency:
I assumed that Kontakt was a money printing machine.
Quite a few smaller indie devs I know have been jumping off of Kontakt. One of the bigger ones - Get Good Drums - built their own engine with Cradle Audio, to get away from Kontakt.
The pricing model for Kontakt was always quite a large barrier to entry.
-
RE: LFO Phase Control - Now shifts phase in realtimeposted in General Questions
@griffinboy said in LFO Phase Control - Now shifts phase in realtime:
Me as well, I've got a few.
I used fixed point math for all LFOs now.
You can get really cheap phase manipulation and implicit wrappingAhhh interesting. Mine is not using fixed point math, and actually looking at the code, I've just spotted a few areas where I can make them cheaper! Ahhhh... to the Trello board.......
-
RE: LFO Phase Control - Now shifts phase in realtimeposted in General Questions
haha! I wrote a custom LFO late last year for a project, and this was precisely one of the reasons!
-
RE: Browsable Snippet: [Clocksynced Arpeggiator]posted in Presets / Scripts / Ideas
@HISEnberg said in Browsable Snippet: [Clocksynced Arpeggiator]:
Just curious do you have an example of a using a panel to control an arpeggiator?
I'll have to put one together, because the one I have is the clients.
But basically I did a piano roll kind of interface, where I can specify pitch and length, in a grid. Then an extra velocity lane below. I draw a grid according to the steps count, centre lane across the middle, +12 and -12 range below. So it's a load of squares in a grid. Each cell can be clicked on and off, and when you click it off, you can drag the right-most edge to change the size of the note.
It's all pretty straight forward graphics context drawing to be honest; tied in with Christoph's arp snippet.
-
RE: Browsable Snippet: [Clocksynced Arpeggiator]posted in Presets / Scripts / Ideas
@DanH said in Browsable Snippet: [Clocksynced Arpeggiator]:
@Orvillain I couldn't get this working nicely - the sliderpacks would never recall the settings properly. Does it work ok your end?
I'm not using slider packs. I'm using custom drawn script panels, and I save the step data into the panel value field for preset store/recall.
I don't really like slider packs, and I try to avoid them at all costs. Coz they're ugly and mean.
-
RE: Browsable Snippet: [Clocksynced Arpeggiator]posted in Presets / Scripts / Ideas
Heya!
I modified the clocksynced arpeggiator example slightly for my own needs.
But I am wondering - what advantage does it have over just using the Arpeggiator midi processor???
-
RE: Custom browser - custom preset file format???posted in General Questions
@Christoph-Hart I'm looking at this again. Before I begin, is there a decent snippet anywhere that demonstrates how to do this for a simple plugin?
Also, what are the gotcha's to watch out for? You mentioned killing voices, loading on the background thread, etc...
-
RE: Colours added/removed in UI XMLposted in General Questions
@Christoph-Hart Interesting, I did not know that! Looking forward to the designers whining at me about Figma pixel-perfect accuracy!

It might be worth performing this rounding/clamping in the UI fields too, for consistency sake. I totally get it is a JUCE baseline thing, so I'm not going to whinge about sub-pixel accuracy or anything like that.