-
Notifications
You must be signed in to change notification settings - Fork 76
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Global send #77
Global send #77
Conversation
…into tape1708+1.0-dev
…into tape1708+1.0-dev
Demonstrates a new behavior for global effects with two features * any sound can independently control the "send" amount to an effect * other events that don't use the global effect won't interfere with the effect's parameters This should make it a little easier to work with multiple streams to a single orbit when global effects are used. This first commit demonstrates the idea with two new global effects: a tape delay and a gated reverb. Example use in Tidal: ``` d1 $ s "bd <~ ~ ~ cr> sn:2 <~ ~ ~ cr>" # release 1 # cut 1 # gateverb 4 # gateverbd 0.5 # gateverbg 0.3 # gateverbr 1 # gain 0.8 d3 $ superimpose (### [bandf "[400,800,1300]", bandq 5]) $ s "arpy*8" # up ("<0 0 3 -5>") # shape 0.2 # gain 0.8 # tape 0.5 # taped 1 # tapefb 0.3 |*| speed 4 ```
The reverb (using `room` and `size`) is now also a "send"-style effect, where `room` is the send amount. `dry` has also been repurposed - it now controls the amount of dry sound in the final mix. A zero value means you won't hear the original sound, but you can still use the various "send" parameters (like `room` `tape` `gateverb`) to get a processed "wet" sound.
Now all the global effects use sends, and should not be affected by other events on the same orbit that don't use effect parameters.
Tweaked GlobalDirtEffect.set so that unspecified (nil value) parameters are ignored when checking to see if a value has changed.
The fix in the previous commit has made the ugly workaround redundant.
I'll try to provide an overview/summary of how things are meant to work
This is implemented by giving every global effect has its own input bus, and the dirt_gate synth handles sending out signals to all the buses using the various "send" parameters. |
Issues that could use work:
|
just two questions back:
This will lead to hanging effects, where the code doesn't reflect the sound you hear. Maybe convenient, but really?
This is the case now, too, isn't it? My main question however is: how do you specify which effects will be each others' inputs? Usually, e.g. you want the leslie go into the room delay, don't you? |
re: first question it might be worth doing this for when at least one synth
is sending something and then revert back to default if nothing at all is
sending a value (the second part being how it is now, no? the first part as
it is now i have to define the same e.g. room and size for every sound in
that orbit otherwise i get it jumping between values)
…On Feb 14, 2018 4:48 PM, "Julian Rohrhuber" ***@***.***> wrote:
just two questions back:
. If an event occurs which doesn't specify one of these parameters, the
effect should just keep using the last specified value.
This will lead to hanging effects, where the code doesn't reflect the
sound you hear. Maybe convenient, but really?
For each global effect there is a "send" parameter that controls how much
of the signal goes to the global effect
This is the case now, too, isn't it?
My main question however is: how do you specify which effects will be each
others' inputs? Usually, e.g. you want the leslie go into the room delay,
don't you?
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
<#77 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AOffrsojb9IXLk4GNki8m1y0Au0F_pnFks5tUwA0gaJpZM4SFcpk>
.
|
One of my classic test cases is something like this:
In "standard" SuperDirt, the "cp" winds up resetting the delay unit and so the "bd" cuts off unexpectedly. If you change to This does lead to situations where if you change the first part to just
Not exactly, for example the
I have not thought about this at all - I was thinking of the effects as being completely independent (but you're right, I don't think this was previously the case). If each effect now gets its own bus, I think they are pretty much independent - I don't know if that's desirable. |
I think the problem is that I don't know a foolproof way of defining "nothing at all is sending a value". The tape delay has feedback and up to an eight-second buffer; I quite often do something like
and then silence Perhaps just waiting until the effect itself is completely silent? Maybe something could be built into DirtPause to reset the effect parameters. |
then you should be sending to two different orbits. The whole point of an orbit is to allow independent global effects and default parameters.
|
Ok, that is indeed weird, we should probably change that default behaviour. |
I see. Yes, this is a real specification problem - I think it needs to be solved in tidal first (that is, we should discuss what we intend it to mean). What you intend is probably something like this:
But you see now why dirt is "dirty" - it isn't pure, has side effects. For global effects, they are desired. |
Meant to post thoughts sooner...
Right, the thing I was slow to realize is that "independent global effects" also includes not using any global effects on a "track". I.e. if I have some stuff that I don't want any effect on, and some stuff I do, I almost always need two orbits. In practice what I've found is that I need to use a separate orbit for every global effect. But I don't always plan out my global effect usage ahead of time, so it means on-the-fly remembering that once I do decide to use one, I need to pull that stuff out and send it (and only it) to another orbit. And if I'm just using a separate orbit for each global effect it makes me wonder why I don't just build that into my definitions, so that I've realized what I'm doing in this PR is almost equivalent to that, but instead of an automatic new orbit per effect I'm using a new bus per orbit. So in this PR if I want to have a The main functional difference in this PR, then, is just that I no longer have to worry about specifying orbits. Except for the rare case when, for example, I want something like two different reverb units playing on different sounds simultaneously. I personally find this easier to use, but I recognize that it's at least partly due to a particular mental model I keep in my head, and that any "global effect" implementation is going to have to stash the weirdness somewhere. |
@bgold-cosmos what do you think of the idea of the editor sending each pattern to a different orbit by default? (I mentioned it as part of this issue #74) |
@yaxu I think I'd still prefer this PR, because of the following cases:
Orbit-per-pattern would still chop off the delay tail, this PR "localizes" the send parameter (
Probably not a big deal, but orbit-per-pattern would force me to break this up into two patterns, or otherwise have to remember about whether I was stepping on |
Yes, this is not good, I see. But this is really a missing separation of parameters between In principle it would be very easy to just give every global effect its own private bus. No need to add them to the orbit. I'd find that quite reasonable. As you've mentioned, the disadvantage is that you can't play these effects into each other. Say you want to add a dub siren (which would have to be a global effect if it should be continuous), you sure want to add some delay to it … But maybe there is a simple way we can think up to route between them. In the end it is mainly a specification problem on the tidal side (that is in our imagination while playing). |
So my main hesitation is right now: if we separated the send from the wet-dry for every effect, would there still be something missing? If yes, we could just give every effect its own bus. If no, I'd prefer to fix that. |
I'm not completely sure I understand, but I think what you're asking about is the distinction between what I might call "input gain" (send amount) and "output gain" (return amount) for each global effect. Most of the effects are actually linear w.r.t. input gain, so there's no need for individual dry/wet knobs (return gain) on each effect. For example, if you want to double the output of the delay unit, you can just double the send (input) by doubling Another point - even in the existing SuperDirt, the global effects all take input from the dryBus and output to the effectBus, so there's never been any signal routing from one global effect to another. The "local" effects do happen in a chain, and that's where the |
I've spent some more time on thinking this through. Indeed, effect chaining was something I have removed already a while ago. So all effects are indeed independent already. If I see this correctly, we have two separate issues, an easy one and a more difficult one:
Thus, say you first play: what should happen? When you don't mention it, should a parameter: Normally, I'd say If you say One way to solve Any thoughts? P.S.Essentially, these are two different semantics for code in general: a. code means sound P.P.S.The PR is #80. |
hi @bgold-cosmos ! I noticed you are still working on this. Are you not happy with the solution I have proposed (#80)? After your helpful comments I had realized that the extra busses are not necessary after all. |
Actually didn't mean for that push to go here. I didn't want to switch branches right before AlgoSix, and haven't had a chance to thoroughly check out #80 since then. I'll definitely be doing that soon since I'd rather not have to deal with separate branches. |
No need to check out #80, it's already merged. You should have it in 1.0-dev. I am not saying it's complete, but ready to be tested and reconsidered what is still missing. |
OK, I think it might be best to close here and continue the conversation in issue #75 |
This PR is for discussing how a modified effects routing might look like. Thanky to @bgold-cosmos !