Here’s a first look at a module (my first!) called Drifter. I haven’t actually applied any time to GitHub yet, though that will be the eventual channel for the source and distribution. In the meantime, here’s a Google Drive link to the Drifter-2.0.0-win.vcvplugin file.
A friend of mine who loves words has offered to write the docs for this, but here’s my current elevator pitch. “A function of In → Out that randomly changes (with constraints) when triggered.”
The shortest way to explain it is this picture of this tiny rack:
- OFST - sets the range of the expected inputs and outputs from 0-10V or -5-+5V.
- LINE - Selects from three different line types, Steps/Lines/Curves
- RESET Input and button - Resets the line to its starting position, which is all zeroes. Also applies any change to LINE COUNT (below).
- DRIFT Input and button - an upward movement past 2V will cause all of the points defining the output curve to change. So will pressing the button.
- DRIFTINESS - the distance, in V, that each point can move in one DRIFT event. 0 locks the curve in place, ignoring DRIFT events. Higher values completely change the line each time, to the human eye, at least. (Hint: start small).
- LINE COUNT - the number of segments in the curve, from 1 (just connecting the end points) to 30.
- ENDS - End points stay locked at neutral position/end points drift up and down when DRIFT events occur.
Anything you wish was gradually changing - melodies, volume levels, waveforms, CV levels. Note that the use of a Saw wave as the input in the sample rack is just to better illustrate the idea of it being a transformation function; you can put whatever you like in.
Design questions that I’m considering (although, maybe not for the initial release):
- Should there be three separate outputs (Steps/Lines/Curve) instead of just one with a LINE switch?
- Make Driftiness an input?
- Make Polyphonic? Not certain that people would want to apply the same function to multiple inputs, but…?
- Spikiness: value for minimum X distance between points. At highest value, points just move up and down.
- Add bias knob on the output? Or is this easy enough other ways so as not to bother?
- Add an attenuator on the output? Or, again, are these so common that I don’t need to?
Any reactions, thoughts, gentle finger pointing at obvious oversights, reactions to the UI…whatever, I’m curious.
To anyone who actually tries this, thank you!
It looks interesting! I wasn’t really sure how the module was supposed to work, so I fed in a control voltage in hopes that it would slowly drift. I’m not sure if it worked. Maybe a few demos would go a long way in showing potential uses.
As for the front panel, it’s difficult to comment on aesthetics since everyone has their own style. My only comment might be that it’s not immediately apparent which labels are associated with which knobs and inputs. For example, which of these controls are associate with Reset?
Of course, you can figure it out if you look hard enough. But it took me some thinking when I first loaded the module.
I might also help to visual connect the CV inputs and the manual controls:
(Maybe not exactly how I show it, but you get the idea.)
Play around with it for a while and kinda got how it works, pretty cool!
LINE knob only has 3 valid values, it felt freezed for a great distance when being turned. A toggle would be better, or you can make the turning angle range smaller, or maybe make more types.
Don’t know if this is possible, but I would like the
LINE COUNT change to be in realtime, without resetting (also it’s not very clear that you need to reset to get it work).
I don’t totally get how
ENDS works, sometimes toggling it stops the drifting, sometimes it doesn’t.
Yes, make a separate input for
DRIFTINESS would be cool, I manually tweak the knob in this little patch and like the effect.
DRIFTINESS is the main effect knob, a bigger knob and a more visible position could help.
Some related controls can go together (
Font size choices are a bit weird, this also affect the overall layout, and visibility of
RESET looks more important).
OUT are also coverd by the screws.
(I like the exclamation mark)
Here is a horrible quick MS Paint take (in my layout style), but you get the idea:
These are great notes; when you live with something, there’s a lot of details you never notice! Thank you both.
I have largely revamped the UI of this module (thanks to Bret and Letheward for your advice), which I think will make what it is doing much more transparent. It also now includes a display, showing what the waveform/function currently looks like.
Now that image from my original post can look like this:
This demonstrates how Drifter can influence a parameter (in this case, the easiest one to hear, which is frequency).
The updated per-element documentation:
- X DRIFT Input and button - the distance, in V, that each point can move along the X-axis (i.e., left-to-right) in one DRIFT event. 0 locks the points horizontally in place. Higher values allow larger changes each time. (Hint: start small).
- OFST - sets the range of the expected inputs and outputs from 0-10V or -5-+5V.
- TOTAL DRIFT Input and button - the distance, in V, that each point can move in one DRIFT event. 0 locks the points in place. Higher values allow larger changes each time (Hint: start small).
- ENDS - Selects one of two options: Left and right end points stay locked at value zero OR end points drift up and down when DRIFT events occur.
- DRIFT Input and button - a trigger to the input or button press will cause all of the points defining the output curve to move once, within the limits set by X DRIFT, TOTAL DRIFT, and ENDS.
- COUNT - the number of segments in the steps/line/curve, from 1 (just connecting the end points) to 32. Takes effect at the next RESET.
- RESET Input and button - clicking the button or sending a trigger to the input resets the line to its starting position, which is all zeroes. Also applies any change to COUNT.
- STYLE - Selects from three different line types, Steps/Lines/Curves. Changes are applied instantly.
- IN - selects the horizontal position of the point on the line to be selected. Shown on the display as a short line at the bottom of the display.
- OUT - the vertical position of the line at the position determined by IN.
Uses: Anything you wish was gradually changing - melodies, volume levels, waveforms, CV levels. Note that the use of a Saw wave as the input in the sample rack is just to better illustrate the idea of it being a transformation function; you can put whatever you like into IN. Sine wave, oscillator output, random, … Drifter alters signals, basically.
Since Drifter is about motion and change, I think video will eventually showcase this better than these words, but I want to nail down the UI at least a bit more before recording the visuals.
Here are the builds:
(Thanks to pgatt for making the Mac build.)
Source: GitHub - mahlenmorris/VCVRack: Set of modules for use with VCV Rack 2.0
Love to hear any thoughts. Even if (especially if) you try it and think, “Eh?”
Did play with it for a bit (more to follow later) and thus far no issues seen. MacOS 11.6.4 here, Rack2 Pro 2.1.0
Works fine for macOS 10.15.7
I was going to suggest an EOC output, then (forehead-smack) I realized it doesn’t work that way at all. It became immediately evident as soon as I used something other than a sawtooth input.
Now I’m blue-skying about a method to trigger the DRIFT without getting a click downstream, so as to get an endless CV variation.
Is there any way to save the function waveform along with the preset? The regular “Preset/Save As” only saves the knob positions and button states.
The click on a DRIFT is, as you’ve likely surmised, from the instantaneous change in the value. I figured one could put a slew limiter on the values from OUT if that transient was important to avoid, but maybe building one in is important? Or at least mentioning the utility of one, right?
I’m trying not to include every tool in the box; I can see uses for attenuverters and bias on the values from OUT, but again, these are all well known functions in modular, and surely better implemented by others. Also useful is using the Seriously Slow LFO as the values to IN.
I was wondering if anyone would want to save the current function so it would get restored on startup! I’ll investigate how that should work.
Thanks for trying it, and for your thoughts on it!
The click-free thing could be a chore because you’d want the input, the transfer waveform, and the output of the downstream VCO (or whatever) all to be at zero when the DRIFT is triggered. Maybe something with a series of trigger buffers? Herding cats.
Or, have the value of the point on the waveform that is currently being output always stay the same, and calculate the new line out from that point forward, then wrap around to the beginning of the line. No, wait, that won’t work because the direction of the input may be unpredictable. I keep thinking of it as a species of sequencer. Which it is not.
I dare say you’re right, about using a slew limiter. It’s the simplest, and who could tell the difference?
Actually, there is one advantage to putting the slew limiting into Drifter; it would know to only engage during a DRIFT event. I’ll think on that…
That would work. Maybe throw in an option to disable the slew limiter?
Drifter is now live in the Library. Thanks again, everybody.
@john_rose, I did add an option to save the current waveform. I haven’t thought of a slew solution I love, which suggests I don’t fully believe I know how Drifter will be used in practice; I’m hoping that actual usage will suggest some path(s) to follow.