Midi Chord strummer?

Bill W's icon

I'm trying to create a Max patch that uses either a keyboard split or a separate midi controller to control the strumming of keys of a held chord on the primary controller. The general idea would be strumming notes like a guitar. The general idea would be to play a chord with one hand but then to iterate through the chords using the other controller/zone, which would be drumpads.

There's a strum patch that does this with pitchbend or modwheel, and I created a preprocessor that converts my strumming notes to PB, but it's kind of wonky and the results don't work well. It needs to be fast because the strumming will eventually come from drumpads.

I've gotten as far as splitting my controller, so I can debug it using one keyboard. And I can capture the list of notes for both the chord and the strumming. But I'm not sure how to combine them. I want to play the notes on the chord side, using the velocities and gates from the strum side.

Any tips?

Thx!

Source Audio's icon

what I don't understand is "iterate through the chords"

which chords do you mean, collection of predefined chords ?

if you hold a chord using 1st split , that's it.

then use whatever to trigger chord notes ascending or any kind of order

using 2nd split or controller.

each note on triggers next note for example.

Bill W's icon

No, a chord I'd just play on half the keyboard. I've seen lots of devices that make chords, or I'd just play it and hold the sustain pedal.

But it won't make any sound until you hit the strum keys. And then they'd just strum through the notes on the chord. Kind of like guitar fingerpicking. You fret a chord but don't get any sound until you strum the strings. An omnichord would be another example.

Source Audio's icon

That should be no big deal if you explain how do you want to perform strumming.

Held notes from 1st split can be stored in coll including their velocity if you want so.

Or only notes.

then you trigger output , now just explain how you want to do it.

Wil's icon

More explicitly

You play a chord and store the notes without triggering output

Then trigger the stored notes as arpeggio using … what you mentioned other section of keyboard or drum pad

[zl reg]

Source Audio's icon

this should get you going with keys split and notes storage into coll

Max Patch
Copy patch and select New From Clipboard in Max.

more to come when you explain how to strum

Bill W's icon

Thanks!!! -- I can't wait to try that when I get home!!

So, there are no arpeggios. Everything's meant to be played real time. And at first at least, one strum note would trigger one of the interval notes.

I have a couple of ideas for how I'd allocate the strumming notes, and it will come down to what seems best playability wise when translated to different types of controllers.

So lets assume the strumming zone is 1 octave and that chords could be 2-6 notes.

Option 1 is to just to map the notes to play the intervals in order. So C=1, C#=2, D=3.... I'm pretty sure I can extend it myself to do things like go up and down octaves for additional notes or even add fast up or down strokes. The strums would be controlled by drum triggers or something like an Eraetouch.

The notes that aren't mapped to an interval, so the ones that are greater than the #of notes in the chord, could perhaps play notes in different octaves or maybe do a fast strum of the whole chord (up or down) like a guitar. I figured I would see what's playable first.

BTW, this is where this idea started. This is a VST called Strum for AAS (not to be confused with the max patch called strum). In one of it's modes, it works as I've described. The guitar samples in this (amazing) VST are optimized for things like mutes and various guitar gestures. This wouldn't apply to most other VSTs. But individual notes, all up stroke, all downstroke, and octaves should apply to anything.

AAS Strum has other shortcuts in it, like if you play just one note in the chord zone, it just sets the chord to a major triad on that note. And it has some ways to generate inversions if you hit many notes. I don't really need that. There are other Max objects that do that kind of stuff. But the strumming seems unique.

This video shows a little of what I'm doing with strum. I'm using the Red Boppad to output 16 different notes that map to the strumming options of the vst above. I grouped them together to make it playable. Then I bolted the thing to an Artiphone Chorda, that's controlling the chord.

A lot of other things are happening. The artiphone is going through the Eventide Misha in my modular to step through scales. But you can see bits of the idea in this.

Thanks!!!!

-Bill (roundingerror.nyc)

Source Audio's icon

I see it simple, you have notes in a chord and want to strum them

or play them as a stroke.

