Skip to content
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

find a good multichannel / orbit / pattern abstraction #823

Open
felixroos opened this issue Nov 25, 2023 · 2 comments
Open

find a good multichannel / orbit / pattern abstraction #823

felixroos opened this issue Nov 25, 2023 · 2 comments

Comments

@felixroos
Copy link
Collaborator

find a abstraction that allows using a second stereo output as a cue output

here's 2 graphics made bx @daslyfe

Screenshot_2023-11-21_at_4 18 21_PM Screenshot_2023-11-21_at_4 29 08_PM

channels are implemented in #820

there were some more ideas in chat that I want to drop here:

  • maybe at the top level you can set the q output? something like setQ([2,3])
  • maybe use 1,2 as master out by default and 3,4 as cue by default if it exists
  • it could default to the second stereo pair on the interface
  • still requires some more thought about the relation between pattern names (like x in p(x) or 1...9 in p1..p9) and channels and orbits. also how this would work without using named patterns. I kind of like writing a single stack of patterns as opposed to individual blocks with .pX because it's easier to add transformations to multiple patterns at once / groups of patterns. the all function only partly solves this problem as you still cannot transform only a subset of patterns
    i also wonder if there would be a use case for being able to use the same orbit for different channels. or the same channel for different orbits
  • I was thinking they would act more as traditional fx sends in a DAW, maybe you can configure/ set what channles they output to like orbit(1).setChannels([3,4])
    kinda like setCps
  • it seems like the channel should receive the signal without global effects then (aka pre-send / pre-orbit). post-send/orbit can potentially contain effects of other channels then
  • the question is how would you route the effects into a channel..
    the alternative would be to connect the orbit to the channel (post-send/orbit) . then either let the user set the channels and orbits manually or automatically set the orbit to the channel number
    or do both with something like .preCh and .postCh
  • here is how I was thinking it could work: patternA = sound("bd").channels([2,3]).room(1).orbit(1)
  • orbit(1).setChannels([5,6])
  • channels 5/6 would receive a completely wet output of the reverb signal, and channels 2/3 would receive a dry signal
  • the orbit(1).setChannels([5,6]) syntax might not work, because the orbit function is already defined, as you can use any chained function like .orbit(x) also as top level function like orbit(x, pat). maybe just define a single top level function like this: orbitChannel(1, [5,6]). or alternatively the orbit channel could also be set on the pattern: s("bd").dryChannel([2,3]).room(1).orbit(1).wetChannel([5,6])
  • In any way, this still looks like a lot to write to me if you just want to cue a pattern. Maybe channel should by default set both dry and wet paths to the same channel + use a unique orbit? so s("bd").channel("3:4") would set { dryChannel: [3,4], orbit: '3,4', orbitChannel: [3,4] }. here, the orbit name would just be the stringified channel array
    thinking more about cueing, another handy thing could be a function called qChannel(3,4) that would set the default cue channel used by q1 ... q9 or any .q(x). so if you'd do s("bd").delay(.5).q1 you'd automatically get it sent to channels 3 and 4 including dry and wet signal
  • the problem with the above idea is that the orbit might change when .q1 is changed to .p1 (to send it to the main out). if it's still .q1 , the orbit would be 3,4 (stringified qChannel). when it's changed to .d1, the orbit would be 0,1 (default main channel). There might already be things happening in that orbit, so the delay time / reverb size (which are bound to the orbit) might actually be different in cue (q1) than it is in main out (p1). in reality, you'd expect your cue to reflect what you'd hear later, which is not the case here. so maybe just set the orbit to the q/p value, in this case 1, or by default also 1 when no pq is used. But that default might only be sensible for cueing.. not sure
  • To me, the easiest/ thing that makes the most sense would be to treat the orbits separately as fx busses and set them with orbitChannel(1, [5,6])

#820 should be merged before approaching these ideas.

anyone feel free to drop more ideas here

@felixroos
Copy link
Collaborator Author

also this:

image

@yaxu
Copy link
Member

yaxu commented Dec 6, 2023

Here's how it's configured in superdirt: https://tidalcycles.org/docs/configuration/AudioConfig/audio_outputs/

I.e. you set number of channels to pan across that's the same for all orbits, then set an offset per orbit.

When panning things across more than two channels it normally treats them as being in a ring. There are a few control parameters to set how that works.

Some superdirt discussion about multichannel panning here: musikinformatik/SuperDirt#36

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants