surge-synthesizer / surge

Synthesizer plug-in (previously released as Vember Audio Surge)
https://surge-synthesizer.github.io/
GNU General Public License v3.0
3.15k stars 400 forks source link

Regression in OSC mute/solo behaviour #7579

Closed gitsmol closed 6 months ago

gitsmol commented 8 months ago

Bug Description: Mute and solo commands sent over OSC are partially ignored.

Surge XT Version This was found in https://github.com/surge-synthesizer/surge/commit/520b6f862773388454fc7e83f7bf2f27663e1c1b. Not sure when the bug first occurs. It's not present in 1.3.1.

NB: the bug does not occur in CLI-mode. It's might be akin to 7417.

Reproduction Steps:

The same goes for solo-ing. Tested using OSCD and TouchOSC.

Expected Behavior: For the mute and unmute buttons to toggle on and off. For the UI and OSC to stay in step.

Computer Information (please complete the following!): Macbook M1 Mac OS Ventura 13.6.1

pkstone commented 6 months ago

@baconpaul @gitsmol : I can recreate this, but do not know the reason for the behavior. All other Parameters are working fine, and there is nothing special about '/param/a/mixer/osc1/mute' that I know of. Here is a quick Python script to recreate the error; it is supposed to alternately mute and unmute Osc1 every 2 seconds. Mute the other Oscillators to make it obvious. You can hear that it mutes the mixer strip for Osc1 (and the UI reflects this), but the un-mute never happens, neither audio- or gui-wise. What is the secret to getting "/param/a/mixer/osc1/mute" to unmute?

from osc4py3.as_eventloop import *
from osc4py3 import oscbuildparse
import time

ip = "127.0.0.1"
port = 53280    #Surge XT default OSC in port

def oscOut(addr, val):
    msg = oscbuildparse.OSCMessage(addr, ",f", [val])
    osc_send(msg, "oscout")
    osc_process()

osc_startup()
osc_udp_client(ip, port, "oscout")

for x in range(20):
    oscOut("/param/a/mixer/osc1/mute", 1.0)
    time.sleep(2)
    oscOut("/param/a/mixer/osc1/mute", 0.0)
    time.sleep(2)

osc_terminate()
pkstone commented 6 months ago

@baconpaul I'm zeroing in on this one. It has to do with mute (at least) being stored as a bool in Parameter. There's a 'changed' check in the (OSC-resultant) update of parameters, which is only looking at p->val.f. I will fix this.

pkstone commented 6 months ago

@baconpaul This one is fixed. #7626 is still not fixed.