qiemem / eurorack

Firmware customization for Mutable Instruments' Eurorack Modules.
99 stars 18 forks source link

Looping Yellow Stage => Quantizer #1

Closed jb0000 closed 4 years ago

jb0000 commented 4 years ago

Hello,

thank you for this awesome firmware!

Here a suggestion for the looping standalone step (yellow) mode: Swap the slew function for a simple quantizer. 3 scales could be selected with the knob:

The slider value and cv would be continuously quantized in normal mode and sampled at every gate in gated mode. Bonus points for more scales such as pentatonic for example. Stages hardware should be could enough to allow exact pitch voltages.

It would be an awesome feature since small quantizers are not that widespread in eurorack and it would just pair so nicely with your Turing Machine and random modes.

Edit: I just realized that looping standalone gated step mode is already used for T&H. Maybe T&H could be set via button + slider but its not as clean as I hoped. Also octaves and octaves + fifths would be fun scales.

qiemem commented 4 years ago

Hey! Sorry for the delayed response. At first, I had been thinking that quantization was beyond the scope of what Stages should do, especially since the UI for it would be pretty tough. That said, I managed to figure out a UI that seems to work pretty well.

Yellow segments (all yellow segments) now let you set scale by holding the button and moving the slider. The available scales, in order of slider position (from top), are:

Once quantization is applied, the slider will then offset across two octaves. Thus, to access other modes, you just move the slider to the corresponding tonic. So, the bottom half of the slider gives you (again, in order):

The top half of the slider gives you the same thing, but an octave up. To get to minor in particular, I've just been starting at the bottom, and counting notes as I move the slider up ("C, D, E, F, G, A")...

Maybe slightly clunky, but the nice thing about this is that it makes it very easy to select basic scale, and then possible (without too much trouble) to select an arbitrary mode despite the UI limitations. Furthermore, it also gives you a quite playable quantized sequencer.

A couple downsides:

As I mentioned, this will work for all yellow segments: so a non-gated looping segment gives you a quantizable slew. Gated for quantizable S&H. In group yellows gives you a quantized sequencer.

What do you think?

Implemented in c430c502da4b246950c2fd9460c678ca1d159e42

jb0000 commented 4 years ago

🤯 Awesome! You took it to another level. I will test it as soon as possible.

jb0000 commented 4 years ago

Some thoughts after testing:

What could be improved:

Overall its really great and I will continue testing it.

qiemem commented 4 years ago

This is fantastic feedback! Thank you!

Disable the fader while selecting a scale.

Good call. This has been bugging me too.

One could jump the offset to the fader position or catch the offset with the fader(prefered).

What do you mean by catch the offset?

Inverse scale order.

Makes sense. I had been thinking higher = more notes (for some reason, I thought Marbles worked like this... but it's definitely the opposite), but the bottom = default is probably a more important consideration.

qiemem commented 4 years ago

Flipped the scale order in f389936d7ac473c08803eb78e4fddb923dc5ca9c and locked pot and slider values when changing parameters in 2eff9aa89b207b9eedf4657d3a950a5a260e2cb9.

Right now, it jumps to the current slider/pot value when you release the button, but I'm definitely interested in other methods.

Thanks again for testing and the feedback!

jb0000 commented 4 years ago

Wow you are fast!

What do you mean by catch the offset?

I found a nice description here with pictures here: Minilouge manual page 43

Excerpt - **Jump**: When you turn the knob, the parameter value will jump to the value indicated by the knob. Since this makes it easy to hear the results while editing, we recommend that you use this setting. - **Catch**: Turning the knob will not change the parameter value until the knob position matches the stored value. We recommend that you use this setting when you don’t want the sound to change abruptly, such as while performing. - **Scale**: When you turn the knob, the parameter value will increase or decrease in a relative manner in the direction that it is turned. When you turn the knob and it reaches the full extent of its motion, it will operate proportionate to the maximum or minimum value of the parameter. Once the knob position matches the param- eter value, the knob position and parameter value will subsequently be linked.
qiemem commented 4 years ago

This is a great reference, thanks!

I implemented the catch mechanism, and it feels a little odd to be honest. It's hard to indicate when the value doesn't match the position. I set it so that the slider led/segment type led would blink rapidly when there's a mismatch, but that can be pretty hard to distinguish from other led states.

Similarly, with the scale mechanism (which I assume is similar to Clouds' blend knob), there's no way to indicate the true value of the thing, meaning that you can't tell by looking what state the module is in (though I suppose that's already true with quantization).

What if the value automatically goes to the position of the slider, but at a slower rate (e.g. a couple v/s)? That would ensure there were no abrupt changes, but also makes sure that values can't persistently be off from positions.

jb0000 commented 4 years ago

I can see how it is akward. Inspite of all the added function Stages still is a module where you can see what’s going on at first glance. That would be lost with catch or scale. After spending some more time I found that the jump is not a big issue with medium to slowly gated s/hs because you can adjust in between the gates. I will test somemore with continues quantization. The slowly rising catch might be very nice. Another idea would be to give a 1 seconds latency and then jump.

qiemem commented 4 years ago

Moved discussion of value/position agreement to #6 as it's more general than quantization. Closing as this seems to be working well!