You can't really strum with proper velocity using white and black keys.

As guitar player I can tell you that strum has last note accented,

and on the wished beat. slow strum does not really exist.

And every chord played with plectrum is actually up or down stroke strum,

only that interval between notes can be so short that it can't be really

intercepted and declared as a strum.

At the end it is a question how do you spit out notes from chord,

in what order and how fast.

So once you decde about what exactly suits best your strum needs

and need help about logic arround it simply post here.

Bill W's icon

I'm struggling with how to actually get the notes out of the collection in coordination with the strummed key. I'm trying to retrieve the note by it's Index, which should be the strumkey-keysplit (which is 48). But it keeps interpreting the integer I send to the collection as the value of the first element. So below it will only match 12, 16,19, 23 instead of 1,2,3,4

Sorry, I haven't figured out how to embed my max code here yet.

Do I need to force an index value into the heldnotes collection using listfunnel?

Thanks for your help. I'm going through the Kadenze max course, but it's so different than the kind of procedural programming I'm used to!

Bill W's icon

I'm not trying to emulate guitars, the AAS VST does that as well as I'd ever need. This is more for other sounds, piano, pitched percussion, and modular. The velocities of the strum notes do need to be used for the note that's played, so even if you play the same note over and over, you can accent it. So it should used the strummed velocity not the one in the collection.

But this doesn't need obey any of the rules of a guitars, such as note order. And inversions would just work as played. So if you chorded CEG, then S1=C, S2=E, S3=G. And if you chorded GCE, S1=G, S2=C... There's no need to re-sort the notes.

In a way, the idea comes from Bruford. Though his setup uses fixed pitches. I have other max objects that move around through scales and sometimes play chords.

The one thing I can't get to work so far, is to play the note in the heldnotes collection by its index. And I also need to add using the Strummed velocity.

Source Audio's icon

ok, now you posted enough infos to go forward.

As you don't need velocity from chord notes, we can ignore them and store only note values.

using numeric index in coll is a bit tricky,

because you can add or remove held notes,

and one needs to resort them in order to output different strums.

I mean to index notes 1,2 3 4 etc, not by their pitch.

but I still don't understand relation between trigger and chord.

should any received note progress through notes,

when and how do you want to stop and reset and so on.

in principle you can bang coll and it will loop through indexes.

From your screenshot, you tried to recall notes

by matching transposed input from 2nd split ?

here is option - any note from split 2 triggers next one in the chord,

using velocity

for simplicity, I used 2nd kslider set to touchscreen mode for triggering.

Max Patch
Copy patch and select New From Clipboard in Max.

P.S. had to reupload patch, one patchcord got deleted by mistake...

Bill W's icon

Thanks! I'm not sure what the black keyboard is doing. I can't get it to make a sound. So maybe this helps....

In my screenshot, I set a split point of 48, and then split the notes between two zones in a simple subpatcher like this. (In reality it might be two different controllers, but I deal with that prior by combining midi sends from other tracks that might preprocess various things)

The strumming keys don't need to really know anything musically or algorithmically about the chords. Simply playing the notes in order of low to high is probably fine.

Since you're a guitarist, maybe thinking in strums is what's confusing. Think of it more like fingerpicking. The chord is fretted and there's no sound until you pick strings. And you can finger pick in any order (and velocity) to your heart's content until you change to a new chord. And when you switch chords, those same picking fingers play the same string, but might get a different note.

Just replace picking strings with hitting a key or drumpad.

The mapping of the triggering notes would be static, say just 1-5. I was trying to do midinote-keysplitnote, which amounts to the same thing.

S1 would always just play the lowest note of the chord, S2, the second note, S3 the third. That's it. They don't need to know much about the chords at all. Probably sorting them low to high is enough. And they only change notes when you play a different chord.

The Reset would be when lift the held chord or let up on the sustain pedal. I suppose, if you hold sustain and play more keys, they're added to the chord list. And when there's no buffered chord the strumming keys wouldn't trigger anything. There's no persistent memory between chords other than when sustained.

