Voxglitch modules - beta testers welcome!

@pgatt That’s great feedback! What if it ships with a bunch of factory presets, like:

image

… and a “sane” default configuration? I completely understand where you’re coming from. I know what each things controls, but as a new user, it would probably be very overwhelming. It’s going to need some serious documentation and lots of tutorials. I could make a simplified version if people would like one.

It’s interesting to hear that you want it to sound like the source material. I was bummed out during development at one point because it sounded too much like the source material! Ha ha ha. But I fixed that. :slight_smile:

Today I’m going to add a “max window” knob. Keeping the window short makes the module more memory efficient, but also shortens the playback length of each grain. A longer window will result in lusher, reverb-like sounds, but could tank your CPU.

image

The front panel is looking terrible right now. I’m not going to nitpick it until the dust settles.

1 Like

Also, I’ll try tracking v/o on the pitch control. Good idea.

New version available!

  • Added Max Window control, which is actually quite fun!
  • Output had been in mono due to a bug. This has been fixed.

Re: sounding like the source material. I get that consumer products lately have been fudging the line between granular proper and short sampling (where the source is easily recognizable). And that’s fine. But if that’s your taste to begin with, hurray :partying_face: for nudging people into exploring the venerable direction of granular proper!

1 Like

Thanks @OhWell. I’m actually really, really excited about this module. I’ve been getting absolutely astonishing sounds from it. I’m pushing updates throughout the day. I just made the SPAWN input optional and will be pushing that up. The internal spawn counter is in sync with the internal processing loops, which unleashes some new sounds.

At the moment, it’s relatively easy to overload the CPU. I’m going to ask on the forums if there’s a way for me to display the CPU usage on the front panel and add that soon. It’s a beast, for sure.

1 Like

wow, you strike again Bret! long waited module for sure. There is only one thing I don’t like - cpu consumption with that position of three static bottom knobs, otherwise works nicely. And sometimes it’s also a cpu spike when apply audiorate modulation to window parameter. And yeah there is also a huge delay between changing the audio and grains update, around 4 seconds or 5, or it that how this module works, caches a long time for buffering? 2020-04-27_09-14-14

I’m all for complete glitchy mayhem, but I’d like to start or finish somewhat near the source material. Otherwise it’s not really an effect in any meaningful way, it’s more like a random noise oscillator, which is fine too, but not really a granular sampler if it’s only unrecognisable noise the whole time. I wouldn’t want it to stay only similar to the sound source, but for my uses I’d like to either start or finish there.

Thanks Artem! I’m still fine-tuning it. You can avoid the delay by moving the Position knob to the very right. I know it’s counter-intuitive and I’ll try to improve that.

Also, I realized this morning in bed that I’m not computing the grain lifespan correctly. It should be based on the grain’s window, but right now it’s not. Things are definitely still in flux! I’m hoping that fixing some of the settings will make the module less chaotic but still give explorers like me plenty of options.

1 Like

but not really a granular sampler if it’s only unrecognisable noise the whole time

Sure, that makes sense. I’ll keep working on it. I suspect that there are a few mechanics that I’ve implemented incorrectly that, when fixed, should help.

Thanks Bret, and please don’t take it as a criticism, it sounds good so far and it’s awesome that you’re tackling this module. Just would be nice to scan the spectrum from fairly similar to the source all the way to full blown mayhem.

I appreciate it @pgatt. I’ve been facing a real challenges with this module. Here are a few:

Incoming audio is constantly streaming through a buffer. Let’s say that a grain spawns every 44 “ticks” (depending on sample rate) and starts playing at position in the buffer.

  1. The 1st grain starts at position 44 in the buffer and begins playing at sample rate.
  2. 100 ticks later, the 2nd grain starts at position 44 in the buffer and starts playing at sample rate.

Here’s the really mind-bending part: Both samples will be playing at the same position in the sample. In fact, if the playback position in the buffer is not modulated, all the grains will be playing the same exact same spot in the sample, causing the huge spike in volume that you can sometimes hear.

Let me give you analogy, just in case that’s difficult to comprehend. Imagine that you’re on the beach with two video cameras. If you turn video camera #1 on at 2:00 PM and video camera #2 on at 2:03 PM, they’re both filming the same thing. That’s essentially happening in this module if you don’t modulate the location input. A casual user might get frustrated by this. But if I set up some internal modulation to apply to the position (like a triangle wave), it’s making an assumption on how the grains should be… I think that the term is, “scheduled”, which would make it nearly impossible for a power-user to tweak the module to their liking.

