pantherb / setBfree

DSP tonewheel organ
http://setbfree.org
GNU General Public License v2.0
194 stars 35 forks source link

Vibrato switches are not sent back when program change #52

Closed brunetton closed 6 years ago

brunetton commented 6 years ago

Hi again. Still trying to get a full MIDI feedback with command line version, I came across some little things that you maybe would to be aware of. Here is one of those things:

Command line version nor UI sent me back any CC MIDI message for a Program Change implying vibrato switch. For example, given this programs file:

# Program 1
2 {
   name="Program 1",
   vibratoupper=on,
   perc=on,
  }

# Program 2
3 {
   name="Program 2",
   vibratoupper=off,
   perc=off,
  }

And this config file:

midi.controller.upper.80=percussion.enable
midi.controller.upper.84=vibrato.upper

Switching between Program 1 and Program 2 repetelively only send back CC 80 0 and CC 80 127, not CC 84 0 and CC 84 127

brunetton commented 6 years ago

This is the same with rotary.speed-preset. Do you want me to open another bug ?

x42 commented 6 years ago

That's a conceptual issue (and identical to #51). For historical reasons there are different messages which can trigger the same action, and feedback is indeed not consistent.

Using a Program Change to en/disable vibrato uses vibrato.routing to set the tow vibrato switches atomically.

A config file

midi.controller.upper.84=vibrato.routing

will provide feedback bit 6 (64) for "upper" and bit 5 (32) for "lower" vibrato.

I'll see if it can also trigger other, newer, dedicated "vibrato.upper" mappings.

x42 commented 6 years ago

No need to open another bug for the Leslie.

The following are currently ambiguous and/or inconsistent:

  "vibrato.routing",            /* off/lower/upper/both */
  "vibrato.upper",              /* off/on */
  "vibrato.lower",              /* off/on */

  "swellpedal1",                /* Volume, for primary ctrlr (mod wheel) */
  "swellpedal2",                /* Volume, for secondary ctrlr (expression) */

  "rotary.speed-preset",        /* stop, slow, fast, stop */
  "rotary.speed-toggle",        /* sustain pedal */
  "rotary.speed-select",        /* 0..8 (3^2 combinations) [stop/slow/fast]^[horn|drum] */
brunetton commented 6 years ago

Why not making a 1 - 1 matching between UI widgets and CC signals ? One signal per widget. This doesn't prevent from adding additional features on top of it (like the one-knob vibrato control), but it ensure that UI users that add signals receive the signals they defined from UI. A more advanced user should use program file to use other advanced messages.

What do you think about that ?

x42 commented 6 years ago

There is backwards compatibility to consider e.g. the two swellpedaloption go all the way back to beatrix (2004). Also the original vibrato.routing cannot be removed without breaking old config files and/or existing DAW sessions.

While you might be comfortable to write core and build on top, most musicians are not. This is why some wrapper were added (dedicated vibrato.upper and vibrato.lower as well as rotary.speed-toggle).

Anyway, it isn't too hard to properly send feedback.

brunetton commented 6 years ago

Thanks !

In all this comment, I'm using 23ae3055634c6a7c6abe91b226809de3d913d90f

This is perfect for vibrato.upper and vibrato.lower; as they emit the same values they receive, independently. This works with O-S-C: I can control each vibrato independently, and when they change due to program chance, O-S-C UI receive the "good" signal (0 or 127) and buttons are updated correctly.

=> thanks a lot ! :champagne:

Unfortunately, I did not manage to have the same comportment with whirl :s I probably missed something, and I'm sorry for that.

I used the whirl messages this configuration for testing whirl messages:

midi.controller.upper.80=percussion.enable

midi.controller.upper.91=rotary.speed-select
midi.controller.upper.92=rotary.speed-preset
midi.controller.upper.93=rotary.speed-toggle

