def _new_expanded(cls, special_index=0, **kwargs): import supriya.synthdefs get_signature = inspect.signature signature = get_signature(cls.__init__) input_dicts = UGen._expand_dictionary( kwargs, unexpanded_input_names=cls._unexpanded_input_names ) ugens = [] has_custom_special_index = "special_index" in signature.parameters for input_dict in input_dicts: if has_custom_special_index: ugen = cls._new_single(special_index=special_index, **input_dict) else: ugen = cls._new_single(**input_dict) ugens.append(ugen) if len(ugens) == 1: return ugens[0] return supriya.synthdefs.UGenArray(ugens)
def _new_expanded(cls, special_index=0, **kwargs): import supriya.synthdefs get_signature = inspect.signature signature = get_signature(cls.__init__) input_dicts = UGen._expand_dictionary( kwargs, unexpanded_input_names=cls._unexpanded_input_names ) ugens = [] has_custom_special_index = "special_index" in signature.parameters for input_dict in input_dicts: if has_custom_special_index: ugen = cls._new_single(special_index=special_index, **input_dict) else: ugen = cls._new_single(**input_dict) ugens.append(ugen) if len(ugens) == 1: return ugens[0] return supriya.synthdefs.UGenArray(ugens)
def __str__(self): """ Gets string representation of synth definition. :: >>> import supriya.synthdefs >>> import supriya.ugens :: >>> with supriya.synthdefs.SynthDefBuilder() as builder: ... sin_one = supriya.ugens.SinOsc.ar() ... sin_two = supriya.ugens.SinOsc.ar(frequency=443) ... source = sin_one + sin_two ... out = supriya.ugens.Out.ar(bus=0, source=source) ... >>> synthdef = builder.build(name='test') :: >>> graph(synthdef) # doctest: +SKIP :: >>> print(synthdef) synthdef: name: test ugens: - SinOsc.ar/0: frequency: 440.0 phase: 0.0 - SinOsc.ar/1: frequency: 443.0 phase: 0.0 - BinaryOpUGen(ADDITION).ar: left: SinOsc.ar/0[0] right: SinOsc.ar/1[0] - Out.ar: bus: 0.0 source[0]: BinaryOpUGen(ADDITION).ar[0] Returns string. """ def get_ugen_names(): grouped_ugens = {} named_ugens = {} for ugen in self._ugens: key = (type(ugen), ugen.calculation_rate, ugen.special_index) grouped_ugens.setdefault(key, []).append(ugen) for ugen in self._ugens: parts = [type(ugen).__name__] if isinstance(ugen, supriya.ugens.BinaryOpUGen): ugen_op = supriya.synthdefs.BinaryOperator.from_expr( ugen.special_index) parts.append("(" + ugen_op.name + ")") elif isinstance(ugen, supriya.ugens.UnaryOpUGen): ugen_op = supriya.synthdefs.UnaryOperator.from_expr( ugen.special_index) parts.append("(" + ugen_op.name + ")") parts.append("." + ugen.calculation_rate.token) key = (type(ugen), ugen.calculation_rate, ugen.special_index) related_ugens = grouped_ugens[key] if len(related_ugens) > 1: parts.append("/{}".format(related_ugens.index(ugen))) named_ugens[ugen] = "".join(parts) return named_ugens def get_parameter_name(input_, output_index=0): if isinstance(input_, supriya.synthdefs.Parameter): return ":{}".format(input_.name) elif isinstance(input_, supriya.ugens.Control): # Handle array-like parameters value_index = 0 for parameter in input_.parameters: values = parameter.value if isinstance(values, float): values = [values] for i in range(len(values)): if value_index != output_index: value_index += 1 continue elif len(values) == 1: return ":{}".format(parameter.name) else: return ":{}[{}]".format(parameter.name, i) return "" import supriya.synthdefs import supriya.ugens ugens = [] named_ugens = get_ugen_names() for ugen in self._ugens: ugen_dict = {} ugen_name = named_ugens[ugen] for i, input_ in enumerate(ugen.inputs): if i < len(ugen._ordered_input_names): argument_name = tuple(ugen._ordered_input_names)[i] else: argument_name = tuple(ugen._ordered_input_names)[-1] if (ugen._unexpanded_input_names and argument_name in ugen._unexpanded_input_names): unexpanded_index = i - tuple( ugen._ordered_input_names).index(argument_name) argument_name += "[{}]".format(unexpanded_index) if isinstance(input_, float): value = input_ else: output_index = 0 if isinstance(input_, supriya.synthdefs.OutputProxy): output_index = input_.output_index input_ = input_.source input_name = named_ugens[input_] value = "{}[{}{}]".format( input_name, output_index, get_parameter_name(input_, output_index), ) ugen_dict[argument_name] = value if not ugen_dict: ugen_dict = None ugens.append({ugen_name: ugen_dict}) result = { "synthdef": { "name": self.actual_name, #'hash': self.anonymous_name, "ugens": ugens, } } return yaml.dump(result, default_flow_style=False, indent=4)
def _decompile_synthdef(value, index): import supriya.synthdefs import supriya.ugens sdd = SynthDefDecompiler synthdef = None name, index = sdd._decode_string(value, index) constants, index = sdd._decode_constants(value, index) indexed_parameters, index = sdd._decode_parameters(value, index) ugens = [] ugen_count, index = sdd._decode_int_32bit(value, index) for i in range(ugen_count): ugen_name, index = sdd._decode_string(value, index) calculation_rate, index = sdd._decode_int_8bit(value, index) calculation_rate = supriya.CalculationRate(calculation_rate) input_count, index = sdd._decode_int_32bit(value, index) output_count, index = sdd._decode_int_32bit(value, index) special_index, index = sdd._decode_int_16bit(value, index) inputs = [] for _ in range(input_count): ugen_index, index = sdd._decode_int_32bit(value, index) if ugen_index == 0xFFFFFFFF: constant_index, index = sdd._decode_int_32bit(value, index) constant_index = int(constant_index) inputs.append(constants[constant_index]) else: ugen = ugens[ugen_index] ugen_output_index, index = sdd._decode_int_32bit( value, index) output_proxy = ugen[ugen_output_index] inputs.append(output_proxy) for _ in range(output_count): output_rate, index = sdd._decode_int_8bit(value, index) ugen_class = getattr(supriya.ugens, ugen_name, None) if ugen_class is None: ugen_class = getattr(supriya.synthdefs, ugen_name) ugen = supriya.synthdefs.UGen.__new__(ugen_class) if issubclass(ugen_class, supriya.synthdefs.Control): starting_control_index = special_index parameters = sdd._collect_parameters_for_control( calculation_rate, indexed_parameters, inputs, output_count, starting_control_index, ugen_class, ) ugen_class.__init__( ugen, parameters=parameters, starting_control_index=starting_control_index, calculation_rate=calculation_rate, ) else: kwargs = {} if not ugen._unexpanded_input_names: for i, input_name in enumerate(ugen._ordered_input_names): kwargs[input_name] = inputs[i] else: for i, input_name in enumerate(ugen._ordered_input_names): if input_name not in ugen._unexpanded_input_names: kwargs[input_name] = inputs[i] else: kwargs[input_name] = tuple(inputs[i:]) if issubclass(ugen_class, MultiOutUGen): MultiOutUGen.__init__( ugen, calculation_rate=calculation_rate, channel_count=output_count, special_index=special_index, **kwargs, ) else: UGen.__init__( ugen, calculation_rate=calculation_rate, special_index=special_index, **kwargs, ) ugens.append(ugen) variants_count, index = sdd._decode_int_16bit(value, index) synthdef = supriya.synthdefs.SynthDef(ugens=ugens, name=name, decompiled=True) if synthdef.name == synthdef.anonymous_name: synthdef._name = None return synthdef, index
def _decompile_synthdef(value, index): import supriya.synthdefs import supriya.ugens sdd = SynthDefDecompiler synthdef = None name, index = sdd._decode_string(value, index) constants, index = sdd._decode_constants(value, index) indexed_parameters, index = sdd._decode_parameters(value, index) ugens = [] ugen_count, index = sdd._decode_int_32bit(value, index) for i in range(ugen_count): ugen_name, index = sdd._decode_string(value, index) calculation_rate, index = sdd._decode_int_8bit(value, index) calculation_rate = supriya.CalculationRate(calculation_rate) input_count, index = sdd._decode_int_32bit(value, index) output_count, index = sdd._decode_int_32bit(value, index) special_index, index = sdd._decode_int_16bit(value, index) inputs = [] for _ in range(input_count): ugen_index, index = sdd._decode_int_32bit(value, index) if ugen_index == 0xFFFFFFFF: constant_index, index = sdd._decode_int_32bit(value, index) constant_index = int(constant_index) inputs.append(constants[constant_index]) else: ugen = ugens[ugen_index] ugen_output_index, index = sdd._decode_int_32bit(value, index) output_proxy = ugen[ugen_output_index] inputs.append(output_proxy) for _ in range(output_count): output_rate, index = sdd._decode_int_8bit(value, index) ugen_class = getattr(supriya.ugens, ugen_name) ugen = supriya.ugens.UGen.__new__(ugen_class) if issubclass(ugen_class, supriya.ugens.Control): starting_control_index = special_index parameters = sdd._collect_parameters_for_control( calculation_rate, indexed_parameters, inputs, output_count, starting_control_index, ugen_class, ) ugen_class.__init__( ugen, parameters=parameters, starting_control_index=starting_control_index, calculation_rate=calculation_rate, ) else: kwargs = {} if not ugen._unexpanded_input_names: for i, input_name in enumerate(ugen._ordered_input_names): kwargs[input_name] = inputs[i] else: for i, input_name in enumerate(ugen._ordered_input_names): if input_name not in ugen._unexpanded_input_names: kwargs[input_name] = inputs[i] else: kwargs[input_name] = tuple(inputs[i:]) if issubclass(ugen_class, supriya.ugens.MultiOutUGen): supriya.ugens.MultiOutUGen.__init__( ugen, calculation_rate=calculation_rate, channel_count=output_count, special_index=special_index, **kwargs, ) else: supriya.ugens.UGen.__init__( ugen, calculation_rate=calculation_rate, special_index=special_index, **kwargs, ) ugens.append(ugen) variants_count, index = sdd._decode_int_16bit(value, index) synthdef = supriya.synthdefs.SynthDef(ugens=ugens, name=name, decompiled=True) if synthdef.name == synthdef.anonymous_name: synthdef._name = None return synthdef, index
def __str__(self): """ Gets string representation of synth definition. :: >>> import supriya.synthdefs >>> import supriya.ugens :: >>> with supriya.synthdefs.SynthDefBuilder() as builder: ... sin_one = supriya.ugens.SinOsc.ar() ... sin_two = supriya.ugens.SinOsc.ar(frequency=443) ... source = sin_one + sin_two ... out = supriya.ugens.Out.ar(bus=0, source=source) ... >>> synthdef = builder.build(name='test') :: >>> supriya.graph(synthdef) # doctest: +SKIP :: >>> print(synthdef) synthdef: name: test ugens: - SinOsc.ar/0: frequency: 440.0 phase: 0.0 - SinOsc.ar/1: frequency: 443.0 phase: 0.0 - BinaryOpUGen(ADDITION).ar: left: SinOsc.ar/0[0] right: SinOsc.ar/1[0] - Out.ar: bus: 0.0 source[0]: BinaryOpUGen(ADDITION).ar[0] Returns string. """ def get_ugen_names(): grouped_ugens = {} named_ugens = {} for ugen in self._ugens: key = (type(ugen), ugen.calculation_rate, ugen.special_index) grouped_ugens.setdefault(key, []).append(ugen) for ugen in self._ugens: parts = [type(ugen).__name__] if isinstance(ugen, supriya.ugens.BinaryOpUGen): ugen_op = BinaryOperator.from_expr(ugen.special_index) parts.append("(" + ugen_op.name + ")") elif isinstance(ugen, supriya.ugens.UnaryOpUGen): ugen_op = UnaryOperator.from_expr(ugen.special_index) parts.append("(" + ugen_op.name + ")") parts.append("." + ugen.calculation_rate.token) key = (type(ugen), ugen.calculation_rate, ugen.special_index) related_ugens = grouped_ugens[key] if len(related_ugens) > 1: parts.append("/{}".format(related_ugens.index(ugen))) named_ugens[ugen] = "".join(parts) return named_ugens def get_parameter_name(input_, output_index=0): if isinstance(input_, supriya.synthdefs.Parameter): return ":{}".format(input_.name) elif isinstance(input_, supriya.ugens.Control): # Handle array-like parameters value_index = 0 for parameter in input_.parameters: values = parameter.value if isinstance(values, float): values = [values] for i in range(len(values)): if value_index != output_index: value_index += 1 continue elif len(values) == 1: return ":{}".format(parameter.name) else: return ":{}[{}]".format(parameter.name, i) return "" import supriya.synthdefs import supriya.ugens ugens = [] named_ugens = get_ugen_names() for ugen in self._ugens: ugen_dict = {} ugen_name = named_ugens[ugen] for i, input_ in enumerate(ugen.inputs): if i < len(ugen._ordered_input_names): argument_name = tuple(ugen._ordered_input_names)[i] else: argument_name = tuple(ugen._ordered_input_names)[-1] if ( ugen._unexpanded_input_names and argument_name in ugen._unexpanded_input_names ): unexpanded_index = i - tuple(ugen._ordered_input_names).index( argument_name ) argument_name += "[{}]".format(unexpanded_index) if isinstance(input_, float): value = input_ else: output_index = 0 if isinstance(input_, supriya.synthdefs.OutputProxy): output_index = input_.output_index input_ = input_.source input_name = named_ugens[input_] value = "{}[{}{}]".format( input_name, output_index, get_parameter_name(input_, output_index), ) ugen_dict[argument_name] = value if not ugen_dict: ugen_dict = None ugens.append({ugen_name: ugen_dict}) result = { "synthdef": { "name": self.actual_name, # 'hash': self.anonymous_name, "ugens": ugens, } } return yaml.dump(result, default_flow_style=False, indent=4)