Zynseq: swing is coming, and much more

Not finished yet, but it sounds very promising :star_struck:

This development will bring us:

  • 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!! :grin:



Yes! So bring the midi controllers on board. :slight_smile: :+1:

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 :slight_smile:

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 :wink:


I recorded a new demo. It’s a single pattern looping. Super simple 4 betas with 4 steps/beat. The pattern is this:


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 … :grin:

I’ve not pushed the changes because the new parameters are not saved in the snapshot yet. I hope to do it tomorrow.



Hey - you are sounding like how well I can keep consistent timing and velocity whilst drumming… :wink:

Remember to update the file format doc.

1 Like

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.

Obviously to properly test this we need a de-humanizer to ensure we leave tiny footprints when we dance.

Keeping such controls within MIDI range unleashes the possibility of building any response curve with consistent tools from other tools.

Throw it in as a snapshot… It will get us going.

Ups! I almost forgot to announce that swing and the rest are now merged in Oram :sweat_smile:

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.


Hi @LFO !

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”.


1 Like

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.

1 Like

Hi zynstep lovers!

We’ve been working hard to improve the pattern editor user interface, specially the pattern render engine.

  • Better and faster rendering
  • Smooth scrolling in both axis
  • Smooth zoom in both axis
  • Timeline ticks

Take a look:

If you use the Oram Bookworm version (testing), simply update and start enjoying these improvements. Don’t forget to send feedback!!


  • If you are a V5 / MINI-2 owner, you can fast access zoom mode by clicking knob#3 and moving knob#3 & knob#4. Bold click knob#3 to reset zoom to default.

  • If not, you will find the “grid zoom” option in the menu.

  • Touch action still requires some extra work. Don’t report issues with touch, please. We are still working on it!



Fantastic, well done

:heart_eyes: :star_struck: :kissing_heart:

1 Like

Hi @zynthianers!

New update! Touch is fixed in the pattern editor and pitch-zoom gesture has been implemented. Now you can scroll and zoom with 2 fingers. Bold press for dragging notes or editing existing ones, etc.

I’ve also improved the knob control in pattern editor, so now you can:

V5 / MINI-2

  • rotate knob#1 to change tempo
  • click knob#1 for entering arranger
  • rotate knob#2 to zoom the grid
  • click knob#2 for restoring zoom to default
  • click knob#3 for editing note paramters (or parameter’s defaults, if no note is selected). This function is also available by bold pushing knob#4, but i want to try something more “agile”.


  • rotate knob#1 to change tempo
  • rotate knob#3 (learn) to zoom
  • no restoring function, sorry :wink: