Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
    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)
Esempio n. 4
0
    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)