Bypassed expander behavior?

What is the expected behavior if an expander is bypassed, but the parent module is not? Is there a standard?

Intuitively I expect the parent to treat a bypassed expander as if it is not there. I ran a test with Bogaudio ADDR-SEQ and ASX, and was surprised to see that ADDR-SEQ behavior was identical regardless whether the ASX expander was bypassed or not.

I did not test any other expanders.

I am in the midst of developing my first expander, and want to get the behavior right. It certainly is easier to ignore the expander bypass state. But that just seems wrong to me.

Note - My master module is getting the expander module pointer and reading the expander ports/params directly - I am not using the messaging system.

1 Like

I agree with your intuition that Bypass should be supported when it’s sensible, as it is in this case. Then again, when an extender is in place you can think of the composite as effectively just a larger module. But I lean to your interpretation – seems more useful to implement bypass that way, instead of forcing users to move the extender away to decouple it.

I thought of that. But if that is the case then I would expect bypassing one should bypass the other, and that does not happen (at least not automatically)

It feels like there is lots of room for improvement in the underlying expander API. As it is now it seems like the wild wild west.

  • Expansion configuration
    • List of models that are legal as expanders
      • How many are allowed for each type (chaining), with 0 representing unlimited
      • Which side(s) are legal for expansion
      • Identify which models are expanders and which are parents (only one parent allowed per expansion set instance)
  • Auto detect expansion chains using configuration info, and store an array of expanders found (actually two, one for left and one for right)
  • Extend onExpanderChange to recognize bypass/unbypass, and have the event propagate down the chain
  • Attribute/method to enable or disable an expander (separate from bypass).

Lots of details to be worked out, but I think it would be worthwhile. I might submit a feature request.

Separate but related question -
How do I query whether a module has been bypassed?

I see the on Bypass and onUnBypass events. But I don’t see how to query the module state outside of the events.

You asked:

How do I query whether a module has been bypassed?

Answer: Module::isBypassed

So you just have to find the modules you want to know about.

2 Likes

Doh! Not sure how I missed that. Thanks!

Finding all modules:

  • engine::getModuleIds (two versions - one returning a vec, one filling a buffer)
  • engine::getModule(id) returns a Module*

You can also traverse cables, but that misses modules that aren’t plugged into anything.

1 Like