Attempting to find a solution to this conundrum, today I tried adding code to forbid two grains from playing at the exact same position the buffer. Essentially, the code said:

if this grain is playing at position i in the sample, and any other grain is also playing at position i, don’t add this grain to the output.

It may have helped? I need to run some more tests. But there was a serious side-effect: If you don’t modulate the position, only 1 grain can play the sample at the selected position, which is good. But as soon as you modulate the position, multiple grains can start playing (and overlapping) which increases the amplitude significantly due to the way the grains are summed. (Which sounds distorted and loud.) It didn’t feel like a real solution, but tomorrow I may run some more tests to compare before-and-after.

Another big issue is CPU usage. In order to get lush sounds, you need to increase the window value. (Window is how long the grain is.) But this causes grains to stay in memory longer, and more grains means more CPU time. One way around this is to decrease the maximum number of grains allowed in memory. However, sometimes you might want more grains, but with a shorter window. My solution so far has been to exposed those settings on the front panel, but it means that the module can go haywire. Maybe there’s some way of automatically throttling the settings to keep CPU usage under control without adversely affecting the sound, but if so, I haven’t figured it out yet.

If I put strict limitations on nearly any parameter, it means that there’s some fantastic and weird sound that will no longer be possible to achieve. My module Ghosts is a good example of this. Ghosts always sounds beautiful and interesting, but it’s repertoire is limited. So I have to decide if this module is going to sacrifice flexibility in favor of stability.

Anyhow, I wanted to share my thoughts. Maybe a community member will say, “Bret, you’re so dumb. The answer is clearly… [clever solution].” :slight_smile:

- Bret

I suppose it is not the time that causes high CPU usage but the number of grains which need to be summed? I haven’t looked at your code yet but using SIMD might really help in this case as it can reduce needed CPU instructions up to factor 4 under ideal conditions.

Hmm, I’m most likely missing something, but I thought a common solution is to use a fixed buffer length, pushing audio through and out at the same rate as it’s being added. So that (as far as the granular engine is concerned) each addressable position in the buffer acts like a tape play head. The way you describe it makes it sound like the position 44 works like position on the tape itself (instead of the relative position of playheads.) Could that be that’s what’s going to make it counterintuitive?

Yes, that’s exactly how I’m implementing it. Sorry if I glossed over that implementation detail. I have a fixed width buffer where the audio gets “pushed though”. Technically, I’m adding the audio then incrementing the write-head, if you will. When the write head reaches the end of the buffer, I wrap it to the beginning. When a new grain is created, it’s passed:

  1. The location of the write head, the [grain] Location input value. Is uses this as its starting playback position.
  2. The pitch at which to playback. (a simple float value that’s been pre-calculated)
  3. The selected amplitude slope. (That’s new and not yet in the repository.)
  4. A pointer to the buffer. Memory consumption is not an issue.

However, @stoermelder Ben has a very good point that was troubling me last night as well. After I had posted, I realized that I wasn’t being logical when I talked about grain length affecting CPU. The CPU should be completely dependent on the number of grains. Right now I allow up to… 400 grains. Maybe that’s too many. I’ve tweaked that before, but maybe it’s work revisiting.

Also @stoermelder, that’s an amazing idea! I’ve never tried that before. I have programmed some assembly language in college 30 years ago. Oooo. Getting old. Ha ha. First, maybe I should double check that my code is as efficient as possible. I just spotted some division that could be converted to bit shifting.

Thanks so much for the suggestions!

1 Like

Hmm, what about the read head? Does it move with the audio at the same pace as the write head?

(To get the intuitive tape read/write style behavior, I suspect the read and write heads would have to move at the same pace by default, with ‘position’ controlling the position of the read head relative to the write head.)

Andrew did a really good job to make SIMD quite easy to understand and to use. Take a look at the simd namespace. Many operators on simd::float_4 just work like on float, a few helpers like simd::ifelse() make you life really easy :slightly_smiling_face:

Also, some good read:

Yes it does. You’ve got it exactly right. :slight_smile:

1 Like

That sounds perfectly intuitive! :nerd_face:

Will this sequencer cut and paste with Entrian, Impromptu, etc?