From cde0d0a93460d03df05d387a7786c4f17d546ab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9phine=20Wolf=20Oberholtzer?= <166141926+josephine-wolf-oberholtzer@users.noreply.github.com> Date: Thu, 16 Jan 2025 09:37:37 -0500 Subject: [PATCH] Add UpdateDictPattern (#415) * Implement UpdateDictPattern * Add docstring --- supriya/patterns/__init__.py | 9 +++++++- supriya/patterns/eventpatterns.py | 32 +++++++++++++++++++++++++--- tests/patterns/test_PatternPlayer.py | 3 ++- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/supriya/patterns/__init__.py b/supriya/patterns/__init__.py index adcac25c0..2d900b15e 100644 --- a/supriya/patterns/__init__.py +++ b/supriya/patterns/__init__.py @@ -1,4 +1,10 @@ -from .eventpatterns import ChainPattern, EventPattern, MonoEventPattern, UpdatePattern +from .eventpatterns import ( + ChainPattern, + EventPattern, + MonoEventPattern, + UpdateDictPattern, + UpdatePattern, +) from .events import ( BusAllocateEvent, BusFreeEvent, @@ -54,4 +60,5 @@ "SynthAllocateEvent", "UnaryOpPattern", "UpdatePattern", + "UpdateDictPattern", ] diff --git a/supriya/patterns/eventpatterns.py b/supriya/patterns/eventpatterns.py index f897c7f57..921486c00 100644 --- a/supriya/patterns/eventpatterns.py +++ b/supriya/patterns/eventpatterns.py @@ -7,7 +7,7 @@ from .patterns import Pattern, SequencePattern -class EventPattern(Pattern): +class EventPattern(Pattern[Event]): """ Akin to SuperCollider's Pbind. """ @@ -82,7 +82,7 @@ def is_infinite(self) -> bool: return True -class UpdatePattern(Pattern): +class UpdatePattern(Pattern[Event]): """ Akin to SuperCollider's Pbindf. """ @@ -129,7 +129,33 @@ def is_infinite(self) -> bool: return self._pattern.is_infinite -class ChainPattern(Pattern): +class UpdateDictPattern(Pattern[Event]): + """ + Akin to SuperCollider's Penvir. + """ + + def __init__(self, pattern: Pattern[Event], dictionary: Dict[str, Any]) -> None: + self._pattern = pattern + self._dictionary = dictionary + + def _iterate( + self, state: Optional[Dict[str, UUID]] = None + ) -> Generator[Event, bool, None]: + event_iterator = iter(self._pattern) + while True: + try: + event = next(event_iterator) + except StopIteration: + return + if (yield new(event, **self._dictionary)): + return + + @property + def is_infinite(self) -> bool: + return self._pattern.is_infinite + + +class ChainPattern(Pattern[Event]): """ Akin to SuperCollider's Pchain. """ diff --git a/tests/patterns/test_PatternPlayer.py b/tests/patterns/test_PatternPlayer.py index 507db5d1c..d4dbbfa78 100644 --- a/tests/patterns/test_PatternPlayer.py +++ b/tests/patterns/test_PatternPlayer.py @@ -12,6 +12,7 @@ from supriya.osc import OscBundle, OscMessage from supriya.patterns import ( BusPattern, + Event, EventPattern, GroupPattern, MonoEventPattern, @@ -25,7 +26,7 @@ "pattern, until, target_node, expected", [ ( - SequencePattern( + SequencePattern[Event]( [ EventPattern(frequency=SequencePattern([440, 550, 660])), MonoEventPattern(frequency=SequencePattern([440, 550, 660])),