If you happen to reuse notes in subsequent chords, like you start with CEG, strum for a while, and then play ACE, during the first chord S1=C but for the second chord S1=A and S2=C. Its OK that the C moved from pad 1 to 2. I don't think that will matter in practicality. It will sound good when the chords sound good.

In fact the notes played by a given strum key will jump around all the time as the chords move.

Think of it perhaps like an autoharp, dulcimer, or an omnichord. You pick chords on one side of the instrument, but you play rhythmically on the other side with very little thought about the actual notes. Or as Keith Richards supposedly said, "You use your brain with your left hand and your heart with your right!"

Thanks again!

Source Audio's icon

black keys mimick midi input.

Which is not possible from left kslider set to polyphonic mode

which I used to set notes in a chord.

Check kslider help file.

picking or strumming , it makes no difference to me.

It is a simple logic. you have notes in a chord,

now set some rules how to spit them out and that's it.

If you really play left hand cords, you will have max 5 notes in theory.

Assign 5 trigger notes on 2nd split and do whatever you want.

here is test patch:

set notes on left keyboard, play 5 red notes on right one.

I removed splits, you can do that as you want.

Max Patch
Copy patch and select New From Clipboard in Max.

Bill W's icon

Ah, OK, I see how it works in your test patch.

Let me see how I can wire it up. In Max proper, I know I can use two controllers and more than one midi channel, but Max4Live restricts me to midi channel. That's why I was trying to do it using a strumming range on just one controller like a keyboard split. M4L makes it easier to create and manage a template for my setup.

Outside of this patch, I have lots of things that remap midi notes and route midi.

Thank you SO much for your help! I'll post something when I have it working as intended.

-Bill in NYC

Bill W's icon

Hi! - I've been testing the patch integrated into the other parts of my test rig and have a couple of questions, and perhaps a bug. I changed it to handle 6 harmonies and a TBD up or down stroke.

I'm using the patch with two controllers feeding into one track on the same midi channel. The QuNexus is supplying the chorded notes. It's going through an ableton chord creator object that's creating harmonies from the one keyed note. But I've tested without that too.

The boppad is supplying the strum triggers from Note# 96-104 and then the midi streams are joined together. There's also a sustain pedal signal added in.

The bug seems to have to do with the reset of the chord collection.

Right now, if you continue to hold a chord and strum it, the notes seem wrong or can contain several duplicates. But if you just tap a chord and then strum, it works great, except for sometimes there are hanging midi notes and I have to send an all notes off from a different track.

So I'm thinking the collection reset is not working correctly. Although it's kind of cool to not have to hold the chord as an option. But that can be done with the sustain pedal as first designed.

Any suggestions for how to fix this? It is really fun to play so far btw!

I also have a question: do you think there's a better way to send the Strum Notes than to use a range of the keyboard? Ie something that leaves all 128 notes available for chording? I'm trying to keep this compatible with M4L which, as I understand it, can't pass two midi channels at once to a patcher.

Thanks!

bwstrum1.51.amxd
amxd

Edit: I think my problem comes from how I'm splitting the notes but the alternatives I've tried so far don't work.

thanks!

Source Audio's icon

As first I am not using Live,

and so can't judge when it comes to it's bugs and limitations.

When it comes to split, proper splitting was included in my very first posted patch.

if you explain in detail what you want to do, no problem to help you .

But just telling strumUp in not enough.

Initially you wanted 5 notes triggered by 5 notes on the 2nd split

which would also provide velocity.

Now you want more held notes, strum up/ down and repeat notes.

which timing between notes should this actions have ?

and what velocity ? all the same ?

Bill W's icon

Thx kindly

Sorry, I'm not trying to expand the scope! I think I can figure out the strum features I'll add now that I have a little bit better idea of how to use the collection. The comments inside the patch were for myself. I've already figured out a few such as play all, random, +1 up, -1 down and will eventually add them to the black keys. I think those will be the most useful.

The basic reqs are still that the strumming controls the velocity. The chord velocity doesn't matter.

