Tool idea: Euclidean rhythm generator

The stretch feature is not quite what I imagined. I thought it should stretch the sequence, and maintain the pattern but in a shrinked/expanded form. Perhaps a bit tricky.

Ah, think I will pull the relevant code into some other model, because the ability to distribute X notes over Y lines is definitely useful :slight_smile:

The blanknote feature is useful for two practical reasons that I can think of:

  1. You want to overlay a second generator into the same column, for instance putting low velocity hi-hats into the same column as high velocity hi-hats.

  2. You want to mute (erase) notes from a generator when they are clashing with another generator (i e, silence kicks whenever there is a snare). This would then be done by duplicating the snare generator, and outputting it to the kick column with blanknotes on.

That makes sense, the challenge is really how to express it without turning everything into a complicated mess :slight_smile:

Nevertheless I am liking this generator! I hope xstream will be developed and that the GUI could be made even more usable.

Actually I did (inspired by our discussion) undertake a major refactoring of the UI class in xStream. It was a monster, about 5K lines of code.
Now it’s much more manageable. Still need to do the “tab” thing, but this class needed to be sorted out first :slight_smile:

Also, yes to your other suggestions.

Ah, think I will pull the relevant code into some other model, because the ability to distribute X notes over Y lines is definitely useful :slight_smile:

Yes, I noticed it did what my tool is doing: https://www.renoise.com/tools/place-selected-notes-evenly

But I used math.floor and you used math.ceil (or the other way around), rendering delay values being one step off. Maybe your way is the correct one and I should fix this in my tool.

That makes sense, the challenge is really how to express it without turning everything into a complicated mess :slight_smile:

Yes. GUI grouping would help a bit. I’m thinking something like this:

Top group (euclidean sequence, minor cycle):
Steps
Pulses
Offset/rotate
Reverse
Cropping/padding
Stretch

Next group (major cycle):
Cyclelength (usable for restarting minor cycle at any place, i e some things maintain polyrhythm over longer time)
Offset/rotate (just for flexibility)

Next group (various settings):
Blank notes
Don’t overwrite with blank lines
Invert hits/non-hits

Last group:
Instrument
Velocity
Column

Actually I did (inspired by our discussion) undertake a major refactoring of the UI class in xStream. It was a monster, about 5K lines of code.
Now it’s much more manageable. Still need to do the “tab” thing, but this class needed to be sorted out first :slight_smile:

Great to hear that you’re putting effort into this tool. It’s very potent.

Also, yes to your other suggestions.

Making xstream a streamlined and user friendly part of workflow when generating patterns would be huge. Even more huge than Renoise having a piano roll :wink: I guess that would call for a new pasting principle alongside live and TRK, that would fire any time an input track is updated.

I just put out the new version (1.45). Managed to release our in-progress euclidean generator - oops :slight_smile:

But most importantly, I’ve had a bit of time to think about the tabbed arguments implementation.

And I think the best way to structure this is to think in terms of the “args” becoming a multidimensional array.

So, imagine for example my sequencer model - it has four notes, four volumes, four duplicates of pretty much everything.

What I would want when accessing those values would be something like

args.pitch.a
args.pitch.b
args.pitch.c
etc.

Or alternatively, I could organize my arguments like this

args.a.pitch
args.a.volume
etc.

In either case, I would create arguments while making use of a basic dot notation syntax.

The UI would then organize the arguments panel accordingly,_as well as_providing the ability to sort the entries

Because of the way it’s stored we can control the order of keys - something you normally can’t do in lua tables.

Not sure if having tabs within tabs will be necessary - it will certainly make the code a lot more complex. Try to consider if your example above could be structured to provide everything needed in a single tabbedlevel? We still need multiple generators, right?

It would be nice to have a tab for each generator, but also the ability to group arguments (you know, just the subtle graphical box thing to make the gui more user friendly).

Maybe that would be difficult to make? I’d imagine something like

args.generator_1__tab.a__group.steps

args.generator_1__tab.b__group.blanknotes

args.generator_2__tab.a__group.steps

args.generator_2__tab.b__group.blanknotes

__ being a delimiter.

Tabbed arguments is now a reality.

https://forum.renoise.com/t/new-tool-3-0-3-1-xstream/44430

I spent yesterday night recording a lot of output from this model. It’s absolutely wicked, not only for rhythmic but alsorhythmic/melodic material

(which is why I added transpose and phrase options, btw.)

Awesome!! I will for sure customize this into my own flexible but user unfriendly generator! :slight_smile:

Yeah, I’m looking forward to the ability of generating euclidian chord stabs…