Vel humanizer processor. Could someone please take a look?

edited July 2022 in Drambo


I don’t know if this is the place to post this, so excuse me in advance if it’s not.

im trying to get better at Drambo while making my own processors and stuff. I just “finished” a velocity humanizer and I’d love it if some of you gurus could take a look at it and tell me how to improve it.

I find it hard to do conditions in Drambo, like “do this if the value of that is whatever”. Also simple stuff like “greater or equal to”. I know it’s how the CV module stuff works, but I keep wanting to do if/else kind of logic. I managed to do it in this rack using negation module to multiply and then add/subtract… meaning if negation is zero it won’t do anything. Seems very convulted to me so I’d love to know if I’ve taken the complicated route.

I know there’s fellow members here like @rs2000 that are masters so… yeah, I’d appreciate some feedback so I can finesse my Drambo geeking.

what the vel humanizer processor aims to do: take an input velocity and randomize it within a range and also respecting minimum and maximum values. It also adds a second randomizer for when you’ve reached the max/min for more realistic randomizing.


ps: here’s the processor in screenshots for those super-humans that are able to see what’s going on just by peeking.


  • Hi Tahiche!

    You're doing it right.

    The conditions you're looking for are a little hidden inside the Math => "Function" module.

    Apart from Negate, Multiply, Add and Subtract there's also a few modules derived from analog circuitry like Half Wave and Full Wave Rectify or Quantize, also Scale & Offset is quite a useful one.

  • This is the simplest version I can imagine:

    Morph controls the random number range between .005 and 1.000.

  • edited July 2022

    Oh, even better (and more like an even random number distribution like what you wanted to achieve by adding the second random offset):

    The Max and Min modulations in Morph are both set at .50 and Morph affects Random up to 2.000.

    (1.000 would work too but this way you have more freedom to play with adjustments).

  • edited July 2022

    Thanks a lot @rs2000 !. I had never used the morph module.

    But unless I’m missing something your version doesn’t take into account the incoming velocity. Does it?.

    say you have a short repeating pattern where you have set some velocities to get some dynamics… my goal was to randomize those incoming values but respect the original intensity. Meaning soft notes would still be soft and loud notes would still be loud, but adding variation.

    that’s why I’m adding (or subtracting since it’s bipolar) the random value to the input velocity. To keep it relative.

    The second randomizer is harder to explain and maybe could be achieved a simpler way… if you’re adding a random value it’s very likely many notes are going to end up on max/min value. So many notes are going to end up at 127 vel (more than any other value). That second randomizer checks if the generated vel (input +/- random) is equal to the max. If it is (negate module) it will do a second random add/subtract so that those 127 end up in 127, 126, 122, etc… and the same for the min values. That’s why I have so many modules 😂

    BTW I did see those other modules in math section but I can’t find an easy way to a) check for greater or equal to b) do a simple if/else. I guess the closest to an if/else condition to perform different operations depending on conditions would be an N-1 module where the conditions set the index. But it’s not very intuitive, hard to wrap my head around.

    im updating the original upload, there was a stupid mistake connecting at the end.

    thanks for your help, really appreciate it.

  • You're welcome @Tahiche!

    Indeed I've just read now that you've also wanted the incoming velocity to be respected.

    My suggestion was to avoid the second randomizer altogether by properly scaling the value ranges so the randomness won't change, independent from the min/max settings.

    You could switch Random to bipolar and just add the result to incoming velocity. In that case, the patch could be even simpler, maybe just scale the random number and add it to the incoming velocity. The scale amount would equal the amount of randomness applied on velocity.

    An if/else block with routing included could be done with a simple Graphic Shaper modulating the Index input of a N-to-1 switch. Combine with Math => Function if required.

  • A little trick I've often used in my projects is this:

    If A is larger than B then the second Graphic Shaper is used instead of the first. The X-Fader is only used as a switch here.

    The result goes into N-to-1 with any amount of switch positions, whatever you need.

  • edited July 2022

    Hi!. Yeah, that’s what I’m doing, adding a bipolar random value (range set by slider) to the incoming velocity. The problem with this is that you end up with a lot of “clipped” values. That’s what I’m trying to fix with the second random, which could probably be made simpler but I can’t see how.

    not even caring about min/max values at this point, say your input velocity is 100 and you set a random scale of 0.5 bipolar, you’re going to add to the incoming value…. When random is negative everything’s ok, but when it’s positive you’re gonna add a random number between 0-63 (0.5 random for a total of 127 velocity) . That yields a lot of 127 values (100 + random(0-63), or a lot of max values if setting a limit… So the second random tries to fix that. If the value is equal to max, do a second, smaller, randomizer and subtract that so all those 127 are now 122, 115, 126 and so on… You probably can’t tell the difference in normal scenarios between a velocity of 127 and 115 but in cases like triggering a drumkit with many velocity layers it might add that little extra.

    BTW, is a processor like this CPU heavy?. I’m guessing it’s not, but I’m worried it’s total overkill if that second randomizing, for example, has any impact. In that case it’s totally not worth it.

    thank u for patience and help! 🙏

  • Background: I’m trying to build a set of tools to make any Drum machine multi-layer capable. I have Audiolayer and Digistix2 that can do velocity layers, but the former has no multiple outs and i don’t dig the UI and workflow of DigiStix. Drambo, of course, can do it but it takes quite some time to build kits.

    I recently purchased Sitala and I really like the simplicity and workflow, so I want to try and make multilayer kits with it to see how it goes. I’ll use Drambo as the sequencer and this velocity humanizer paired with another processor that matches incoming vel to notes, either round robin or velocity layers. It would also work for FAC Drumkit or anything that requires a sequencer. Instead of having a sequencer + Mozaic script with Drambo I can have it in one.

Sign In or Register to comment.