Voxglitch modules - beta testers welcome!

I think the case where you want a pop is pretty rare. I’ve never seen a module that let you turn off the anti pop.

Great news! I got smoothing working! I’ll have a build ready by the end of tonight. I just need to put the final touches on it and make sure it takes into account different sample rates. I’m super excited about it!

FYI:In order to switch between samples without a “pop”, I wrote code that essentially acts as a slew limiter on the sample waveform:

if(params[SMOOTH_SWITCH].getValue()  && (smooth_ramp < 1))
{
	float smooth_rate = 128.0f / args.sampleRate;  // A smooth rate of 128 seems to work best
	smooth_ramp += smooth_rate;
	wav_output_voltage = (last_wave_output_voltage * (1 - smooth_ramp)) + (wav_output_voltage * smooth_ramp);
	outputs[WAV_OUTPUT].setVoltage(wav_output_voltage);
}
else
{
	outputs[WAV_OUTPUT].setVoltage(wav_output_voltage);
}

last_wave_output_voltage = wav_output_voltage;

smooth_ramp is a float which is set to 0 every time the sample position jumps to a new spot.

2 Likes

A new build is on Github. :dancing_women:

@Aria_Salvatrice: Aria, I’ve added a smoothing switch that I’m sure you’ll like!

@ale47p: Alessandro, I’ve made the panel changes that you suggested and the retrigger option. I’m looking into your “last used folder” suggestion right now.

-=- UPDATE -=-
I’ve added funcationality so that only .wav files can be selected when selecting a sample using the context menu.

There is dsp::SlewLimiter also. If you wanted to compare…

1 Like

Thank you Phil! Just for reference, here’s the code for dsp::SlewLimiter which is defined in https://vcvrack.com/docs/filter_8hpp_source.

template <typename T = float>
 struct TSlewLimiter {
     T out = 0.f;
     T rise = 0.f;
     T fall = 0.f;
  
     void reset() {
         out = 0.f;
     }
  
     void setRiseFall(T rise, T fall) {
         this->rise = rise;
         this->fall = fall;
     }
     T process(T deltaTime, T in) {
         out = simd::clamp(in, out - fall * deltaTime, out + rise * deltaTime);
         return out;
     }
     DEPRECATED T process(T in) {
         return process(1.f, in);
     }
 };
  
 typedef TSlewLimiter<> SlewLimiter;

I don’t understand all of it at first glance, but it looks similar to my code. I’ll use my own code for now, however it’s good to know that this exists.

still no OSX build to find?

Have been looking for this link cheers!!

I’ve created another module!

wav-bank-front-panel-0101447

It’s another sample player. Key features:

  • Instead of loading individual .wav files, you select a folder and it loads all .wav files in that folder into memory.
  • It allows you to switch between .wav files.

It’s up on Github for anyone who’d like to test it. GitHub - clone45/voxglitch: Modules for VCV Rack

I haven’t stress tested it yet. I’d recommend keeping the number of samples and sample lengths small. Enjoy!

Hello! I’ve created a XY controller companion module for the Repeater module.

It’s up on my github in case anyone wants to kick the tires.

It should be relatively self-explanatory, except for perhaps the CLK input. Recording of the XY mouse positions only happen on every clock pulse. This both gives you freedom to record at reasonable rates (to conserve memory), but also helps sync playback with any other clocked module, such as the Repeater module.

Enjoy! Let me know how it goes!

Cheers, Bret

2 Likes

Very cool!

Edit: No brilliant!!

@Coirt Phil, I’m so glad you like it! :bowing_man: :blush:

Recording mouse working okay, a suggestion that might give more control: Have set control points to jump to on each pulse with the ability to set these positions with the mouse. Along with recording possibly… When you record some movement it might be just the one pitch that is not sitting right for position / division being able to set that particular voltage on the XY could make it even more reasonable or fitting.

I considered adding a “punch record mode” to the module so that you can edit existing recordings. Let me think it over a bit.

Just doodling around - this would be the rough layout with an additional “PUNCH” switch for locking in punch recording:

It doesn’t leave much room for pleasantries and it’s a bit wider, but I do like the idea of adding the PUNCH switch.

Could do with attenuverted mod knobs also on repeater perhaps attack / decay (start / end) knobs for each bank? Not sure but the position knob seems to set the length of each bank to the length of bank 1 only.

XY is a really nice companion for repeater but also for other modules, applicable to filters also and many uses. Would you consider building the XY pad into repeater.

For the mouse positions I was thinking something like this… XYSuggestion

each yellow box representing where the crosshair snaps to on each trigger received with the mouse controlling the x, y position of each square perhaps even moving either clockwise, counter or random (random might even come from the user, boxes being indexed it would snap in order!)

I’d love to hear more about your “mouse positions” feature. However, I would probably build that into a separate module.

Question: If the mouse positions are set, like you’ve suggested, wouldn’t the module be acting very similar to a traditional step sequencer, except with variable length? Wouldn’t it be very similar to this in functionality?

image

Not sure but the position knob seems to set the length of each bank to the length of bank 1 only.

The POS knob on Repeater is global. It controls the repeat (stutter) length on all 5 .wav files. That’s by design though. :slight_smile:

Cheers, Bret

Sure without the UI. The UI is what gives the control but it is very difficult to record exactly what you want with mouse position alone it might come close but bridging that gap with editable positions that have been recorded would be 100 times faster to customise those quirks in a glitching sample. Recording with the mouse is kind of a random factor also (in a good way) but if you could edit the recorded positions…

Ah I see with the position knob, shorter samples will make no sound compared to one with length though so functionally it would be better if these were separated imo. Some thoughts are: if a sample has the same length it would not matter, say a sample is 4 bars and another is 2 bars repeat the 2 bar again but if you have another sample which is less than a second repeat the max length for 4 bars for continuity purposes (but it may be cut off at the end). On the other hand positioning a shorter sample somewhere in the range of longer samples would also be worthy.

Added punch recording:

2 Likes

Hello everyone,

I’m super excited to announce my new module, “Ghosts” which is ready for Alpha testing. It’s a granular sample player. I’m not sure exactly how to describe it. It’s similar to Reaktor’s old Travelizer patch. I’m going to eventually add pitch control, but I’m too excited to wait. :slight_smile:

ghosts

Usage:

  1. Right-click on the module to load a sample
  2. Tweak out.

Don’t worry about the sloppy panel layout just yet. I’ll pin that down once I’ve settled on all the features. Sorry, you’ll have to compile this yourself for now. I hope to get all my modules ready for official release within the next few weeks.

Enjoy, Bret

5 Likes

Crazy sounds! :smiley: