- This topic has 11 replies, 3 voices, and was last updated 2 weeks ago by sadguitarius.
December 31, 2022 at 6:51 pm #168080sadguitariusParticipant
In this thread (https://www.eventideaudio.com/forums/topic/vsig-custom-modules/) it is mentioned that single-sample feedback loops are possible in VSig. While I am new to VSig (although I do have Max/MSP/gen experience which translates well), I can’t figure out how to actually make this work. It seems that any time I mix in feedback from an output signal, I get a few extra samples of delay in the feedback loop. I was hoping to be able to design my own filters for the H9000 using low-level DSP. Is this simply not possible at the moment?
I attached what as far as I can tell a correctly-implemented patch which is pretty much the simplest possible recursive low pass filter. I can plainly hear some high-frequency comb filtering going on, especially at low cutoff settings, which shouldn’t be happening. Can anyone offer some insight? Am I just going about this totally wrong?
January 1, 2023 at 12:59 pm #168083sadguitariusParticipant
and the attachment didn’t show up, so here it is.
January 2, 2023 at 11:53 am #168116John BayliesParticipant
Seems the attachment hasn’t attached. Could you upload the file to google drive?
Also, have you checked out https://cdn.eventideaudio.com/manuals/h9000/2.0/content/development/gen~.html ?
January 2, 2023 at 1:57 pm #168119sadguitariusParticipant
Ah weird! Ok here you go: link
I put in a switch to add or remove a single-sample delay in the feedback, as I wasn’t sure if the expected behavior should be to add an implicit delay for feedback loops or not. It does change the sound, but it seems like there’s already more than a sample of delay automatically inserted anyhow.
I have checked out the gen~ code export and it is awesome. The reason for wanting to do this in VSig is to have access to Eventide algorithms at the same time and also to have better control over how parameters are displayed.
I also heard there’s a raw C++ API in the works (not sure if this is still a thing). Is this something that can be made available? Would this also include the same algorithms available in VSig, or only DSP code provided by the user?
I’m mainly just trying to have access to some of the more modern techniques for analog filter modeling with saturation at the same time as having those sweet Eventide pitch shifts and reverb building blocks in the same unit. I hope that if this isn’t currently possible, it’s something that could be added one of these days!
January 2, 2023 at 4:29 pm #168130John BayliesParticipant
looking at your sigfile, the textknob’s choices are both set to 0, which send 0 to picodelay’s delayamt.
I just measured picodelay, and unless I did something wrong, it looks like setting picodelay’s delayamt to 0 somehow gives it a negative delay of one sample. delayamt 1 = no delay. delayamt 2 = 1-sample delay.
so your textknob’s choices should be set to 1 and 2, but it still doesn’t seem to work. I don’t do filter design so I can’t help with the implementation.
I’m not sure if the C++ API is still offered. You may want to send an email to support.
January 2, 2023 at 7:27 pm #168136sadguitariusParticipant
Ah I made a mistake with the switch values, it was a quick addition just to give the option of adding or removing the delay. Strangely, I hooked up a monitor and the switch still output 0 and 1 even though the values were not set, so I guess it actually doesn’t make a difference. The other weird thing is that even with the picodelay in the feedback path set to a delay of 0, the filter sounds more correct than with feedback straight from the output back into the crossin module. The order of the modules definitely matters as well. I still can’t get it to work right though.
Thanks for your help! I’ll check with support to see if there’s a solution.
January 7, 2023 at 11:45 pm #168343PuppeteerParticipant
I haven’t tried this out on my H9000 yet, but a few things I can see for potential issues.
The pico delay is executed before the crossin so the crossin input from the picodelay is always going to be delayed by 1 sample (or however many samples the processor lag is) even if picodelay is set to 0. I was thinking about ways to solve this for my own feedback filter algorithms (which can get runaway feedback, but I’m seeing that as a feature at the moment for some stuff I’m doing), and I think that there will need to be some delay in the dry signal after the feedback loop but before the outputs to align the dry signal with the outputs, if we want true sample accuracy in feedback loops.
The other thought I had was perhaps to set up some input and output shift registers using the pico delay and using those to feedback or inject, similar to how shift registers in labView work, but I haven’t worked through this yet to see if it’s possible or how to implement it.
My thinking is that each of the dsp blocks is going to introduce some latency and the only way to really line things up at the sample level is going to be to introduce delays on the dry input and to pull the suitably delayed signal when it is required. To reliably do this though will need us to understand the latency of each block, which isn’t available either in the help file, or in the .json database. I think the only way to find out would either be for Eventide to supply it (if they know) or for us to measure each block, which is somewhere in my todo list for the future. Eventide may also have put some form of latency compensation in, so that may be another potential spanner in the works.
Another potential issue (and I don’t think this will directly affect your signal chain) is that I’ve found audio signals don’t seem to do what I expect with regards to absolute numbers.
The 0-1 in crossin modulation is most likely silence to full scale audio, which don’t necessarily correspond to the digits 0 and 1 (even though the help file says that’s what it’s expecting). You may be better off using a volume control or something similar to feed your mod input from an oscillator. I’ve fallen into this trap a few times trying to do a similar thing to what you are attempting here. As I’ve said I haven’t tested your algorithm yet, and if it works, don’t mess with it, but if the crossfade isn’t doing what you are expecting, this could be a reason. Also, the math.bound may be a better option than the c_bound, if you need it, and put it on the audio line.
January 8, 2023 at 10:21 am #168350sadguitariusParticipant
Thanks for the detailed reply! I did try several combinations of execution order and this was the one that seemed “closest” to working correctly, although I haven’t fully wrapped my head around the way VSig handles order of execution in feedback loops yet.
The shift register idea is cool and seems like a tidy way to at least ensure that a single object is responsible for creating the individual taps.
Yes I do think doing some tests on each object would be helpful, but as you said, some official help from Eventide on the best way to go about this (if it’s even possible) would be the best case and would save tons of time.
Thanks also for the heads up about unpredictable object behavior. I was a little worried about using the crossfade, but it seemed to be doing what it was supposed to. Since this is only a 1-pole filter, it wouldn’t be that noticeable if it was not tracking properly, so again probably something to test further.
I’m away from my studio over the next week but I’ll try some of this stuff when I can!
January 10, 2023 at 9:34 am #168392PuppeteerParticipant
A single pole filter shouldn’t require feedback, though admittedly .my math is a little rusty in that area, but my memory tells me that filter resonance requires feedback and can’t be achieved in a single pole filter.
My understanding is that a feedback path will turn a single pole filter into a 2 pole filter when the maths or block diagram is simplified to a single transfer function.
January 10, 2023 at 11:04 am #168396sadguitariusParticipant
Hi @Puppeteer, here is a basic explanation of a 1-pole IIR filter. IIR implies that feedback from the output is combined with the input signal so that the output signal never completely decays i.e. “infinite impulse”. If you want a more detailed explanation, this book is an invaluable resource (although I admittedly understand only a fraction of it). Basically this allows the creation of digital filters that more closely model what would be happening with resistor-capacitor networks in analog filters.
As far as I know, you are correct that resonance doesn’t happen in a 1-pole filter, but that doesn’t mean that there can’t be feedback in the equation used to produce the filter’s response.
Hope this helps!
January 12, 2023 at 11:46 pm #168440PuppeteerParticipant
Yep, you are correct. That would require feedback.
January 13, 2023 at 12:57 am #168441sadguitariusParticipant
Ah cool, I didn’t mean to sound pedantic or something. Glad we’re on the same page and thanks for your help!
- You must be logged in to reply to this topic.