porres / pd-else

ELSE - EL Locus Solus' Externals for Pure Data
Do What The F*ck You Want To Public License
297 stars 35 forks source link

plaits~ #1888

Open porres opened 1 year ago

porres commented 1 year ago
porres commented 1 year ago

modes 18,19,20 (6op fm) dont work with trigger

tomara-x commented 1 year ago

modes 18,19,20 (6op fm) dont work with trigger

cause they need a gate signal (cause they can sustain). stick a [timed.gate~] for example into the second inlet

porres commented 1 year ago

that doesnt make much sense, all modes can sustain

tomara-x commented 1 year ago

outside of trigger mode the object is an oscillator (a sound source) which means it is sustained, that's what's expected of it. in trigger mode it has a built-in decay envelope for all models. for fm models, however, it has a different envelope that needs a gate (there are pads and stuff like that, and they have sustain and a release stages)

porres commented 1 year ago

I see, it doesn't work with bangs anyway, so it makes it useless and I guess it's best to just delete this feature and have control numbers do the triggering job. I've been changing they way trigger mode works anyway so I can design a proper abstraction that emulates the module.

And what about the interaction between trigger and level? It doesn't work well! It seems it's an internal bug and there's nothing I can do but maybe create some workaround hack.

When you have both connected, the trigger mode is kinda ignored and the level input superseedes it Screen Shot 2023-10-17 at 16 41 41

porres commented 1 year ago

When you have both connected, the trigger mode is kinda ignored and the level input superseedes it

this only works well for modes 11, 12. 18, 19 & 20, where the level input is used for something else

porres commented 1 year ago

fixed/changed the trigger issues

porres commented 1 year ago

trigger and level interplay is still an issue

tomara-x commented 1 year ago

you removed the bang trigger instead, you're aware of that? this will break any existing patches, you're aware of that?

porres commented 1 year ago

of course

tomara-x commented 1 year ago

so it's a breaking change for the sake of.. what?

porres commented 1 year ago

The whole idea is just wrong, in every case you need a "proper" gate input, you can test and see how impulses don't really work, and while most modes will respond to a gate on activation only, modes 18-19-20 need a gate on and a gate off switch. So what the object needs for a control input is a toggle, not a bang, and you can see that what started this is that a bang didn't work for modes 18-19-20

The whole desing principle was flawed and, well, I don't even remember who put this there and where we got it from, but the code was also overly complicated because of this as it was actually emulating a gate on and off internally, so it tried to adapt [plaits~] to the Pd context in a silly way as I see it. If I had done it all from the beggining, I don't think I'd include it in the first place.

The object already behaved nicely if you had a control gate value in the 2nd inlet. I now also added an example for that in the documentation, and it works perfectly well for all modes.

Screen Shot 2023-10-18 at 13 25 15

Something else I had to change is how it would automatically get into the trigger mode if a signal is connected. This is really bad for a GUI abstraction as the modules I'm designing, as it has a 0 signal connected to it even if nothing is connected to the abstraction, so now you have to manually set it to trigger mode, in both cases. This idea was also kinda bad to me, that you'd have to set it to trigger mode only if you wanted to control it via control data... that was just forcing an idea that makes sense in the modular world, but not in the Pd world, so it's funny that there was an attempt to adapt things to the Pd world, but it was really good and still forced things that aren't really good for Pd...

I know I'm digressing now, but just to say, next step is that I'll also need to manually activate the 'vca' mode, so I can design a proper GUI module abstraction, for the same reason, but specially because things aren't working well when both inlets are connected, and I'll also have to document that I guess...

Now, I know breaking stuff sucks, but I'm not willing to commit to something I think it's a bad idea and not something I designed in the first place. I do break things even when I design something and then realize it was a bad idea.

And I knew that this object was being included with many many things still uncertain, and this is why I also put it in the documentation that "this object is still experimental".

ELSE in its whole is still experimental and subject to breaking changes, but objects marked with "experimental" are basically things that will most likely and surely change/break. And even with current changes I'm not sure I am ready to remove the 'experimental' warning.

cheers

tomara-x commented 1 year ago

you literally didn't answer how having the bang trigger as an extra is problematic. it doesn't work for the three fm models because you can't trigger an adsr with a bang. but it works for all other models which use a decay envelope.

porres commented 1 year ago

you literally didn't answer how having the bang trigger as an extra is problematic.

geez, I went on and on saying how I thought it was stupid, wrong, unnecessary, well, I'll just say I'm trying to reduce unnecessary complexity. The thing on its own is already a nightmare as is, introducing more unnecessary complexity on a Pd wrapper because of a misconception that does not function in all cases is not something I'm willing to add, as there is already a way of doing things that works well for ALL cases.

I try really hard (and I know I sometimes fail) to follow a KISS (Keep it simple, stupid) principle, that's all I have to say

porres commented 1 year ago

Stuff from manual that need attention and figuring out:

https://pichenettes.github.io/mutable-instruments-documentation/modules/plaits/manual/#

