Upcoming Tonecarver module: tcArpGen (in Beta)

Here is an early look at an upcoming module: tcArpGen. tcArpGen is part sequencer, part arpeggiator, harmonizer, and delay, so it would be best classified as a Pattern Generator. It uses recursive L-System rules to define the actions that direct the arpeggiators and harmonizers that select the notes to be output.

image

Beta Downloads:

After adding tcArpGen to a patch/project, use the right-click menu to load a rules file so that tcArpGen has instructions on how to process its inputs.

L-Systems:

http://algorithmicbotany.org/papers/abop/abop.pdf

The plant and leaf diagrams generated by L-System rules were the inspiration for the module. Loosely speaking, the height of the plant represents the time dimension and the position of the leaves or branch tips along the left-right axis represent note pitch. It is not a perfect analogy but that is what started the development and exploration. The result is a module that can produce some very pleasant sequences after a bit of tweaking and dialing in.

The L-System rule set is:

  N      play a note (and harmonies if active)
  +      pick the next note in the chord
  -      pick the previous note in the chord
  _      play a rest 

  $h1+   pick the next scale interval for harmony 1  (use $h2 for harmony 2, $h3 for harmony 3)
  $h1-   pick the previous scale interval for harmony 1
  $h1*   pick a random scale interval for harmony 1
  $h1!   set interval for harmony 1 to nominal (0)
  $h1=4  set scale interval for harmony 1 to given value
  
  $s+    pick the next scale interval for the semitone offset
  $s-    pick the previous scale interval for the semitone offset
  $s*    pick a random scale interval for semitone offset
  $s!    set scale interval for semitone to nominal (0)
  $s=5   set scale interval for semitone to given value
  
  $o+    pick next octave offset
  $o-    pick prev octave offset
  $o*    pick a random octave offset
  $o!    set octave offset to nominal (0) 
  $o=-2  set octave offset to given value
  
  [      save context 
  ]      restore context 
  
  {      begin expression
  }      end expresssion

 @funcname
 |  up-down invert
 ~  up-down nominal 

  X(float) = N  + ...         Production Probability
11 Likes

This looks very interesting! Of course, I am thinking about what all I could do by combining my Meander module with your tcArpGen module in a patch. If I understand tcArpGen correctly, you generate a melody and then harmonize chords to the melody, right. In Meander, I generate the harmony chords and then compose melodies that are compatible with the chords.

What is the format of the tcArpGen poly scale input? Is it the “poly external scale” such as Meander and Grande Quant use, or is it whatever Aaron Static uses? I need to look at the Aaron Static scale standard again.

Anyway, I can imagine this being fun.

Thanks! The poly scale input is first sorted ascending, then the lowest value is taken to be the root/tonic pitch and the other values are taken to be scale degrees above the tonic. Pitches are snapped to western 12-tone equal temperament note values.

I’ll have to familiarize myself with the “poly external scale” format used by Meander and Grand Quant.

The chord ‘harmonization’ can be hit or miss depending on the exact actions in the L-System rules, the state/position of the harmony interval arpeggiators, and the active scale at any given time. Using sparse scales (pentatonics, hexatonics) helps to reduce the change of a dissonant harmony note.

Since the “poly ext. scale” format was developed 3 years ago or so, and the developer is no longer here, I will give the gist of the format. A scale is designated as 12 channels with C being the first channel and B being the 12th channel. The scale root note channel is given a value of 10.0v. Each other semitone that is in the scale is given a value of 8.0v. If a semitone is not in the scale, that channel is given a value of 0.0v. Meander can output either heptatonic diatonic scales in this format or pentatonic scales.

Grande Quant does not follow poly ext. scale format exactly but understands it fine if given such. Quant has all scale note semitone channels with a value of >1.0v. and non scale notes 0.0v (or <=1.0v), and poly ext. scale meets this standard and works fine when fed into the Quant “Scale” input. I do not feed a “Root” to Quant in such uses as it is not necessary and in fact causes problems if sent.

Here is the output in Meander for C major scale: Edit, Meander was in a pentatonic scale output mode when I captured this.

I need to look at what Aaron Static uses. The Aaron Static modules are great, so I understand that you would want to be able to use it’s format as a scale input. It would be cool if tcAprGen could be set via a menu choice to either the Aaron Static format or the poly. ext. scale format. I am not sure who else may have implemented the poly ext. scale format.

Yes, harmonizing can get pretty wild, especially when you get outside of the heptatonic diatonic scales as it is not even clear how to form a chord in many scales. Meander for Windows in 1988 had a really complex A.I. algorithm to attempt to build nice sounding chords, no matter which of the ~30 scales were selected. It failed to sound good quite often.