(I don't really get the difference between those 3 signals so I put all of them to be sure not to miss something)

1 {
   name="off",
   rotary=off
   perc=off
  }

2 {
   name="Chorale",
   rotary=chorale
   perc=on
  }

3 {
   name="Tremolo",
   rotary=tremolo
   perc=on
  }

Two problems appears:

Problem 1: no whirl feedback from program change

When I switch from Programs 1, 2 and 3, only CC 80 (percussion) is sent by setBfree, there's no CC 90, 91 nor 92 :(

Problem 2: CC values from UI are inter-dependent

Here's the explanation in details. The table shows received signals values after changing the position of rotary switches in UI:

The "Received values" column represent : (rotary.speed-preset CC value, rotary.speed-select CC value) (rotary.speed-toggle is never sent).

Lower Upper Received values
Chorale Chorale (0, 64)
Chorale Off (64, 64)
Chorale Tremolo (127, 112)
Off Chorale (0, 48)
Off Off (64, 0)
Off Tremolo (127, 96)
Tremolo Chorale (0, 80)
Tremolo Off (64, 32)
Tremolo Tremolo (127, 127)

Here's the O-S-C controls that I defined: osc whirl

What I actually need is:

With the actual received signals values, I can't say to O-S-C:

because those values depends from lower whirl control position !

For example, the same table, with the signals values I would need: (with mapping 127 for Tremolo, 0 for Off and 64 for Chorale in this example)

Lower Upper Received signals
Chorale Chorale (64, 64)
Chorale Off (64, 0)
Chorale Tremolo (64, 117)
Off Chorale (0, 64)
Off Off (0, 0)
Off Tremolo (0, 127)
Tremolo Chorale (127, 64)
Tremolo Off (127, 0)
Tremolo Tremolo (127, 127)

Those two signals could be named rotary-speed.upper and rotary-speed.lower, by analogy to vibrato.upper and vibrato.lower.

I hope I'm more clear this time and you'll be able to put the finger on what I missed to understand !

Thanks again, really !

x42 commented 6 years ago

Problem 1: see https://github.com/pantherb/setBfree/blob/master/pgm/default.pgm#L69-L71 it's rotaryspeed (not rotary)

Problem 2: that is exactly whey I expect. not a bug.

The difference is that rotary.speed-preset reports the horn, but when you invoke it, it sets both horn and drum speed. It's also mapped so that 0, 127 switches slow/fast (with off in the middle) so that it can be conveniently bound to a mod-wheel or a MIDI foot-pedal which only has two states.

In the past it was possible to customize these presets, luckily no user did that, so that feature was removed (but the property name remained for compatibility).

rotary.speed-select allows for fine-grained separate control of all possible off/slow/fast combinations, just in case.

I don't see a case to actually add even more duplicate properties. In reality switching drum and horn rotor separately is rare (only modded Leslies)

x42 commented 6 years ago

perhaps the following table makes this more obvious (with default preset):

Drum Horn rotary.speed-select .preset write .preset feedback
stop stop 0 (64) 64
chorale stop 16 - 64
tremolo stop 32 - 64
stop chorale 48 - 0
chorale chorale 64 0 0
tremolo chorale 80 - 0
stop tremolo 96 - 127
chorale tremolo 112 - 127
tremolo tremolo 127 127 127
brunetton commented 6 years ago

Problem 1: see https://github.com/pantherb/setBfree/blob/master/pgm/default.pgm#L69-L71 it's rotaryspeed (not rotary)

Indeed ! Shame on me !

In reality switching drum and horn rotor separately is rare (only modded Leslies)

That was the thing ! I didn't knew that. So I can use rotary.speed-preset to control horn and drum speeds and monitor horn speed, using horn and drum together.

So; I think this was the last problem I had using setBfree in combination with O-S-C and it's solved :) I'm very enthusiast ! Thanks again for all :)

x42 commented 6 years ago

In reality switching drum and horn rotor separately is rare

To further elaborate: Most musicians on stage only toggle between chorale / tremolo (both drum and horn). Stopping the Leslie can result in the horn pointing in some odd direction.

setBfree offers ways to configure this and does allow for fancy settings. but remote-control via MIDI is probably not the best way to interact. Also it is rather something you'll do in a studio, or when working offline (mod your leslie) -- not live on stage.

Have a look at the "setBfree whirl speaker" UI :)