Mutable Instruments UGens

So, if I understand correctly, with this solution, I'd have to put the patterns I want to use clouds and verb on in orbit 1?

Yes, in the orbit 0 (you can substitute the [0] in the code with the orbit number you need). It's more limited but maybe less heavy to handle for the computer

1 Like

mhm thats clever. I'm about to test clouds. but the verb has been working for me. Aside from that, I had to modify warps slightly since I wasn't hearing any thing being process. I basically replace the

ReplaceOut.ar(out, signal);
//with
Out.ar(out,signal);

and then I could hear the result which is nuts!! awesome shaper. now I'm going to try using the freq argument and see if it grabs things like chords and octaves from the pattern (I hope but maybe its not the case since its an effect and not an instrument...)
Also, the plates had this weird thing where it produced two signal that where hard pan on each stereo output. A quick solution that I found was summing both signals that the UGen produces like this

Out.ar(out, DirtPan.ar( (sig[0] + sig[1])/2 * volume, ~dirt.numChannels, pan);

I hope we find a way to use this UGens both as processors and generators, but for now it seems that is one or the other. In my case, for example, I found rings a really nice pluck synth so I'm using it as a synth. But haven't tried it as a modulator yet... Elements the other way around: haven't use it as a synth but as a processor, and haven't got to anything I really dig yet...

1 Like

you can also write sig.sum

and for this: sig.mean

This isn't totally related to the MI Ugens, but is something I've also struggled with figuring out in other areas of Tidal too. Mainly I want to have a sustained chord with plaits and sweep a param, but since the left-most pattern is a pattern of one (just one chord) I don't get a sweep.

d1 $ n ("e'add11")
  # s "plaits"
  # harm 0
  # timbre 0.5
  # morph saw

I've tried this, thinking I could give a pattern to morph to give it more subdivisions, but it doesn't work either (no error, but no sweep either):

  # morph (struct "t*32" saw)

Any ideas?

Of course this works, but I want a sustained chord and sweep, which this is not:

d1 $ n ("e'add11*16")
  # s "plaits"
  # harm 0
  # timbre 0.5
  # morph saw
2 Likes

In my non-producer terminology, you effectively want to apply a changing morph effect to the long plaits note which is only playing one event per cycle - but the problem is the morph value is only being taken/applied at the time of the event?

I think what you're looking for has been implemented in tidal as "control busses", but these are only available on a subset of effects (and these ugens are not one of them)... it would be interesting to know how/if the ugens/scsynth/superdirt defs could be modified to make them work though (any thoughts @yaxu )?

I did a demo with them and midi input here:

Ooo, I didn't know about the new control busses, that's exactly what I need. It'd be great to hear if we can modify ugens/etc. to work. I'd love to be able to use speed as a control bus too (just plugging that feature request).

1 Like

Hi i'm a bit late for this but super excited to get it running. Thanks!!

I am having trouble with the mutable.scd.

I am getting these errors on start up:

ERROR: Class not defined.
  in interpreted text
  line 11 char 31:

      freq = freq * DirtFreqScale.kr(speed, accelerate, sustain);
                                 
      sig = MiBraids.ar(pitch: freq.cpsmidi, timbre: timbre, color: color, model: model);
-----------------------------------
ERROR: Class not defined.
  in interpreted text
  line 26 char 31:

      freq = freq * DirtFreqScale.kr(speed, accelerate, sustain);
                                 
      sig = MiOmi.ar(pit: freq.cpsmidi);
-----------------------------------
ERROR: Class not defined.
  in interpreted text
  line 42 char 31:

      freq = freq * DirtFreqScale.kr(speed, accelerate, sustain);
                                 
      sig = MiPlaits.ar(
-----------------------------------
ERROR: Class not defined.
  in interpreted text
  line 66 char 31:

      freq = freq * DirtFreqScale.kr(speed, accelerate, sustain);
                                 
      sig = MiTides.ar(
-----------------------------------

I used a class that's not yet released in superdirt, you would need the chechout the last commit of the develop version of it, otherwise, you can use the code before I introduced that feature:

1 Like

Thanks!!! This is really a game changer. Still wrapping my head around elements.

I set it as an effect but it can be used as synth itself (same as rings).
I have to admit, my favourites are clouds and verb, I"m not using the others a lot

Hey people, this is great!
It is amazing!
Just dropped in to share my happiness :slight_smile:

1 Like

Hi folks,
@paulchannelstrip and I are embarking on a journey to document these ugens and their parameters, mostly for use in tidal (but the info will have other applicability too).

We're beginning with what constitutes a "Standard Installation" - I've written what I believe to be a "standard install" process for linux specifically, that should be portable to other os' (just need to change the paths)

It'd be great if anyone interested could go through and vet this process, and confirm/provide the correct paths for:

  • windows
  • OSX
  • non-debian based distros (fedora, arch)

The doc is here - very much appreciate any assistance :slight_smile: :

[edit] removed - it's now merged into the offical doc:
https://tidalcycles.org/docs/reference/mi-ugens

7 Likes

@kit-christopher and I had an attempt at doing this on OSX today - I've updated the paths for OSX now, but we still couldn't get SuperCollider to see the ugens

If anyone else familiar with wrangling OSX security and SuperCollider could take a look and report the secret back, that would be amazing :slight_smile:

1 Like

You can disable the security feature temporarily with "sudo spctl --master-disable", allow SC to boot the ugens, then re-enable it immediately afterwards with "sudo spctl --master-enable". This seems to work OK.

But if you prefer to go about things more carefully (by which I mean, NOT disabling the global security mechanism even briefly), this seems to work on OS X Big Sur:

As SC tries to load each ugen, it shows a dialog saying unidentified developer, etc., and suggests moving the ugen file to the trash, or allowing you to cancel.

Cancel the first one, then go to System Preferences > Security & Privacy where you'll see its name mentioned at the bottom of the dialog, something like "MiRipples.scx was blocked from use because it is not from an identified developer."

Next to that text is an "Allow anyway" button. Click that, then return to the next dialog that OS X put up saying that the next ugen was forbidden, and repeat the process.

Once all of them have been given "Allow anyway", if you boot SC again and load the ugens, you will still get dialogs asking if you really want to open each one. But you can say Open, and after that, everything seems to work fine.

2 Likes

Thankyou! Given the quantity/detail of information, I've just pointed osx users to your post in case they're not sure what to do.

1 Like

You're welcome, and thanks for the work on the docs! Hopefully the details in the post work for others too.

2 Likes

@cleary Thanks a ton for the documentation. I'm going through the install right now on OS X, and just hit a snag at the very last step (or so it seems): adding the path to mi-ugens-params.hs to my BootTidal.hs file.

I initially placed my mi-ugens-params.hs file alongside the uGen files under Application Support > SuperCollider > SynthDefs, but hit a :script error — presumably because Haskell doesn't like whitespaces in path names (i.e. /Application Support/)?

I then moved the .hs file to another folder (without whitespaces) — /Users/olivier/Sound/tidal-proj/bootTidal/mi-ugens-params.hs, but on boot, Tidal throws this error:

t> IO error:  ""/Users/olivier/Sound/tidal-proj/bootTidal/mi-ugens-params.hs"" does not exist

Tried removing the quotation marks, but no dice. For reference, I placed the code from step 9 in the documentation at the very bottom of my BootTidal file, like so:

:script "/Users/olivier/Sound/tidal-proj/bootTidal/mi-ugens-params.hs"
^:set prompt (.*$)

Sorry if this falls beyond the scope of this thread. But I feel I'm close :slight_smile:

Hi,

thanks for the documentation!

While checking whether my setup was up to date I realized that if I use the

mentioned way to configure `verb` and `clouds` as global effects
// define global effects for mutable instruments effects
        ~dirt.orbits.do { |x|
            var clouds = GlobalDirtEffect(\global_mi_clouds, [\cloudspitch, \cloudspos, \cloudssize, \cloudsdens, \cloudstex, \cloudswet, \cloudsgain, \cloudsspread, \cloudsrvb, \cloudsfb, \cloudsfreeze, \cloudsmode, \cloudslofi]);
            var verb = GlobalDirtEffect(\global_mi_verb, [\verbwet, \verbtime, \verbdamp, \verbhp, \verbfreeze, \verbdiff, \verbgain]);
            x.globalEffects = x.globalEffects
              .addFirst(clouds)
              .addFirst(verb); 
            x.initNodeTree;    
        };                     
        // end define global effects for mutable instruments effects

Supercollider will exit on the first use of braids.

I have to use

this version to avoid the crash, ...
		{
			var clouds = GlobalDirtEffect(\global_mi_clouds, [\cloudspitch, \cloudspos, \cloudssize, \cloudsdens, \cloudstex, \cloudswet, \cloudsgain, \cloudsspread, \cloudsrvb, \cloudsfb, \cloudsfreeze, \cloudsmode, \cloudslofi]);
			var verb = GlobalDirtEffect(\global_mi_verb, [\verbwet, \verbtime, \verbdamp, \verbhp, \verbfreeze, \verbdiff, \verbgain]);

			~dirt.orbits[0].globalEffects = ~dirt.orbits[0].globalEffects
			.addFirst(clouds)
			.addFirst(verb);

			~dirt.orbits[0].initNodeTree;
		}

... which - as far as I understood, makes verb and cloud only available within a single orbit.

Any ideas of how I can use the multiple orbit configuration and avoid the crash?

EDIT: Sorry, just checked again, I am getting the crash with either configuration as soon as I try to use braids. So I have no idea what is causing the crash.

@oli Might be an issue with the content of file as we've got it at the moment. Try wrapping the entire text of mi-ugen-params.hs with :{ ... :}. For example:

:{
let
-- mutable synths
    timbre = pF "timbre"
...
    warpsvgain = pF "warpsvgain"
    warpseasteregg = pI "warpseasteregg"
:}

Let me know if that works :slight_smile:


@mbutz This sounds like an issue with braids in particular, then. Have you tried updating the UGens to the most recent release and the SynthDefs to the most recent commit?

1 Like