I'm mainly trying to understand how to avoid the hung notes on a simple version of the patch, that funnels all the notes to one controller. I need to integrate it into Ableton because of all the other objects I'm using to create scales and chords. Also, Ableton is mixing all the different sounds.

By first version you posted, do you mean this one or the first one with strumming? Or the one with the red strumming control.

I tried adding strumming to the first one, but it's not quite right and still susceptible to the note hangs.

bwstrum1.6.amxd
amxd

Thanks for your help

Source Audio's icon

please test few things here,

I am a bit out of time, and could not properly test and comment all.

Part with counter at low right is meant for looping chord notes

Max Patch
Copy patch and select New From Clipboard in Max.

Bill W's icon

Thx again

I'm trying to test it your way, without Live in the picture, just Max 8. But I had to make a few changes to do so:

  • Made some changes to the strummer because without Ableton running my Boppad patcher, the boppad only puts out 4 notes (36-39).

  • Explicitly set the midi ins to Qunexus and Boppad.

  • Outputs to the default mac synth and change to a sound without decay

  • Disconnected the blackkey processing and moved it out of the way for now just to simplify things

Still getting hung notes and am not sure from where.

(Something that might be obvious, or not, is though I called this a strumming like object, the objective is really more percussive. Though really it amounts to the same thing..)

EDIT - I think my test patch is sh*t because I don't seem to be sending notes off. At first I thought there was a problem with the boppad, but I see the same problem using a different controller for the strum notes.

EDIT2 - I think I know what's going on -- nothing's sending note offs!! (This might also be responsible for a performance issue where live starts to bog down.)

Originally I was vague about how sustain pedal might work because I wasn't sure whether I wanted Sustain to be independent of the strumming actions or not. Ie, musically it's good to be able to iterate through either plucked notes or sustained ones. And I can't just rely on the idea of holding down a chord with one hand, because ultimately I need both hands free for drumming as well as most drum controllers don't support aftertouch anyway.

So for clarity and to get this v1 working, does it make sense to add code that just turns off all notes when say, sustain is released? Another option is to clear all notes when the heldnotes collection changes but that could be prone to playing mistakes.

Slowly the lights are coming on on this stuff.... Thanks supremely for your help and patience.

bwstrum_maxonly_1.61.maxpat
Max Patch

Source Audio's icon

as first you don't connect thresh to noteout.

thresh collects input to show more then just last message.

And don't connet midi to that trigger kslider.

connect midi allways directly, and use kslider as replacement for real midi input

for testing.

If you want to use separate midi input for trigger, no need for any split.

In max that's no problem, in Live you need another track for trigger input,

send it's notes via send/receive to this patch.

Using letter abbreviations to set midi devices is not reliable.

Patch I made was meant to feed makenote, which would take care of

turning triggered notes off.

That because you want to use drumpad trigger which usually produces

too short notes or only note on, which would not be usable

without makenote, to set note length.

I hope you understand this.

If you want to use note off from your trigger midi input,

then replace route with sel and trigger note index on both note on and note off.

here is no split simple patch

With strum and repeat modes I can help you only when you describe exact output of trigger sources

Source Audio's icon

P.S. if you are lucky windows user or Mac with Intel arch user,

then you can try externals that provide direct midi input in live devices.

Bill W's icon

Unfortunately I use an Mac M2u. Here's what I have so far using your diagram above as the starting point.

bwstrum_maxonly_1.71.maxpat
Max Patch

It takes 6 strum notes that correspond to notes 1-6. And I added at least the starting point for 4 black key strums, which are defined as AllNotes, Random, Up1, Down1. I think that's enough.

I tried the automated strumming you had in one of your versions, but it wasn't very playable from a drumming perspective. It's too hard to match the tempo if I'm not using the clock, and didn't seem worth the added complexity.

As for Splitting notes, unfortunately I ultimately will have to use that, as this needs to work in Live. But I just want to understand the patch as you've been guiding me and get this working in the basic sense. I'm a semi retired software developer but Max is a brain warper compared to the procedural programming I'm used to! But I'm committed to learning it. And I think it's getting close.

So perhaps it may help (or not!) to describe the Live setup that this patcher would eventually sit inside:

I use Live for two things: one to mix together a lot of different midi controllers and sometimes process the midi in various ways. The second is as a live mixer hosting a lot of VST's and audio ins that I can control live. That's about it. I rarely sequence or even record though that should all work. I hardly even press Play unless I'm synching to something or looping. For me, Live is a midi environment and a VST Host for spontaneous noise. (when I do record I often prefer Reaper).

So my Live setup does indeed have many tracks just for midi input from various controllers. Sometimes I tweak the midi, such as scale it, iterate through notes, or make chords out of notes. The controllers can be all sorts of things: roland edrums, boppads, a QuNexus, launchpad, other Max devices, modular, Norns, etc! And I can join these together in a bus like midi chain before sending them to an audio track with a VST to make a sound or to a Midi out.

I can also merge in a DORE midi foot controller that just adds in any CC, typically Sustain. I realize that most edrums send a note with a very short envelope. But some controllers support aftertouch such as the Boppad, QuNexus, Eraetouch, DrumKat, etc. So yes, you can hit pads quickly, but you can also hold a note on some devices. Although even for these controllers, the sustain pedal is more effective because it leaves you free to hit a lot of notes! But the pedal controller adds another layer of control when using sustaining sounds, which merged with drum sounds, is the whole point of my crazy setup.

I typically add in the sustain controller at the audio VST track, which is kind of the end of the chain before going to the mix out. This way I can decide based on the VST whether I want sustain or not. Some sounds work better without sustain. So I can mix drones with sustain, and shorter elements without. But to keep it simple, suffice to say, I can control whether sustain is added before or after this Strum Patcher (or both before AND after).

How I picture the input for this strummer object simplified is: 1) chord input via a keyboard, 2) some drum like thing contributing the strumming which may or may not have aftertouch, and 3) sustain CC if necessary -- all squished into one virtual midi controller to get around Max4Live's limits.

I hope my explanation doesn't make it all seem more complicated! I think I've solved the complexity of the environment that happens before this Strummer object gets called. And I can tweak things as needed. But the Strumming patch is potentially a very cool addition to the setup and seems like its actually close, and with your help I'm understanding more of it...

Thanks!

Source Audio's icon

I will take a look and a read of your explanatins.

You don't need to minimise your wishes when it comes to triggering,

only technical limits of Live might dictate one or the other thing.

As you have to use Live,

let's work with that, instead what's possible in pure Max.

Remove all extra midi inputs, and either use keyboard split, or

receive midi via send/receive from different track(s).

Like in that other thread with similar problem.

if you allways use that 96 ... 107 octave, one can fix that without

using range setup.

You have to decide on that.

by the way, if you are software developer take a look at this :

that is source code of imp.midi partly updated for new max sdk.

maybe you can compile that for Mac arm64

Now to triggering.

It is of course possible to output all notes as a strum,

like in my previous patch, or arpeggiator

using note defined length

like 16th note , or 32 or dotted 16, etc.

all auto calculated from live tempo.

In repeat mode - or arpeggio mode,

one could take initial velocity but keep

changing it by aftertouch or any other CC, all is possible.

I made similar stuff 30 years ago with max as standalone Ddrum station.

Interesting could be ostinato mode, where you store a melody, play it as you wish,

it auto resets to 1st note after set period of inactivity.

and so on, many things can be done.

But one needs to know what gets involved as control sources, and precisely defined.

just few remarks:

If you use pgmout, it's range is 1 -128.

You must limit range of objects that send midi,

otherwise you might break midi transmission.

I prefer raw midi, 192 $1 for pgm change 0 - 127

144 $1 $2 for notes etc.

To randomly trigger held notes, set random range accordingly.

like if you have 5 notes, then 1 - 6.

.....

so to resume, I need infos from you about splitting,

fix or dynamic (limit to one octave ?)

