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"); } }
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); } }
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"); }
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"); }
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"); }
public static bool is_mce(IUgen ugen) { if (ugen is Mce) { return(true); } else { return(false); } }
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)); }
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); } } }
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)); }
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"); } }
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"); } }
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"); } }
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); } }
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"); }
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"); }
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"); } }
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"); } }
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); } }
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); } }
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"); } }