Don Cross / CosineKitty / Sapphire

I’m glad you like it!

Glee is based on the Aizawa attractor:

\frac{dx}{dt} = (z-B)x - Dy
\frac{dy}{dt} = Dx + (z-B)y
\frac{dz}{dt} = C + Az - \frac{1}{3} z^3 + (x^2+y^2)(1+Ez) + Fx^3z

where (x, y, z) is the particle’s position vector, and A, B, C, D, E, F are tunable constants.

The three equations define the velocity vector of the particle in terms of its current position. In other words, you take where the particle is, (x, y, z), plug their values into the right hand sides of the equations, and out pops the velocity vector (\frac{dx}{dt}, \frac{dy}{dt}, \frac{dz}{dt}).

This means if you know where the particle is, you can calculate which direction it is moving and how fast, and update the position a little bit based on each small time step dt.

OK, all of that preface was to explain this part: the boring CHAOS knob behavior in Glee (now called “Subtle” mode) is because I chose to vary the C parameter. I can’t remember why I didn’t do more exploration, but I suspect I was in a hurry to get Glee out as a companion to Frolic as a “bonus module”.

The more interesting behavior of “Islands of Stability” comes from varying the A parameter instead.

So the great news is we still have B, D, E, and F to play with, or even combinations of varying more than one of them at a time. And I will be working on that over the next few days, to see if there are any other potential chaos modes that are different enough from Default and Islands of Stability to be included also.

This is not a simple thing though because I have to be careful that I choose safe ranges of the parameters to avoid two problems: divergence and convergence. Divergence means the thing can spiral off to infinity. Convergence means the point can wander to a location where the calculated velocity is (0, 0, 0) and get stuck there forever.

Anyway, stay tuned here and I will be releasing more experimental plugins over the next few days.

I would love to see+hear an example! Can you post a patch or video here?

OK, I have updated Glee to have 4 different chaos modes. They are all named after fruit, and the first letter tells you which of the Aizawa parameters is being controlled by the CHAOS knob:

  • Apple
  • Banana
  • Cantaloupe
  • Elderberry

It turns out that the D and F parameters weren’t very interesting, any more than C is. But I provide Cantaloupe for backward compatibility.

I also added redundant menu options to the SPEED and CHAOS knobs. I left these options in the main context menu because I have a feeling a lot of people don’t think to right-click on knobs, but they often will right-click on the panel out of curiosity.

Here is the plugin build.

@DaveVenom I think you will have fun with this one!

1 Like

You know I did! I particularly like looking at Elderberry on the Tricorder.

I tried feedback by using VCO Lab to modulate the Glee speed, and then the Glee Y output to modulate VCO Lab linear FM and/or phase, or … So many different things to try, and they all sound interesting.

Now I am eagerly anticipating what Rotini and Pivot will bring to the table. I see Rotini in your build, but it doesn’t seem to be functional - the output is always 0

Awesome!

Rotini is a super-simple cross product calculator. If either cable is unplugged, it will be treated as a (0, 0, 0) vector, and the cross product of (0, 0, 0) with any other vector is also (0, 0, 0).

You will also get zero out if you feed in two vectors but they point in exactly the same (or exactly opposite) directions. The cross product of any two parallel 3D vectors is (0, 0, 0). And this can easily happen if you put monophonic inputs in: (a, 0, 0) x (b, 0, 0) = (0, 0, 0) for all real numbers a and b, because they are both parallel (aligned along the x-axis).

A special case of parallel vectors is when both A and B inputs to Rotini are the same 3D vector. So if you plug in two different Frolics with default settings, close the patch and open it again, the Frolics will be generating identical trajectories in lockstep. Then Rotini will output… you guessed it… zero.

So you could try feeding the P (polyphonic 3D) output port from different Frolic/Glee with different settings into Rotini’s A and B inputs:

I’m pretty happy with Glee/Aizawa now. Today I’m going to explore the other parameters in Frolic/Rucklidge, to see if Frolic can gain any fun new chaos modes too.

Oh man, I forgot it requires vector inputs. Thanks

1 Like

Yeah, I explained all this not just for you, but for anyone else here reading. Even I, the developer, kept thinking something was wrong when I got stuck with flatline output, LOL. Then I would think about it and go, oh yeah, parallel vectors.

Oh man Rotini is fun! It is like another form of FM.

I have another idea. You could make Rotini and Pivot wider, and make A and B two columns of inputs with X, Y, Z, and P for each. Then the user can construct each vector with three ordinary mono inputs. The X, Y, and Z inputs could be additive with P. Of course this can all be done with merge utilities, which is what I did to create vectors using audio signals. But putting it all in one module would be much more elegant.

It might be nice to also have permutation knobs and CV for the A and B inputs. Meaning a knob plus CV that would swap X, Y, and/or Z in various permutations.

I like this idea, but I don’t want to add this into Rotini and Pivot because I’m planning on a series of other vector operators and I want to keep them as all as simple as possible. I prefer the philosophy of factoring out concepts into separate specialized modules, unless doing so makes what remains hard to use in the typical cases.

But I do like the idea of a Sapphire Merge module specialized for 3D vectors, including the additive part in the merge: vector = (P[0]+X, P[1]+Y, P[2]+Z). Sapphire Merge could be super-thin, maybe 2 or 3 HP wide, and I might be able to stack two independent merge units in one panel.

This could also be a dedicated module, but I’m not as interested in it because swapping vector components isn’t a normal vector operation in math. I’m following my intuition: a vector isn’t just an ordered sequence of 3 numbers, but a single mathematical entity of its own. I’m following a line of thought that physical simulations have produced very interesting sounds, and physical simulations treat vectors as fundamental entities inside an arbitrary coordinate system.