if you want to use tempo/note based repeater arrpeggiator,

and how to include aftertouch or other CC controks.

You dont need to explain it technically, but in simple words.

like for example;

initial trigger sets velocity, aftertouch might SCALE it by ??? %

every new note resets scaling.

same would have to be set for any other controller, what it does,

and what if it is not received.

Also sustain, should it act as HOLD ?

like grab current triggered note and release it on next press.

or as sostenuto ?

Source Audio's icon

P.S

you say that you merge midi inputs from

several devices or tracks.

Is that something new in Live 12 ?

Bill W's icon

This is about as close as I can get the Max4L version to work so far using one virtual controller and a key split.

Everything functions but I'm still getting frequent stuck notes and it's not quite behaving the same way when holding the chord vs releasing the chord quickly.

And Live seems prone to overloads and scratchy sounds when stuck notes occur. I'm testing with a simplified setup and Live's performance monitor doesn't indicate problems.

So I've wired in a brute force all notes off to sustain release. Maybe I should retry what you suggested in an earlier version that sends note off pairs for all notes. I can still add Sustain CC outside the patcher and see how that works.

On the up side, it's showing promise to be very fun to play.

bwstrum_m4l_1.8.amxd
amxd

Thanks again for your very generous help!

Source Audio's icon

The problem is that you can produce duplicate notes.

If you hold full chord and at same time play single notes,

or step Up/Down.

I made a patch with all that included, and then realised that I can not finish it

without your precise instructions.

What when ... ?

Some synths retrigger allready held notes, some accumulate them,

and leave them hanging till all notes get turned off.

Then even for simple up / down trigger,

does direction change reset the counter so that it allways starts from bottom or top ?

or does it go on without taking into account what was before ?

Did you decide what to do when held notes change ?

When you remove or replace held note(s) from the coll,

how do you turn held and now non existing notes off ?

You must check every possible scenario, and then

take actions to produce wished result.

strategies could be someting like only one trigger at a time,

for example if you dump all notes, and then hit any other trigger,

held chord should first turn off.

and so on and so on...

your patch has basic mistakes - black key functions except dump

don't turn notes off .

Because you trigger next note with both note On and note Off.

so previous note does not get turned off....

then you can't connect midiin into notein and ctlin,

use either midiin with midi parse,

or dedicated objects for notes, controllers etc

Source Audio's icon

here is now a bit compex patch, with some rules set :

- trigger input is monophonic, each trigger cancels previous

- Up/down & Arrpegiator start from bottom or top as set,

and reset counter after set inactivity time (now 1000ms)

- tempo based Arpeggio interval

- uzi triggers chord notes

- zl.scramble for random note trigger

- note or chord output turns all notes off before getting out

Max Patch
Copy patch and select New From Clipboard in Max.

Bill W's icon

LOL - you added a lot to digest! Gonna take me a bit to go through it all. Thx so much!

But firstly so the foundation is clear, let me elaborate on how I merge tracks since that's the driver of my whole rig. I've been doing some of this for years and am not sure when they added the "Midi To" feature. But I was using MIDIPIPE prior and created a lot of complicated setups for it. I tried a few alternatives as well but found them to just add unnecessary complexity but not the ability to program things like this strumming idea or very dynamic note remapping/scaling. (And I think, having to eventually learn Max was an inevitability..)

Also, all these tools are separate from Live, where the soundmaking and mixing happens. Eventually I decided if I could move all the midi routing into my Live template, it would be easier to switch from project to project as the configuration of the midi routing was encapsulated inside each Live Set file. This made experimenting and changing things around So much easier.

As for how it works, so yes, you can use the "MIDI To" that's on every channel to send to any of the other channels. And Midi FROM can include other tracks too, not just external controllers.

But that's too simplistic when the routing gets complicated or when you want to tap into midi at multiple points, like before and after you change it. So I started trying to design a Bus that would drive all this but then found the MXL max components and the MXL Send and Receive - a godsend.

