note offset, what allows to record without quantization, at maximum resolution. It also simplifies implementing what follows …
swing. adjustable globally and per-sequence. Both are multiplied to get the applied swing factor. Swing factor ranges from 0 to 1 (0-100%) . 0% is “no swing”, the typical 0.5 “MPC swing”. 100% is 0.75 “MPC swing”.
humanization: using a normal distribution for generating random offsets for each note. You can adjust the variance, that act as the humanization factor. Humanization should be applied to velocity too. BTW, do you think is it right to use a normal distribution here?
per note “probability of playing”, that allows having notes that sometimes play and sometimes not. Combined with a global probability could allow very interesting things. Imagine… “chance” could be a nice name for this parameter, right?
I know I know, i must focus on releasing Oram ASAP… but hell, I want some fun too!!
Humanizing is one of the thing i’ve wanted to get done at some point as well, but haven’t looked into precisely how i’d want to implement it. Perhaps it could be a configurable curve, but normal distribution seems like a reasonable sort of default, so to speak.
It’s very interesting to see the different approach to swing you’re taking - i’m going with the traditional drum sequencer style (0% being previous step, 100% being next step, 50% being the unshifted position), but picking a specific style, and doing so deliberately, is important
Similarly with the probability, there, also something i’ve been working on recently. The way i’ve done it is to implement a probability “sequence” which allows for each entry in a pattern to track its probability over time during playback. That allows for things like “play x, skip y” and “skip x, play next n% likely” style things, rather than only strict percentile probability values that always get chosen for the entry. Just dropping that particular cat amongst your pigeons, because it was fun to implement, and gives a bonkers amount of power
I recorded a new demo. It’s a single pattern looping. Super simple 4 betas with 4 steps/beat. The pattern is this:
KKCK KKCK KKCK KKCK
5 mins of jamming exclusively with the new zynseq features:
Swing Divisor
Swing Amount
Time Humanization
Velocity Humanization => This is super cool
“Note Play Chance” is still unimplemented. A random chance is just the first step for this. I like the idea of setting “Play Patterns”, like “XXXOOXXO”, or using a euclidean generator.
I’m also thinking of attaching euclidean generators to any step in the pattern, so it uses the number of steps in pattern (for instance) as parameter “n” and the step position as the “offset”, so only the “k” is required as explicit parameter. Ideas, ideas …
I’ve not pushed the changes because the new parameters are not saved in the snapshot yet. I hope to do it tomorrow.
At the risk of adding complexity, couldn’t we add a great deal of flexibility and Power (similar to the recently introduced driver concept), by letting this offset Factor be specified by the player - there would be presets available, such as a normal distribution, but if a person wanted a different distribution they could supply the routine to modify the timing and velocity of a given note.
So you specify:
Time Humanization Normal
Velocity Humanization Normal
But Normal could be replaced by any other named code, either predefined or player supplied.
I’m using the word “player” to indicate the user - eg the Musician, or Sound Designer.
Ups! I almost forgot to announce that swing and the rest are now merged in Oram
If you update, you will find these new parameters in the pattern’s context-menu:
Swing Divisor
Swing Amount
Time Humanization
Velocity Humanization
Play Chance
And these in the note options:
Offset (% step)
Play Chance
All of them should be saved in the snapshots.
As you can see, swing and humanization are pattern parameters. I’m thinking about having global parameters too, but it’s not so “easy” as you could think at a first glance. Devil is in details and i prefer to see how this work and having some feedback, before going on with the global parameters.
Regarding “Play chance”, it’s implemented per-note and per-pattern, so both parameters are multiplied to get the final “Play chance”. You can get very interesting results playing with both of them.
Regarding “Swing Divisor”, i probably will change how this parameter works, but i’m still looking for the best way. With this “way”, i found some interesting combinations, like this one:
4/4 time signature
swing divisor: 3
swing amount: 43%
Finally, i must say humanization, specially “Time humanization”, is not really nice and it needs some extra care. I will be waiting your suggestions and ideas.
I was having some fun with this. I made really simple straight beats and melodies to try and hear the impact of the functions.
Drums: Velocity 100
Bass: Velocity 40, Note Play Chance 70%
Melody: Time Humanisation 100
I’m hearing the effect on the melody more as I listen back, I didn’t notice it as much at first. Adding global velocity (to the drums) immediately created a groove. It would be great if the velocity control was allowed per note as this can allow for really expressive drum pattern creation.
I’m not very satisfied with time humanization so you can expect improvements in this area along the next days. For the rest, i’m quite happy, and i’ve found specially enjoyable velocity humanization and play chance. I will think about adding per-note “velocity humanization”.
If not per-note with the drums, per-voice is also good. Applying velocity humanisation across each voice such as hihats and other percussion would be less work to program than a per-note setting and still very effective to get a nice dynamic sounding drum pattern.