ConfusingSimpler: multifunction 1-button idea


I am trying to create a multi-function button that will record/overdub on the confusing simpler module when pressed, but when long-pressed, delete the sample.

Recording/overdubbing happens via the record button on the module, so this seems easy, just keeping the same button and sending triggers.

One problem is that there is no “delete” button, so when long-pressing, the button should trigger the confusing simpler stop button so when record is pressed again, the sample is overwritten.

The challenge is how to capture a long-press separately to send it to the stop button. Currently I’m using a gate–>slew–>compare to detect a long press and send a separate trigger. This works great but I don’t know how to prevent the record trigger from also being sent.

Hopefully that makes sense… I’ve tried a few things that didn’t end up working and I have a feeling I’m “over engineering” this thing.

Open to suggestions–ty

Hmm interesting challenge.some part of me thinks getting the signal to either record or delete needs to come from the “unpress”.

slope detector “falling” output would do this.

Anothing thing to play with could be a signal delay. But the slew should work the same…

As far as deleting sample, you could do this with 8face barring any other options… save a preset with the empty simpliciter. But this method also captures knob settings which may or may not be an issue…

Good luck with the rest. Hopefully this isnt a red herring.

1 Like

The first thing I’d do is figure out a way to make the button do nothing on press and do its stuff on release. That’s how long/short press systems typically work. Once you have that in place you can work the rest out I’m sure.


You still need a way to ignore the record if long press has happened… this might be a logic module job.

1 Like

Logic module task indeed. And yeah, that’s what I mean: On press, do nothing, on release either rec/overdub or stop, depending on time held.

Count modula gate to trig (and probably lots of others) will be a good start: 1: Let its rising trig start a counter, or phasor, or your gate->slew->compare setup, or whatever. 2 : Send it’s falling trig to a 1->2 switch. 3: Control the switch with some lingering event triggered by the counter/phasor/whatever (reset by falling trig from CM module). 4: Send the default output from the switch to rec/overdub, and the other output to stop.

Should work right?

1 Like

Oh yeah cm gate to trig would work in exchange of slope detector. (Accomplishing same task)

As for the rest, my imagination is failing me, a image/vid of that patch would help. @andreya.ek.frisk

Probably better to delete as soon as the long press time period has passed so that the user gets feedback and knows it is safe to release without initiating record instead. A flip flop is useful for this.

I am toying with the idea of creating a dedicated module for this in a future Venom release. I hesitate because it would seem better to simply use different buttons for the functionalities, and not mess around with long presses. But if interfacing with a physical control surface with limited inputs, then I see how this could be useful. A long press button would also be useful to protect against accidental presses for destructive actions. But then you wouldn’t need the short press as well.

In the mean time, below are two solutions, one fairly compact version using only Bogaudio, and the other larger but with fewer modules using only VCV Free. Both versions send a green trigger to the scope with a short press, and a red trigger to the scope with a long press.

Long Press.vcv (1.8 KB)

For this solution I need a slew limiter for the rising edge, but “instantaneous” for the falling edge. Bogaudio has this, but VCV Slew is symmetric, so I substitute an ADSR for the slew limiter. The right most VCV Gates module replaces the Bogaudio combination of Edge + FlipFlop. The cables in both solutions are color coded the same (as much as possible). A given color in the VCV solution serves the same purpose as with the Bogaudio solution.

The 2nd Gate to Trigger module in both solutions serves an interesting purpose. It delays the reset of the flip flop until after the the first Gate to Trigger end trigger has finished. This is necessary to properly block the short “record” trigger.


Great solutions.

Thank you–8face was indeed what I was planning to use if I couldn’t figure out a more “traditional” way. I know it will definitely get it done–great suggestion!

Press do nothing definitely a piece of the puzzle. :thinking:

:clap: thanks for this, it looks like it might be what I was looking for. It does confirm my suspicion that the solution is more complex than I imagined. If I get it working I’ll come back to upload the full patch with the simpler

Because BASICally exists to make CV logic like this easier (well, easier if you don’t mind writing scripts in BASICally), here’s @DaveVenom’s patch with the addition of a BASICally script that does this. Note that I’ve resized the BASICally module to take less space.

Long Press (BASICally).vcv (2.6 KB)

The BASICally script is this:

' Gate Input to IN1.
' Click -> OUT1 emits a trigger on release.
' Long press (see 'long' below for length) -> OUT2
'     emits a trigger after 'long' millis.

WHEN start()
  ' Number of milliseconds to be
  ' considered a LONG press.
  long = 1000
  ' state means:
  ' * 0 - unpressed.
  ' * 1 - pressed.
  ' * 2 - long press sent, waiting for release.
  state = 0
  OUT1 = 0
  OUT2 = 0

  IF IN1 > 2 THEN  ' Gate is high.
    IF state == 0 THEN
      state = 1 ' We've started a press.
      start_time = time_millis()
    ELSEIF state == 1 AND 
           time_millis() - start_time > long THEN
      ' This is now a long press.
      ' Send out long press trigger.
      OUT2 = 10
      WAIT 1
      OUT2 = 0
      state = 2
    END IF
    IF state == 1 THEN
      ' press ended before long press time.
      ' Send click trigger.
      OUT1 = 10
      WAIT 1
      OUT1 = 0
    END IF
    state = 0

This will likely get added as a preset to a future version of BASICally.


Nice. I briefly considered trying to code this up with your BASICally or docB Formula One. Especially if you provide a preset, it is even less likely that I will create a dedicated Venom module. I do have a nice design in my head, but I don’t think it is worth doing (unless a bunch of people scream for it)

1 Like

Thank you, it’s really great to have more than one way to solve it.

Ah, good point about deleting during hold rather than on release @DaveVenom That makes a lot of sense. That’s how the long-press to delete on loopers typically works after all. :slight_smile:


I was able to get it down to 4 Bogaudio modules. About the same size as a BASICally or Formula One. :slight_smile: (Though I certainly don’t wanna discourage scripting it, that can be fun)

Long.vcv (1.0 KB)

The first edge sends the short-press trig through. The slew limiter rise time determines the long-press duration. After which the second edge goes high, sending the long press trig and flipping the switch which blocks the short press trig. The slew limiter fall time being non-zero, plus the edges having different thresholds, equals the switch staying flipped when you release after a long press. Besides preventing both triggers from being sent together, it also prevents accidental clicks after the long press, for a duration set by the slew limiter fall time. :slight_smile:



Very clever

I’m thinking the fall time should be as short as possible, yet still prevent any of the the short reset from sneaking through after a long press. If the fall time is too long, then after a short press that comes close, but does not reach the long press - if another press is initiated very quickly, the next long press will require significantly less time because the starting point is not zero. Also, I personally don’t like a dead time when the reset cannot be fired.

That is why I went the flip flop route with reset capability to get very precise timing.

But with your configuration, the fall time can be set as low as 0.002 seconds without any unwanted short reset leakage. I checked using Nysthi Multivoltimetro in Min/Max mode to make sure the reset output remains zero. Two milliseconds is fast enough to be virtually zero for us mere humans.


These are all clever but isn’t the right solution to do this on the ui thread.

When you get mouse down start a timer, when you get mouse up send a Dre cord message if the timer is still live. Otherwise send the delete message when the timer expires, then have clear segregated messages in the backend

You are talking code for a module, yes?

We are trying to achieve that with existing modules, not trying to create a new one. Though I still have a small itch to create a Venom module for this sometime in the future. I have a design sketched out already.

Oh sorry! I thought this was a dev question. Ignore me.