F. Attenuverters for the TIMBRE, FM and MORPH CV inputs. When the corresponding CV input is left unpatched and the trigger input [3] is patched, the attenuverter adjusts the modulation amount from the internal decaying envelope generator. When unplugging a CV input, and if the trigger input is patched, remember to reset the attenuverter to 12 o’clock if you do not want the internal envelope to take over!

  1. Trigger input. Serves four percussive purposes:

Triggers the internal decaying envelope generator. Excites the physical and percussive models. Strikes the internal low-pass gate (unless the LEVEL CV input [4] is patched). Samples and holds the value of the MODEL CV input.

  1. Level CV input. Opens the internal low-pass gate, to simultaneously control the amplitude and brightness of the output signal. Also acts as an accent control when triggering the physical or percussive models.

A collection of speech synthesis algorithms.

MORPH: phoneme or word segment selection. When HARMONICS is past 11 o'clock, a list of words can be scanned through by turning the MORPH knob or by sending a CV to the corresponding input. One can also patch the trigger input [3] to trigger the utterance of a word, use the FM attenuverter to control the intonation and the MORPH attenuverter to control speed.

The physical and drum models employ their own decay envelope and filter. The internal LPG is disabled for them:

The TRIG input triggers the synthesis of the signal, but doesn't strike the LPG. When the TRIG input is patched, the LEVEL input works as an accent control.

porres commented 1 year ago

Level CV input. Opens the internal low-pass gate, to simultaneously control the amplitude and brightness of the output signal. Also acts as an accent control when triggering the physical or percussive models.

So yeah, we got it all wrong! This acts much like a trigger, not a VCA, and answers my question as it takes things over and actually controls the internal LPG! When closing a gate, it does take some time (the decay time, actually) to turn things down. It also controls the brightness as it says (interplays with cutoff?)

Anyway, we have to rewrite the help file and get this straight.

We also need to map which modes have a trigger and level interaction

porres commented 1 year ago

This is what I am making of it and I can't believe what a nightmare of complexity and weirdness we have with all these models... it's being a good torture trying to figure things out and document it properly...

The level supercsedes triggering and controls the LPG with a sustained gate. Nonetheless, both trigger and level input work together for mode 7 (vowel and speech synthesis), where the trigger triggers the utterance of a word and the level input controls the LPG (we also need attenuvertes to control more stuff btw)

Other modes can work with both a trigger and level input, but for them, the LPG is disabled (and hence so are the decay and cutoff settings). These modes are: 11 (inharmonic string modeling), 12 (modal resonator), the percussive modes 13 (bass drum), 14 (snare drum) and 15 (hi hat), as well the 6 op FM modes (18, 19 and 20).

In modes 11 and 12, the trigger input triggers a percussive decay envelope, while the level signal works as an accent control, but impulses. When not being triggered, the level input works as an exciter for the models.

In the percussive modes 12 to 15, the trigger input also triggers a percussive decay envelope and the level input also works as an accent control.

In FM modes 18 to 20 you have attack and release envelopes that are controlled by trigger input with a gate on and off, this means that in this case the trigger input controls holds a sustained sound when the gate is on. The level input controls loudness or timbre depending on how each preset is programmed. Without the level input enabled it's like this parameter is set to '0.5'.

porres commented 1 year ago

I can of course be missing some secrets...

porres commented 1 year ago

I did add examles for all models and tested things, there were things missing and wrong again... here's a sumary

The 'trigger' message or flag enables 'trigger' mode, where in most cases the 2nd inlet takes pulses to trigger a built in LPG (LowPass Gate) with a percussive one shot envelope with no sustain and just a decay stage. The LPG has a frequency cutoff setting and a decay parameter. This mode is useful for generating kind of percussive sounds.

You can also enable the 3rd inlet for a level input instead. In this case the signal level input controls the LPG and provides an attack ans sustain stage. If both modes are enabled, the level input supersedes the trigger mode, but they can work together in a few modes.

In mode 7 (vowel and speech synthesis), only the level input controls the LPG. The trigger triggers the utterance of a word and supersedes the level input.

In mode 23 (Chiptune), only the level input controls the LPG. In trigger mode you have a continuous tone and an arppegio note variation at each trigger.

In other modes where trigger and level work together, the LPG is actually disabled (and hence so are the decay and cutoff settings). These modes are: 11 (inharmonic string modeling), 12 (modal resonator), the percussive modes 13 (bass drum), 14 (snare drum) and 15 (hi hat), as well the 6 op FM modes (18, 19 and 20). See details below.

In modes 11 to 15, the level signal works as an envelope. If the trigger mode is enabled, the level input works as an accent while the trigger triggers a percussive decay envelope.

In FM modes 18 to 20 you have attack and release envelopes that are controlled by trigger input with a gate on and off, this means that in this case the trigger input can hold a sustained sound when the gate is on. The level input controls loudness or timbre depending on how each preset is programmed. Without the level input enabled it's like this parameter is set to '0.5'.