T's Musical Tools 🧙‍♀️

I spent a few days really workshopping my manual, and hopefully I was able to get things across a lot more clearly:

Many modules are focused around seedable RNG, and/or routing polyphonic signals in useful ways such as shuffling, sorting, joining, or selecting subsets of them.

Spellbook (dev log) is a sequencer which uses a plaintext, “tracker like” notation, specifically created for a modular environment, and designed to be easily written, edited, and copy & pasted.

Mostly these modules are useful for routing signals and/or working with control voltages, as opposed to generating audio, but most do have the option to run at audio rate if they normally don’t (for mad science purposes).

Where to Get It:

The Modules

The modules might look a little intimidating, because there no knobs, only jacks. Everything is controlled via CV inputs. But don’t worry, they’re all very small, focused modules that will make sense once you use them.

  • Calendar - Output LFO-like signals based on local time and day, creating rising sawtooths synced with seconds, minutes, hours, days, through to years.

  • Sight - A scope where time slows down over the width of the scope, letting you see a signal over different time scales simultaneously.

  • Seed - Get 16 random numbers, with an option to provide an RNG seed.

  • Shuffle - Randomly re-order the channels of a polyphonic signal, with an option to provide an RNG seed.

  • Ouroboros - Step through the channels of a polyphonic signal as a sequence. Try using Seed as your sequence source! Maybe Shuffle it every two bars?

  • Append - Combine the channels of up to 16 mono or polyphonic cables (i.e. append the multiple lists together into one big list; up to a total internal buffer of 256 channels), then output a 1 to 16 channel subset of them, with CV controls for width and starting point.

  • Stats - Get statistical measures like mean, median, mode, product, etc. of the channels of a polyphonic signal, inspired by spreadsheet functions like AVERAGE(), MEDIAN(), MODE(), UNIQUE(), etc.

  • Sort - Sort and select channels from a polyphonic cable using other polyphonic CV inputs, inspired by the spreadsheet functions RANK() and FILTER().

  • Spine - A few static CV constants/offsets I use a lot like +/-1, +/-5, +/-10, multiply by -1, etc.

  • Spellbook - Plain text “musical markup” sequencing of CVs/pitches, with a broad variety of accepted formats for however you want to write your sequences; such as pitch names, MIDI note numbers, semitones, Hertz, etc. Write out sequences in rows and columns like a spreadsheet!

12 Likes

Incidentally, I looked at your polyphonic modules yesterday and found some of their functions to be intriguing and different. Well done! So, I look forward to exploring the others in the plugin.

1 Like

Sounds cool! I’ll try it! I think it lacks some controls though… I mean, that’s not critical, but that would be cool to have, for example, a length control for Ouroboros as a knob on the module too. And that also goes for other modules that expect external controls as mono signal… But anyway, this looks cool! I’ll try them. Thank you for your work!

1 Like

greatly appreciated. thank you!! :clap:

1 Like
3 Likes

I like this radio-show-dialog-conversation-type video. Not necessarily crazy about the advertisement-style/content, but think that the approach has a lot of potential for creating entertaining tutorials.

In any case, will for sure take a look at Spellbook and RhythML. Thank you for developing and sharing!

2 Likes

I wrote a fake infomercial for my Sanguine PJ Editor, because the idea amused me; but this takes it to the next level (I stopped at using the script as a description for the thing) :stuck_out_tongue:

Lovely tutorial for a module that looks rather useful, thank you for developing it and, honestly, making me laugh with the video :slight_smile:

1 Like

I am looking at the Append module and find that the voltage ranges for Width and Rotation are different from the 0 to 10V ranges mentioned in the manual.

For width, the number of channels seems to vary with the number of attached input cables. For example, with 2 inputs, I reach 16 channels with approx. 4.8V. With 3 inputs, it takes approx. 3.2V to produce a window of 16 channels. With 4 inputs it is approx. 2.4V. Is this intended that the window is dependent on the number of inputs?

For rotation, I seem to reach the end of the channel chain (here: 4x16 channels) with approx. 7.7V, and then it rolls over to the first channel element again. This finding seems to be independent of the Width setting. Is this intended?

Or I can also not exclude that I’m doing something wrong or misunderstand? Could you please clarify?

UPC_Append (T)_20241010_Questions.vcvs (8.2 KB)

1 Like

The intended behavior for both is that:

  • 0v = first channel (not necessarily port 1, if you skip an input- it’s “first available channel”)
  • 10v = last available channel (but if this would output more than 16 channels, you only get 16)

So, it’s relative to the total number of input channels (not input cables); which might be up to 256 channels if you fully load it up.

I think that’s what is happening in your example, but it’s totally possible there’s a bug in the module. I actually did it in a different way for Spellbook’s “Index” in relative mode but didn’t go back and review Append.

1 Like

Hmm, I’m reaching 16 channels on the width way before 10V, and it’s variable depending on the number of connected channels. There is not skipping in the example.

For rotation, 7.7V displays the last channel/element (here filled with 0.85V). With higher input voltages on the Rotation port, I see the beginning of the channel buffer again (here starting with 0.10V).

I don’t think it’s a very big deal, but would be happy to understand what is going on, just wasn’t expecting these results.

The .vcvs is included in the post above, in case you would like to run your own trials.

Thanks!

1 Like

I think everything is working as intended. Both Width and Rotation are affected by changes in the number of input channels. Better to think of them as “0% - 100%” instead of “1 - 16”.

By default, it’s like Width is 100% and Rotation is 0%; it tries to pass through “all channels”, starting from channel 1:

50% / 5v width will always give you “half of the connected channels”, whether there are two inputs channels or 256:

If you’ve got more than 16 input channels, you’ll start seeing 16 output channels before 10v. Whatever % of your input channels comes out to “16 channels” is the point where the output becomes “full”.

So here, 32 channels going in, Width is “50%”, so we’re getting half of them, which is 16, at 5v:

If I just stick a bunch more inputs in, now there’s a total of 96 channels, and it only takes 1.6v, about 16%, to get 16 output channels:

If I try to set the Width higher, it “tries” to output more than 16 channels, but you only get 16 on the port.

I did it this way because I felt the usefulness of Append was so you if you want “half the channels”, that’s what you get, even if the number of input channels change, because Append’s power is that it doesn’t care about adding/removing channels or even gaps between the inputs. It just picks everything up and sticks it all in one big bucket.

However, there is actually unused space for an “Alt Mode” on Append, like all the other modules have. Would it be helpful to add an alt-mode where 0v Width = 1 channel and 10v width = 16 channels, no matter how many channels are actually connected? Or is there some other specific behavior which would be better?

1 Like

Thank you so much for taking the time to test and explain! The pics are really helpful, too. Your results make sense to me.

I personally would not mind the Alt Mode where 0V Width = 1 channel and 10V width = 16 channels.

The concept I am trying to get at is to load a large number (e.g. 128 channels) into the buffer, open a window of a defined width and ‘scroll’ through the buffer with the rotation voltage. I find this more difficult to operate if the window size (width) changes every time I add or remove channels. But like I said, this is not critical.

I still have not figured out why there is a rollover to the beginning of the buffer when in the ‘scrolling’ process the end of the buffer is reached. Shouldn’t it just end with the ‘highest’ input channel?

Ah, the rollover is on purpose too, that’s why it’s “Rotation” and not just “Start Point”. It’s supposed to be like all the channels are in a big circle, and you’re spinning that circle.

You could take the output and send it to a second Append, or maybe Toly Pools, and I think that might give you what you need.

Ah, rotation, yes! Thanks again!