Skip to content

Commit

Permalink
Re-implement graphdefs (#378)
Browse files Browse the repository at this point in the history
  • Loading branch information
josephine-wolf-oberholtzer authored May 6, 2024
1 parent 6a4626f commit 1f41e13
Show file tree
Hide file tree
Showing 38 changed files with 5,995 additions and 5,749 deletions.
2 changes: 1 addition & 1 deletion supriya/assets/synthdefs/default.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def _build_default_synthdef() -> SynthDef:
amplitude=0.1,
frequency=440,
gate=1,
out=Parameter(parameter_rate=ParameterRate.SCALAR, value=0),
out=Parameter(rate=ParameterRate.SCALAR, value=0),
pan=0.5,
) as builder:
low_pass = LPF.ar(
Expand Down
29 changes: 19 additions & 10 deletions supriya/assets/synthdefs/system_synthdefs.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,34 @@
from ...enums import EnvelopeShape
from ...ugens import EnvGen, Envelope, In, InFeedback, Out, SynthDef, SynthDefBuilder
from supriya.enums import EnvelopeShape
from supriya.ugens import (
EnvGen,
Envelope,
In,
InFeedback,
Out,
SynthDef,
SynthDefBuilder,
)


def _build_link_audio_synthdef(channel_count: int) -> SynthDef:
with SynthDefBuilder(
out=0, in_=16, gate=1, fade_time=0.02, done_action=2
) as builder:
start_value = builder["fade_time"] <= 0
envelope = EnvGen.kr(
envelope = Envelope(
amplitudes=[start_value, 1.0, 0.0],
durations=[1.0, 1.0],
curves=[EnvelopeShape.SINE],
release_node=1,
)
envgen = EnvGen.kr(
done_action=builder["done_action"],
envelope=Envelope(
amplitudes=[start_value, 1.0, 0.0],
durations=[1.0, 1.0],
curves=[EnvelopeShape.SINE],
release_node=1,
),
envelope=envelope,
gate=builder["gate"],
time_scale=builder["fade_time"],
)
source = InFeedback.ar(bus=builder["in_"], channel_count=channel_count)
Out.ar(bus=builder["out"], source=source * envelope)
Out.ar(bus=builder["out"], source=source * envgen)
return builder.build(name=f"system_link_audio_{channel_count}")


Expand Down
4 changes: 2 additions & 2 deletions supriya/assets/synthdefs/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
def _build_test_synthdef() -> SynthDef:
with SynthDefBuilder(
frequency=440,
amplitude=Parameter(value=1.0, parameter_rate=ParameterRate.AUDIO),
amplitude=Parameter(value=1.0, rate=ParameterRate.AUDIO),
) as builder:
sin_osc = SinOsc.ar(frequency=builder["frequency"])
enveloped_sin = sin_osc * builder["amplitude"]
Expand All @@ -16,7 +16,7 @@ def _build_test_synthdef() -> SynthDef:
def _build_test_two_voice_synthdef() -> SynthDef:
with SynthDefBuilder(
frequencies=(220, 440),
amplitude=Parameter(value=1.0, parameter_rate=ParameterRate.AUDIO),
amplitude=Parameter(value=1.0, rate=ParameterRate.AUDIO),
) as builder:
sin_osc = SinOsc.ar(frequency=builder["frequencies"])
enveloped_sin = sin_osc * builder["amplitude"]
Expand Down
32 changes: 20 additions & 12 deletions supriya/contexts/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -606,26 +606,34 @@ def add_synth(
raise ValueError(add_action_)
target_node_id = self._resolve_node(target_node)
synthdef_kwargs: Dict[
Union[int, str], Union[SupportsFloat, str, Tuple[float, ...]]
Union[int, str], Union[float, str, Tuple[Union[float, str], ...]]
] = {}
for _, parameter in synthdef.indexed_parameters:
if parameter.name not in settings:
continue
value = settings[parameter.name]
if not isinstance(value, Sequence) or isinstance(value, str):
value = (value,)
if value == parameter.value:
continue
if parameter.parameter_rate is ParameterRate.SCALAR:
synthdef_kwargs[parameter.name] = float(value)
elif parameter.name in ("in_", "out"):
synthdef_kwargs[parameter.name] = float(value)
elif isinstance(value, Bus):
synthdef_kwargs[parameter.name] = value.map_symbol()
elif isinstance(value, str):
synthdef_kwargs[parameter.name] = value
elif isinstance(value, tuple):
synthdef_kwargs[parameter.name] = tuple((float(v) for v in value))
if parameter.rate is ParameterRate.SCALAR or parameter.name in (
"in_",
"out",
):
synthdef_kwargs[parameter.name] = tuple(float(v) for v in value)
else:
synthdef_kwargs[parameter.name] = float(value)
processed_values: List[Union[float, str]] = []
for v in value:
if isinstance(v, Bus):
processed_values.append(v.map_symbol())
elif isinstance(v, str):
processed_values.append(v)
else:
processed_values.append(float(v))
if len(processed_values) == 1:
synthdef_kwargs[parameter.name] = processed_values[0]
else:
synthdef_kwargs[parameter.name] = tuple(processed_values)
id_ = self._allocate_id(Node, permanent=permanent)
self._add_requests(
NewSynth(
Expand Down
10 changes: 10 additions & 0 deletions supriya/contexts/entities.py
Original file line number Diff line number Diff line change
Expand Up @@ -568,6 +568,16 @@ def free(self):
"""
self.context.free_bus_group(self)

def map_symbol(self) -> str:
"""
Get the bus group's map symbol.
"""
if self.calculation_rate is CalculationRate.AUDIO:
return f"a{self.id_}"
elif self.calculation_rate is CalculationRate.CONTROL:
return f"c{self.id_}"
raise InvalidCalculationRate


@dataclasses.dataclass(frozen=True)
class Node(ContextObject):
Expand Down
22 changes: 12 additions & 10 deletions supriya/contexts/requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
List,
Optional,
Sequence,
SupportsFloat,
SupportsInt,
Tuple,
Union,
Expand Down Expand Up @@ -1309,11 +1308,11 @@ class NewSynth(Request):
add_action: AddActionLike
target_node_id: SupportsInt
controls: Optional[
Dict[Union[int, str], Union[SupportsFloat, str, Tuple[float, ...]]]
Dict[Union[int, str], Union[float, str, Tuple[Union[float, str], ...]]]
] = None

def to_osc(self) -> OscMessage:
contents: List[Union[float, str, Tuple[float, ...]]] = [
contents: List[Union[float, str, Tuple[Union[float, str], ...]]] = [
(
self.synthdef.actual_name
if isinstance(self.synthdef, SynthDef)
Expand All @@ -1325,12 +1324,13 @@ def to_osc(self) -> OscMessage:
]
for key, value in sorted((self.controls or {}).items()):
contents.append(key if isinstance(key, str) else int(key))
if isinstance(value, str):
if isinstance(value, tuple):
if len(value) == 1:
contents.append(value[0])
else:
contents.append(value)
elif isinstance(value, (float, str)):
contents.append(value)
elif isinstance(value, tuple):
contents.append(tuple((float(v) for v in value)))
else:
contents.append(float(value))
return OscMessage(RequestName.SYNTH_NEW, *contents)


Expand Down Expand Up @@ -1642,14 +1642,16 @@ class ReceiveSynthDefs(Request):
... ),
... )
>>> request.to_osc()
OscMessage('/d_recv', b'SCgf\x00\x00\x00\x02\x00\x01\x07default\x00\x00\x00\x0c\x00\x00\x00\x00>\x99\x99\x9a<#\xd7\n?333@\x00\x00\x00\xbe\xcc\xcc\xcd>\xcc\xcc\xcdEz\x00\x00E\x9c@\x00E\x1c@\x00EH\x00\x00?\x80\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00=\xcc\xcc\xcdC\xdc\x00\x00?\x80\x00\x00?\x00\x00\x00\x00\x00\x00\x05\tamplitude\x00\x00\x00\x01\tfrequency\x00\x00\x00\x02\x04gate\x00\x00\x00\x03\x03out\x00\x00\x00\x00\x03pan\x00\x00\x00\x04\x00\x00\x00\x14\x07Control\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x07Control\x01\x00\x00\x00\x00\x00\x00\x00\x04\x00\x01\x01\x01\x01\x01\x06VarSaw\x02\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x01\x02\x05Linen\x01\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\xff\xff\xff\xff\x00\x00\x00\x02\xff\xff\xff\xff\x00\x00\x00\x03\xff\xff\xff\xff\x00\x00\x00\x01\xff\xff\xff\xff\x00\x00\x00\x04\x01\x04Rand\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\xff\xff\xff\xff\x00\x00\x00\x05\xff\xff\xff\xff\x00\x00\x00\x00\x00\x0cBinaryOpUGen\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x01\x06VarSaw\x02\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x01\x02\x04Rand\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x06\x00\x0cBinaryOpUGen\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x00\x01\x06VarSaw\x02\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x01\x02\x04Sum3\x02\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x02\x0cBinaryOpUGen\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x02\x00\x00\x00\n\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x01\x02\x04Rand\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\xff\xff\xff\xff\x00\x00\x00\x07\xff\xff\xff\xff\x00\x00\x00\x08\x00\x04Rand\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\xff\xff\xff\xff\x00\x00\x00\t\xff\xff\xff\xff\x00\x00\x00\n\x00\x05XLine\x01\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x0b\xff\xff\xff\xff\x00\x00\x00\x00\x01\x03LPF\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x02\x0cBinaryOpUGen\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x02\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x02\x0cBinaryOpUGen\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x02\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x02\x04Pan2\x02\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x03\xff\xff\xff\xff\x00\x00\x00\x0b\x02\x02\tOffsetOut\x02\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x01\x00\x00', OscMessage('/s_new', 'default', 1000, 1, 1))
OscMessage('/d_recv', b'SCgf\x00\x00\x00\x02\x00\x01\x07default\x00\x00\x00\x0c\x00\x00\x00\x00>\x99\x99\x9a<#\xd7\n?333@\x00\x00\x00\xbe\xcc\xcc\xcd>\xcc\xcc\xcdEz\x00\x00E\x9c@\x00E\x1c@\x00EH\x00\x00?\x80\x00\x00\x00\x00\x00\x05=\xcc\xcc\xcdC\xdc\x00\x00?\x80\x00\x00?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\tamplitude\x00\x00\x00\x00\tfrequency\x00\x00\x00\x01\x04gate\x00\x00\x00\x02\x03pan\x00\x00\x00\x03\x03out\x00\x00\x00\x04\x00\x00\x00\x14\x07Control\x01\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x01\x01\x01\x01\x06VarSaw\x02\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x01\x02\x05Linen\x01\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xff\xff\xff\xff\x00\x00\x00\x02\xff\xff\xff\xff\x00\x00\x00\x03\xff\xff\xff\xff\x00\x00\x00\x01\xff\xff\xff\xff\x00\x00\x00\x04\x01\x07Control\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x04\x00\x04Rand\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\xff\xff\xff\xff\x00\x00\x00\x05\xff\xff\xff\xff\x00\x00\x00\x00\x00\x0cBinaryOpUGen\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x01\x06VarSaw\x02\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x01\x02\x04Rand\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x06\x00\x0cBinaryOpUGen\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x00\x01\x06VarSaw\x02\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x01\x02\x04Sum3\x02\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x02\x0cBinaryOpUGen\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x02\x00\x00\x00\n\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x01\x02\x04Rand\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\xff\xff\xff\xff\x00\x00\x00\x07\xff\xff\xff\xff\x00\x00\x00\x08\x00\x04Rand\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\xff\xff\xff\xff\x00\x00\x00\t\xff\xff\xff\xff\x00\x00\x00\n\x00\x05XLine\x01\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x0b\xff\xff\xff\xff\x00\x00\x00\x00\x01\x03LPF\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x02\x0cBinaryOpUGen\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x02\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x02\x0cBinaryOpUGen\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x02\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x04Pan2\x02\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xff\xff\xff\xff\x00\x00\x00\x0b\x02\x02\tOffsetOut\x02\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x01\x00\x00', OscMessage('/s_new', 'default', 1000, 1, 1))
"""

synthdefs: Sequence[SynthDef]
on_completion: Optional[Requestable] = None

def to_osc(self) -> OscMessage:
contents = [compile_synthdefs(self.synthdefs)]
contents: List[Union[OscBundle, OscMessage, bytes]] = [
compile_synthdefs(*self.synthdefs)
]
if self.on_completion:
contents.append(self.on_completion.to_osc())
return OscMessage(RequestName.SYNTHDEF_RECEIVE, *contents)
Expand Down
15 changes: 12 additions & 3 deletions supriya/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"""

from collections.abc import Sequence
from typing import cast
from typing import SupportsFloat, cast

from uqbar.enums import IntEnumeration, StrictEnumeration

Expand Down Expand Up @@ -128,10 +128,19 @@ def from_expr(cls, expr) -> "CalculationRate":

if hasattr(expr, "calculation_rate"):
return expr.calculation_rate
elif isinstance(expr, (int, float)) and not isinstance(expr, cls):
elif isinstance(expr, ParameterRate):
return {
ParameterRate.AUDIO: CalculationRate.AUDIO,
ParameterRate.CONTROL: CalculationRate.CONTROL,
ParameterRate.SCALAR: CalculationRate.SCALAR,
ParameterRate.TRIGGER: CalculationRate.CONTROL,
}[expr]
elif isinstance(expr, (int, float, SupportsFloat)) and not isinstance(
expr, cls
):
return cast(CalculationRate, CalculationRate.SCALAR)
elif isinstance(expr, Parameter):
name = expr.parameter_rate.name
name = expr.rate.name
if name == "TRIGGER":
return cast(CalculationRate, CalculationRate.CONTROL)
return CalculationRate.from_expr(name)
Expand Down
66 changes: 39 additions & 27 deletions supriya/ext/mypy.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,27 +40,28 @@ def transform(self) -> bool:
info = self._ctx.cls.info

SupportsIntType = api.named_type("typing.SupportsInt")
UGenOperableType = api.named_type(
"supriya.ugens.core.UGenOperable",
)
CalculationRateType = api.named_type("supriya.enums.CalculationRate")
UGenOperableType = api.named_type("supriya.ugens.core.UGenOperable")
UGenScalarType = api.named_type("supriya.ugens.core.UGenScalar")
UGenVectorType = api.named_type("supriya.ugens.core.UGenVector")
# api.named_type() breaks for these... why?
UGenInitScalarParamTypeSym = api.lookup_fully_qualified(
"supriya.ugens.core.UGenInitScalarParam"
UGenRecursiveInputTypeSym = api.lookup_fully_qualified(
"supriya.ugens.core.UGenRecursiveInput"
)
UGenInitVectorParamTypeSym = api.lookup_fully_qualified(
"supriya.ugens.core.UGenInitVectorParam"
UGenScalarInputTypeSym = api.lookup_fully_qualified(
"supriya.ugens.core.UGenScalarInput"
)
UGenRateVectorParamTypeSym = api.lookup_fully_qualified(
"supriya.ugens.core.UGenRateVectorParam"
UGenVectorInputTypeSym = api.lookup_fully_qualified(
"supriya.ugens.core.UGenVectorInput"
)

assert UGenInitScalarParamTypeSym.node is not None
assert UGenInitVectorParamTypeSym.node is not None
assert UGenRateVectorParamTypeSym.node is not None
assert UGenRecursiveInputTypeSym.node is not None
assert UGenScalarInputTypeSym.node is not None
assert UGenVectorInputTypeSym.node is not None

UGenInitScalarParamType = getattr(UGenInitScalarParamTypeSym.node, "target")
UGenInitVectorParamType = getattr(UGenInitVectorParamTypeSym.node, "target")
UGenRateVectorParamType = getattr(UGenRateVectorParamTypeSym.node, "target")
UGenRecursiveInputType = getattr(UGenRecursiveInputTypeSym.node, "target")
UGenScalarInputType = getattr(UGenScalarInputTypeSym.node, "target")
UGenVectorInputType = getattr(UGenVectorInputTypeSym.node, "target")

decorator_arguments = {
"ar": _get_decorator_bool_argument(self._ctx, "ar", False),
Expand All @@ -75,12 +76,23 @@ def transform(self) -> bool:
self._ctx, "fixed_channel_count", False
),
}
init_args = []
init_args = [
Argument(
variable=Var("calculation_rate", CalculationRateType),
type_annotation=CalculationRateType,
initializer=None,
kind=ARG_OPT,
),
Argument(
variable=Var("special_index", SupportsIntType),
type_annotation=SupportsIntType,
initializer=None,
kind=ARG_OPT,
),
]
rate_args = []
for name, unexpanded in self.collect_params():
init_type = (
UGenInitVectorParamType if unexpanded else UGenInitScalarParamType
)
init_type = UGenVectorInputType if unexpanded else UGenScalarInputType
init_args.append(
Argument(
variable=Var(name, init_type),
Expand All @@ -91,8 +103,8 @@ def transform(self) -> bool:
)
rate_args.append(
Argument(
variable=Var(name, UGenRateVectorParamType),
type_annotation=UGenRateVectorParamType,
variable=Var(name, UGenRecursiveInputType),
type_annotation=UGenRecursiveInputType,
initializer=None,
kind=ARG_OPT,
)
Expand All @@ -101,7 +113,7 @@ def transform(self) -> bool:
api=api,
cls=cls,
name=name,
typ=UGenInitVectorParamType if unexpanded else UGenInitScalarParamType,
typ=UGenVectorType if unexpanded else UGenScalarType,
override_allow_incompatible=True,
)
if (
Expand Down Expand Up @@ -135,17 +147,17 @@ def transform(self) -> bool:
args=init_args,
return_type=NoneType(),
)
return False
return True


def _ugen_hook(ctx: ClassDefContext) -> None:
UGenTransformer(ctx).transform()
def _ugen_hook(ctx: ClassDefContext) -> bool:
return UGenTransformer(ctx).transform()


class SupriyaPlugin(Plugin):
def get_class_decorator_hook(
def get_class_decorator_hook_2(
self, fullname: str
) -> Optional[Callable[[ClassDefContext], None]]:
) -> Optional[Callable[[ClassDefContext], bool]]:
if fullname == "supriya.ugens.core.ugen":
return _ugen_hook
return None
Expand Down
Loading

0 comments on commit 1f41e13

Please sign in to comment.