353 lines
15 KiB
Markdown
353 lines
15 KiB
Markdown
# unnieversal
|
|
|
|
some VST plugins made in Rust using `baseplug`
|
|
|
|
source for the plugins are inside the `crates` folder. all plugins have only been tested on macos with reaper
|
|
|
|
disclaimer: i am not responsible for loss of work, time, sanity, or anything else if you decide to use these plugins
|
|
|
|
as of now no plugin has ui, so they all just have a few sliders with whatever look your daw gives them
|
|
|
|
## building a plugin
|
|
|
|
because steinberg is an incredibly nice company, i can't actually distribute vst2 plugin binaries without a license, which they don't give out anymore :)
|
|
|
|
so you're gonna have to build the plugins yourself, but don't worry cause it's relatively easy! (i think)
|
|
|
|
### macos
|
|
|
|
to build a plugin, first run:
|
|
|
|
```bash
|
|
cargo b --package package_name --release
|
|
```
|
|
|
|
Then make the generated dylib file into a VST plugin:
|
|
|
|
```bash
|
|
./osx_vst_bundler.sh PluginName target/release/libpackage_name.dylib
|
|
```
|
|
|
|
this will create `PluginName.vst` in the `build` folder. You can copy it into `/Library/Audio/Plug-Ins/VST` and use it in your daw
|
|
|
|
alternatively, you can run:
|
|
|
|
```bash
|
|
./macos.sh packagename
|
|
```
|
|
|
|
this will do all three steps directly for you
|
|
|
|
### other platforms
|
|
|
|
no idea what you have to do for other platforms, refer to the `vst-rs` [docs](https://github.com/rustaudio/vst-rs). i think you can just build with `cargo b --package package_name --release` and take the `.so` or `.dll`, but don't quote me on that
|
|
|
|
PRs are welcome for more build instructions
|
|
|
|
## plugin list
|
|
|
|
the following is the current list of plugins
|
|
|
|
|
|
- `basic_gain`: simple gain plugin
|
|
- `noted`: output midi at regular intervals
|
|
- `sosten`: granular sustain plugin
|
|
- `quinoa`: [WIP] granular synthesis plugin
|
|
- `XLowpass`: reimplementation of [Airwindows XLowpass](http://www.airwindows.com/xlowpass/)
|
|
- `multidim`: randomized midi note generator
|
|
- `robotuna`: automatic pitch correction
|
|
- `hysteria`: hysteresis nonlinear effect
|
|
- `threebandeq`: 3 band eq
|
|
- `threebandwidth`: 3 band stereo widener
|
|
- `tritu`: say-goodbye-to-your-audio distortion
|
|
- `threebandfolding`: 3 band wave folding distortion
|
|
- `double_reverse_delta_inverter`: idk, a weird distortion
|
|
- `transmute_pitch`: pitch to midi converter
|
|
- `reverter`: play sound backwards
|
|
- `panera`: pan individual notes differently
|
|
- `velociter`: random velocity setter
|
|
- `opiate`: spectral morphing between two audio signals
|
|
- `sample - 10/10`: sample rate changer
|
|
|
|
there's a bit of an explanation of each of the plugins below, but it's not a thorough documentation or a manual, it's just a bunch of notes i've written and a short description of the parameters
|
|
|
|
### basic_gain
|
|
|
|
simple gain plugin, used as a template for starting new projects
|
|
|
|
### noted
|
|
|
|
midi retriggerer
|
|
|
|
parameters:
|
|
- `tempo`: how often to retrigger a note
|
|
|
|
it listens for incoming midi, and while a note is on, it triggers it every `tempo` beats. if `tempo` is one, it will trigger once per beat, if it's `0.5`, it'll play half notes, etc.
|
|
|
|
it's useful when you want to play a note super fast (over 1/64 tempo) but don't want to have a section full of tiny midi notes. just add the plugin, set the tempo to how often you want it to play, and add a midi note that lasts however long you want the notes to play for
|
|
|
|
### sosten
|
|
|
|
sustains a sound by replaying a grain of sound on loop. small but versatile
|
|
|
|
parameters:
|
|
- `enable`: will enable the sustain if it's over 0.5
|
|
- `length`: length of the grain in samples. maximum is 48000 cause i said so
|
|
- `manual/pitch detection`: whether to use the manually set length (if under 0.5) or use the detected pitch (over 0.5)
|
|
- `dissipation`: amount of dissipation of the input
|
|
- `direction`: direction in which the grain is played
|
|
|
|
to use this plugin, add an automation for `enable` and set the value to `1.0` wherever you want the sustain to happen. as soon as that happens, it'll start looping the last `length` samples
|
|
|
|
if set to manual, it uses the provided length for the looped grain. if pitch detection is enabled, it will use the detected pitch to calculate the period of the input, and it'll use that for the length of the grain. this should cause the sound to be sustained seamlessly
|
|
|
|
dissipation is a weird thingy. it smooths out the sound, and i think it's a lowpass filter? not sure. makes cool sounds though. what it does is roughly `x[n] = dissipation * x[n] + (1 - dissipation) * x[n + 1]` after each time it plays a sample, so `dissipation = 1` will leave the audio untouched, and setting it to `0.5` provides the greatest effect
|
|
|
|
direction is a selector, with three ranges:
|
|
- `[0, 0.4)`: the grain will be played backwards
|
|
- `[0.4, 0.6)`: the grain will cycle through forwards and backwards
|
|
- `[0.6, 1.0]`: the grain will play forwards
|
|
|
|
my three main uses are:
|
|
- sustaining a note, which you can do with `manual/pitch detection = 1`, `direction = 1`, and any amount of dissipation
|
|
- wavetable-ish kinda thing, by setting `manual = 0` and a really low length, you can play notes of frequency `1 / length`
|
|
- glitch repetition effect, by setting `manual = 0`, any direction (but usually forward), any dissipation, and a medium length. enable at the end of a bar or smth
|
|
|
|
but you can probably use it for more stuff! idk! this are just my suggestions
|
|
|
|
### quinoa [WIP]
|
|
|
|
nothing implemented yet, but it's supposed to be a granular synthesis plugin that does stuff with an audio file
|
|
|
|
since this needs a ui so we can select a file to play, and i still don't know how to do that, progress is kinda stuck
|
|
|
|
### XLowpass
|
|
|
|
XLowpass reimplements [Airwindows XLowpass](http://www.airwindows.com/xlowpass/) in rust. it's a lowpass distortion filter
|
|
|
|
parameters:
|
|
- `gain`
|
|
- `frequency`: cutoff frequency. it's not in hz, so move it around until it does what you want it to
|
|
- `nuke`: amount of distortion
|
|
|
|
i haven't checked correctly, but there's probably some mistakes and it might not sound exactly the same. it does what i want it to, so that's good enough for me. also i have absolutely no idea what the code does, it's just a direct translation
|
|
|
|
you might need to play with the parameters around a bit to get it to sound good
|
|
|
|
### multidim
|
|
|
|
multidim simulates a ball bouncing around in a 16-dimensional cube. each time the ball bounces off of a wall, a midi note is sent out
|
|
|
|
parameters:
|
|
- `speed`: speed at which the ball moves. around 1 should cause approximately one bounce per beat
|
|
- `root`: the lowest note that will be generated (in midi number). the rest of the notes will be from `root` to `root + 16`
|
|
- `note_length`: length of each note in beats
|
|
- `enable`: enables the generation if over 0.5
|
|
|
|
this plugin is a weird thingy i made to generate midi notes pseudo-randomly. i didn't want it to be actually random, cause that doesn't make many patterns, so what i ended up doing is simulating a ball bouncing around a cube, and sending out a note every time it bounces off a wall. this works well, but a cube only has three dimensions, which is pretty low! so through the magic of computers not giving a shit about physical reality, i made the cube be 16 dimensional, and yeah that's basically it
|
|
|
|
the bounces are all perfect and maintain all the energy, so each note ends up playing at a regular interval but they're all playing at different tempos
|
|
|
|
works well if you put it in front of a sampler
|
|
|
|
the only way to reset the pattern is to reset the plugin. if your daw has a way of doing that, do that, otherwise you're gonna have to remove it and re-add it, or close and open your daw
|
|
|
|
### robotuna
|
|
|
|
automatic pitch correction and pitch shifting. the intention is to use it to make hyperpop-style high-pitched vocals
|
|
|
|
params:
|
|
- `manual/snap`: decides whether to listen to midi (if under 0.5) or to snap to the closest semitone (if over or equal 0.5)
|
|
- `frequency gain`: added gain on top of the correction
|
|
|
|
robotuna will do pitch detection on the input, and then shift the pitch to match the expected one. the expected pitch can be either: the midi note, if set to manual; or the closest semitone, if set to snap
|
|
|
|
note: snap mode ignores the midi input
|
|
|
|
after that, the pitch will be shifted by `frequency gain`
|
|
|
|
for example:
|
|
- setting to manual mode, setting gain to `2.0`, and not sending any midi notes, will make the audio be one octave up
|
|
- setting to snap mode, gain to `1.0`, will work as a traditional pitch corrector
|
|
|
|
### hysteria
|
|
|
|
hysteria is a hysteresis nonlinear effect, which compresses and distorts the input audio
|
|
|
|
parameters:
|
|
- `drive`
|
|
- `saturation`
|
|
- `width`: width of the hysteresis loop
|
|
|
|
original source [here](https://ccrma.stanford.edu/~jatin/ComplexNonlinearities/Hysteresis.html)
|
|
|
|
turn the values up for loud and distorted.
|
|
|
|
setting them all to the max at once doesn't sound as interesting though, so play around with the values a bit
|
|
|
|
### threebandeq
|
|
|
|
simple three band equalizer
|
|
|
|
parameters:
|
|
- `low band`: frequency at which the low band ends
|
|
- `high band`: frequency at which the high band starts
|
|
- `low gain`: gain for the low band
|
|
- `mid gain`: gain for the mid band
|
|
- `high gain`: gain for the high band
|
|
|
|
low band goes from 0hz to `low band`, mid band goes from `low band` to `high band`, high band goes from `high band` to half the sample rate
|
|
|
|
### threebandwidth
|
|
|
|
three band stereo widener
|
|
|
|
parameters:
|
|
- `low band`: frequency at which the low band ends
|
|
- `high band`: frequency at which the high band starts
|
|
- `low width`: width for the low band
|
|
- `mid width`: width for the mid band
|
|
- `high width`: width for the high band
|
|
|
|
bands work as they do in `threebandeq`. the width parameters control how wide an audio signal should be in the stereo field
|
|
|
|
it behaves as follows depending on value:
|
|
- `0`: makes audio mono
|
|
- `(0, 1)`: decreases stereo width
|
|
- `1`: leaves audio as is
|
|
- `(1, 3)`: increases stereo width
|
|
|
|
### tritu
|
|
|
|
hard limiter followed by a soft limiter with distortion
|
|
|
|
parameters:
|
|
- `pregain`: pregain for the hard limiter
|
|
- `drive`: drive for the soft limiter
|
|
- `distortion`: amount of distortion on the soft limiter
|
|
|
|
distortion affects lower volumes more than higher volumes, so if you crank up `drive` a lot, there will be less distortion (this is a good thing for high values of `distortion`!). if you leave `drive` low and set `distortion` to max, your audio will turn to almost white noise
|
|
|
|
i like this plugin a lot :)
|
|
|
|
### threebandfolding
|
|
|
|
three band wavefolding distortion
|
|
|
|
parameters:
|
|
- `low band`: frequency at which the low band ends
|
|
- `high band`: frequency at which the high band starts
|
|
- `low folding freq`: folding frequency for the low band
|
|
- `mid folding freq`: folding frequency for the mid band
|
|
- `high folding freq`: folding frequency for the high band
|
|
|
|
bands work as they do in `threebandeq`. the `folding freq` parameters control the frequency of the wavefolder. higher is more distortion. use values over 40 if you want to have basically white noise
|
|
|
|
### double-reverse delta inverter
|
|
|
|
weird kinda distortion that makes loud things quiet and makes quiet things loud
|
|
|
|
parameters:
|
|
- `dry/wet`: dry/wet control
|
|
|
|
yeah there's not many params in this one, the implementation is pretty straightforward
|
|
|
|
it does weird things: a square wave of amplitude 1 will just be completely eliminated, while sine waves are distorted. since it can't be really controlled, use the `dry/wet` to lower the effect if you don't want to go overboard
|
|
|
|
the effect is reversible (it's an [involution](https://en.wikipedia.org/wiki/Involution_(mathematics))), so if you add this plugin twice in a row you get the original signal back. this means you can apply drdi to your audio, apply some other effect, and apply drdi again to get some fun stuff
|
|
|
|
### transmute midi
|
|
|
|
analyzes pitch of incoming audio and sends out the corresponding midi note
|
|
|
|
params:
|
|
- `passthrough`: how much of the original audio to be let through
|
|
- `min note length`: how many beats a note will last
|
|
|
|
latency should be close to 1024 samples, which is around 20ms at 48k i think. the pitch detection is not excellent and it's monophonic, so if you have a noisy input or a bunch of notes at the same time, it's anyone's guess what the detected note will be. there's also no pitch bending or anything fancy like that, so it'll jump around notes even if the input has portamento
|
|
|
|
aside from that, it works well enough on my quick tests
|
|
|
|
you can use it to play synths using other instruments, like a guitar or by whistling! it's quite fun
|
|
|
|
`min note length` controls the note length, so if you see that the detected note jumps around a bunch, you can raise this so the notes last longer, and it'll be a bit smoother
|
|
|
|
### reverter
|
|
|
|
records small grains of audio and plays them backwards
|
|
|
|
params:
|
|
- `length`: length of the grains
|
|
|
|
this plugin will introduce a delay of `length` samples, since it has to record that many samples before being able to play them backwards
|
|
|
|
in my experience values between 5000 and 8000 tend to work well, but you might want to experiment a bit to see what works for you
|
|
|
|
### panera
|
|
|
|
ever wanted to have each pluck of the guitar have a different pan? do i have something for you then!
|
|
|
|
params:
|
|
- `gain`: pregain added to the detector. doesn't affect output sound
|
|
- `attack`: attack of the envelope follower
|
|
- `release`: release of the envelope follower
|
|
- `gate`: gate level at which a peak is detected
|
|
|
|
- `panning mode`: one of {alternating [0, 0.33), sine [0.33, 0.66), random [0.66, 1]}
|
|
- `lfo freq`: frequency for the sine lfo
|
|
|
|
panera consists of a peak detector with a sample and hold lfo tied to the pan. this lfo is sampled each time a new peak comes in, and it's value will be held until the next peak
|
|
|
|
there's three panning modes:
|
|
- alternating: each peak will be hard panned to a different side, alternating between left and right
|
|
- sine: samples a sine lfo, and uses that as the pan for the rest of the note
|
|
- random: each note will have a random pan
|
|
|
|
the peak detector is still a bit fiddly, so you'll have to tweak the params a bit until it works for the kind of sound you're giving it. the defaults have worked great for me, so i recommend you start from there and change as you see fit
|
|
|
|
### velociter
|
|
|
|
velociter sets random velocities to midi notes
|
|
|
|
params:
|
|
- `min_vel`: minimum velocity
|
|
- `max_vel`: maximum velocity
|
|
|
|
it'll set the velocity of every incoming midi note to be in the range `[min_vel, max_vel)`
|
|
|
|
### opiate
|
|
|
|
opiate is a spectral morphing plugin. you have to provide it 4 input channels (two stereo signals), and it'll do spectral morphing between the two
|
|
|
|
params:
|
|
- `morph`: how much to morph from audio 1 to 2
|
|
|
|
if `morph` is set to 0, only audio 1 will play. if it's set to 1, only audio 2 will play. values in between will morph between the two audio signals
|
|
|
|
### sample - 10/10
|
|
|
|
simple (not accurate) sample rate changer
|
|
|
|
params:
|
|
- `repeats`: how many times to repeat a sample
|
|
|
|
repeats a sample as many times as you tell it to, so if `repeats == 2.0`, and the inputs are `[0.0, 1.0, 0.5, 0.3, 0.4, 0.6, 0.7]`, it will play `[0.0, 0.0, 0.0, 0.3, 0.3, 0.3, 0.7]`. basically, `repeats == n` divides the sample rate by `n`
|
|
|
|
it's not doing any actual resampling of audio
|
|
|
|
## contributing
|
|
|
|
issues and prs are welcome, but please open an issue before making any big pr, i don't wanna have to reject a pr where you have put a lot of effort on. if you are fine with that, ig go ahead i'm not your mum
|
|
|
|
## license
|
|
|
|
gpl3 or something, i need to check which one to use and the add the correct file
|
|
|
|
consider it gpl3 for now
|
|
|
|
## naming
|
|
|
|
uhhhh yeah cause the plugins are universal or something, but uni is spelled like annie. also sounds like 언니, which is fun
|
|
|
|
the plugins are named very lazily, it's just whatever name i could come up with before creating the crate, so yeah many are not good
|