Haha the easter bunny has delivered.
-
@hisefilo is our additive synthesis expert I think - last time I looked at his published stuff he was using only about 8 partials to get something viable, so you could "optimise" down to this, build an additive synthesis engine to utilise these, and then keep adding partials until you are happy.
Of course "build an additive synthesis engine" is a 5-word description of a HUGE job...
-
@Lindon @iamlamprey LOL, not that expert but spend a lot of time dealing with partials. I think 128 harmonic partials + residual noise can create almost any sound in a credible way. (lower registries from C2 and below will need up to 256 partials but you can optimize that for each octave)
I haven't checked the Loris integration yet. But I guess many of the 1930 partial you have is noise turned into partials. Have you checked how many partials you see on Spear for this sound??
-
I actually have some semi-working additive nodes I made in SNEX a while back, they just didn't have working envelopes. IIRC they utilized about 40 (?) sines and waveshaping to add overtones without a noticeable CPU hit
The 1930 partials seem to be the Loris algo being overly sensitive, a lot of the extracted partials are extremely close in frequency to each other:
These are sorted by loudness, you can see there's multiple 552.x partials, there's probably some parameter for filtering these but I'm dumb :)
-
The 1930 partials seem to be the Loris algo being overly sensitive,
I assume that's why the resynthesis sounds so good. But for an additive synth it's probably overkill.
This is probably what you need: http://www.cerlsoundgroup.org/Loris/docs/utils.html
collate : collate the Partials to reduce their number without assuming any harmonic structure (cannot distill later!).
-
@d-healey Yeh I noticed that command, not sure how to use it in the HISE implementation, I tried
lorisManager.process(CURRENT_FILE, "collate", ???);
No idea what to use for the third parameter, or if the collate string is even viable there lol
I currently have a hacky solution by just rounding the values before pushing them to the array, then using
pushIfNotAlreadyThere
to remove the duplicates, it works for now -
@iamlamprey I'm currently extending the Loris API to include the more advanced functions like collate, distill and sift (love the names), they do address the problem of having too many partials, but as David said, if you reduce them to a common denominator the sound gets a bit more static.
-
I'm currently extending the Loris API to include the more advanced functions like collate, distill and sift
Which commands are currently available for the
process
function? I had a look through the source but didn't see a list.I see I can play back a buffer using
Engine.playBuffer()
but is there a way I can stop playback? What I want to do is allow the user to load a sample and hit a button which will resynthesise it at different pitches which are mapped to the keyboard and then they can play it back like a regular instrument.Also, can I load a buffer into a loop player or must it be saved as a real file first?
-
@d-healey said in Haha the easter bunny has delivered.:
Which commands are currently available for the
process
function? I had a look through the source but didn't see a list.I don't think there is one, you can make your own functions with processCustom but I'm "patiently" waiting for Christoph to implement the official partial filtering methods cause my hacky ones keep crashing HISE lol
I see I can play back a buffer using Engine.playBuffer() but is there a way I can stop playback?
The mouseUp event in the top panel has a "stop" button by playing an empty buffer (fix by @ustk above):
Engine.playBuffer([], "", 0.0);
-
I don't think there is one,
Well we have
dilate
, I only know because it's used in the toolkit, but I haven't seen it in the code specifically.The mouseUp event in the top panel has a "stop" button by playing an empty buffer
Ah that's clever.
-
@d-healey said in Haha the easter bunny has delivered.:
Well we have
dilate
, I only know because it's used in the toolkit, but I haven't seen it in the code specifically.Hopefully the easter bunny visits twice this year
-
@iamlamprey said in Haha the easter bunny has delivered.:
The mouseUp event in the top panel has a "stop" button by playing an empty buffer (fix by @ustk above):
Engine.playBuffer([], "", 0.0);
Hmm this isn't working for me, the file just plays until the end.
-
I'm not actually sure how that code works, since the docs only ask for 2 params, you could try different combinations of the [], "" and 0.0 lol
Engine.playBuffer(var bufferData, var callback)
If that doesn't work there's a few bits in the source referencing stopping the buffer, specifically
void MainController::stopBufferToPlay()
which is called when destructing a buffer object, but there isn't a wrapper for it, and I'm not sure how safe it would be using that intentionally
-
@iamlamprey said in Haha the easter bunny has delivered.:
I'm not actually sure how that code works, since the docs only ask for 2 params, you could try different combinations of the [], "" and 0.0 lol
Engine.playBuffer(var bufferData, var callback)
Does it work for you?
Docs show 3 parameters for me
-
@d-healey said in Haha the easter bunny has delivered.:
Does it work for you?
ustk's code above works for me in the context of the Loris Toolkit's preview waveform panel, it was crashing on mouse up, now it fades out the audio/stops playback on mouseup.
Docs show 3 parameters for me
Ah I always refer to https://docs.hise.audio/scripting/scripting-api/engine/index.html#playbuffer , the HISE api has 3
I'm not sure why the buffer isn't stopping for you, I think this might be turning into a @Christoph-Hart problem..
-
@iamlamprey Probably a Linux thing. I'll see if I can spot anything in the debugger.
-
@Christoph-Hart said in Haha the easter bunny has delivered.:
@iamlamprey I'm currently extending the Loris API to include the more advanced functions like collate, distill and sift (love the names), they do address the problem of having too many partials, but as David said, if you reduce them to a common denominator the sound gets a bit more static.
Would these extra functions be hard for me to implement? I know you're busy with the MIR stuff atm
-
@iamlamprey also waiting for it! Fingers crossed
-
New commit does what I was trying to do much better:
//make a var outside the rebuild function's scope var frequencies; // probably use a better name lorisManager.analyse(CURRENT_FILE, rootFreq); // line 125 in LorisProcessor.js frequencies = lorisManager.createSnapshot(CURRENT_FILE, "frequency", 0.1); // new method
the string parameters are "frequency", "gain", "phase" and "bandwidth", the time parameter is in seconds
The method returns an array you can inspect:
Once the dilate stuff is ready (if it's not already, i haven't checked) it should be pretty simple to reconstruct the sound in a SNEX node, I think the real CPU struggle will be polyphony...
-
@iamlamprey even monophonic would be good..
-
I haven't been able to get this working lately on my Apple Silicon system (tried native and Rosetta). I did try the latest release dylibs as well as pulling the source and compiling myself. In both cases it's getting caught on:
So getting the "Can't open Loris DLL" message ultimately. I even tried signing the dylibs to avoid that quagmire... so the files are accessible anyway.
I've verified it's trying the correct path on my system, the files are in place.
I was able to build the toolkit project despite this, but it's complaining about function pointers when trying anything.
Would love to get Loris working again. Any ideas?