Voxglitch modules - beta testers welcome!

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?

@Squinky

Which module are you referring to? If it’s Digital Sequencer, it is on my to-do list. :slight_smile:

Yay!

Hey @pgatt, I think I’ve found a good middle-ground to allow this module to be instantly accessible by everyone yet have the ability for serious weirdness. Essentially:

  1. I’m going to add adjustable modulation source that applies to the Position which can be overridden with a CV input. This will keep the module from acting badly when no cables are connected.

  2. I’ve added a spawn rate knob to control the internal spawn rate. Again, the internal spawn rate can be superseded by an CV input. But I’m also going to add CV control over the internal spawn rate because I’ve found that tweaking it can be a lot of fun.

  3. I’ve consolidated and removed some of the controls that are no longer necessary, such as grain throttling.

I won’t have a new version to show off for a few days. I’ve got a lot of work ahead of me! But I think that everyone will love the changes.

1 Like

Awesome Bret, look forward to it. Let me know if you want a tester. Thanks for all your hard work.

1 Like

Absolutely! I would love your feedback. I’ll keep you posted of my progress. :slight_smile:

Hi Everyone!

I think I’ve finished up work on an expander module to Grain Engine MK2 that was originally requested by Artem (@VCVRackIdeas). I could use any help I can get to test it before I release it. Here’s a summary of what it does:

  1. Position it to the left of the Grain Engine MK2
  2. It records incoming audio
  3. Once recording has been stopped, it passes the audio to the Grain Engine MK2. (What actually happens is that it saves the audio to a .wav file and tells Grain Engine MK2 to load it.)

Here’s the front panel:

There isn’t any documentation yet, so here’s a quick overview:

  • INPUTS: The audio to record
  • START REC: Start recording. If the module is already recording, a gate signal at this input will stop recording. In other words, you could hook up a LFO square wave to this input and ignore the STOP REC input.
  • STOP REC: Stops recording.
  • SAMPLE: Which sample slot (1-5) the recording should be saved to in Grain Engine MK2
  • THROUGH: Mirrors the audio at the inputs

Here’s a link to the repo. It’s on my main branch:

I had to make some complicated changes, so I would really appreciate your help in testing this before it goes live.

Cheers,
Bret

Broken link!?

Sorry @Caecos, I just merged it into my main branch. Please see: https://github.com/clone45/voxglitch

Great…just compiled it for Windows…regards…

1 Like

Heads up: I found a pretty nasty bug and fixed it this morning. If you had issues with it crashing when cranking up both RATE and GRAINS, that should be fixed.

1 Like

Build and ran on Ubuntu 20.04, build had a few warnings but completed.

From my tests as an unfamiliar user of your module, all seem to work, I tried pluging unexpected signals in. if noise is applied as the trigger for recording, VCV does slow down, but not crash, every time i was able to delete the cables and stability returned.