In the example below, I'm just daisy chaining 3 controllers into the 4th that has Strum and a VST. So it merges the QuNexus, Boppad, and the Dore Sustain controller. And this works fine.

But using the MXL Send/Receive instead, I can do this via any of the 16 Buses is provides. (in the above example, the mxl stuff is disabled) And this lets me do things like have the QuNexus' raw midi go to Bus A, plus chords to B, maybe up an octave to C, and so on.

And just like I can modify the QuNexus (or whatever's providing the "melody") and eventually get a sound, I do the same with the Boppad (or my edrums). Raw boppad data to Bus E, converted to 16 notes using a big max object on F, tuned to different notes like 96-112 for strumming, etc.

The Sustain controller also goes to a Bus.

Then I can create tracks to make noise with VST's that receive whichever Bus or busses I want for whatever musical purpose. Then Live just mixes them altogether and that's controlled with something like an Akai Midi mix.

( When all this is done, I intend to document it better and create a walkthrough because I think it's a powerful idea. )

This is what it would look like bypassing the MIDI From/Too and instead using MXL Send/Receive.

BTW, this is what the QuNexus track does and where I can add chords from just one note. There are better chord creators, but this is just for testing. It gets midi from Qunexus, immediately sends it to Bus I for an unprocessed note, then to J with the Chorded note.

The MXL bus is a big timesaver, and so far I haven't detected any lag or problems when playing a lot of notes quickly. And you can picture that if I want the whole melodic driver of this to change from QuNexus to another controller, or even a midi sequence, it's really easy. I just send that to the Bus instead.

If anyone at Ableton reads these comments, I would LOVE for more powerful midi routing and buses to be an embedded feature in Live. It would also be nice to segregate these midi processing tracks from audio tracks, but Grouping works well enough.

OK OK, One thing I've been thinking about in testing this is what Sustain should do.

Since the Bus design I described above makes it easy to add Sustain or Not on any VST channel, I think it's best to not do much inside the Strummer in terms of sustaining notes. Because even if you send a quick note off in your strum output, I can still add Sustain back if I choose. And this way I can have the strum output play tracks that are drones and some percussive, simply by whether I merge the Sustain Bus to Strum Output at the channel.

Here's a track with a piano sound getting output from the Strummer on L and Sustain on D. Alternatively, I could have quick metallic bells and leave off D.

Now INSIDE the Strummer, this still leaves a choice to be made as to how long to hold onto the notes in the heldnotes collection. There's something to be said for holding the collection until the next chord is entered. This way you can quickly send it a chord, then play over it indefinitely with two hands and not have to hold down the chord. It's as if there would always be a held chord after the first one. So lets just call this a Latched mode.

However, sustain CC would allow this too. And if the heldnotes collection is cleared when you release sustain (lets call this Unlatched mode), then it would be musically interesting for no Strum notes to come out of the strummer at all, because, surprise surprise, I'm layering other sounds too! The only downside is it requires a foot on the sustain pedal more often, which takes away from my foot action.

Ideally, both Latched and Unlatched are musically useful and interesting. And another footpedal could easily be setup to control it with a different CC. I do something like this elsewhere in my setup.

OK! Let me test your example in more detail and comment back later.

Thanks!

Bill W's icon

Just to append one quick thought to this. I think of the Buses as the plumbing of the overall Live patch, what goes where and how its merged, and then there are Processors that do something and then pass midi on. Processors are Chords, Filtering (ie maybe you just want the BD), ReScale/Quantize, Octave shifts, step through a melody, Samchillian/Eventide Misha like processing that steps through scales, and (hopefully) strumming!

When I first started laying the bus idea out on paper, I pictured it as a grid where you setup your controllers and modifiers as rows and columns and could choose what would be done to them. Then audio tracks could tap into whatever endpoint they required. Ultimately that would be cool, but wiring things point to point using MXL Send/Receive is workable.

Source Audio's icon

I am not using Live so this all is out of my reach ... and interest.

But as general rule, when merging midi from several sources

one should insert watch points to avoid repeated messages

feedback loops etc.