Twister Sister - MIDI Fighter Twister controller extension

RELATED
PRODUCTS

Post

Not satisfied with existing extensions and having a general interest in learning the API, I decided to set out creating my own extension for the MIDI Fighter Twister. This is the result.

A TLDR of the features:
  • 1 bank for track/device control and navigation
  • 3 user mappable banks with user settable light colors that get saved with the project
For the most part it's straight forward stuff, but there is one feature that I think is novel. There are two controls on the "track & device" bank that can be configured to control specific parameters on any number of specific devices. For example, you could have all your reverb plugins map their mix and decay parameters to these knobs.

This is configured using an external TOML file and is pretty flexible. The code that does this is also fairly generic and could be used in other extensions rather easily.

For more detailed info about features, see the docs linked below.

Source: https://github.com/dozius/TwisterSister
Docs: https://github.com/dozius/TwisterSister/tree/main/docs
Downloads: https://github.com/dozius/TwisterSister/releases

Post

Thanks for sharing, I need to try this.

Post

This is odd:
image_2021-04-18_145226.png
But:

Code: Select all

% ls ~/Documents/Bitwig\ Studio/Extensions
DrivenByMoss.bwextension  SpecificDeviceSettings.toml  TwisterSister.bwextension
You do not have the required permissions to view the files attached to this post.

Post

That does seems strange. Maybe Java doesn't resolve "~" and needs the full user directory instead. I'll try to see if I can find some documentation for this.

Unfortunately, I don't have anything that runs MacOS to test on.

Post

Code: Select all

      case MAC:
        return System.getProperty("user.home") + "/Documents/Bitwig Studio/Extensions/" + file;
Seems to have done the trick. Can make a PR if you like.

Post

Cool, I had just come back here to offer a test build that did exactly this. Good to know it actually works. Thanks for letting me know. No need for a PR, I already have a local branch with a similar change in it. I'll put up a release later tonight.

Post

Thanks!

Post

I'm enjoying this, thank you.

In my limited API poking I haven't seen it, but maybe there is a way to decouple a controller from an active selected track? Like, Track 1 is selected (and being controlled by another controller) while MFT controls track 2. If so, would be a great addition, for example: push-turn knob 1 "selects" another track for the MFT without changing track focus, long push resets.

Post

Good news, this is already available. If you open the "Studio I/O" panel, the track cursor and device cursor are available there. If you "pin" the cursor using the little push pin icon then the cursor will stop following the selection.

I didn't think to include this in the documentation because this isn't specific to this extension. It's how the cursors in the API work in general. Discoverability is pretty poor though. Maybe it warrants a short blurb in the docs.

Post

😲It probably is in the docs and I just didn't remember seeing it. Ok then! Thank you for pointing that out, that's amazing news.

Wonder if the pinning of the track is API accessible...

Post

It should be accessible. Anything that inherits the PinnableCursor interface will have "isPinned()" which is a settable boolean value.

Post

Hello
I really like the track/device bank!Thanks!
Is there currently a way to select tracks in a group track with the track selection knob?
It skips them in my project (3.3.7).

Post

No, you have to manually select into/out of groups.

edit: I was trying to remember exactly what stopped me from pursuing this further, so I played around a bit this evening. Then I ran into it again. It was the folding/unfolding of groups that killed it. If you navigate into a group that is folded, it does not unfold automatically. Your cursor gets lost inside the folded group. This is pretty unexpected and can get pretty disorienting if you aren't sure which group the cursor is hidden inside. I suppose you could always manually click select a visible track to reorient, but it just felt too broken.

If Bitwig was smart enough to unfold the groups automatically when you navigate into them or if there was a way to programmatically force them to unfold when you navigate into them, then I would add this feature. If someone knows a way to do this, let me know!

Post

Found a small issue with the controller extension: when a device knob was moved by automation the LED ring reflects that but the knob remembers its previous position — so moving the knob jumps to the value it had before automation happened and goes from there. Interestingly this doesn't happen when just moving the control with the mouse, both the ring and knob value get updated correctly.

To reproduce (on 3.3.7): create parameter automation with a single point, play, move the knob, restore automation, move knob again.

Post

The knobs are set to relative and don't store any kind of position state. All Bitwig sees from the controller is increment/decrement pulses, so I don't see how this could be coming from the extension side. Seems like the issue is with Bitwig. Maybe try reporting the bug to the Bitwig team and see what they say.

Post Reply

Return to “Controller Scripting”