Understanding CuteFox Modules' Intervallic Pair Quantizer

After @DaveVenom used the Intervallic Pair Quantizer in a patch for VCP Challenge #77, I was compelled to dive deeper into understanding the function of this (seemingly simple) module.

Not sure whether I am over-complicating, but I felt that diving down the rabbit whole and building a small test patch could help gain some clarity.

The patch consists of a piano roll to create defined notes, a detune module, a choice of clock and manual step advance, and three pitch analyzers. I’m including it here in case you are interested in playing around with some settings and make your own predictions.

Intervallic Pair Quantizer_Patch for better understanding.vcv (4.1 KB)

I think that after this exercise, I comprehend better (at least in part) what is going on.

The first revealing piece of information regarding the Quantizer came from the manual: “[…] if the current interval is 6 (semitones), it will quantize a new note when the input is 6 semitones or more above/below the last quantized note.”

Quantizing a new note is synonymous to changing the state. Hence, when setting the values of the Interval knobs higher than the interval(s) fed into the module, the state does not change and consequently nothing will happen at all :smile:.

Another clue came from @DaveVenom’s kind comment that quantization “[…] is relative to the previous quantized value, and a given input may produce different notes depending on what was played previously.” So, one needs to keep in mind that the reference point is not absolute but always the current state.

A change of state is indicated by a trigger being output from the module.

Furthermore, the way I understand the manual is that quantization alternates between Interval 1 and Interval 2 like a seesaw. One thing murking the waters for me though is that it’s never immediately clear which one of the two Interval settings is currently being used, as there is no indicator/light for their activity. Perhaps, if the developer reads this, this could be implemented.

A great feature of the module is trigger generation based on intervals, which opens up a realm of opportunity to create rhythms based on pitch change.

If you have any further insights, please feel free to share them here.

3 Likes

I should have included a reference to the original plugin announcement, which is where I learned of the relative nature. I recommend reading the first 3 to 5 posts in that thread. CuteFox Modules - Intervallic Pair Quantizer | Release

Depending on the gap between the previous quantized note and the current input, it may not be a single interval that is being used. It will be a series of alternating intervals. I suppose the module could indicate whether the last interval used in the series is #1 or #2. Maybe that is what you are looking for? (remember, I am not the developer)

I believe if the current input is higher than the previous quantized value, then the first interval in the series is always #1. And if the current input is lower than the previous quantized value, then the first interval in the series is #2. That makes the most sense to me, though I haven’t tested to confirm. But the last interval in the series is dependent on the size of the gap.

1 Like

Thanks for the link! It also would have been wise of me to search for the announcement beforehand :sweat_smile:. There is a lot of good information in the few posts there.

Yes, I think a “last interval used” indicator would help to keep track.

So that would mean that in the “upswing” it’s always #1 and going “down” is always #2? Maybe that could explain why sometimes the test patch gets stuck on one note until one of the interval knobs is lowered.

Hey! Developer here.

Happy to clear some things up! First of all your suggestion of a light indicator for which interval is currently active (by which I mean which interval will be used next to change the output note) is cool, I will think about it and maybe find a nice implementation.

About how it works:

Regardless of whatever happens to the input, it will always (try to) quantize it in the current interval, relative to the last quantized note.

  1. If the current interval in use is larger than the difference between the input voltage and the last quantized note, it will not change the output note.
  2. If the current interval is significantly smaller than the difference between input voltage and the last quantized note (e.g. with a sudden voltage spike), it will change the note to something close to that voltage within semitones (like a regular chromatic quantizer, with all notes ‘ON’).

Therefore this module benefits from linear voltage inputs (as opposed to spikey inputs with lots of jumps) to do its job properly. In my experience, using an attenuator in the input chain is crucial to getting the right balance between 1) and 2).

Regarding @DaveVenom 's point, the module only ‘thinks’ one interval at a time and has no prediction of series of intervals, only how the input voltage vs last quantized note relates to the current interval in use.

Let me know about any other questions, and thanks for using the module!

2 Likes

Thank you for your response, much appreciate you taking the time to explain!

I’ve run another test and have a some difficulty to understand the result: I set up a 1-semitone ladder in the Piano Roll module and set both interval knobs of the quantizer (IPQ) to “1 | Minor 2nd”, so quantization should be to the closest semitone and it should not matter whether the upper or lower interval is active (see pic). Therefore, I would have expected that every note plays exactly as it is set in the Piano Roll.

Nevertheless, I am obtaining the following result:

Step count: 1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16
Piano Roll: C4-C#4-D4-D#4-E4-F4-F#4-G4-G#4-A4-A#4-B4-C5-C#5-D5-D#5
IPQ: C4-C#4-D4-D4-E4-F4-F4-G4-G4-A4-A#4-A#4-C5-C#5-C#5-D#5

(I highlighted the notes I did not expect in bold.)

I’m probably missing a vital piece of the puzzle somewhere. Can you perhaps help me understand the result?

Hey! You’re onto something.

I did a similar test in my system and I got the same result. When you feed it a linear input it seems to work 100% fine, but if it gets a pre-quantized input like you suggested something is off with the calculations.

If I set both intervals to 0 it works fine, which makes sense somehow.

I will take a look at the code and try to fix it.

Thanks for letting me know about this!

2 Likes

Hey! A bug in the system would explain alot.

It also works fine here when setting both intervals to zero (unison).

Thanks for looking into the code! While you are at it (and perhaps also find time to add the indicator light), I would also like to ask if it would be possible to add CV-control over the switch between Intervals 1 and 2, as it could add some more flexibility to the choice of interval. Not sure whether you have already thought about it before, so nevermind if you have.