I guess I’m trying to optimize these 3D vector modules for physical realism, which still allows you do to all the weird stuff you want with the individual vector components and merge them together into a “hacked” vector.

I hope this makes sense and doesn’t sound too negative/dismissive… I hope you keep the ideas coming because they are fun and thought-provoking.

No need to worry - I’m just throwing out ideas. I’m certainly not offended if you don’t like them or don’t take action on them.

I more understand your reluctance to implement any kind of swapping of coordinates. I played around with Computer Scare Toly Pools manipulating the audio rate vector inputs to Rotini and enjoyed the results. But I get how that violates the spirit of your module.

But having independent X, Y, Z inputs seems no different to me than your existing breakout of X, Y, Z from the output vector. It seems very logical and balanced to me. To me a user is just as likely to want independent X, Y, Z inputs as outputs. Just giving you my rationale, no offense taken if you still don’t like the idea.

I don’t know if it was intentional, but I noticed that TOUT can receive input directly from TIN.

So TOUT can receive a vector from the left, provides port outputs, and passes on the vector to the right.

The TIN is not symmetric - it only accepts vector info from the port inputs. You might consider accepting vector input from the left that is summed with any signal from the input ports.

Perhaps the ultimate vector utility module would be a combination of TIN and TOUT:

  • Receives a vector from the left
  • Receives a vector as X, Y, Z inputs
  • Receives a vector as a 3 channel poly signal at P input
  • Sums values from all three sources above
  • Scales the vector with a Level control (maybe with a CV input as well?)
  • Outputs the final vector at X, Y, Z and P outputs
  • Sends the final vector to the right

The above would kind of be a Swiss Army knife for vector processing. Construct a vector P from X, Y, Z. Break down a P vector into X, Y, Z. Offset a vector. Scale a vector. Or any combination thereof.

The last thing I was thinking about was adding polyphony to your suite. One poly port can support up to 5 vectors. You could cap the polyphony at the X, Y, Z inputs at 5 to coincide with the P input/output. The number of channels appearing at P would always be a multiple of 3. I think it would work well for everything except Tricorder. There I suppose you could have an option to select which channel to monitor.

I hope my brainstorming so much is an indication of how much I like what you are doing with vectors.

1 Like

I really like this idea! I will ponder that. I prioritized providing dual monophonic / polyphonic vector output because most of the time I’m using the individual components as CV. But on the input side, I’m mostly dealing with “pure vectors”. VCV Merge works fine for the cases where I need to hack a vector out of components, although it is bulkier than I need. I could probably fit at least 2 vector merge units into a single panel maybe 4 HP wide, even with a LEVEL control group. (I call the combination of manual knob, attenuverter knob, and CV input a control group. I wonder if there is a standard term for this idea?)

I’ve been thinking along these lines also. I have gotten a lot of mileage from basic VCV modules that support polyphony: Split, Merge, ADSR, CV Mix, etc. I want to convince myself that any new modules I create that could be done with other modules offer a dramatic improvement in the user experience.

There is already precedent in Nucleus and Polynucleus. They each have 5 vector outputs. You select which vector you want by clicking to the right of the desired row, and a yellow arrow appears as an indicator. I would definitely do the same for any future modules that offer multiple vectors that could be graphed.

This is really fun stuff!

Having fun with Rotini creating the cross product of vectors derived from a 6 note sine wave chord. I add a tiny bit of vibrato via an LFO to give just a bit of motion. Later on I switch 3 of the source notes to triangle waves. The green cables are the original sine (or triangle) waves. The red cables are the complex waves derived from the vector cross products.

I don’t remember what notes I used for the chord. It is fun to explore different input notes.

I route the raw signals to one Crystal Palace Perspex, which slowly crossfades from one note to the next. The nine cross product waveforms are routed to a second Crystal Palace Perspex.

Sapphire Rotini in the Crystal Palace.vcv (4.8 KB)

I believe the cross product waveforms at the Rotini X, Y, and Z outputs are the equivalent of ring modulation, plus one or two extra peaks (when working with sines). Like with simple ring modulation, the extra peaks do not correspond to the source frequencies.

3 Likes

I really like these sound textures!

It’s cool how you approach this from a different mindset: more of an FM operator, which I hadn’t even thought of. I started Frolic and Glee with the idea of slow LFO-style CV control, and I also was (and still am) fascinated by the idea of creating novel physics simulations by hooking vector operators together into ad hoc analog computers.

Then you had the idea of audio-rate, which leads to a whole new realm of use cases. Very cool collaboration… I’m enjoying this a lot!

1 Like

Yeah, at first I thought it was similar to frequency modulation. But now I am pretty sure cross products on audio rate dynamic vectors is more akin to ring modulation. But the cross product definitely adds its own twist (extra frequency peaks)

1 Like

Hey everyone, here is my first 2.4.8 release candidate for Sapphire.

  • New module: Pivot
  • Glee with the 4 chaos modes, as discussed above.
3 Likes

Don’t forget you have the new Rotini in there as well!

I just realized the Pivot does the coordinate swapping that I was asking for, except it has continuous morphing between the different configurations.

One more variation where I replace the Bogaudio VCOs / LFO with Venom VCO Labs.

The middle VCO Lab is in LFO mode with 8 different signals at various rates for different modulation. The 6 note chord played by the other two VCOs (three notes each) is entirely different from before, I just picked 6 notes within a 2 octave range. Two LFO signals provide vibrato. Two modulate the shape of the sine wave. One modulates the sine phase at ~200Hz, and another modulates the FM amount. The last two modulate the output panning.

Venomous Sapphire Rotini in the Crystal Palace.vcv (7.8 KB)

4 Likes

Here is the patch.

1 Like

My Friday evening fun time… yes, some slow chaotic generative modulation!

“Crescent Saturn Sunrise”

Here is the patch.

4 Likes