Exemple #1
0
 public static Graph synth(IUgen ugen)
 {
     try
     {
         var root = prepare_root(ugen);
         var gn   = mk_node(root, empty_graph());
         var gr   = gn.Item2;
         var cs   = gr.constants;
         var ks   = gr.controls;
         var us   = gr.ugens;
         var us1  = us;
         us1.Reverse();
         if (ks.Count != 0)
         {
             var node = sc3_implicit(ks.Count);
             us1.Insert(0, node);
         }
         var grout = new Graph {
             nextId = -1, constants = cs, controls = ks, ugens = us1
         };
         return(grout);
     }
     catch (Exception)
     {
         throw new Exception("synth");
     }
 }
Exemple #2
0
 public static List <IUgen> mce_extend(int n, IUgen ugen)
 {
     if (ugen is Mce mc)
     {
         var iList = mc.ugens.l;
         return(extend(iList, n));
     }
     else if (ugen is Mrg mg)
     {
         var ex  = mce_extend(n, mg.left);
         var len = ex.Count;
         if (len > 0)
         {
             var outv = new List <IUgen> {
                 ugen
             };
             outv.AddRange(ex.GetRange(1, n - 1));
             return(outv);
         }
         else
         {
             throw new Exception("mce_extend");
         }
     }
     else
     {
         var outv = new List <IUgen>();
         for (var ind = 0; ind < n; ind++)
         {
             outv.Add(ugen);
         }
         return(outv);
     }
 }
Exemple #3
0
 public static Input mk_input(MMap mm, IUgen fp)
 {
     if (fp is FromPortC fpc)
     {
         var p = fetch(fpc.port_nid, mm.cs);
         return(new Input {
             u = -1, p = p
         });
     }
     if (fp is FromPortK fpk)
     {
         var p = fetch(fpk.port_nid, mm.ks);
         return(new Input {
             u = 0, p = p
         });
     }
     if (fp is FromPortU fpu)
     {
         var u = fetch(fpu.port_nid, mm.us);
         return(new Input {
             u = u, p = fpu.port_idx
         });
     }
     throw new Exception("mk_input");
 }
Exemple #4
0
 public static Tuple <INode, Graph> mk_node_u(IUgen ugen, Graph gr)
 {
     if (ugen is Primitive pr1)
     {
         var ng      = acc(pr1.inputs.l, new List <INode>(), gr);
         var gnew    = ng.Item2;
         var ng1     = ng.Item1;
         var inputs2 = new UgenL();
         foreach (var nd in ng1)
         {
             inputs2.l.Add(as_from_port(nd));
         }
         var rate  = pr1.rate;
         var name  = pr1.name;
         var index = pr1.index;
         foreach (var nd2 in gnew.ugens)
         {
             if (find_u_p(rate, name, index, nd2))
             {
                 return(new Tuple <INode, Graph>(nd2, gnew));
             }
         }
         var pr = new Primitive {
             name = name, inputs = inputs2, outputs = pr1.outputs, special = pr1.special, rate = rate
         };
         return(push_u(pr, gnew));
     }
     throw new Exception("mk_node_u");
 }
Exemple #5
0
        public static Tuple <INode, Graph> push_u(IUgen ugen, Graph gr)
        {
            if (ugen is Primitive pr1)
            {
                var node = new NodeU
                {
                    nid     = gr.nextId + 1,
                    name    = pr1.name,
                    inputs  = pr1.inputs,
                    outputs = pr1.outputs,
                    special = pr1.special,
                    ugenId  = pr1.index,
                    rate    = pr1.rate
                };

                var ugens = new List <NodeU>();
                ugens.Add(node);
                ugens.AddRange(gr.ugens);
                var gr1 = new Graph {
                    nextId = gr.nextId + 1, constants = gr.constants, controls = gr.controls, ugens = ugens
                };
                return(new Tuple <INode, Graph>(node, gr1));
            }
            throw new Exception("push_u_p");
        }