Edit: For clarity, here is a screen-grab with Meander set to a heptatonic scale output format and also showing the output going to Grande Quant and the resulting scale in Quant.

.

Ahh … I was not aware there was a standard. Thanks for the detailed explanation. Adding an item to the todo list for a menu item to select the poly scale format.

Well, it was not really a standard but a proposal by a developer that several developers signed on to. There are other things such as portable sequencer format or standard that have been done this way.

I’ve found it limiting in the past when modules assume the lowest note is in the bass. Some chord progressions sound much better when following voice leading rather than the root note of the chord being assumed to be the lowest. It’s the whole reason for chord notations like G7/F# which is a G7 chord with an F# as the bass, the lowest note.

3 Likes

Long before that triads were notated as “first inversion”, “second inversion”. ex: cmaj has c as the lowest note, first inversion has e as the lowest note and second inversion has g as the lowest note.

1 Like

haha - yes, but we actually documented that and made the documents available (in several places). Is this standard documented somewhere?

Love it and appreciate the implementation very much:

I’ve looked at blue arp, kirnu and cthullu, but this is the most promising implementation I’ve come across so far of a seq+arp doing: Input → Generic Rules → Output.

Somewhat related to @pgatt’s remark, my mind immediately thought: Can I in the rule file choose between picking from the sorted values (sorted by voltage) and the pre-sorted values (the order in which they are stacked in the polyphonic cable). Am I correct in my understanding that the way it is implemented I can not access the pre-sorted version?

And if so, would it be possible to have the input sorted as an option, or would that clash with the harmonizing or other parts of the implementation?

Or better yet, would it be possible to implement a pre-sort $. :slight_smile: That way users of this module (that would be me!) could pick their own picking. By pre-sorting the poly input by volume for example, using some auxiliary modules before inputting it into your module, I could pick by played volume in the rule file. Or by inserting the output of another monophonic sequencer into a shift register and output a number of the merged outs into your module’s poly in, I could pick from a FIFO. etc. etc.

Really enthusiastic about this.

1 Like

Not as far as I know, other than in the community posts. I would have to search the community for Aria’s posts in 2020 on this. I cannot remember if this proposal was documented in some repository.

Whereas the poly external scale proposal works well for western 12-semitone diatonic scales (or chromatic), it would not work for arbitrary tunings and scales.

Here is the primary “Poly External Scale” format topic from 2020:

1 Like

Interesting ideas …

For the poly scale, there will be a menu option to select between the “poly ext. scale” format or the “poly sorted by voltage” format. That will set the scale with tonic and degrees.

For the input voltage, there is a button on the panel to select between sorted hi-to-low, sorted low-to-high, or as-received (unsorted), That sets the order for the input values.

There is currently no action in the rules file that affects the sorting order of the poly scale or the poly input. Maybe something could be added in a future release …

2 Likes

Beta version of the module, for Windows, is available in Dropbox here: Tonecarver-2.0.3,with tcArpGen Beta. Drop the .vcvplugin file into the plugins folder under your Rack User directory and start/restart Rack2.

Comments and feedback warmly welcomed.

The manual at this point is more of a quick sketch than an in-depth user guide. Hopefully it gives enough clues to get you started and whets your appetite for exploration.

2 Likes

I installed your beta of your plugin under Windows and I will do some exploring and testing of at least tcArpGen.

1 Like

What is the trick to get output from tcArpGen? I have a clock and have loaded the arp demo text file. Other modules in my test patch are outputting sound, so everything should be fine for tcArpGen. I’m getting no notes and no gates out to FM-OP, even though the clock is passing through you module. I figure there is something obvious that I am overlooking. Thanks,

Hmm … Do you have high gates incoming for each channel in the poly input that you want recognized as input? The input of each channel at the Poly In V/Oct port is only “seen” when there is a high value (10.0) in the corresponding channel of the Poly Gate input.

(Perhaps tcArpgen should take all incoming v/oct channels as notes when there is no Gate In connected … )

Also, verify that at least one of the scale degree buttons is enabled (blue).

Okay, things are happening now. The issue was that the text file selection is not saved as part of the patch and has to be reloaded each time Rack is launched.

1 Like

Although I don’t know fully what I am doing :wink: I have my Meander module set to an Am scale and have Aaron Static ScaleCV sending the A Minor scale to tcArpGen. Meander is playing a “12 bar blues” harmonic progression (chords and bass playing) in Am and I am sending the single channel melody note and gate to tcArpGen. tcArpGen is sending to an FM-OP.

They are playing very well together :grinning:

1 Like

Ahh, yes. Good catch. New version is available in the dropbox folder with a fix for that. The rules file path is now saved with the module and reloaded on opening a saved project.

1 Like