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:

Enjoy!

16 Likes

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:

2 Likes

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

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

Enjoy!

4 Likes

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.

Enjoy!

8 Likes

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.

2 Likes

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

Regards,

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!!

Notes:

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

Enjoy!

9 Likes

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

V4

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

Enjoy!

7 Likes

Hi @zynthianers!

I just pushed the latest improvements in the pattern editor. I implemented infinite undo/redo, what it’s super cool!!! Currently it only works in V5/MINI-2 devices, like this:

  • From pattern editor, you click “ALT” to access history navigation. Arrow keys will change its color to orange (V5 only).

  • LEFT arrow => undo

  • RIGHT arrow => redo

  • DOWN arrow => undo all

  • UP arrow => redo all

This is the logic behind:

  • Snapshots are saved at given “change” points: clear, record button push, transpose, etc.

  • if pattern is playing, snapshots are saved on every loop

  • If pattern is stopped, snapshots are saved every 5 seconds (default)

  • Snapshots are only saved if the pattern changed, obviously :wink:

I’m still thinking the best way of implementing the undo/redo workflow in V4 and legacy devices.

Enjoy!

7 Likes

5s save point does not feel intutive. I added some notes in quick succession and tried to undo and they all disappeared. I was expecting a per-note undo. Having read the instructions I now understand the logic but it is not intuitive and users are likely to be confused or disappointed. It may be better to use a journal for undo so that every action is recorded rather than overal snapshot.

Also, you do not describe when the undo history is invalidated. Of course that becomes evident (and intuitive) when you use it - as soon as a change is made, that point in the undo history is used as the front and other redo states are lost. This does make sense. We need to get this into the wiki docs and device an undo mechanism in V4.

1 Like

Regarding if users want note-by-note undo/redo, it’s not so clear. It depends of how users use it, the edit workflow. Anyway, the snapshot history can act as a journal. We could use a shorter time, or save snapshot after each edit action from the UI.
For sure, for live recording, you absolutely don’t want note-by-note undo/redo. In this case it save changes on each loop.

Nothing strange. It’s the normal way on any kind of “document” editor.

Anyway, there is room for improvement. This is just a first proposal :wink:

Regards

I just reduced the snapshot saving delay to 1 second. Let’s try like this.

Regards,

I tried it and it still feels wrong. I added notes and wanted to remove the last couple but a whole tranche of notes were removed. It may be more frequent that you want to undo something when you are adding notes quickly and hence more likely to include more in the time scale. I recommend that manual input be transactioned after each note. We could retain the per-loop transaction point for live playing. (I think some may want per-note here too but let’s see how it feels. Maybe that could be a config option.)

Regarding V4 workflow - we have few options due to the lack of buttons. (Early V4 and before had no ‘S’ buttons and some custom builds have no touchscreen so we need to design a workflow that uses just the 4 encoders.) We could use the parameter editor to select Undo Mode but this feels wrong. We could use bold press of encoder 3 (Layer) which is currently unmapped (although that might be a bug - I see that short press to toggle playback seems to be broken). (<<This is now fixed.) Or we could add a context menu option to enter Undo Mode. When in Undo Mode we could use an encoder to scroll through the undo/redo states.

2 Likes

OK! Try now :wink:

  • Each UI edit action is saved and can be undone/redone.
  • When MIDI recording step-by-step, snapshots are saved on each note
  • When MIDI recording in real time (playing while recording), snapshots are saved on each loop.

Regards,

3 Likes