Exemple #6
0
 public static bool is_mce(IUgen ugen)
 {
     if (ugen is Mce)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Exemple #7
0
        public static IUgen mk_oscillator(Rate rate, string name, UgenL inputs, IUgen ugen, int ou)
        {
            var rl = new RateList {
            };

            for (var ind = 0; ind < ou; ind++)
            {
                rl.Add(rate);
            }
            return(mk_ugen(name, inputs, rl, 0, 0, rate));
        }
Exemple #8
0
        public static IUgen mce_expand(IUgen ugen)
        {
            if (ugen is Mce)
            {
                var lst   = new List <IUgen>();
                var ugens = ((Mce)(object)ugen).ugens.l;
                foreach (var elem in ugens)
                {
                    lst.Add(mce_expand(elem));
                }
                var outv = new UgenL();
                outv.l = lst;
                return(new Mce {
                    ugens = outv
                });
            }
            else if (ugen is Mrg)
            {
                var left  = ((Mrg)(object)ugen).left;
                var right = ((Mrg)(object)ugen).right;
                var ug1   = mce_expand(left);
                return(new Mrg {
                    left = ug1, right = right
                });
            }
            else
            {
                bool rec <V>(V ug)
                {
                    if (ugen is Primitive)
                    {
                        var inputs = ((Primitive)(object)ug).inputs;
                        var ins    = inputs.l.Where(is_mce);
                        return(ins.ToList().Count > 0);
                    }
                    else
                    {
                        return(false);
                    }
                }

                if (rec(ugen))
                {
                    return(mce_expand(mce_transform(ugen)));
                }
                else
                {
                    return(ugen);
                }
            }
        }
Exemple #9
0
        public static IUgen mk_osc_id(Rate rate, string name, UgenL inputs, IUgen ugen, int ou)
        {
            var rl = new RateList {
            };

            for (var ind = 0; ind < ou; ind++)
            {
                rl.Add(rate);
            }
            var inps = new UgenL {
            };

            inps.l.AddRange(mce_channels(ugen).l);
            return(mk_ugen(name, inps, rl, UID.nextUID(), 0, rate));
        }
Exemple #10
0
 public static int mce_degree(IUgen ugen)
 {
     if (ugen is Mce mc)
     {
         return(mc.ugens.l.Count);
     }
     else if (ugen is Mrg mg)
     {
         return(mce_degree(mg.left));
     }
     else
     {
         throw new Exception("Error: mce_degree");
     }
 }
Exemple #11
0
 public static Mce mce_transform(IUgen ugen)
 {
     if (ugen is Primitive prim)
     {
         var inputs = prim.inputs;
         var ins    = inputs.l.Where(x => is_mce(x));
         var degs   = new List <int>();
         foreach (var elem in ins)
         {
             degs.Add(mce_degree(elem));
         }
         var upr = max_num(degs, 0);
         var ext = new List <List <IUgen> >();
         foreach (var elem in inputs.l)
         {
             ext.Add(mce_extend(upr, elem));
         }
         var iet  = transposer <IUgen>(ext);
         var outv = new List <IUgen>();
         //var outv = new UgenL();
         foreach (var elem2 in iet)
         {
             var newInps = new UgenL();
             newInps.l = elem2;
             var p = new Primitive
             {
                 name    = prim.name,
                 inputs  = newInps,
                 outputs = prim.outputs,
                 rate    = prim.rate,
                 special = prim.special,
                 index   = prim.index
             };
             //outv.l.Add(p);
             outv.Add(p);
         }
         var newOut = new UgenL();
         newOut.l = outv;
         //return new Mce(ugens: outv);
         return(new Mce {
             ugens = newOut
         });
     }
     else
     {
         throw new Exception("Error: mce_transform");
     }
 }
Exemple #12
0
 public static IUgen proxify(IUgen ugen)
 {
     if (ugen is Mce mc)
     {
         var lst = new UgenL();
         foreach (var elem in mc.ugens.l)
         {
             lst.l.Add(proxify(elem));
         }
         return(new Mce {
             ugens = lst
         });
     }
     else if (ugen is Mrg)
     {
         var prx = proxify(((Mrg)ugen).left);
         return(new Mrg {
             left = prx, right = ((Mrg)ugen).right
         });
     }
     else if (ugen is Primitive)
     {
         var ln = ((Primitive)ugen).outputs.Count;
         if (ln < 2)
         {
             return(ugen);
         }
         else
         {
             var lst1 = iota(ln, 0, 1);
             var lst2 = new UgenL();
             foreach (var ind in lst1)
             {
                 lst2.l.Add(proxify(new Proxy {
                     primitive = (Primitive)ugen, index = ind
                 }));
             }
             return(new Mce {
                 ugens = lst2
             });
         }
     }
     else
     {
         throw new Exception("proxify");
     }
 }
Exemple #13
0
 public static IUgen prepare_root(IUgen ugen)
 {
     if (ugen is Mce mc)
     {
         return(mrg_n(mc.ugens));
     }
     else if (ugen is Mrg mg)
     {
         return(new Mrg {
             left = prepare_root(mg.left), right = prepare_root(mg.right)
         });
     }
     else
     {
         return(ugen);
     }
 }
Exemple #14
0
 public static Tuple <INode, Graph> push_k_p(IUgen ugen, Graph gr)
 {
     if (ugen is Control ctrl1)
     {
         var node = new NodeK {
             nid = gr.nextId + 1, name = ctrl1.name, deflt = ctrl1.index, rate = ctrl1.rate
         };
         var contrs = new List <NodeK>();
         contrs.Add(node);
         contrs.AddRange(gr.controls);
         var gr1 = new Graph {
             nextId = gr.nextId + 1, constants = gr.constants, controls = contrs, ugens = gr.ugens
         };
         return(new Tuple <INode, Graph>(node, gr1));
     }
     throw new Exception("push_k_p");
 }
Exemple #15
0
 public static Tuple <INode, Graph> mk_node(IUgen ugen, Graph gr)
 {
     if (ugen is Constant <int> )
     {
         return(mk_node_c(ugen, gr));
     }
     else if (ugen is Primitive)
     {
         return(mk_node_u(ugen, gr));
     }
     else if (ugen is Mrg mg)
     {
         var gn = mk_node(mg.right, gr);
         var g1 = gn.Item2;
         return(mk_node(mg.left, g1));
     }
     throw new Exception("mk_node");
 }
Exemple #16
0
 public static Tuple <INode, Graph> mk_node_c(IUgen ugen, Graph gr)
 {
     try
     {
         var val = ((Constant <int>)ugen).value;
         foreach (var nd in gr.constants)
         {
             if (find_c_p(val, nd))
             {
                 return(new Tuple <INode, Graph>(nd, gr));
             }
         }
         return(push_c(val, gr));
     }
     catch (Exception)
     {
         throw new Exception("make_node_c");
     }
 }
Exemple #17
0
 public static Tuple <INode, Graph> mk_node_k(IUgen ugen, Graph gr)
 {
     try
     {
         var name = ((Control)ugen).name;
         foreach (var nd in gr.controls)
         {
             if (find_k_p(name, nd))
             {
                 return(new Tuple <INode, Graph>(nd, gr));
             }
         }
         return(push_k_p(ugen, gr));
     }
     catch (Exception)
     {
         throw new Exception("mk_node_k");
     }
 }
Exemple #18
0
 public static UgenL mce_channels(IUgen ugen)
 {
     if (ugen is Mce mc)
     {
         var ugens = mc.ugens;
         return(ugens);
     }
     else if (ugen is Mrg mg)
     {
         var left  = mg.left;
         var right = mg.right;
         var lst   = mce_channels(left);
         var len   = lst.l.Count;
         if (len > 1)
         {
             var mrg1 = new Mrg {
                 left = lst.l[0], right = right
             };
             var outv = new List <IUgen> {
                 mrg1
             };
             outv.AddRange(lst.l.GetRange(1, len - 1));
             var newOut = new UgenL();
             newOut.l = outv;
             return(newOut);
         }
         else
         {
             throw new Exception("Error: mce_channels");
         }
     }
     else
     {
         var outv = new List <IUgen>();
         outv.Add(ugen);
         var newOut = new UgenL();
         newOut.l = outv;
         return(newOut);
     }
 }
Exemple #19
0
 public static void printUgen(IUgen ugen)
 {
     if (ugen is Control ctrl)
     {
         Console.WriteLine("K: " + ctrl.name);
     }
     else if (ugen is Primitive)
     {
         Console.WriteLine("P: " + ((Primitive)(object)ugen).name);
     }
     else if (ugen is Constant <int> )
     {
         Console.WriteLine("C: " + ((Constant <int>)(object) ugen).value.ToString());
     }
     else if (ugen is Constant <double> )
     {
         Console.WriteLine("C: " + ((Constant <double>)(object) ugen).value.ToString());
     }
     else if (ugen is Mce)
     {
         Console.WriteLine("Mce: " + ((Mce)(object)ugen).ugens.l.Count.ToString());
         printUgens(((Mce)(object)ugen).ugens);
     }
     else if (ugen is Mrg)
     {
         Console.WriteLine("Mrg: ");
         Console.Write(" * left: ");
         printUgen(((Mrg)(object)ugen).left);
         Console.Write(" * right: ");
         printUgen(((Mrg)(object)ugen).right);
     }
     else if (ugen is Proxy)
     {
         Console.WriteLine("Proxy: ");
     }
     else
     {
         Console.Write(ugen);
     }
 }
Exemple #20
0
 public static Rate rate_of(IUgen ugen)
 {
     if (ugen is Control ctrl)
     {
         return(ctrl.rate);
     }
     else if (ugen is Primitive pr)
     {
         return(pr.rate);
     }
     else if (ugen is Proxy prox)
     {
         return(prox.primitive.rate);
     }
     else if (ugen is Mce mc)
     {
         var rates = (mc.ugens.l.Select(x => rate_of(x))).ToList();
         return(max_rate((RateList)rates));
     }
     else
     {
         throw new Exception("Error: rate_of");
     }
 }