From b68337fab123bc15cc78feac0620cf234b547e0b Mon Sep 17 00:00:00 2001 From: "J. Wolf Oberholtzer" Date: Sun, 24 Mar 2024 15:48:57 -0400 Subject: [PATCH] Consolidate synthdefs into ugens --- README.md | 4 +- docs/notebooks/introduction.ipynb | 25031 ---------------- docs/notebooks/rise.css | 11 - docs/source/index.rst | 4 +- supriya/__init__.py | 9 +- supriya/assets/synthdefs/clap.py | 12 +- supriya/assets/synthdefs/default.py | 15 +- supriya/assets/synthdefs/kick.py | 15 +- .../assets/synthdefs/multiband_compressor.py | 13 +- supriya/assets/synthdefs/simple_sine.py | 3 +- supriya/assets/synthdefs/sweep_filter.py | 3 +- supriya/assets/synthdefs/system_synthdefs.py | 5 +- supriya/assets/synthdefs/test.py | 3 +- supriya/contexts/core.py | 2 +- supriya/contexts/entities.py | 2 +- supriya/contexts/nonrealtime.py | 2 +- supriya/contexts/realtime.py | 2 +- supriya/contexts/requests.py | 4 +- supriya/contexts/shm.cpp | 38 +- supriya/enums.py | 22 +- supriya/ext/mypy.py | 12 +- supriya/patterns/events.py | 2 +- supriya/patterns/structure.py | 2 +- supriya/synthdefs/__init__.py | 33 - supriya/synthdefs/builders.py | 320 - supriya/synthdefs/compilers.py | 437 - supriya/synthdefs/controls.py | 341 - supriya/synthdefs/envelopes.py | 263 - supriya/synthdefs/grapher.py | 220 - supriya/synthdefs/synthdefs.py | 945 - supriya/typing.py | 2 + supriya/ugens/__init__.py | 36 +- supriya/ugens/basic.py | 30 +- supriya/ugens/beq.py | 22 +- supriya/ugens/bufio.py | 36 +- supriya/ugens/chaos.py | 46 +- .../ugens/compilers.py | 0 supriya/ugens/convolution.py | 10 +- supriya/ugens/{bases.py => core.py} | 2248 +- supriya/ugens/decorators.py | 0 supriya/ugens/delay.py | 50 +- supriya/ugens/demand.py | 46 +- supriya/ugens/diskio.py | 8 +- supriya/ugens/dynamics.py | 8 +- supriya/ugens/envelopes.py | 289 +- supriya/{synthdefs => ugens}/factories.py | 43 +- supriya/ugens/ffsinosc.py | 12 +- supriya/ugens/filters.py | 78 +- supriya/ugens/gendyn.py | 8 +- supriya/ugens/granular.py | 10 +- supriya/ugens/hilbert.py | 8 +- supriya/ugens/info.py | 42 +- supriya/ugens/inout.py | 8 +- supriya/ugens/lines.py | 26 +- supriya/ugens/mac.py | 8 +- supriya/ugens/ml.py | 22 +- supriya/ugens/noise.py | 64 +- supriya/ugens/osc.py | 38 +- supriya/ugens/panning.py | 24 +- supriya/ugens/physical.py | 10 +- supriya/ugens/pv.py | 76 +- supriya/ugens/reverb.py | 4 +- supriya/ugens/safety.py | 4 +- supriya/ugens/triggers.py | 46 +- supriya/utils/iterables.py | 4 +- tests/book/test_ext_book.py | 7 +- tests/contexts/test_Score_nodes.py | 4 +- tests/contexts/test_Score_synthdefs.py | 5 +- tests/contexts/test_Server_synthdefs.py | 5 +- tests/patterns/test_FxPattern.py | 3 +- tests/{synthdefs => ugens}/__init__.py | 0 .../test_SynthDefFactory.py} | 12 +- .../test_SynthDef___str__.py} | 11 +- .../test_SynthDef_ambisonics.py} | 31 +- .../test_SynthDef_basic.py} | 77 +- .../test_SynthDef_decompile.py} | 93 +- .../test_SynthDef_demand.py} | 15 +- tests/ugens/test_SynthDef_expansion.py | 100 + .../test_SynthDef_mfcc.py} | 16 +- .../test_SynthDef_optimization.py} | 21 +- .../test_SynthDef_parameters.py} | 177 +- .../test_SynthDef_rngs.py} | 26 +- .../test_SynthDef_shared.py} | 0 .../test_SynthDef_splay.py} | 38 +- .../test_SynthDef_system.py} | 6 +- .../test_SynthDef_width_first.py} | 53 +- 86 files changed, 3361 insertions(+), 28480 deletions(-) delete mode 100644 docs/notebooks/introduction.ipynb delete mode 100644 docs/notebooks/rise.css delete mode 100644 supriya/synthdefs/__init__.py delete mode 100644 supriya/synthdefs/builders.py delete mode 100644 supriya/synthdefs/compilers.py delete mode 100644 supriya/synthdefs/controls.py delete mode 100644 supriya/synthdefs/envelopes.py delete mode 100644 supriya/synthdefs/grapher.py delete mode 100644 supriya/synthdefs/synthdefs.py rename docs/notebooks/introduction.css => supriya/ugens/compilers.py (100%) rename supriya/ugens/{bases.py => core.py} (62%) delete mode 100644 supriya/ugens/decorators.py rename supriya/{synthdefs => ugens}/factories.py (98%) rename tests/{synthdefs => ugens}/__init__.py (100%) rename tests/{synthdefs/test_synthdefs_SynthDefFactory.py => ugens/test_SynthDefFactory.py} (95%) rename tests/{synthdefs/test_synthdefs_SynthDef___str__.py => ugens/test_SynthDef___str__.py} (75%) rename tests/{synthdefs/test_synthdefs_SynthDefCompiler_ambisonics.py => ugens/test_SynthDef_ambisonics.py} (86%) rename tests/{synthdefs/test_synthdefs_SynthDefCompiler_basic.py => ugens/test_SynthDef_basic.py} (83%) rename tests/{synthdefs/test_synthdefs_SynthDefDecompiler.py => ugens/test_SynthDef_decompile.py} (64%) rename tests/{synthdefs/test_synthdefs_SynthDefCompiler_demand.py => ugens/test_SynthDef_demand.py} (93%) create mode 100644 tests/ugens/test_SynthDef_expansion.py rename tests/{synthdefs/test_synthdefs_SynthDefCompiler_mfcc.py => ugens/test_SynthDef_mfcc.py} (95%) rename tests/{synthdefs/test_synthdefs_SynthDefCompiler_optimization.py => ugens/test_SynthDef_optimization.py} (77%) rename tests/{synthdefs/test_synthdefs_SynthDefCompiler_parameters.py => ugens/test_SynthDef_parameters.py} (82%) rename tests/{synthdefs/test_synthdefs_SynthDefCompiler_rngs.py => ugens/test_SynthDef_rngs.py} (85%) rename tests/{synthdefs/test_synthdefs_SynthDefCompiler_shared.py => ugens/test_SynthDef_shared.py} (100%) rename tests/{synthdefs/test_synthdefs_SynthDefCompiler_splay.py => ugens/test_SynthDef_splay.py} (95%) rename tests/{synthdefs/test_synthdefs_SynthDefCompiler_system.py => ugens/test_SynthDef_system.py} (98%) rename tests/{synthdefs/test_synthdefs_SynthDefCompiler_width_first.py => ugens/test_SynthDef_width_first.py} (91%) diff --git a/README.md b/README.md index dc0cc337e..0a6d39e32 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Supriya lets you: in realtime. - Compile SuperCollider - [SynthDefs](http://josiahwolfoberholtzer.com/supriya/api/supriya/synthdefs/index.html) + [SynthDefs](http://josiahwolfoberholtzer.com/supriya/api/supriya/ugens/index.html) natively in Python code - Explore @@ -69,8 +69,8 @@ Boot the SuperCollider server: Import some classes: + >>> from supriya import Envelope, synthdef >>> from supriya.ugens import EnvGen, Out, SinOsc - >>> from supriya.synthdefs import Envelope, synthdef Make a synthesizer definition: diff --git a/docs/notebooks/introduction.ipynb b/docs/notebooks/introduction.ipynb deleted file mode 100644 index b8b09beec..000000000 --- a/docs/notebooks/introduction.ipynb +++ /dev/null @@ -1,25031 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Introducing Supriya\n", - "\n", - "A Python API for SuperCollider\n", - "\n", - "https://github.com/supriya-project/supriya" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Supriya lets you..." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "- boot and communicate with SuperCollider's `scsynth` synthesis server" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "- construct and compile SynthDef unit generator graphs in native Python code" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "- build and control graphs of synthesizers and synthesizer groups" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "- explicitly object-model `scsynth`-specific OSC commands via `Request` and `Response` classes" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "- compile non-realtime synthesis scores via Supriya's `Session` class" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "- write patterns for realtime or non-realtime synthesis" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "A lot of the same stuff you do with `sclang` and `scide`, just in Python instead." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## About the author" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "- A composer and programmer\n", - " - https://github.com/josiah-wolf-oberholtzer\n", - " - https://soundcloud.com/josiah-wolf-oberholtzer/in-the-tall-grasses" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "- PhD from Harvard in Music Composition, specializing in massively multi-channel tape music and symbolic computer-assisted composition" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "- Core contributor to Abjad (https://http://abjad.mbrsi.org/), a Python API for LilyPond" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "- Software engineering manager at Capital One, running a group developing serverless machine learning applications for hotel reservation arbitrage" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "- Used / taught enough Max/MSP to hit a wall" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Hold up, what's Python? (Cribbed from Wikipedia)\n", - "\n", - "- Python is an interpreted, high-level, general-purpose programming language.\n", - "\n", - "- Created by Guido van Rossum and first released in 1991, **Python has a design philosophy that emphasizes code readability, notably using significant whitespace.** (emphasis mine)\n", - "\n", - "- It provides constructs that enable clear programming on both small and large scales.\n", - "\n", - "- Python features a dynamic type system and automatic memory management.\n", - "\n", - "- It supports multiple programming paradigms, including object-oriented, imperative, functional and procedural, and has a large and comprehensive standard library. It also has a vibrant third-party package ecosystem." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Hello Python\n", - "\n", - "This is maybe a little corny, but it's pretty good advice." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The Zen of Python, by Tim Peters\n", - "\n", - "Beautiful is better than ugly.\n", - "Explicit is better than implicit.\n", - "Simple is better than complex.\n", - "Complex is better than complicated.\n", - "Flat is better than nested.\n", - "Sparse is better than dense.\n", - "Readability counts.\n", - "Special cases aren't special enough to break the rules.\n", - "Although practicality beats purity.\n", - "Errors should never pass silently.\n", - "Unless explicitly silenced.\n", - "In the face of ambiguity, refuse the temptation to guess.\n", - "There should be one-- and preferably only one --obvious way to do it.\n", - "Although that way may not be obvious at first unless you're Dutch.\n", - "Now is better than never.\n", - "Although never is often better than *right* now.\n", - "If the implementation is hard to explain, it's a bad idea.\n", - "If the implementation is easy to explain, it may be a good idea.\n", - "Namespaces are one honking great idea -- let's do more of those!\n" - ] - } - ], - "source": [ - "import this" - ] - }, - { - "attachments": { - "scEn.png": { - "image/png": "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" - } - }, - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## SuperCollider Architecture Review\n", - "\n", - "- `scsynth`: a synthesis server\n", - "- `sclang`: a programming language / interpreter\n", - "- `scide`: a GUI for running all of the above\n", - "- `OSC (Open Sound Control)`: \"a protocol for communication among computers, sound synthesizers, and other multimedia devices\"\n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## OK, but why make another `scsynth` client?\n", - "\n", - "- To take advantage of language features and libraries not available in `sclang`\n", - "- To explore language features and libraries in your chosen language you might not otherwise interact with\n", - "- To better understand how `sclang` and `scsynth` interact\n", - "- Just For Fun™\n", - "- Because you're stubborn" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## No, really, why?\n", - "\n", - "Well, I want...\n", - "\n", - "- To make massively multichannel fixed media pieces in my preferred language, so I can make use of code I've already written as well as many third-party libraries I love using for documentation, testing, etc.\n", - "- To have all audio materials modeled in code\n", - "- To create parity between the experiences of realtime experimentation and non-realtime composing\n", - "- To allow layers of NRT material to reference one another in an object-oriented way\n", - "- To allow for fully-reproducible (re-)rendering of NRT scores\n", - "- To allow entire scores and related CLI/TUI tools to be fully tested as code" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Some design principles\n", - "\n", - "- Keep the scope narrow / don't reinvent\n", - " - Lean on the wider community for unit test, math, MIDI, etc.\n", - "- Keep the interfaces familiar\n", - " - Python makes it easy for classes to implement list-like / dictionary-like interfaces\n", - "- Keep the interfaces simple\n", - " - Avoid convenience methods, alternate spellings\n", - "- Avoid global state\n", - "- Make classes as immutable as possible\n", - " - Local state can be as hard to manage as global state\n", - " - Use factory classes to configure and instantiate instances\n", - "- If it's a term-of-art in `scsynth`, use the name" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Hello World" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "from supriya import Server, Synth" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "scrolled": true, - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "server = Server()\n", - "server.boot()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "<+ Synth: 1000>" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "synth = Synth()\n", - "synth.allocate()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NODE TREE 0 group\n", - " 1 group\n", - " 1000 default\n", - " out: 0.0, amplitude: 0.1, frequency: 440.0, gate: 1.0, pan: 0.5\n" - ] - } - ], - "source": [ - "print(server)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "<+ Synth: 1000>" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "synth.release()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "server.quit()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "### Hello World (a little more complicated)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "from supriya import Bus, Group, Server, Synth" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "server = Server().boot()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "bus = Bus.control().allocate()\n", - "bus.set(0.5)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "group = Group().allocate()\n", - "for i in range(1, 10):\n", - " synth = Synth(amplitude=bus, frequency=111 * i)\n", - " _ = synth.allocate(target_node=group)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "bus.set(0.1)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "group.controls[\"gate\"] = 0" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "server.quit()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Realtime Server Node Tree Model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's just import `supriya`:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "import supriya" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And let's make a bunch of synths and groups..." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "synth_a = supriya.Synth(frequency=333, name=\"A\")\n", - "synth_b = supriya.Synth(frequency=444, name=\"B\")\n", - "synth_c = supriya.Synth(frequency=555, name=\"C\")\n", - "outer_group = supriya.Group(name=\"Outer\")\n", - "inner_group = supriya.Group(name=\"Inner\")\n", - "outer_group.extend([synth_a, inner_group, synth_c])\n", - "inner_group.append(synth_b)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Shhh, this is magic..." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "%load_ext supriya.ext.ipython" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "...so we can capture some of Supriya's output in this presentation:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tG\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup->synth-0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup->group-1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup->synth-2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1->synth-1-0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tGroup\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: Outer\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsynth-0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSynth\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: A\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 0-0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tGroup\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: Inner\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 0-1\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsynth-1-0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSynth\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: B\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 0-1-0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsynth-2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSynth\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: C\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 0-2\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "_ = supriya.graph(outer_group)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Groups know about their children and nodes know about their parents:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 <- Synth: ??? (A)>\n", - "1 <- Group: ??? (Inner)>\n", - "2 <- Synth: ??? (C)>\n" - ] - } - ], - "source": [ - "for index, node in enumerate(outer_group.children):\n", - " print(index, repr(node)) " - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 <- Synth: ??? (B)>\n", - "1 <- Group: ??? (Inner)>\n", - "2 <- Group: ??? (Outer)>\n" - ] - } - ], - "source": [ - "for distance, node in enumerate(synth_b.parentage):\n", - " print(distance, repr(node))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Nodes can be iterated depth-first and know their position in the tree:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "<- Synth: ??? (A)> (0,)\n", - "<- Group: ??? (Inner)> (1,)\n", - "<- Synth: ??? (B)> (1, 0)\n", - "<- Synth: ??? (C)> (2,)\n" - ] - } - ], - "source": [ - "for child in outer_group.depth_first():\n", - " print(repr(child), child.graph_order)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Booting the server is \"just like\"™ in `sclang`:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "server = supriya.Server()\n", - "server.boot()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "We can print out to the interpreter a string representation of `scsynth`'s state:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NODE TREE 0 group\n", - " 1 group\n" - ] - } - ], - "source": [ - "print(server)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Allocating a group recursively allocates its children. " - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NODE TREE 0 group\n", - " 1 group\n", - " 1000 group\n", - " 1001 default\n", - " out: 0.0, amplitude: 0.1, frequency: 333.0, gate: 1.0, pan: 0.5\n", - " 1002 group\n", - " 1003 default\n", - " out: 0.0, amplitude: 0.1, frequency: 444.0, gate: 1.0, pan: 0.5\n", - " 1004 default\n", - " out: 0.0, amplitude: 0.1, frequency: 555.0, gate: 1.0, pan: 0.5\n" - ] - } - ], - "source": [ - "outer_group.allocate()\n", - "print(server)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Let's visualize the allocated node structure:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tG\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1000->synth-1001\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1000->group-1002\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1000->synth-1004\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1002->synth-1003\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1000\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tGroup\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: Outer\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 1000\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsynth-1001\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSynth\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: A\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 1001\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1002\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tGroup\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: Inner\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 1002\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsynth-1003\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSynth\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: B\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 1003\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsynth-1004\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSynth\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: C\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 1004\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "_ = supriya.graph(outer_group)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "We can query synth controls and set them like a Python dictionary:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "333.0" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "synth_a[\"frequency\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "654.0\n" - ] - } - ], - "source": [ - "synth_a[\"frequency\"] = 654\n", - "print(synth_a[\"frequency\"])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can set the controls of synths who are members of the subtree rooted at some group by setting a key of that the group like you would a dictionary:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.01" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "outer_group.controls[\"amplitude\"] = 0.01\n", - "synth_a[\"amplitude\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "The synth controls are also explicitly modeled, hidden inside the \"controls\" interface:" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " \"amplitude\": 0.01 [kr]>\n", - " \"frequency\": 654.0 [kr]>\n", - " \"gate\": 1.0 [kr]>\n", - " \"out\": 0.0 [ir]>\n", - " \"pan\": 0.5 [kr]>\n" - ] - } - ], - "source": [ - "for control_name in synth_a.controls:\n", - " print(repr(synth_a.controls[control_name]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Groups also have a control interface, aggregating controls from synths in their subtree:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " \"amplitude\" [kr]>\n", - " \"frequency\" [kr]>\n", - " \"gate\" [kr]>\n", - " \"out\" [ir]>\n", - " \"pan\" [kr]>\n" - ] - } - ], - "source": [ - "for control_name in outer_group.controls:\n", - " print(repr(outer_group.controls[control_name]))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "We can allocate new nodes and move existing nodes in the same command" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "synth_d = supriya.Synth(synthdef=supriya.assets.synthdefs.pad, name=\"D\")\n", - "inner_group.extend([synth_d, synth_a])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Iteration continues to work:" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "<+ Group: 1002 (Inner)>\n", - "<+ Synth: 1004 (C)>\n" - ] - } - ], - "source": [ - "for node in outer_group.children:\n", - " print(repr(node))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the `Outer` group now knows about a new synth control name from the `pad` SynthDef:" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "amplitude\n", - "filter_frequency\n", - "frequency\n", - "gate\n", - "out\n", - "pan\n" - ] - } - ], - "source": [ - "for control_name in outer_group.controls:\n", - " print(control_name)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "We can visualize the entire server node structure, including the root node and default group:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tG\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\troot-node-0->group-1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1->group-1000\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1000->group-1002\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1000->synth-1004\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1002->synth-1003\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1002->synth-1005\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1002->synth-1001\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\troot-node-0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tRootNode\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tGroup\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 1\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1000\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tGroup\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: Outer\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 1000\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-1002\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tGroup\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: Inner\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 1002\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsynth-1003\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSynth\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: B\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 1003\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsynth-1005\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSynth\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: D\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 1005\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsynth-1001\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSynth\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: A\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 1001\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsynth-1004\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSynth\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: C\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 1004\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "_ = supriya.graph(server)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Let's free the `Outer` group:" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "<- Group: ??? (Outer)>" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "outer_group.free()" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NODE TREE 0 group\n", - " 1 group\n" - ] - } - ], - "source": [ - "print(server)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Explicitly freeing a group does not destructure its children:" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "??? group (Outer)\n", - " ??? group (Inner)\n", - " ??? default (B)\n", - " amplitude: 0.01, frequency: 444.0, gate: 1.0, out: 0.0, pan: 0.5\n", - " ??? pad (D)\n", - " amplitude: 0.1, filter_frequency: 1500.0, frequency: 440.0, gate: 1.0, out: 0.0, pan: 0.0\n", - " ??? default (A)\n", - " amplitude: 0.01, frequency: 654.0, gate: 1.0, out: 0.0, pan: 0.5\n", - " ??? default (C)\n", - " amplitude: 0.01, frequency: 555.0, gate: 1.0, out: 0.0, pan: 0.5\n" - ] - } - ], - "source": [ - "print(outer_group)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tG\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup->group-0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup->synth-1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-0->synth-0-0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-0->synth-0-1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-0->synth-0-2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tGroup\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: Outer\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgroup-0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tGroup\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: Inner\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 0-0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsynth-0-0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSynth\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: B\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 0-0-0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsynth-0-1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSynth\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: D\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 0-0-1\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsynth-0-2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSynth\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: A\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 0-0-2\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsynth-1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSynth\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tname: C\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tid: 0-1\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "_ = supriya.graph(outer_group)" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "server.quit()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## OSC Command Aggregation\n", - "\n", - "What's Supriya _actually_ doing when we move nodes in and out of the server tree?" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [], - "source": [ - "server = supriya.Server().reboot()\n", - "server.debug_request_names = True # for legibility" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the same node structure as before..." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "??? group (Outer)\n", - " ??? default (A)\n", - " amplitude: 0.1, frequency: 333.0, gate: 1.0, out: 0.0, pan: 0.5\n", - " ??? group (Inner)\n", - " ??? default (B)\n", - " amplitude: 0.1, frequency: 444.0, gate: 1.0, out: 0.0, pan: 0.5\n", - " ??? default (C)\n", - " amplitude: 0.1, frequency: 555.0, gate: 1.0, out: 0.0, pan: 0.5\n" - ] - } - ], - "source": [ - "synth_a = supriya.Synth(frequency=333, name=\"A\")\n", - "synth_b = supriya.Synth(frequency=444, name=\"B\")\n", - "synth_c = supriya.Synth(frequency=555, name=\"C\")\n", - "outer_group = supriya.Group(name=\"Outer\")\n", - "inner_group = supriya.Group(name=\"Inner\")\n", - "outer_group.extend([synth_a, inner_group, synth_c])\n", - "inner_group.append(synth_b)\n", - "print(outer_group)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Let's allocate the default SynthDef manually (why?):" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "supriya.assets.synthdefs.default.allocate()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "We can spy on OSC messages going to and coming from `scsynth`:" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "with server.osc_io.capture() as transcript:\n", - " outer_group.allocate()" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OscBundle(\n", - " contents=(\n", - " OscMessage('/g_new', 1000, 0, 1),\n", - " OscMessage('/s_new', 'default', 1001, 0, 1000, 'frequency', 333.0),\n", - " OscMessage('/g_new', 1002, 3, 1001),\n", - " OscMessage('/s_new', 'default', 1003, 0, 1002, 'frequency', 444.0),\n", - " OscMessage('/s_new', 'default', 1004, 3, 1002, 'frequency', 555.0),\n", - " OscMessage('/sync', 0),\n", - " ),\n", - " )\n" - ] - } - ], - "source": [ - "for timestamp, osc_message in transcript.sent_messages:\n", - " print(repr(osc_message))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "notes" - } - }, - "source": [ - "- What was sent when we allocated that group? An OSC bundle.\n", - "- What's an OSC bundle? A bunch of OSC messages meant to execute simultaneously.\n", - "- Supriya models OSC bundles and OSC messages explicitly as classes\n", - "- The OSC messages here are a linearized version of depth-first allocation of the nodes in the subtree." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "We also have the responses from the server to each of those `/s_new` and `/g_new` commands.\n", - "And the `/synced` response as well..." - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OscMessage('/n_go', 1000, 1, -1, -1, 1, -1, -1)\n", - "OscMessage('/n_go', 1001, 1000, -1, -1, 0)\n", - "OscMessage('/n_go', 1002, 1000, 1001, -1, 1, -1, -1)\n", - "OscMessage('/n_go', 1003, 1002, -1, -1, 0)\n", - "OscMessage('/n_go', 1004, 1000, 1002, -1, 0)\n", - "OscMessage('/synced', 0)\n" - ] - } - ], - "source": [ - "for timestamp, osc_message in transcript.received_messages:\n", - " print(repr(osc_message))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Recall that I manually allocated the default synthdef earlier.\n", - "\n", - "Let's make a new synth_d using a simple sine-wave synthdef.\n", - "\n", - "Then let's allocate the new synth and also move synth 1001 into the inner group." - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "synth_d = supriya.Synth(synthdef=supriya.assets.synthdefs.simple_sine)\n", - "with server.osc_io.capture() as transcript:\n", - " inner_group.extend([synth_d, synth_a])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Supriya knows if SynthDefs have previously been allocated.\n", - "\n", - "When allocating new synths it will generate an `/d_recv` and add any node allocation / movement / free commands as the completion message:" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OscMessage('/d_recv', bytearray(b'SCgf\\x00\\x00\\x00\\x02\\x00\\x01\\x0bsimple_sine\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00C\\xdc\\x00\\x00\\x00\\x00\\x00\\x03\\tamplitude\\x00\\x00\\x00\\x00\\x03bus\\x00\\x00\\x00\\x01\\tfrequency\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x04\\x07Control\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x00\\x01\\x01\\x01\\x06SinOsc\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x00\\x02\\x0cBinaryOpUGen\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x03Out\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00'), OscBundle(\n", - " contents=(\n", - " OscMessage('/s_new', 'simple_sine', 1005, 3, 1003),\n", - " OscMessage('/n_after', 1001, 1005),\n", - " ),\n", - " ))\n" - ] - } - ], - "source": [ - "for timestamp, osc_message in transcript.sent_messages:\n", - " print(repr(osc_message))" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OscMessage('/n_go', 1005, 1002, 1003, -1, 0)\n", - "OscMessage('/n_move', 1001, 1002, 1005, -1, 0)\n", - "OscMessage('/done', '/d_recv')\n" - ] - } - ], - "source": [ - "for timestamp, osc_message in transcript.received_messages:\n", - " print(repr(osc_message))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Requests and Responses\n", - "\n", - "Let's reboot..." - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [], - "source": [ - "server = supriya.Server().reboot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Ok, this is almost the same as before, just simpler:" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "synth_a = supriya.Synth(frequency=333, name=\"A\")\n", - "synth_b = supriya.Synth(synthdef=supriya.assets.synthdefs.pad, frequency=444, name=\"B\")\n", - "outer_group = supriya.Group(name=\"Outer\")\n", - "inner_group = supriya.Group(name=\"Inner\")\n", - "outer_group.extend([synth_a, inner_group])\n", - "inner_group.append(synth_b)" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "with server.osc_io.capture() as transcript:\n", - " outer_group.allocate()" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SynthDefReceiveRequest(\n", - " callback=RequestBundle(\n", - " contents=(\n", - " GroupNewRequest(\n", - " items=[\n", - " Item(add_action=AddAction.ADD_TO_HEAD, node_id=<+ Group: 1000 (Outer)>, target_node_id=1),\n", - " ],\n", - " ),\n", - " SynthNewRequest(\n", - " add_action=AddAction.ADD_TO_HEAD,\n", - " frequency=333.0,\n", - " node_id=<+ Synth: 1001 (A)>,\n", - " synthdef=,\n", - " target_node_id=<+ Group: 1000 (Outer)>,\n", - " ),\n", - " GroupNewRequest(\n", - " items=[\n", - " Item(add_action=AddAction.ADD_AFTER, node_id=<+ Group: 1002 (Inner)>, target_node_id=<+ Synth: 1001 (A)>),\n", - " ],\n", - " ),\n", - " SynthNewRequest(\n", - " add_action=AddAction.ADD_TO_HEAD,\n", - " frequency=444.0,\n", - " node_id=<+ Synth: 1003 (B)>,\n", - " synthdef=,\n", - " target_node_id=<+ Group: 1002 (Inner)>,\n", - " ),\n", - " ),\n", - " ),\n", - " synthdefs=(\n", - " ,\n", - " ,\n", - " ),\n", - " )\n" - ] - } - ], - "source": [ - "for timestamp, request in transcript.requests:\n", - " print(request)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "notes" - } - }, - "source": [ - "None of the above is OSC. It's all explicitly class-modeled.\n", - "\n", - "Note that some of the `node_id` and `target_node_id` arguments are actually references to specific `Group` or `Synth` objects rather than just integers.\n", - "\n", - "When communicating a request like this to the server, we don't necessarily know the IDs of the nodes until we start to communicate it.\n", - "\n", - "What happen's when we \"run\" a request?\n", - "- Linearize the request (if necessary) into a series of requests.\n", - "- Apply each request _locally_, including allocating the ID of each request's node; the request classes implement any necessary logic for local application.\n", - "- If we want to block until the server processes the request, register an OSC callback using the requests's knowledge of what to expect\n", - "- Convert the request to OSC and send it\n", - "- If blocking, wait until we receive the expected response." - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NodeInfoResponse(\n", - " action=NodeAction.NODE_CREATED,\n", - " is_group=True,\n", - " node_id=1000,\n", - " parent_group_id=1,\n", - " )\n", - "NodeInfoResponse(\n", - " action=NodeAction.NODE_CREATED,\n", - " is_group=False,\n", - " node_id=1001,\n", - " parent_group_id=1000,\n", - " )\n", - "NodeInfoResponse(\n", - " action=NodeAction.NODE_CREATED,\n", - " is_group=True,\n", - " node_id=1002,\n", - " parent_group_id=1000,\n", - " previous_node_id=1001,\n", - " )\n", - "NodeInfoResponse(\n", - " action=NodeAction.NODE_CREATED,\n", - " is_group=False,\n", - " node_id=1003,\n", - " parent_group_id=1002,\n", - " )\n", - "DoneResponse(\n", - " action=('/d_recv',),\n", - " )\n" - ] - } - ], - "source": [ - "for timestamp, response in transcript.responses:\n", - " print(response)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "There are a _lot_ of `Request` and `Response` classes..." - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['BufferAllocateReadChannelRequest', 'BufferAllocateReadRequest', 'BufferAllocateRequest', 'BufferCloseRequest', 'BufferCopyRequest', 'BufferFillRequest', 'BufferFreeRequest', 'BufferGenerateRequest', 'BufferGetContiguousRequest', 'BufferGetRequest', 'BufferInfoResponse', 'BufferNormalizeRequest', 'BufferQueryRequest', 'BufferReadChannelRequest', 'BufferReadRequest', 'BufferSetContiguousRequest', 'BufferSetContiguousResponse', 'BufferSetRequest', 'BufferSetResponse', 'BufferWriteRequest', 'BufferZeroRequest', 'ClearScheduleRequest', 'CommandRequest', 'ControlBusFillRequest', 'ControlBusGetContiguousRequest', 'ControlBusGetRequest', 'ControlBusSetContiguousRequest', 'ControlBusSetContiguousResponse', 'ControlBusSetRequest', 'ControlBusSetResponse', 'DoneResponse', 'DumpOscRequest', 'ErrorRequest', 'FailResponse', 'GroupDeepFreeRequest', 'GroupDumpTreeRequest', 'GroupFreeAllRequest', 'GroupHeadRequest', 'GroupNewRequest', 'GroupQueryTreeRequest', 'GroupTailRequest', 'MoveRequest', 'NodeAction', 'NodeAfterRequest', 'NodeBeforeRequest', 'NodeCommandRequest', 'NodeFillRequest', 'NodeFreeRequest', 'NodeInfoResponse', 'NodeMapToAudioBusContiguousRequest', 'NodeMapToAudioBusRequest', 'NodeMapToControlBusContiguousRequest', 'NodeMapToControlBusRequest', 'NodeOrderRequest', 'NodeQueryRequest', 'NodeRunRequest', 'NodeSetContiguousRequest', 'NodeSetContiguousResponse', 'NodeSetRequest', 'NodeSetResponse', 'NodeTraceRequest', 'NothingRequest', 'NotifyRequest', 'ParallelGroupNewRequest', 'QueryTreeControl', 'QueryTreeGroup', 'QueryTreeResponse', 'QueryTreeSynth', 'QuitRequest', 'Request', 'RequestBundle', 'RequestId', 'RequestName', 'Requestable', 'Response', 'StatusRequest', 'StatusResponse', 'SyncRequest', 'SyncedResponse', 'SynthDefFreeAllRequest', 'SynthDefFreeRequest', 'SynthDefLoadDirectoryRequest', 'SynthDefLoadRequest', 'SynthDefReceiveRequest', 'SynthDefRemovedResponse', 'SynthGetContiguousRequest', 'SynthGetRequest', 'SynthNewRequest', 'SynthNewargsRequest', 'SynthNoidRequest', 'TriggerResponse', 'UgenCommandRequest', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']\n" - ] - } - ], - "source": [ - "print(dir(supriya.commands))" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "server.quit()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "### Musings\n", - "\n", - "The synthesis server is a state machine.\n", - "\n", - "OSC commands are state transitions.\n", - "\n", - "The local server state is a lossy model of the (complete) synthesis server state.\n", - "\n", - "Request classes (can/should) encapsulate the logic for performing their effects on the local state." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## SynthDef Builders\n", - "\n", - "SynthDefs are created via SynthDefBuilders, which act as \"context managers\":" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [], - "source": [ - "builder = supriya.SynthDefBuilder(amplitude=0, bus=0, frequency=440)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "SynthDef parameters are accessed via dictionary lookup on the builder:" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [], - "source": [ - "with builder as builder:\n", - " sine = supriya.ugens.SinOsc.ar(frequency=builder[\"frequency\"])\n", - " source = sine * builder[\"amplitude\"]\n", - " supriya.ugens.Out.ar(\n", - " bus=builder[\"bus\"],\n", - " source=source,\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "synthdef = builder.build(name=\"simple_sine\")\n", - "print(repr(synthdef))" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tsynthdef_simple_sine\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_1:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_2:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_3:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1:e->ugen_2:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2:e->ugen_3:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tControl\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tamplitude:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t440.0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tSinOsc\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tphase:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tBinaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[MULTIPLICATION]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tleft\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tright\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "_ = supriya.graph(synthdef)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "More ways of \"viewing\" a SynthDef:" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "synthdef:\n", - " name: simple_sine\n", - " ugens:\n", - " - Control.kr: null\n", - " - SinOsc.ar:\n", - " frequency: Control.kr[2:frequency]\n", - " phase: 0.0\n", - " - BinaryOpUGen(MULTIPLICATION).ar:\n", - " left: SinOsc.ar[0]\n", - " right: Control.kr[0:amplitude]\n", - " - Out.ar:\n", - " bus: Control.kr[1:bus]\n", - " source[0]: BinaryOpUGen(MULTIPLICATION).ar[0]\n", - "\n" - ] - } - ], - "source": [ - "print(str(synthdef))" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "b'SCgf\\x00\\x00\\x00\\x02\\x00\\x01\\x0bsimple_sine\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00C\\xdc\\x00\\x00\\x00\\x00\\x00\\x03\\tamplitude\\x00\\x00\\x00\\x00\\x03bus\\x00\\x00\\x00\\x01\\tfrequency\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x04\\x07Control\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x00\\x01\\x01\\x01\\x06SinOsc\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x00\\x02\\x0cBinaryOpUGen\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x03Out\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00'" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "synthdef.compile()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "### A slightly more complex SynthDef" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "builder = supriya.SynthDefBuilder(amplitude=1, bus=0, frequency=440, decay_time=5, coefficient=0.1)" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "with builder:\n", - " envelope = supriya.ugens.EnvGen.kr(\n", - " envelope=supriya.synthdefs.Envelope.linen(\n", - " attack_time=0,\n", - " sustain_time=builder[\"decay_time\"],\n", - " release_time=0,\n", - " ),\n", - " done_action=supriya.DoneAction.FREE_SYNTH,\n", - " )\n", - " source = supriya.ugens.Pluck.ar(\n", - " source=supriya.ugens.WhiteNoise.ar() * builder[\"amplitude\"],\n", - " trigger=supriya.ugens.Impulse.kr(frequency=0),\n", - " maximum_delay_time=0.1,\n", - " delay_time=1 / builder[\"frequency\"],\n", - " decay_time=builder[\"decay_time\"],\n", - " coefficient=builder[\"coefficient\"],\n", - " )\n", - " supriya.ugens.Out.ar(bus=builder[\"bus\"], source=[source, source])" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [], - "source": [ - "pluck_synthdef = builder.build()" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tsynthdef_7a5e2af8be158c66747ea11ca9db1f9c\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_1:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_2:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_4:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_7:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3:e->ugen_4:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6:e->ugen_7:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6:e->ugen_7:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tControl\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tamplitude:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcoefficient:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t5.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t440.0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tEnvGen\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tgate:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tlevel_scale:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tlevel_bias:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\ttime_scale:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdone_action:\n", - "\t\t\t\n", - "\n", - "\t\t\t2.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tenvelope:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t3.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t-99.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t-99.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t5.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t \n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t5.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t5.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tBinaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[FLOAT_DIVISION]\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tleft:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tright\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tWhiteNoise\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tBinaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[MULTIPLICATION]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tleft\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tright\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tImpulse\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tphase:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tPluck\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\ttrigger\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcoefficient\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t \n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "_ = supriya.graph(pluck_synthdef)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "SynthDefs do not need to be named. Supriya uses hashing to generate unique names:" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(None, '7a5e2af8be158c66747ea11ca9db1f9c', '7a5e2af8be158c66747ea11ca9db1f9c')" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pluck_synthdef.name, pluck_synthdef.anonymous_name, pluck_synthdef.actual_name" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [], - "source": [ - "server = supriya.Server().boot()\n", - "with server.osc_io.capture() as transcript:\n", - " pluck_synthdef.play()" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SynthDefReceiveRequest(\n", - " callback=SynthNewRequest(\n", - " add_action=AddAction.ADD_TO_HEAD,\n", - " node_id=<+ Synth: 1000>,\n", - " synthdef=,\n", - " target_node_id=1,\n", - " ),\n", - " synthdefs=(\n", - " ,\n", - " ),\n", - " )\n" - ] - } - ], - "source": [ - "for timestamp, request in transcript.requests:\n", - " print(request)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "### A swarm of fretless mandolins" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "count = 50\n", - "\n", - "with supriya.SynthDefBuilder() as builder:\n", - " frequencies = supriya.ugens.SinOsc.kr(\n", - " frequency=[supriya.ugens.Rand.ir(0.05, 0.2) for _ in range(count)],\n", - " phase=[supriya.ugens.Rand.ir(0., 1.0) for _ in range(count)],\n", - " ).range(1000, 3000)\n", - " plucks = supriya.ugens.Pluck.ar(\n", - " source=[supriya.ugens.WhiteNoise.ar() * 0.1 for _ in range(count)],\n", - " trigger=[supriya.ugens.Impulse.kr(frequency=supriya.ugens.Rand.ir(10, 12)) for _ in range(count)],\n", - " maximum_delay_time=1 / 100,\n", - " delay_time=1 / frequencies,\n", - " decay_time=2,\n", - " coefficient=[supriya.ugens.Rand.ir(0.01, 0.2) for _ in range(count)],\n", - " )\n", - " pans = supriya.ugens.Pan2.ar(\n", - " source=plucks,\n", - " position=[supriya.ugens.Rand.ir(-1, 1) for _ in range(count)]\n", - " )\n", - " mix = supriya.ugens.Mix.multichannel(pans, 2)\n", - " supriya.ugens.Out.ar(source=supriya.ugens.LeakDC.ar(source=mix))" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "angry_mandolins = builder.build()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "This SynthDef is too large to send over UDP, but Supriya does the right thing:" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "26472" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(angry_mandolins.compile())" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [], - "source": [ - "server = supriya.Server().reboot()\n", - "with server.osc_io.capture() as transcript:\n", - " synth = angry_mandolins.play()" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SynthDefLoadDirectoryRequest(\n", - " callback=SynthNewRequest(\n", - " add_action=AddAction.ADD_TO_HEAD,\n", - " node_id=<+ Synth: 1000>,\n", - " synthdef=,\n", - " target_node_id=1,\n", - " ),\n", - " directory_path=PosixPath('/var/folders/tk/tts3w0kd6llcx_dxj1mq_m0m0000gn/T/tmpzy6_jxah'),\n", - " )\n" - ] - } - ], - "source": [ - "for timestamp, request in transcript.requests:\n", - " print(request)" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<- Synth: ???>" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "synth.free()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Let's parameterize those mandolins:" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [], - "source": [ - "def make_mandolin_synthdef(count=50):\n", - " with supriya.SynthDefBuilder() as builder:\n", - " frequencies = supriya.ugens.SinOsc.kr(\n", - " frequency=[supriya.ugens.Rand.ir(0.05, 0.2) for _ in range(count)],\n", - " phase=[supriya.ugens.Rand.ir(0., 1.0) for _ in range(count)],\n", - " ).range(1000, 3000)\n", - " plucks = supriya.ugens.Pluck.ar(\n", - " source=[supriya.ugens.WhiteNoise.ar() * 0.1 for _ in range(count)],\n", - " trigger=[supriya.ugens.Impulse.kr(frequency=supriya.ugens.Rand.ir(10, 12)) for _ in range(count)],\n", - " maximum_delay_time=1 / 100,\n", - " delay_time=1 / frequencies,\n", - " decay_time=2,\n", - " coefficient=[supriya.ugens.Rand.ir(0.01, 0.2) for _ in range(count)],\n", - " )\n", - " pans = supriya.ugens.Pan2.ar(\n", - " source=plucks,\n", - " position=[supriya.ugens.Rand.ir(-1, 1) for _ in range(count)]\n", - " )\n", - " mix = supriya.ugens.Mix.multichannel(pans, 2)\n", - " supriya.ugens.Out.ar(source=supriya.ugens.LeakDC.ar(source=mix))\n", - " return builder.build()" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 76, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "server.reboot()" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "synth_1 = make_mandolin_synthdef(count=1).play()" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "metadata": {}, - "outputs": [], - "source": [ - "synth_5 = make_mandolin_synthdef(count=5).play()" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "metadata": {}, - "outputs": [], - "source": [ - "synth_25 = make_mandolin_synthdef(count=25).play()" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 80, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "server.quit()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## SynthDef Factories\n", - "\n", - "Adding another level of abstraction and convention.\n", - "\n", - "`Synth` --> `SynthDef` --> `SynthDefBuilder` --> `SynthDefFactory`" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "A double allpass delay chain with wiggly modulation:" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "factory = supriya.synthdefs.SynthDefFactory()" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "metadata": {}, - "outputs": [], - "source": [ - "def signal_block(builder, source, state):\n", - " iterations = state.get('iterations') or 2\n", - " for _ in range(iterations):\n", - " decay_time = supriya.ugens.LFDNoise3.kr(\n", - " frequency=[1] * state[\"channel_count\"],\n", - " )\n", - " delay_time = supriya.ugens.LFDNoise3.kr(\n", - " frequency=[1] * state[\"channel_count\"],\n", - " )\n", - " source = supriya.ugens.AllpassC.ar(\n", - " decay_time=decay_time.range(0.05, 0.5),\n", - " delay_time=delay_time.range(0.05, 1.0),\n", - " source=source,\n", - " maximum_delay_time=1.0,\n", - " )\n", - " return source" - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "metadata": {}, - "outputs": [], - "source": [ - "factory = factory.with_input()\n", - "factory = factory.with_output()\n", - "factory = factory.with_signal_block(signal_block)" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "metadata": {}, - "outputs": [], - "source": [ - "synthdef = factory.build()" - ] - }, - { - "cell_type": "code", - "execution_count": 85, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tsynthdef_5cc33c8e4190b7a1330910d7278c46ce\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_1:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_12:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11:e->ugen_12:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2:e->ugen_3:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4:e->ugen_5:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7:e->ugen_8:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9:e->ugen_10:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tControl\n", - "\t\t\t\n", - "\n", - "\t\t\t(scalar)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tout:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "_ = supriya.graph(synthdef)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Let's make that a quadruple allpass:" - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tsynthdef_9d36960f4fd35a5c46922d7df6c05be7\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_1:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_22:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12:e->ugen_13:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14:e->ugen_15:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16:e->ugen_21:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17:e->ugen_18:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_18:e->ugen_21:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_19:e->ugen_20:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2:e->ugen_3:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_20:e->ugen_21:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_21:e->ugen_22:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4:e->ugen_5:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7:e->ugen_8:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9:e->ugen_10:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tControl\n", - "\t\t\t\n", - "\n", - "\t\t\t(scalar)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tout:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_18\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_19\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_20\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_21\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_22\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "synthdef = factory.build(iterations=4)\n", - "_ = supriya.graph(synthdef)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Or an octuple allpass:" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tsynthdef_e7c6586a14162f309080871e64846e5d\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_1:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_42:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12:e->ugen_13:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14:e->ugen_15:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16:e->ugen_21:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17:e->ugen_18:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_18:e->ugen_21:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_19:e->ugen_20:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2:e->ugen_3:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_20:e->ugen_21:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_21:e->ugen_26:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_22:e->ugen_23:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_23:e->ugen_26:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_24:e->ugen_25:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_25:e->ugen_26:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_26:e->ugen_31:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_27:e->ugen_28:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_28:e->ugen_31:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_29:e->ugen_30:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_30:e->ugen_31:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_31:e->ugen_36:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_32:e->ugen_33:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_33:e->ugen_36:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_34:e->ugen_35:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_35:e->ugen_36:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_36:e->ugen_41:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_37:e->ugen_38:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_38:e->ugen_41:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_39:e->ugen_40:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4:e->ugen_5:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_40:e->ugen_41:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_41:e->ugen_42:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7:e->ugen_8:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9:e->ugen_10:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tControl\n", - "\t\t\t\n", - "\n", - "\t\t\t(scalar)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tout:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_18\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_19\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_20\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_21\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_22\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_23\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_24\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_25\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_26\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_27\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_28\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_29\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_30\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_31\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_32\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_33\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_34\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_35\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_36\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_37\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_38\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_39\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_40\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_41\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_42\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "synthdef = factory.build(iterations=8)\n", - "_ = supriya.graph(synthdef)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "A _stereo_ quadruple allpass delay:" - ] - }, - { - "cell_type": "code", - "execution_count": 88, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tsynthdef_ec3bb7e172a68981a2c9a032446703d6\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_1:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_42:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1:e->ugen_8:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11:e->ugen_21:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12:e->ugen_13:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13:e->ugen_18:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14:e->ugen_15:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15:e->ugen_21:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16:e->ugen_17:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17:e->ugen_18:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_18:e->ugen_28:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_19:e->ugen_20:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2:e->ugen_3:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_20:e->ugen_21:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_21:e->ugen_31:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_22:e->ugen_23:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_23:e->ugen_28:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_24:e->ugen_25:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_25:e->ugen_31:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_26:e->ugen_27:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_27:e->ugen_28:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_28:e->ugen_38:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_29:e->ugen_30:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3:e->ugen_8:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_30:e->ugen_31:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_31:e->ugen_41:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_32:e->ugen_33:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_33:e->ugen_38:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_34:e->ugen_35:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_35:e->ugen_41:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_36:e->ugen_37:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_37:e->ugen_38:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_38:e->ugen_42:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_39:e->ugen_40:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4:e->ugen_5:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_40:e->ugen_41:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_41:e->ugen_42:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6:e->ugen_7:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7:e->ugen_8:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8:e->ugen_18:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9:e->ugen_10:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tControl\n", - "\t\t\t\n", - "\n", - "\t\t\t(scalar)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tout:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t1\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_18\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_19\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_20\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_21\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_22\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_23\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_24\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_25\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_26\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_27\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_28\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_29\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_30\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_31\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_32\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_33\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_34\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_35\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_36\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_37\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_38\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_39\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_40\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_41\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_42\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t \n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "synthdef = factory.build(iterations=4, channel_count=2)\n", - "_ = supriya.graph(synthdef)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "A double allpass delay with dry/wet mix:" - ] - }, - { - "cell_type": "code", - "execution_count": 89, - "metadata": { - "scrolled": false, - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tsynthdef_a9dd147e991c89505a68b5518ec97dce\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_1:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_13:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1:e->ugen_7:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11:e->ugen_12:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12:e->ugen_13:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2:e->ugen_13:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3:e->ugen_4:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4:e->ugen_7:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6:e->ugen_7:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7:e->ugen_12:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8:e->ugen_9:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9:e->ugen_12:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tControl\n", - "\t\t\t\n", - "\n", - "\t\t\t(scalar)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tout:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tXOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcrossfade\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tControl\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcrossfade:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "factory = factory.with_output(crossfaded=True)\n", - "synthdef = factory.build(iterations=2)\n", - "_ = supriya.graph(synthdef)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Where the dry/wet mix follows a durated hanning window:" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "metadata": { - "scrolled": false, - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tsynthdef_944abe4ae8901d0152ca5db9853dd835\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_1:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_14:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_3:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1:e->ugen_2:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10:e->ugen_13:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11:e->ugen_12:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12:e->ugen_13:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13:e->ugen_14:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2:e->ugen_14:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3:e->ugen_8:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4:e->ugen_5:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5:e->ugen_8:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6:e->ugen_7:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7:e->ugen_8:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8:e->ugen_13:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9:e->ugen_10:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tControl\n", - "\t\t\t\n", - "\n", - "\t\t\t(scalar)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tout:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLine\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tstart:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tstop:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdone_action:\n", - "\t\t\t\n", - "\n", - "\t\t\t2.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tXOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcrossfade\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tUnaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[HANNING_WINDOW]\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "factory = factory.with_output(crossfaded=True, windowed=True)\n", - "synthdef = factory.build(iterations=2)\n", - "_ = supriya.graph(synthdef)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Now add another signal block with DC-kill and limiting:" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "def signal_block_post(builder, source, state):\n", - " source = supriya.ugens.LeakDC.ar(source=source)\n", - " source = supriya.ugens.Limiter.ar(duration=0.01, source=source)\n", - " return source" - ] - }, - { - "cell_type": "code", - "execution_count": 92, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tsynthdef_b500beac9f281d4bf7a9d82ac2875b20\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_1:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_3:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1:e->ugen_2:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10:e->ugen_13:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11:e->ugen_12:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12:e->ugen_13:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13:e->ugen_14:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14:e->ugen_15:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3:e->ugen_8:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4:e->ugen_5:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5:e->ugen_8:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6:e->ugen_7:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7:e->ugen_8:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8:e->ugen_13:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9:e->ugen_10:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tControl\n", - "\t\t\t\n", - "\n", - "\t\t\t(scalar)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tout:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLine\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tstart:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tstop:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdone_action:\n", - "\t\t\t\n", - "\n", - "\t\t\t2.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLeakDC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcoefficient:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.995\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLimiter\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tlevel:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.01\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tXOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcrossfade\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tUnaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[HANNING_WINDOW]\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "factory = factory.with_signal_block(signal_block_post)\n", - "synthdef = factory.build(iterations=2)\n", - "_ = supriya.graph(synthdef)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "And a feedback loop:" - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": { - "scrolled": false, - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tsynthdef_7335bc67cbe259a12fcf590916f96ce9\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_1:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_18:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_3:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1:e->ugen_2:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10:e->ugen_15:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11:e->ugen_12:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12:e->ugen_15:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13:e->ugen_14:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14:e->ugen_15:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16:e->ugen_17:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17:e->ugen_18:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17:e->ugen_19:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2:e->ugen_18:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3:e->ugen_5:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4:e->ugen_5:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5:e->ugen_10:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6:e->ugen_7:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7:e->ugen_10:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8:e->ugen_9:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9:e->ugen_10:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tControl\n", - "\t\t\t\n", - "\n", - "\t\t\t(scalar)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tout:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLine\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tstart:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tstop:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdone_action:\n", - "\t\t\t\n", - "\n", - "\t\t\t2.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLeakDC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcoefficient:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.995\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLimiter\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tlevel:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.01\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_18\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tXOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcrossfade\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_19\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLocalOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tUnaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[HANNING_WINDOW]\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLocalIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdefault:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tBinaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[ADDITION]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tleft\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tright\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "factory = factory.with_feedback_loop()\n", - "synthdef = factory.build(iterations=2)\n", - "_ = supriya.graph(synthdef)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Where the feedback loop has its own signal block:" - ] - }, - { - "cell_type": "code", - "execution_count": 94, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "def feedback_block(builder, source, state):\n", - " multiplier = supriya.ugens.LFDNoise1.kr(frequency=10).range(0.1, 0.9)\n", - " if len(source) > 1:\n", - " source = supriya.synthdefs.UGenArray((source[-1],) + source[:-1])\n", - " return -(multiplier * source)" - ] - }, - { - "cell_type": "code", - "execution_count": 95, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tsynthdef_dcc2ebfabda05ac7516215cf80aa4022\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_1:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_18:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_3:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1:e->ugen_2:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10:e->ugen_15:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11:e->ugen_12:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12:e->ugen_15:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13:e->ugen_14:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14:e->ugen_15:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16:e->ugen_17:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17:e->ugen_18:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17:e->ugen_21:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_19:e->ugen_20:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2:e->ugen_18:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_20:e->ugen_21:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_21:e->ugen_22:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_22:e->ugen_23:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3:e->ugen_5:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4:e->ugen_5:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5:e->ugen_10:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6:e->ugen_7:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7:e->ugen_10:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8:e->ugen_9:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9:e->ugen_10:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tControl\n", - "\t\t\t\n", - "\n", - "\t\t\t(scalar)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tout:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLine\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tstart:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tstop:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdone_action:\n", - "\t\t\t\n", - "\n", - "\t\t\t2.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLeakDC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcoefficient:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.995\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLimiter\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tlevel:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.01\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_18\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tXOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcrossfade\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_19\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise1\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t10.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tUnaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[HANNING_WINDOW]\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_20\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_21\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tBinaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[MULTIPLICATION]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tleft\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tright\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_22\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tUnaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[NEGATIVE]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_23\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLocalOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLocalIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdefault:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tBinaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[ADDITION]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tleft\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tright\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "factory = factory.with_feedback_loop(feedback_block)\n", - "synthdef = factory.build(iterations=2)\n", - "_ = supriya.graph(synthdef)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "And a random seed ID:" - ] - }, - { - "cell_type": "code", - "execution_count": 96, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tsynthdef_38801e6c36ac8557aed1e587743d8b5e\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_1:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_19:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_2:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_4:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12:e->ugen_13:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14:e->ugen_15:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16:e->ugen_17:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17:e->ugen_18:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_18:e->ugen_19:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_18:e->ugen_22:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2:e->ugen_3:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_20:e->ugen_21:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_21:e->ugen_22:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_22:e->ugen_23:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_23:e->ugen_24:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3:e->ugen_19:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7:e->ugen_8:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9:e->ugen_10:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tControl\n", - "\t\t\t\n", - "\n", - "\t\t\t(scalar)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tout:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\trand_id:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tRandID\n", - "\t\t\t\n", - "\n", - "\t\t\t(scalar)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\trand_id\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLeakDC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcoefficient:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.995\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_18\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLimiter\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tlevel:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.01\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_19\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tXOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcrossfade\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLine\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tstart:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tstop:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdone_action:\n", - "\t\t\t\n", - "\n", - "\t\t\t2.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_20\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise1\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t10.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_21\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_22\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tBinaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[MULTIPLICATION]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tleft\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tright\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_23\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tUnaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[NEGATIVE]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_24\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLocalOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tUnaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[HANNING_WINDOW]\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLocalIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdefault:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tBinaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[ADDITION]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tleft\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tright\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "factory = factory.with_rand_id(1)\n", - "synthdef = factory.build(iterations=2)\n", - "_ = supriya.graph(synthdef)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "And finally in stereo with four delays:" - ] - }, - { - "cell_type": "code", - "execution_count": 97, - "metadata": { - "scrolled": true, - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\t\n", - "\n", - "\t\n", - "\t\t\n", - "\n", - "\t\tsynthdef_3870d2c139e884ee4fb45e03e37b4323\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_1:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_2:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_4:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0:e->ugen_52:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10:e->ugen_11:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11:e->ugen_17:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12:e->ugen_13:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13:e->ugen_14:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14:e->ugen_24:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15:e->ugen_16:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16:e->ugen_17:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17:e->ugen_27:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_18:e->ugen_19:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_19:e->ugen_24:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2:e->ugen_3:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_20:e->ugen_21:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_21:e->ugen_27:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_22:e->ugen_23:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_23:e->ugen_24:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_24:e->ugen_34:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_25:e->ugen_26:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_26:e->ugen_27:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_27:e->ugen_37:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_28:e->ugen_29:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_29:e->ugen_34:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3:e->ugen_52:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_30:e->ugen_31:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_31:e->ugen_37:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_32:e->ugen_33:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_33:e->ugen_34:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_34:e->ugen_44:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_35:e->ugen_36:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_36:e->ugen_37:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_37:e->ugen_49:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_38:e->ugen_39:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_39:e->ugen_44:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4:e->ugen_7:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_40:e->ugen_41:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_41:e->ugen_49:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_42:e->ugen_43:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_43:e->ugen_44:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_44:e->ugen_45:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_45:e->ugen_46:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_46:e->ugen_52:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_46:e->ugen_57:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_47:e->ugen_48:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_48:e->ugen_49:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_49:e->ugen_50:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5:e->ugen_6:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5:e->ugen_7:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_50:e->ugen_51:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_51:e->ugen_52:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_51:e->ugen_55:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_53:e->ugen_54:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_54:e->ugen_55:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_54:e->ugen_57:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_55:e->ugen_56:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_56:e->ugen_59:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_57:e->ugen_58:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_58:e->ugen_59:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6:e->ugen_14:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7:e->ugen_17:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8:e->ugen_9:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9:e->ugen_14:w\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tControl\n", - "\t\t\t\n", - "\n", - "\t\t\t(scalar)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tout:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\trand_id:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_1\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tRandID\n", - "\t\t\t\n", - "\n", - "\t\t\t(scalar)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\trand_id\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_10\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_11\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_12\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_13\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_14\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_15\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_16\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_17\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_18\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_19\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_2\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLine\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tstart:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tstop:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdone_action:\n", - "\t\t\t\n", - "\n", - "\t\t\t2.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_20\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_21\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_22\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_23\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_24\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_25\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_26\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_27\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_28\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_29\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_3\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tUnaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[HANNING_WINDOW]\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_30\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_31\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_32\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_33\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_34\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_35\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_36\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_37\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_38\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_39\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t1\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_40\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_41\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_42\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_43\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_44\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_45\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLeakDC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcoefficient:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.995\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_46\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLimiter\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tlevel:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.01\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_47\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_48\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.475\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.525\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_49\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tAllpassC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmaximum_delay_time:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdelay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdecay_time\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLocalIn\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tdefault:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t1\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_50\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLeakDC\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcoefficient:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.995\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_51\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLimiter\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tlevel:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tduration:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.01\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_52\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tXOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tbus\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tcrossfade\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t \n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_53\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise1\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t10.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_54\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.4\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.5\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_55\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tBinaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[MULTIPLICATION]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tleft\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tright\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_56\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tUnaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[NEGATIVE]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_57\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tBinaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[MULTIPLICATION]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tleft\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tright\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_58\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tUnaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[NEGATIVE]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_59\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLocalOut\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t \n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_6\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tBinaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[ADDITION]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tleft\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tright\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_7\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tBinaryOpUGen\n", - "\t\t\t\n", - "\n", - "\t\t\t[ADDITION]\n", - "\t\t\t\n", - "\n", - "\t\t\t(audio)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tleft\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tright\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_8\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tLFDNoise3\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tfrequency:\n", - "\t\t\t\n", - "\n", - "\t\t\t1.0\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tugen_9\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tMulAdd\n", - "\t\t\t\n", - "\n", - "\t\t\t(control)\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tsource\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\tmultiplier:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.225\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\taddend:\n", - "\t\t\t\n", - "\n", - "\t\t\t0.275\n", - "\t\t\t\n", - "\n", - "\t\t\t\n", - "\t\t\t\n", - "\n", - "\t\t\t0\n", - "\t\t\t\n", - "\n", - "\t\t\n", - "\t\t\n", - "\n", - "\t\n", - "\t\n", - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "synthdef = factory.build(iterations=4, channel_count=2)\n", - "_ = supriya.graph(synthdef)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Non-realtime Session Model\n", - "\n", - "Supriya has a parallel object-model for non-realtime composition." - ] - }, - { - "cell_type": "code", - "execution_count": 98, - "metadata": { - "slideshow": { - "slide_type": "notes" - } - }, - "outputs": [], - "source": [ - "%reload_ext supriya.ext.ipython\n", - "import supriya" - ] - }, - { - "cell_type": "code", - "execution_count": 99, - "metadata": {}, - "outputs": [], - "source": [ - "session = supriya.nonrealtime.Session(2, 2)\n", - "\n", - "with session.at(0):\n", - " synth_a = session.add_synth(duration=6, frequency=444)\n", - " group = session.add_group(add_action=\"ADD_TO_TAIL\")\n", - " \n", - "with session.at(2):\n", - " synth_b = session.add_synth(duration=6, frequency=555, add_action=\"ADD_TO_TAIL\")\n", - " \n", - "with session.at(4):\n", - " group.move_node(synth_a)" - ] - }, - { - "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "_ = supriya.play(session)" - ] - }, - { - "cell_type": "code", - "execution_count": 101, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0:\n", - " NODE TREE 0 group\n", - " 1000 default\n", - " 1001 group\n", - "2.0:\n", - " NODE TREE 0 group\n", - " 1000 default\n", - " 1001 group\n", - " 1002 default\n", - "4.0:\n", - " NODE TREE 0 group\n", - " 1001 group\n", - " 1000 default\n", - " 1002 default\n", - "6.0:\n", - " NODE TREE 0 group\n", - " 1001 group\n", - " 1002 default\n", - "8.0:\n", - " NODE TREE 0 group\n", - " 1001 group\n", - "inf:\n", - " NODE TREE 0 group\n" - ] - } - ], - "source": [ - "print(session.to_strings())" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Just like the realtime model, nodes know about their parents and children.\n", - "\n", - "With the caveat that you always have to ask \"when...\":" - ] - }, - { - "cell_type": "code", - "execution_count": 102, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[, ]\n" - ] - } - ], - "source": [ - "with session.at(1):\n", - " print(synth_a.get_parentage())" - ] - }, - { - "cell_type": "code", - "execution_count": 103, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[, , ]\n" - ] - } - ], - "source": [ - "with session.at(5):\n", - " print(synth_a.get_parentage())" - ] - }, - { - "cell_type": "code", - "execution_count": 104, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[, ]\n" - ] - } - ], - "source": [ - "with session.at(1):\n", - " print(session.root_node.get_children())" - ] - }, - { - "cell_type": "code", - "execution_count": 105, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[, ]\n" - ] - } - ], - "source": [ - "with session.at(5):\n", - " print(session.root_node.get_children())" - ] - }, - { - "cell_type": "code", - "execution_count": 106, - "metadata": { - "scrolled": true, - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0 OscMessage('/d_recv', bytearray(b'SCgf\\x00\\x00\\x00\\x02\\x00\\x01 da0982184cc8fa54cf9d288a0fe1f6ca\\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'))\n", - "0.0 OscMessage('/s_new', 'da0982184cc8fa54cf9d288a0fe1f6ca', 1000, 0, 0, 'frequency', 444)\n", - "0.0 OscMessage('/g_new', 1001, 1, 0)\n", - "2.0 OscMessage('/s_new', 'da0982184cc8fa54cf9d288a0fe1f6ca', 1002, 1, 0, 'frequency', 555)\n", - "4.0 OscMessage('/g_head', 1001, 1000)\n", - "6.0 OscMessage('/n_set', 1000, 'gate', 0)\n", - "8.0 OscMessage('/n_set', 1002, 'gate', 0)\n", - "10.0 OscMessage('/n_free', 1001)\n", - "10.0 OscMessage(0)\n" - ] - } - ], - "source": [ - "for osc_bundle in session.to_osc_bundles(duration=10):\n", - " for osc_message in osc_bundle.contents:\n", - " print(osc_bundle.timestamp, repr(osc_message))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "A slightly trickier example:" - ] - }, - { - "cell_type": "code", - "execution_count": 107, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "session = supriya.nonrealtime.Session(2, 2)\n", - "\n", - "with session.at(0):\n", - " outer_group = session.add_group()\n", - " synth_a = outer_group.add_synth(duration=6, frequency=333)\n", - " inner_group = outer_group.add_group(add_action=\"ADD_TO_TAIL\")\n", - " \n", - "with session.at(2):\n", - " synth_a[\"frequency\"] = 444\n", - " \n", - "with session.at(4):\n", - " synth_b = inner_group.add_synth(duration=4, frequency=555)\n", - " \n", - "with session.at(6):\n", - " synth_b.move_node(synth_a, \"ADD_AFTER\")" - ] - }, - { - "cell_type": "code", - "execution_count": 108, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10000/10000 [00:00<00:00, 89797.25ms/s]\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "_ = supriya.play(session, duration=10)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Nodes know about their parameters through time:" - ] - }, - { - "cell_type": "code", - "execution_count": 109, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "333\n" - ] - } - ], - "source": [ - "with session.at(1):\n", - " print(synth_a[\"frequency\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 110, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "444\n" - ] - } - ], - "source": [ - "with session.at(3):\n", - " print(synth_a[\"frequency\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0:\n", - " NODE TREE 0 group\n", - " 1000 group\n", - " 1001 default\n", - " 1002 group\n", - "4.0:\n", - " NODE TREE 0 group\n", - " 1000 group\n", - " 1001 default\n", - " 1002 group\n", - " 1003 default\n", - "6.0:\n", - " NODE TREE 0 group\n", - " 1000 group\n", - " 1002 group\n", - " 1003 default\n", - "8.0:\n", - " NODE TREE 0 group\n", - " 1000 group\n", - " 1002 group\n", - "inf:\n", - " NODE TREE 0 group\n" - ] - } - ], - "source": [ - "print(session.to_strings())" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "We can perform some more exotic operations on the nodes, like splitting a group but keeping its children intact:" - ] - }, - { - "cell_type": "code", - "execution_count": 112, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "with session.at(7.5):\n", - " outer_group.split(split_occupiers=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 113, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10000/10000 [00:00<00:00, 98819.95ms/s]\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "_ = supriya.play(session, duration=10)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Group 1000 has become group 1004:" - ] - }, - { - "cell_type": "code", - "execution_count": 114, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0:\n", - " NODE TREE 0 group\n", - " 1000 group\n", - " 1001 default\n", - " 1002 group\n", - "4.0:\n", - " NODE TREE 0 group\n", - " 1000 group\n", - " 1001 default\n", - " 1002 group\n", - " 1003 default\n", - "6.0:\n", - " NODE TREE 0 group\n", - " 1000 group\n", - " 1002 group\n", - " 1003 default\n", - "7.5:\n", - " NODE TREE 0 group\n", - " 1004 group\n", - " 1002 group\n", - " 1003 default\n", - "8.0:\n", - " NODE TREE 0 group\n", - " 1004 group\n", - " 1002 group\n", - "inf:\n", - " NODE TREE 0 group\n" - ] - } - ], - "source": [ - "print(session.to_strings())" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Look at the OSC messages at timestamp 7.5:" - ] - }, - { - "cell_type": "code", - "execution_count": 115, - "metadata": { - "scrolled": true, - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0 OscMessage('/d_recv', bytearray(b'SCgf\\x00\\x00\\x00\\x02\\x00\\x01 da0982184cc8fa54cf9d288a0fe1f6ca\\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'))\n", - "0.0 OscMessage('/g_new', 1000, 0, 0)\n", - "0.0 OscMessage('/s_new', 'da0982184cc8fa54cf9d288a0fe1f6ca', 1001, 0, 1000, 'frequency', 333)\n", - "0.0 OscMessage('/g_new', 1002, 1, 1000)\n", - "2.0 OscMessage('/n_set', 1001, 'frequency', 444)\n", - "4.0 OscMessage('/s_new', 'da0982184cc8fa54cf9d288a0fe1f6ca', 1003, 0, 1002, 'frequency', 555)\n", - "6.0 OscMessage('/n_after', 1001, 1003)\n", - "6.0 OscMessage('/n_set', 1001, 'gate', 0)\n", - "7.5 OscMessage('/g_new', 1004, 2, 1000)\n", - "7.5 OscMessage('/g_tail', 1004, 1002)\n", - "7.5 OscMessage('/n_free', 1000)\n", - "8.0 OscMessage('/n_set', 1003, 'gate', 0)\n", - "40.0 OscMessage('/n_free', 1002, 1004)\n", - "40.0 OscMessage(0)\n" - ] - } - ], - "source": [ - "for osc_bundle in session.to_osc_bundles(duration=40):\n", - " for osc_message in osc_bundle.contents:\n", - " print(osc_bundle.timestamp, repr(osc_message))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "### The `__render__` protocol" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Supriya's NRT knows about soundfiles and _things that could, in the future, be soundfiles_.\n", - "\n", - "This is expressed via the `__render__` protocol. If a class implements a `__render__` method that writes audio to disk and returns the path, then instances of that class can be used anywhere you would pass the path to a soundfile." - ] - }, - { - "cell_type": "code", - "execution_count": 116, - "metadata": { - "slideshow": { - "slide_type": "skip" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The supriya.ext.ipython extension is already loaded. To reload it, use:\n", - " %reload_ext supriya.ext.ipython\n" - ] - } - ], - "source": [ - "%load_ext supriya.ext.ipython\n", - "import supriya" - ] - }, - { - "cell_type": "code", - "execution_count": 117, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "say_supriya = supriya.Say(\"Speak and Spell Supriya\", voice=\"Daniel\")\n", - "_ = supriya.play(say_supriya)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "### NRT Dependency Tree (turtles all the way down)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Let's make a quick mono-to-stereo sampler player:" - ] - }, - { - "cell_type": "code", - "execution_count": 118, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "with supriya.SynthDefBuilder(buffer_id=0, gain=0, pan=0, rate=1) as builder:\n", - " rate_scale = supriya.ugens.BufRateScale.kr(buffer_id=builder[\"buffer_id\"])\n", - " source = supriya.ugens.PlayBuf.ar(\n", - " buffer_id=builder[\"buffer_id\"],\n", - " channel_count=1,\n", - " done_action=supriya.DoneAction.FREE_SYNTH,\n", - " rate=builder[\"rate\"] * rate_scale,\n", - " ) * builder[\"gain\"].db_to_amplitude()\n", - " source = supriya.ugens.Pan2.ar(source=source, position=builder[\"pan\"])\n", - " supriya.ugens.Out.ar(bus=0, source=source)\n", - " \n", - "mono_to_stereo_sampler_synthdef = builder.build(\"mono_to_stereo_sampler\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Add the `Say` instance as a buffer, then play it fives times:" - ] - }, - { - "cell_type": "code", - "execution_count": 119, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "say_supriya_session = supriya.Session(2, 2)\n", - "\n", - "with say_supriya_session.at(0):\n", - " buffer_ = say_supriya_session.add_buffer(\n", - " channel_count=1,\n", - " file_path=say_supriya,\n", - " )\n", - " \n", - "for i in range(5):\n", - " with say_supriya_session.at(i):\n", - " synth = say_supriya_session.add_synth(\n", - " synthdef=mono_to_stereo_sampler_synthdef,\n", - " buffer_id=buffer_,\n", - " rate=2 ** (-i / 4),\n", - " pan=(i - 2) / 2,\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 120, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10000/10000 [00:00<00:00, 96753.08ms/s]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Rendering say-368ecd9abce14c74732aff347d29b7f6.aiff\n", - " Command: say -o say-368ecd9abce14c74732aff347d29b7f6.aiff -v Daniel 'Speak and Spell Supriya'\n", - " Skipping say-368ecd9abce14c74732aff347d29b7f6.aiff. File already exists.\n", - "Writing session-823e942abd87e9a473edec5bb6a19929.osc.\n", - " Wrote session-823e942abd87e9a473edec5bb6a19929.osc.\n", - "Rendering session-823e942abd87e9a473edec5bb6a19929.osc.\n", - " Command: scsynth -N session-823e942abd87e9a473edec5bb6a19929.osc _ session-823e942abd87e9a473edec5bb6a19929.aiff 44100 aiff int24 -i 2 -o 2\n", - " Rendered session-823e942abd87e9a473edec5bb6a19929.osc with exit code 0.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "_ = supriya.play(say_supriya_session, duration=10, print_transcript=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Now let's make a quick stereo-to-stereo sample player:" - ] - }, - { - "cell_type": "code", - "execution_count": 121, - "metadata": {}, - "outputs": [], - "source": [ - "with supriya.SynthDefBuilder(buffer_id=0, gain=0, pan=0, rate=1) as builder:\n", - " rate_scale = supriya.ugens.BufRateScale.kr(buffer_id=builder[\"buffer_id\"])\n", - " source = supriya.ugens.PlayBuf.ar(\n", - " buffer_id=builder[\"buffer_id\"],\n", - " channel_count=2,\n", - " done_action=supriya.DoneAction.FREE_SYNTH,\n", - " rate=builder[\"rate\"] * rate_scale,\n", - " ) * builder[\"gain\"].db_to_amplitude()\n", - " supriya.ugens.Out.ar(bus=0, source=source)\n", - " \n", - "stereo_to_stereo_sampler_synthdef = builder.build(\"stereo_to_stereo_sampler\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "The previous session is now used as the file path for the buffer in this new session:" - ] - }, - { - "cell_type": "code", - "execution_count": 122, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "say_supriya_session_session = supriya.Session(2, 2)\n", - "\n", - "with say_supriya_session_session.at(0):\n", - " buffer_ = say_supriya_session_session.add_buffer(\n", - " channel_count=2,\n", - " file_path=say_supriya_session,\n", - " )\n", - " \n", - "for i in range(4):\n", - " with say_supriya_session_session.at(i):\n", - " synth = say_supriya_session_session.add_synth(\n", - " synthdef=stereo_to_stereo_sampler_synthdef,\n", - " buffer_id=buffer_,\n", - " rate=2 ** (-i / 4)\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 123, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Rendering say-368ecd9abce14c74732aff347d29b7f6.aiff\n", - " Command: say -o say-368ecd9abce14c74732aff347d29b7f6.aiff -v Daniel 'Speak and Spell Supriya'\n", - " Skipping say-368ecd9abce14c74732aff347d29b7f6.aiff. File already exists.\n", - "Writing session-823e942abd87e9a473edec5bb6a19929.osc.\n", - " Skipped session-823e942abd87e9a473edec5bb6a19929.osc. File already exists.\n", - "Rendering session-823e942abd87e9a473edec5bb6a19929.osc.\n", - " Skipped session-823e942abd87e9a473edec5bb6a19929.osc. Output already exists.\n", - "Writing session-321d01f4c8b2efb80a4643adfa802eb7.osc.\n", - " Wrote session-321d01f4c8b2efb80a4643adfa802eb7.osc.\n", - "Rendering session-321d01f4c8b2efb80a4643adfa802eb7.osc.\n", - " Command: scsynth -N session-321d01f4c8b2efb80a4643adfa802eb7.osc _ session-321d01f4c8b2efb80a4643adfa802eb7.aiff 44100 aiff int24 -i 2 -o 2\n", - "WARNING: Buffer UGen: no buffer data\n", - "WARNING: Buffer UGen: no buffer data\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12000/12000 [00:00<00:00, 64425.75ms/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARNING: Buffer UGen: no buffer data\n", - " Rendered session-321d01f4c8b2efb80a4643adfa802eb7.osc with exit code 0.\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "_ = supriya.play(say_supriya_session_session, duration=12, print_transcript=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Deeper and deeper:" - ] - }, - { - "cell_type": "code", - "execution_count": 124, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "allpass_panic_synthdef = (\n", - " factory\n", - " .with_input(private=True) # separate in and out bus IDs\n", - " .with_output(crossfaded=True)\n", - " .build(name=\"allpass_panic\", channel_count=2, iterations=8)\n", - ")\n", - "\n", - "meta_session = supriya.Session(2, 2, input_=say_supriya_session_session)\n", - "\n", - "with meta_session.at(0):\n", - " # we need to read from input bus and write to the output bus\n", - " meta_session.add_synth(\n", - " synthdef=allpass_panic_synthdef,\n", - " crossfade=0.5,\n", - " in_=meta_session.audio_input_bus_group, # input buses are object-modeled\n", - " )\n", - " meta_session.set_rand_seed(rand_id=0, rand_seed=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 125, - "metadata": { - "scrolled": true, - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0 OscMessage('/d_recv', bytearray(b'SCgf\\x00\\x00\\x00\\x02\\x00\\x01 5687d9b2bf9dbecb3e9123627ea65f9d\\x00\\x00\\x00\\x01?\\x80\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x07rand_id\\x00\\x00\\x00\\x00\\trand_seed\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x04\\x07Control\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x00\\x01\\x01\\x06RandID\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x08RandSeed\\x00\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x08FreeSelf\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x00\\x01\\x00\\x00'))\n", - "0.0 OscMessage('/d_recv', bytearray(b'SCgf\\x00\\x00\\x00\\x02\\x00\\x01 e3e614dc06a31341d5f86306b3286134\\x00\\x00\\x00\\x0b\\x00\\x00\\x00\\x00?\\x80\\x00\\x00>fff>\\x8c\\xcc\\xcd>\\xf333?\\x06ff?~\\xb8R<#\\xd7\\nA \\x00\\x00>\\xcc\\xcc\\xcd?\\x00\\x00\\x00\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00?\\x80\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x04\\tcrossfade\\x00\\x00\\x00\\x03\\x03in_\\x00\\x00\\x00\\x00\\x03out\\x00\\x00\\x00\\x01\\x07rand_id\\x00\\x00\\x00\\x02\\x00\\x00\\x00c\\x07Control\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x00\\x00\\x06RandID\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x02In\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x02\\x07LocalIn\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x00\\x02\\x02\\x0cBinaryOpUGen\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x00\\x02\\x0cBinaryOpUGen\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x06\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\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\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\n\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x0b\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x07\\x00\\x00\\x00\\x00\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\r\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x05\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x0e\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\t\\x00\\x00\\x00\\x00\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x10\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x12\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x14\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x0c\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x15\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x11\\x00\\x00\\x00\\x00\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x17\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x0f\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x18\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x13\\x00\\x00\\x00\\x00\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x1a\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x1c\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x1e\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x16\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x1f\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x1b\\x00\\x00\\x00\\x00\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00!\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x19\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x00\"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x1d\\x00\\x00\\x00\\x00\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00$\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00&\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00(\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00 \\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x00)\\x00\\x00\\x00\\x00\\x00\\x00\\x00%\\x00\\x00\\x00\\x00\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00+\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00#\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x00,\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\'\\x00\\x00\\x00\\x00\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00.\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x000\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x002\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00*\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x003\\x00\\x00\\x00\\x00\\x00\\x00\\x00/\\x00\\x00\\x00\\x00\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x005\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00-\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x006\\x00\\x00\\x00\\x00\\x00\\x00\\x001\\x00\\x00\\x00\\x00\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x008\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00:\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00<\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x004\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x00=\\x00\\x00\\x00\\x00\\x00\\x00\\x009\\x00\\x00\\x00\\x00\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00?\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x007\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x00@\\x00\\x00\\x00\\x00\\x00\\x00\\x00;\\x00\\x00\\x00\\x00\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00B\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00D\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00F\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00>\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x00G\\x00\\x00\\x00\\x00\\x00\\x00\\x00C\\x00\\x00\\x00\\x00\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00I\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00A\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x00J\\x00\\x00\\x00\\x00\\x00\\x00\\x00E\\x00\\x00\\x00\\x00\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00L\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00N\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x02\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x03\\x01\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00P\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00H\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x00Q\\x00\\x00\\x00\\x00\\x00\\x00\\x00M\\x00\\x00\\x00\\x00\\x02\\x06LeakDC\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00R\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x06\\x02\\x07Limiter\\x02\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00S\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x07\\x02\\tLFDNoise3\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00U\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x04\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x05\\x01\\x08AllpassC\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00K\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\x00\\x00\\x00V\\x00\\x00\\x00\\x00\\x00\\x00\\x00O\\x00\\x00\\x00\\x00\\x02\\x06LeakDC\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00W\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x06\\x02\\x07Limiter\\x02\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00X\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x01\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x07\\x02\\tLFDNoise1\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x08\\x01\\x06MulAdd\\x01\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00Z\\x00\\x00\\x00\\x00\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\t\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\n\\x01\\x0cBinaryOpUGen\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x02\\x00\\x00\\x00[\\x00\\x00\\x00\\x00\\x00\\x00\\x00Y\\x00\\x00\\x00\\x00\\x02\\x0bUnaryOpUGen\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\\\\\x00\\x00\\x00\\x00\\x02\\x0cBinaryOpUGen\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x02\\x00\\x00\\x00[\\x00\\x00\\x00\\x00\\x00\\x00\\x00T\\x00\\x00\\x00\\x00\\x02\\x0bUnaryOpUGen\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00^\\x00\\x00\\x00\\x00\\x02\\x08LocalOut\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00]\\x00\\x00\\x00\\x00\\x00\\x00\\x00_\\x00\\x00\\x00\\x00\\x02\\x07Control\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x03\\x01\\x04XOut\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00a\\x00\\x00\\x00\\x00\\x00\\x00\\x00T\\x00\\x00\\x00\\x00\\x00\\x00\\x00Y\\x00\\x00\\x00\\x00\\x00\\x00'))\n", - "0.0 OscMessage('/s_new', 'e3e614dc06a31341d5f86306b3286134', 1000, 0, 0, 'crossfade', 0.5, 'in_', 2)\n", - "0.0 OscMessage('/s_new', '5687d9b2bf9dbecb3e9123627ea65f9d', 1001, 0, 0, 'rand_id', 0, 'rand_seed', 1)\n", - "40.0 OscMessage('/n_free', 1000)\n", - "40.0 OscMessage(0)\n" - ] - } - ], - "source": [ - "for osc_bundle in meta_session.to_osc_bundles(duration=40):\n", - " for osc_message in osc_bundle.contents:\n", - " print(osc_bundle.timestamp, repr(osc_message))" - ] - }, - { - "cell_type": "code", - "execution_count": 126, - "metadata": { - "scrolled": false, - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\r", - " 0%| | 0/40000 [00:00\n", - " \n", - " Your browser does not support the audio element.\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "_ = supriya.play(meta_session, duration=30, print_transcript=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "metadata": { - "slideshow": { - "slide_type": "skip" - } - }, - "outputs": [], - "source": [ - "server.quit()\n", - "for path in supriya.output_path.iterdir():\n", - " path.unlink()" - ] - } - ], - "metadata": { - "celltoolbar": "Slideshow", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.5" - }, - "rise": { - "autolaunch": true, - "transition": "slide" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": true, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": false - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/notebooks/rise.css b/docs/notebooks/rise.css deleted file mode 100644 index e5e5a1278..000000000 --- a/docs/notebooks/rise.css +++ /dev/null @@ -1,11 +0,0 @@ -.rise-enabled .rendered_html { - padding-top: 0.25em; - padding-bottom: 0.25em; -} - -.cell svg { - width: 80vw !important; - height: 66vh !important; - max-height: 100% !important; - max-width: 100% !important; -} diff --git a/docs/source/index.rst b/docs/source/index.rst index 1d11b9117..9ae3d6e15 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -21,7 +21,7 @@ Supriya lets you: :py:class:`context ` interface. - Compile SuperCollider :py:class:`SynthDefs - ` natively in Python code. + ` natively in Python code. - Schedule :py:mod:`~supriya.patterns` and callbacks with tempo- and meter-aware :py:mod:`~supriya.clocks`. @@ -76,8 +76,8 @@ Boot the SuperCollider server:: Import some classes:: + >>> from supriya import Envelope, synthdef >>> from supriya.ugens import EnvGen, Out, SinOsc - >>> from supriya.synthdefs import Envelope, synthdef Make a synthesizer definition:: diff --git a/supriya/__init__.py b/supriya/__init__.py index 3a1e45a36..8026fa2e3 100644 --- a/supriya/__init__.py +++ b/supriya/__init__.py @@ -31,18 +31,21 @@ CalculationRate, DoneAction, HeaderFormat, + ParameterRate, SampleFormat, ) from .io import graph, play, plot, render from .osc import OscBundle, OscCallback, OscMessage from .patterns import Pattern -from .synthdefs import ( +from .ugens import ( Envelope, + UGen, + UGenVector, + UGenOperable, SynthDef, SynthDefBuilder, synthdef, ) -from .ugens import UGen, UGenArray, UGenOperable from .assets.synthdefs import default from .scsynth import Options @@ -92,7 +95,7 @@ "SynthDefBuilder", "TimeUnit", "UGen", - "UGenArray", + "UGenVector", "UGenOperable", "__version__", "__version_info__", diff --git a/supriya/assets/synthdefs/clap.py b/supriya/assets/synthdefs/clap.py index da219560b..25239aac0 100644 --- a/supriya/assets/synthdefs/clap.py +++ b/supriya/assets/synthdefs/clap.py @@ -1,5 +1,13 @@ -from ...synthdefs import Envelope, SynthDef, SynthDefBuilder -from ...ugens import BPF, HPF, EnvGen, Out, WhiteNoise +from ...ugens import ( + BPF, + HPF, + EnvGen, + Envelope, + Out, + SynthDef, + SynthDefBuilder, + WhiteNoise, +) def _build_clap_synthdef() -> SynthDef: diff --git a/supriya/assets/synthdefs/default.py b/supriya/assets/synthdefs/default.py index 4ae8a9265..3bc258f5d 100644 --- a/supriya/assets/synthdefs/default.py +++ b/supriya/assets/synthdefs/default.py @@ -1,6 +1,17 @@ from ...enums import DoneAction, ParameterRate -from ...synthdefs import Parameter, SynthDef, SynthDefBuilder -from ...ugens import LPF, Linen, Mix, OffsetOut, Pan2, Rand, VarSaw, XLine +from ...ugens import ( + LPF, + Linen, + Mix, + OffsetOut, + Pan2, + Parameter, + Rand, + SynthDef, + SynthDefBuilder, + VarSaw, + XLine, +) def _build_default_synthdef() -> SynthDef: diff --git a/supriya/assets/synthdefs/kick.py b/supriya/assets/synthdefs/kick.py index a1ccd1298..3767aeb1b 100644 --- a/supriya/assets/synthdefs/kick.py +++ b/supriya/assets/synthdefs/kick.py @@ -1,5 +1,16 @@ -from supriya.synthdefs import Envelope, SynthDef, SynthDefBuilder -from supriya.ugens import BPF, RLPF, EnvGen, Impulse, LinLin, Out, PinkNoise, SinOsc +from supriya.ugens import ( + BPF, + RLPF, + EnvGen, + Envelope, + Impulse, + LinLin, + Out, + PinkNoise, + SinOsc, + SynthDef, + SynthDefBuilder, +) def _build_kick_synthdef() -> SynthDef: diff --git a/supriya/assets/synthdefs/multiband_compressor.py b/supriya/assets/synthdefs/multiband_compressor.py index 2ca084b8b..ac81038a2 100644 --- a/supriya/assets/synthdefs/multiband_compressor.py +++ b/supriya/assets/synthdefs/multiband_compressor.py @@ -1,5 +1,14 @@ -from ...synthdefs import SynthDef, SynthDefBuilder -from ...ugens import HPF, LPF, CompanderD, In, Limiter, ReplaceOut, Sum4 +from ...ugens import ( + HPF, + LPF, + CompanderD, + In, + Limiter, + ReplaceOut, + Sum4, + SynthDef, + SynthDefBuilder, +) def _make_synthdef(channel_count: int = 2) -> SynthDef: diff --git a/supriya/assets/synthdefs/simple_sine.py b/supriya/assets/synthdefs/simple_sine.py index 608ae34b8..58321e287 100644 --- a/supriya/assets/synthdefs/simple_sine.py +++ b/supriya/assets/synthdefs/simple_sine.py @@ -1,5 +1,4 @@ -from ...synthdefs import SynthDef, SynthDefBuilder -from ...ugens import Out, SinOsc +from ...ugens import Out, SinOsc, SynthDef, SynthDefBuilder def _build_synthdef() -> SynthDef: diff --git a/supriya/assets/synthdefs/sweep_filter.py b/supriya/assets/synthdefs/sweep_filter.py index fe55b1d72..e0a169cfa 100644 --- a/supriya/assets/synthdefs/sweep_filter.py +++ b/supriya/assets/synthdefs/sweep_filter.py @@ -1,5 +1,4 @@ -from ...synthdefs import SynthDef, SynthDefBuilder -from ...ugens import HPF, LPF, In, Lag, ReplaceOut +from ...ugens import HPF, LPF, In, Lag, ReplaceOut, SynthDef, SynthDefBuilder def _build_synthdef() -> SynthDef: diff --git a/supriya/assets/synthdefs/system_synthdefs.py b/supriya/assets/synthdefs/system_synthdefs.py index cc84b60d0..519d661ce 100644 --- a/supriya/assets/synthdefs/system_synthdefs.py +++ b/supriya/assets/synthdefs/system_synthdefs.py @@ -1,8 +1,5 @@ from ...enums import EnvelopeShape -from ...synthdefs import Envelope, SynthDef, SynthDefBuilder -from ...ugens import EnvGen, In, InFeedback, Out - -__all__ = [] +from ...ugens import EnvGen, Envelope, In, InFeedback, Out, SynthDef, SynthDefBuilder def _build_link_audio_synthdef(channel_count: int) -> SynthDef: diff --git a/supriya/assets/synthdefs/test.py b/supriya/assets/synthdefs/test.py index 7d6a4f33c..be1c2eee9 100644 --- a/supriya/assets/synthdefs/test.py +++ b/supriya/assets/synthdefs/test.py @@ -1,6 +1,5 @@ from ...enums import ParameterRate -from ...synthdefs import Parameter, SynthDef, SynthDefBuilder -from ...ugens import Out, SinOsc +from ...ugens import Out, Parameter, SinOsc, SynthDef, SynthDefBuilder def _build_test_synthdef() -> SynthDef: diff --git a/supriya/contexts/core.py b/supriya/contexts/core.py index 2858ac9fe..0bf2d571c 100644 --- a/supriya/contexts/core.py +++ b/supriya/contexts/core.py @@ -33,7 +33,6 @@ from ..enums import AddAction, CalculationRate, ParameterRate from ..scsynth import Options -from ..synthdefs import SynthDef from ..typing import ( AddActionLike, CalculationRateLike, @@ -41,6 +40,7 @@ SampleFormatLike, SupportsOsc, ) +from ..ugens import SynthDef from .allocators import BlockAllocator, NodeIdAllocator from .entities import ( Buffer, diff --git a/supriya/contexts/entities.py b/supriya/contexts/entities.py index 681812256..3a61a135a 100644 --- a/supriya/contexts/entities.py +++ b/supriya/contexts/entities.py @@ -25,8 +25,8 @@ from ..assets.synthdefs.default import default from ..enums import AddAction, CalculationRate from ..io import PlayMemo -from ..synthdefs import SynthDef from ..typing import AddActionLike, HeaderFormatLike, SampleFormatLike, SupportsRender +from ..ugens import SynthDef from .errors import InvalidCalculationRate, InvalidMoment from .responses import BufferInfo, NodeInfo diff --git a/supriya/contexts/nonrealtime.py b/supriya/contexts/nonrealtime.py index 09c05a2db..340a70f5d 100644 --- a/supriya/contexts/nonrealtime.py +++ b/supriya/contexts/nonrealtime.py @@ -20,8 +20,8 @@ from ..enums import CalculationRate, HeaderFormat, SampleFormat from ..osc import OscBundle from ..scsynth import AsyncNonrealtimeProcessProtocol, Options -from ..synthdefs import SynthDef from ..typing import HeaderFormatLike, SampleFormatLike, SupportsOsc +from ..ugens import SynthDef from .core import Context, ContextError, ContextObject, Node from .requests import DoNothing, RequestBundle, Requestable diff --git a/supriya/contexts/realtime.py b/supriya/contexts/realtime.py index 5198342d7..9fcc3e125 100644 --- a/supriya/contexts/realtime.py +++ b/supriya/contexts/realtime.py @@ -46,8 +46,8 @@ ProcessProtocol, SyncProcessProtocol, ) -from ..synthdefs import SynthDef from ..typing import SupportsOsc +from ..ugens import SynthDef from .core import ( Buffer, Bus, diff --git a/supriya/contexts/requests.py b/supriya/contexts/requests.py index b89e4ae7b..097399059 100644 --- a/supriya/contexts/requests.py +++ b/supriya/contexts/requests.py @@ -29,8 +29,8 @@ from ..enums import AddAction, HeaderFormat, RequestName, SampleFormat from ..osc import OscBundle, OscMessage -from ..synthdefs import SynthDef, SynthDefCompiler from ..typing import AddActionLike, HeaderFormatLike, SampleFormatLike, SupportsOsc +from ..ugens import SynthDef, compile_synthdefs from .responses import Response if TYPE_CHECKING: @@ -1649,7 +1649,7 @@ class ReceiveSynthDefs(Request): on_completion: Optional[Requestable] = None def to_osc(self) -> OscMessage: - contents = [SynthDefCompiler.compile_synthdefs(self.synthdefs)] + contents = [compile_synthdefs(self.synthdefs)] if self.on_completion: contents.append(self.on_completion.to_osc()) return OscMessage(RequestName.SYNTHDEF_RECEIVE, *contents) diff --git a/supriya/contexts/shm.cpp b/supriya/contexts/shm.cpp index 2c8691e4f..e19d18c71 100644 --- a/supriya/contexts/shm.cpp +++ b/supriya/contexts/shm.cpp @@ -1,4 +1,4 @@ -/* Generated by Cython 3.0.8 */ +/* Generated by Cython 3.0.9 */ /* BEGIN: Cython Metadata { @@ -45,10 +45,10 @@ END: Cython Metadata */ #else #define __PYX_EXTRA_ABI_MODULE_NAME "" #endif -#define CYTHON_ABI "3_0_8" __PYX_EXTRA_ABI_MODULE_NAME +#define CYTHON_ABI "3_0_9" __PYX_EXTRA_ABI_MODULE_NAME #define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI #define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." -#define CYTHON_HEX_VERSION 0x030008F0 +#define CYTHON_HEX_VERSION 0x030009F0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof @@ -757,8 +757,13 @@ class __Pyx_FakeReference { typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else - #define __Pyx_PyCFunctionFast _PyCFunctionFast - #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords + #if PY_VERSION_HEX >= 0x030d00A4 + # define __Pyx_PyCFunctionFast PyCFunctionFast + # define __Pyx_PyCFunctionFastWithKeywords PyCFunctionFastWithKeywords + #else + # define __Pyx_PyCFunctionFast _PyCFunctionFast + # define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords + #endif #endif #if CYTHON_METH_FASTCALL #define __Pyx_METH_FASTCALL METH_FASTCALL @@ -1110,7 +1115,7 @@ static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) #endif -#if PY_VERSION_HEX >= 0x030d00A1 +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) #else static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { @@ -1197,7 +1202,7 @@ static CYTHON_INLINE float __PYX_NAN() { #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ - { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } @@ -1301,24 +1306,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -#if CYTHON_COMPILING_IN_LIMITED_API -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) -{ - const wchar_t *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#else -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) -{ - const Py_UNICODE *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#endif #define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) -#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) -#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) @@ -6575,7 +6563,7 @@ static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, default: return NULL; } - return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); + return ((__Pyx_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { diff --git a/supriya/enums.py b/supriya/enums.py index f579862b7..db58f01ae 100644 --- a/supriya/enums.py +++ b/supriya/enums.py @@ -93,7 +93,6 @@ def from_expr(cls, expr) -> "CalculationRate": :: - >>> import supriya.synthdefs >>> import supriya.ugens :: @@ -125,13 +124,12 @@ def from_expr(cls, expr) -> "CalculationRate": Return calculation-rate. """ - from .synthdefs import Parameter - from .ugens import OutputProxy, UGen + from .ugens import Parameter - if isinstance(expr, (int, float)) and not isinstance(expr, cls): - return cast(CalculationRate, CalculationRate.SCALAR) - elif isinstance(expr, (OutputProxy, UGen)): + if hasattr(expr, "calculation_rate"): return expr.calculation_rate + elif isinstance(expr, (int, float)) and not isinstance(expr, cls): + return cast(CalculationRate, CalculationRate.SCALAR) elif isinstance(expr, Parameter): name = expr.parameter_rate.name if name == "TRIGGER": @@ -141,8 +139,6 @@ def from_expr(cls, expr) -> "CalculationRate": return super().from_expr(expr) elif isinstance(expr, Sequence): return max(CalculationRate.from_expr(item) for item in expr) - elif hasattr(expr, "calculation_rate"): - return cls.from_expr(expr.calculation_rate) return super().from_expr(expr) @property @@ -475,13 +471,3 @@ class UnaryOperator(IntEnumeration): THRU = 47 TRIANGLE_WINDOW = 51 WELCH_WINDOW = 50 - - -class Unit(IntEnumeration): - UNDEFINED = 0 - DECIBELS = 1 - AMPLITUDE = 2 - SECONDS = 3 - MILLISECONDS = 4 - HERTZ = 5 - SEMITONES = 6 diff --git a/supriya/ext/mypy.py b/supriya/ext/mypy.py index 94ef746b4..e2a1d276a 100644 --- a/supriya/ext/mypy.py +++ b/supriya/ext/mypy.py @@ -21,7 +21,7 @@ def collect_params(self) -> List[Tuple[str, bool]]: if ( isinstance(expr, CallExpr) and isinstance(expr.callee, RefExpr) - and expr.callee.fullname in ["supriya.ugens.bases.param"] + and expr.callee.fullname in ["supriya.ugens.core.param"] ): params.append( ( @@ -41,17 +41,17 @@ def transform(self) -> bool: SupportsIntType = api.named_type("typing.SupportsInt") UGenOperableType = api.named_type( - "supriya.ugens.bases.UGenOperable", + "supriya.ugens.core.UGenOperable", ) # api.named_type() breaks for these... why? UGenInitScalarParamTypeSym = api.lookup_fully_qualified( - "supriya.ugens.bases.UGenInitScalarParam" + "supriya.ugens.core.UGenInitScalarParam" ) UGenInitVectorParamTypeSym = api.lookup_fully_qualified( - "supriya.ugens.bases.UGenInitVectorParam" + "supriya.ugens.core.UGenInitVectorParam" ) UGenRateVectorParamTypeSym = api.lookup_fully_qualified( - "supriya.ugens.bases.UGenRateVectorParam" + "supriya.ugens.core.UGenRateVectorParam" ) assert UGenInitScalarParamTypeSym.node is not None @@ -146,7 +146,7 @@ class SupriyaPlugin(Plugin): def get_class_decorator_hook( self, fullname: str ) -> Optional[Callable[[ClassDefContext], None]]: - if fullname == "supriya.ugens.bases.ugen": + if fullname == "supriya.ugens.core.ugen": return _ugen_hook return None diff --git a/supriya/patterns/events.py b/supriya/patterns/events.py index ac7f15c0b..1e8bb15a0 100644 --- a/supriya/patterns/events.py +++ b/supriya/patterns/events.py @@ -7,8 +7,8 @@ from ..assets.synthdefs.default import default from ..contexts import BusGroup, Context, ContextObject, Node from ..enums import AddAction, CalculationRate -from ..synthdefs import SynthDef from ..typing import AddActionLike, CalculationRateLike +from ..ugens import SynthDef from ..utils import expand diff --git a/supriya/patterns/structure.py b/supriya/patterns/structure.py index c5f483810..6fd57451a 100644 --- a/supriya/patterns/structure.py +++ b/supriya/patterns/structure.py @@ -7,8 +7,8 @@ from supriya.assets import synthdefs from supriya.enums import CalculationRate -from ..synthdefs import SynthDef from ..typing import CalculationRateLike +from ..ugens import SynthDef from .events import ( BusAllocateEvent, BusFreeEvent, diff --git a/supriya/synthdefs/__init__.py b/supriya/synthdefs/__init__.py deleted file mode 100644 index 1c87705fa..000000000 --- a/supriya/synthdefs/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -Tools for constructing and compiling synthesizer definitions (SynthDefs). -""" - -from .builders import SynthDefBuilder, synthdef -from .compilers import SynthDefCompiler, SynthDefDecompiler -from .controls import AudioControl, Control, LagControl, Parameter, Range, TrigControl -from .envelopes import Envelope -from .factories import SynthDefFactory -from .grapher import SynthDefGrapher -from .synthdefs import SuperColliderSynthDef, SynthDef, UGenSortBundle - -__all__ = [ - "AudioControl", - "BinaryOpUGen", - "Control", - "Envelope", - "LagControl", - "OutputProxy", - "Parameter", - "PseudoUGen", - "Range", - "SuperColliderSynthDef", - "SynthDef", - "SynthDefBuilder", - "SynthDefCompiler", - "SynthDefDecompiler", - "SynthDefFactory", - "SynthDefGrapher", - "TrigControl", - "UGenSortBundle", - "synthdef", -] diff --git a/supriya/synthdefs/builders.py b/supriya/synthdefs/builders.py deleted file mode 100644 index 5c387821e..000000000 --- a/supriya/synthdefs/builders.py +++ /dev/null @@ -1,320 +0,0 @@ -import collections -import copy -import inspect -import threading -import uuid -from typing import Callable, Dict, List, Optional, Tuple, Union - -from uqbar.objects import new - -from supriya.enums import ParameterRate -from supriya.ugens import Impulse, Poll - -from ..ugens import OutputProxy, UGen -from .controls import Control, Parameter -from .synthdefs import SynthDef - -_local = threading.local() -_local._active_builders = [] - - -class SynthDefBuilder: - """ - A SynthDef builder. - - :: - - >>> import supriya.synthdefs - >>> import supriya.ugens - - :: - - >>> builder = supriya.synthdefs.SynthDefBuilder( - ... frequency=440, - ... trigger=supriya.synthdefs.Parameter( - ... value=0, - ... parameter_rate=supriya.enums.ParameterRate.TRIGGER, - ... ), - ... ) - - :: - - >>> with builder: - ... sin_osc = supriya.ugens.SinOsc.ar( - ... frequency=builder["frequency"], - ... ) - ... decay = supriya.ugens.Decay.kr( - ... decay_time=0.5, - ... source=builder["trigger"], - ... ) - ... enveloped_sin = sin_osc * decay - ... out = supriya.ugens.Out.ar(bus=0, source=enveloped_sin) - ... - - :: - - >>> synthdef = builder.build() - >>> supriya.graph(synthdef) # doctest: +SKIP - """ - - ### CLASS VARIABLES ### - - _active_builders: List["SynthDefBuilder"] = _local._active_builders - - __slots__ = ("_name", "_parameters", "_ugens", "_uuid") - - ### INITIALIZER ### - - def __init__(self, name: Optional[str] = None, **kwargs) -> None: - self._name = name - self._uuid = uuid.uuid4() - self._parameters: Dict[Optional[str], Parameter] = collections.OrderedDict() - self._ugens: List[Union[Parameter, UGen]] = [] - for key, value in kwargs.items(): - self._add_parameter(key, value) - - ### SPECIAL METHODS ### - - def __enter__(self) -> "SynthDefBuilder": - SynthDefBuilder._active_builders.append(self) - return self - - def __exit__(self, exc_type, exc_value, traceback): - SynthDefBuilder._active_builders.pop() - - def __getitem__(self, item: str) -> Parameter: - return self._parameters[item] - - ### PRIVATE METHODS ### - - def _add_ugens(self, ugen: Union[OutputProxy, Parameter, UGen]): - if isinstance(ugen, OutputProxy): - source = ugen.source - else: - source = ugen - if source._uuid != self._uuid: - raise ValueError - self._ugens.append(source) - - def _add_parameter(self, *args) -> Parameter: - # TODO: Refactor without *args for clarity - if 3 < len(args): - raise ValueError(args) - if len(args) == 1: - assert isinstance(args[0], Parameter) - name, value, parameter_rate = args[0].name, args[0], args[0].parameter_rate - elif len(args) == 2: - name, value = args - if isinstance(value, Parameter): - parameter_rate = value.parameter_rate - else: - parameter_rate = ParameterRate.CONTROL - if name.startswith("a_"): - parameter_rate = ParameterRate.AUDIO - elif name.startswith("i_"): - parameter_rate = ParameterRate.SCALAR - elif name.startswith("t_"): - parameter_rate = ParameterRate.TRIGGER - elif len(args) == 3: - name, value, parameter_rate = args - parameter_rate = ParameterRate.from_expr(parameter_rate) - else: - raise ValueError(args) - if not isinstance(value, Parameter): - parameter = Parameter(name=name, parameter_rate=parameter_rate, value=value) - else: - parameter = new(value, parameter_rate=parameter_rate, name=name) - assert parameter._uuid is None - parameter._uuid = self._uuid - self._parameters[name] = parameter - return parameter - - ### PUBLIC METHODS ### - - def build(self, name: Optional[str] = None, optimize: bool = True) -> SynthDef: - # Calling build() creates controls each time, so strip out - # previously created ones. This could be made cleaner by preventing - # Control subclasses from being aggregated into SynthDefBuilders in - # the first place. - self._ugens[:] = [ugen for ugen in self._ugens if not isinstance(ugen, Control)] - name = self.name or name - with self: - ugens: List[Union[Parameter, UGen]] = [] - ugens.extend(self._parameters.values()) - ugens.extend(self._ugens) - ugens = copy.deepcopy(ugens) - ugens, parameters = SynthDef._extract_parameters(ugens) - ( - control_ugens, - control_mapping, - indexed_parameters, - ) = SynthDef._build_control_mapping(parameters) - SynthDef._remap_controls(ugens, control_mapping) - ugens = control_ugens + ugens - synthdef = SynthDef(ugens, name=name, optimize=optimize) - return synthdef - - def poll_ugen( - self, - ugen: UGen, - label: Optional[str] = None, - trigger: Optional[UGen] = None, - trigger_id: int = -1, - ) -> None: - poll = Poll.new( - source=ugen, - label=label, - trigger=trigger or Impulse.kr(frequency=1), - trigger_id=trigger_id, - ) - self._add_ugens(poll) - - ### PUBLIC PROPERTIES ### - - @property - def name(self) -> Optional[str]: - return self._name - - -def synthdef(*args: Union[str, Tuple[str, float]]) -> Callable[[Callable], SynthDef]: - """ - Decorator for quickly constructing SynthDefs from functions. - - :: - - >>> from supriya.ugens import EnvGen, Out, SinOsc - >>> from supriya.synthdefs import Envelope, synthdef - - :: - - >>> @synthdef() - ... def sine(freq=440, amp=0.1, gate=1): - ... sig = SinOsc.ar(frequency=freq) * amp - ... env = EnvGen.kr(envelope=Envelope.adsr(), gate=gate, done_action=2) - ... Out.ar(bus=0, source=[sig * env] * 2) - ... - - :: - - >>> print(sine) - synthdef: - name: sine - ugens: - - Control.kr: null - - SinOsc.ar: - frequency: Control.kr[1:freq] - phase: 0.0 - - BinaryOpUGen(MULTIPLICATION).ar/0: - left: SinOsc.ar[0] - right: Control.kr[0:amp] - - EnvGen.kr: - gate: Control.kr[2:gate] - level_scale: 1.0 - level_bias: 0.0 - time_scale: 1.0 - done_action: 2.0 - envelope[0]: 0.0 - envelope[1]: 3.0 - envelope[2]: 2.0 - envelope[3]: -99.0 - envelope[4]: 1.0 - envelope[5]: 0.01 - envelope[6]: 5.0 - envelope[7]: -4.0 - envelope[8]: 0.5 - envelope[9]: 0.3 - envelope[10]: 5.0 - envelope[11]: -4.0 - envelope[12]: 0.0 - envelope[13]: 1.0 - envelope[14]: 5.0 - envelope[15]: -4.0 - - BinaryOpUGen(MULTIPLICATION).ar/1: - left: BinaryOpUGen(MULTIPLICATION).ar/0[0] - right: EnvGen.kr[0] - - Out.ar: - bus: 0.0 - source[0]: BinaryOpUGen(MULTIPLICATION).ar/1[0] - source[1]: BinaryOpUGen(MULTIPLICATION).ar/1[0] - - :: - - >>> @synthdef("ar", ("kr", 0.5)) - ... def sine(freq=440, amp=0.1, gate=1): - ... sig = SinOsc.ar(frequency=freq) * amp - ... env = EnvGen.kr(envelope=Envelope.adsr(), gate=gate, done_action=2) - ... Out.ar(bus=0, source=[sig * env] * 2) - ... - - :: - - >>> print(sine) - synthdef: - name: sine - ugens: - - AudioControl.ar: null - - SinOsc.ar: - frequency: AudioControl.ar[0:freq] - phase: 0.0 - - LagControl.kr: - lags[0]: 0.5 - lags[1]: 0.0 - - BinaryOpUGen(MULTIPLICATION).ar/0: - left: SinOsc.ar[0] - right: LagControl.kr[0:amp] - - EnvGen.kr: - gate: LagControl.kr[1:gate] - level_scale: 1.0 - level_bias: 0.0 - time_scale: 1.0 - done_action: 2.0 - envelope[0]: 0.0 - envelope[1]: 3.0 - envelope[2]: 2.0 - envelope[3]: -99.0 - envelope[4]: 1.0 - envelope[5]: 0.01 - envelope[6]: 5.0 - envelope[7]: -4.0 - envelope[8]: 0.5 - envelope[9]: 0.3 - envelope[10]: 5.0 - envelope[11]: -4.0 - envelope[12]: 0.0 - envelope[13]: 1.0 - envelope[14]: 5.0 - envelope[15]: -4.0 - - BinaryOpUGen(MULTIPLICATION).ar/1: - left: BinaryOpUGen(MULTIPLICATION).ar/0[0] - right: EnvGen.kr[0] - - Out.ar: - bus: 0.0 - source[0]: BinaryOpUGen(MULTIPLICATION).ar/1[0] - source[1]: BinaryOpUGen(MULTIPLICATION).ar/1[0] - """ - - def inner(func): - signature = inspect.signature(func) - builder = SynthDefBuilder() - kwargs = {} - for i, (name, parameter) in enumerate(signature.parameters.items()): - rate = ParameterRate.CONTROL - lag = None - try: - if isinstance(args[i], str): - rate_expr = args[i] - else: - rate_expr, lag = args[i] - rate = ParameterRate.from_expr(rate_expr) - except (IndexError, TypeError): - pass - value = parameter.default - if value is inspect._empty: - value = 0.0 - parameter = Parameter(lag=lag, name=name, parameter_rate=rate, value=value) - kwargs[name] = builder._add_parameter(parameter) - with builder: - func(**kwargs) - return builder.build(name=func.__name__) - - return inner diff --git a/supriya/synthdefs/compilers.py b/supriya/synthdefs/compilers.py deleted file mode 100644 index da3e7c16d..000000000 --- a/supriya/synthdefs/compilers.py +++ /dev/null @@ -1,437 +0,0 @@ -import collections -import struct -from collections.abc import Sequence - -from .. import utils -from ..enums import CalculationRate, ParameterRate -from ..ugens import OutputProxy, UGen -from .controls import Control, Parameter - - -class SynthDefCompiler: - @staticmethod - def compile_synthdef(synthdef, name): - result = SynthDefCompiler.encode_string(name) - result += synthdef._compiled_ugen_graph - return result - - @staticmethod - def compile_parameters(synthdef): - result = [] - result.append( - SynthDefCompiler.encode_unsigned_int_32bit( - sum(len(_[1]) for _ in synthdef.indexed_parameters) - ) - ) - for control_ugen in synthdef.control_ugens: - for parameter in control_ugen.parameters: - value = parameter.value - if not isinstance(value, tuple): - value = (value,) - for x in value: - result.append(SynthDefCompiler.encode_float(x)) - result.append( - SynthDefCompiler.encode_unsigned_int_32bit(len(synthdef.indexed_parameters)) - ) - for index, parameter in synthdef.indexed_parameters: - name = parameter.name - result.append(SynthDefCompiler.encode_string(name)) - result.append(SynthDefCompiler.encode_unsigned_int_32bit(index)) - return bytes().join(result) - - @staticmethod - def compile_synthdefs(synthdefs, use_anonymous_names=False): - def flatten(value): - if isinstance(value, Sequence) and not isinstance( - value, (bytes, bytearray) - ): - return bytes().join(flatten(x) for x in value) - return value - - result = [] - encoded_file_type_id = b"SCgf" - result.append(encoded_file_type_id) - encoded_file_version = SynthDefCompiler.encode_unsigned_int_32bit(2) - result.append(encoded_file_version) - encoded_synthdef_count = SynthDefCompiler.encode_unsigned_int_16bit( - len(synthdefs) - ) - result.append(encoded_synthdef_count) - for synthdef in synthdefs: - name = synthdef.name - if not name or use_anonymous_names: - name = synthdef.anonymous_name - result.append(SynthDefCompiler.compile_synthdef(synthdef, name)) - result = flatten(result) - result = bytes(result) - return result - - @staticmethod - def compile_ugen(ugen, synthdef): - outputs = ugen._get_outputs() - result = [] - result.append(SynthDefCompiler.encode_string(type(ugen).__name__)) - result.append(SynthDefCompiler.encode_unsigned_int_8bit(ugen.calculation_rate)) - result.append(SynthDefCompiler.encode_unsigned_int_32bit(len(ugen.inputs))) - result.append(SynthDefCompiler.encode_unsigned_int_32bit(len(outputs))) - result.append( - SynthDefCompiler.encode_unsigned_int_16bit(int(ugen.special_index)) - ) - for input_ in ugen.inputs: - result.append(SynthDefCompiler.compile_ugen_input_spec(input_, synthdef)) - for output in outputs: - result.append(SynthDefCompiler.encode_unsigned_int_8bit(output)) - result = bytes().join(result) - return result - - @staticmethod - def compile_ugen_graph(synthdef): - result = [] - result.append( - SynthDefCompiler.encode_unsigned_int_32bit(len(synthdef.constants)) - ) - for constant in synthdef.constants: - result.append(SynthDefCompiler.encode_float(constant)) - result.append(SynthDefCompiler.compile_parameters(synthdef)) - result.append(SynthDefCompiler.encode_unsigned_int_32bit(len(synthdef.ugens))) - for ugen_index, ugen in enumerate(synthdef.ugens): - result.append(SynthDefCompiler.compile_ugen(ugen, synthdef)) - result.append(SynthDefCompiler.encode_unsigned_int_16bit(0)) - result = bytes().join(result) - return result - - @staticmethod - def compile_ugen_input_spec(input_, synthdef): - result = [] - if isinstance(input_, float): - result.append(SynthDefCompiler.encode_unsigned_int_32bit(0xFFFFFFFF)) - constant_index = synthdef._constants.index(input_) - result.append(SynthDefCompiler.encode_unsigned_int_32bit(constant_index)) - elif isinstance(input_, OutputProxy): - ugen = input_.source - output_index = input_.output_index - ugen_index = synthdef._ugens.index(ugen) - result.append(SynthDefCompiler.encode_unsigned_int_32bit(ugen_index)) - result.append(SynthDefCompiler.encode_unsigned_int_32bit(output_index)) - else: - raise Exception("Unhandled input spec: {}".format(input_)) - return bytes().join(result) - - @staticmethod - def encode_string(value): - result = bytes(struct.pack(">B", len(value))) - result += bytes(bytearray(value, encoding="ascii")) - return result - - @staticmethod - def encode_float(value): - return bytes(struct.pack(">f", float(value))) - - @staticmethod - def encode_unsigned_int_8bit(value): - return bytes(struct.pack(">B", int(value))) - - @staticmethod - def encode_unsigned_int_16bit(value): - return bytes(struct.pack(">H", int(value))) - - @staticmethod - def encode_unsigned_int_32bit(value): - return bytes(struct.pack(">I", int(value))) - - -class SynthDefDecompiler: - """ - SynthDef decompiler. - - :: - - >>> import supriya.synthdefs - >>> import supriya.ugens - >>> with supriya.synthdefs.SynthDefBuilder( - ... frequency=440, - ... trigger=supriya.synthdefs.Parameter( - ... value=0.0, - ... parameter_rate=supriya.enums.ParameterRate.TRIGGER, - ... ), - ... ) as builder: - ... sin_osc = supriya.ugens.SinOsc.ar(frequency=builder["frequency"]) - ... decay = supriya.ugens.Decay.kr( - ... decay_time=0.5, - ... source=builder["trigger"], - ... ) - ... enveloped_sin = sin_osc * decay - ... out = supriya.ugens.Out.ar(bus=0, source=enveloped_sin) - ... - >>> synthdef = builder.build() - >>> supriya.graph(synthdef) # doctest: +SKIP - - :: - - >>> print(synthdef) - synthdef: - name: 001520731aee5371fefab6b505cf64dd - ugens: - - TrigControl.kr: null - - Decay.kr: - source: TrigControl.kr[0:trigger] - decay_time: 0.5 - - Control.kr: null - - SinOsc.ar: - frequency: Control.kr[0:frequency] - phase: 0.0 - - BinaryOpUGen(MULTIPLICATION).ar: - left: SinOsc.ar[0] - right: Decay.kr[0] - - Out.ar: - bus: 0.0 - source[0]: BinaryOpUGen(MULTIPLICATION).ar[0] - - :: - - >>> compiled_synthdef = synthdef.compile() - >>> sdd = supriya.synthdefs.SynthDefDecompiler - >>> decompiled_synthdef = sdd.decompile_synthdefs(compiled_synthdef)[0] - >>> supriya.graph(decompiled_synthdef) # doctest: +SKIP - - :: - - >>> print(decompiled_synthdef) - synthdef: - name: 001520731aee5371fefab6b505cf64dd - ugens: - - TrigControl.kr: null - - Decay.kr: - source: TrigControl.kr[0:trigger] - decay_time: 0.5 - - Control.kr: null - - SinOsc.ar: - frequency: Control.kr[0:frequency] - phase: 0.0 - - BinaryOpUGen(MULTIPLICATION).ar: - left: SinOsc.ar[0] - right: Decay.kr[0] - - Out.ar: - bus: 0.0 - source[0]: BinaryOpUGen(MULTIPLICATION).ar[0] - - :: - - >>> str(synthdef) == str(decompiled_synthdef) - True - """ - - ### PRIVATE METHODS ### - - @staticmethod - def _decode_constants(value, index): - sdd = SynthDefDecompiler - constants = [] - constants_count, index = sdd._decode_int_32bit(value, index) - for _ in range(constants_count): - constant, index = sdd._decode_float(value, index) - constants.append(constant) - return constants, index - - @staticmethod - def _decode_parameters(value, index): - sdd = SynthDefDecompiler - parameter_values = [] - parameter_count, index = sdd._decode_int_32bit(value, index) - for _ in range(parameter_count): - parameter_value, index = sdd._decode_float(value, index) - parameter_values.append(parameter_value) - parameter_count, index = sdd._decode_int_32bit(value, index) - parameter_names = [] - parameter_indices = [] - for _ in range(parameter_count): - parameter_name, index = sdd._decode_string(value, index) - parameter_index, index = sdd._decode_int_32bit(value, index) - parameter_names.append(parameter_name) - parameter_indices.append(parameter_index) - indexed_parameters = [] - if parameter_count: - pairs = tuple(zip(parameter_indices, parameter_names)) - pairs = sorted(pairs, key=lambda x: x[0]) - iterator = utils.iterate_nwise(pairs) - for (index_one, name_one), (index_two, name_two) in iterator: - value = parameter_values[index_one:index_two] - if len(value) == 1: - value = value[0] - parameter = Parameter(name=name_one, value=value) - indexed_parameters.append((index_one, parameter)) - index_one, name_one = pairs[-1] - value = parameter_values[index_one:] - if len(value) == 1: - value = value[0] - parameter = Parameter(name=name_one, value=value) - indexed_parameters.append((index_one, parameter)) - indexed_parameters.sort(key=lambda x: parameter_names.index(x[1].name)) - indexed_parameters = collections.OrderedDict(indexed_parameters) - return indexed_parameters, index - - @staticmethod - def _decompile_synthdef(value, index): - from .. import synthdefs, ugens - from .synthdefs import SynthDef - - 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) - decompiled_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 = 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 = decompiled_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(ugens, ugen_name, None) - if ugen_class is None: - ugen_class = getattr(synthdefs, ugen_name) - ugen = UGen.__new__(ugen_class) - if issubclass(ugen_class, 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:]) - ugen._channel_count = output_count - UGen.__init__( - ugen, - calculation_rate=calculation_rate, - special_index=special_index, - **kwargs, - ) - decompiled_ugens.append(ugen) - variants_count, index = sdd._decode_int_16bit(value, index) - synthdef = SynthDef(ugens=decompiled_ugens, name=name, decompiled=True) - if synthdef.name == synthdef.anonymous_name: - synthdef._name = None - return synthdef, index - - @staticmethod - def _decode_string(value, index): - length = struct.unpack(">B", value[index : index + 1])[0] - index += 1 - result = value[index : index + length] - result = result.decode("ascii") - index += length - return result, index - - @staticmethod - def _decode_float(value, index): - result = struct.unpack(">f", value[index : index + 4])[0] - index += 4 - return result, index - - @staticmethod - def _decode_int_8bit(value, index): - result = struct.unpack(">B", value[index : index + 1])[0] - index += 1 - return result, index - - @staticmethod - def _decode_int_16bit(value, index): - result = struct.unpack(">H", value[index : index + 2])[0] - index += 2 - return result, index - - @staticmethod - def _decode_int_32bit(value, index): - result = struct.unpack(">I", value[index : index + 4])[0] - index += 4 - return result, index - - @staticmethod - def _collect_parameters_for_control( - calculation_rate, - indexed_parameters, - inputs, - output_count, - starting_control_index, - ugen_class, - ): - from .controls import TrigControl - - parameter_rate = ParameterRate.CONTROL - if issubclass(ugen_class, TrigControl): - parameter_rate = ParameterRate.TRIGGER - elif calculation_rate == CalculationRate.SCALAR: - parameter_rate = ParameterRate.SCALAR - elif calculation_rate == CalculationRate.AUDIO: - parameter_rate = ParameterRate.AUDIO - parameters = [] - collected_output_count = 0 - lag = 0.0 - while collected_output_count < output_count: - if inputs: - lag = inputs[collected_output_count] - parameter = indexed_parameters[ - starting_control_index + collected_output_count - ] - parameter.parameter_rate = parameter_rate - if lag: - parameter.lag = lag - parameters.append(parameter) - collected_output_count += len(parameter) - return parameters - - ### PUBLIC METHODS ### - - @staticmethod - def decompile_synthdef(value): - synthdefs = SynthDefDecompiler.decompile_synthdefs(value) - assert len(synthdefs) == 1 - return synthdefs[0] - - @staticmethod - def decompile_synthdefs(value): - synthdefs = [] - sdd = SynthDefDecompiler - index = 4 - assert value[:index] == b"SCgf" - file_version, index = sdd._decode_int_32bit(value, index) - synthdef_count, index = sdd._decode_int_16bit(value, index) - for _ in range(synthdef_count): - synthdef, index = sdd._decompile_synthdef(value, index) - synthdefs.append(synthdef) - return synthdefs diff --git a/supriya/synthdefs/controls.py b/supriya/synthdefs/controls.py deleted file mode 100644 index 74f4255ef..000000000 --- a/supriya/synthdefs/controls.py +++ /dev/null @@ -1,341 +0,0 @@ -import collections -import dataclasses -from collections.abc import Sequence -from typing import Optional, Tuple, Union, cast - -from uqbar.objects import get_repr - -from ..enums import CalculationRate, ParameterRate, SignalRange, Unit -from ..ugens import OutputProxy, UGen, UGenOperable - - -class Range: - """ - A range. - - :: - - >>> supriya.synthdefs.Range(-1.0, 1.0) - Range(maximum=1.0, minimum=-1.0) - - :: - - >>> supriya.synthdefs.Range(minimum=0.0) - Range(maximum=inf, minimum=0.0) - - :: - - >>> supriya.synthdefs.Range() - Range(maximum=inf, minimum=-inf) - - :: - - >>> supriya.synthdefs.Range((0.1, 0.9)) - Range(maximum=0.9, minimum=0.1) - - :: - - >>> supriya.synthdefs.Range(supriya.synthdefs.Range(-3, 3)) - Range(maximum=3.0, minimum=-3.0) - """ - - def __init__(self, minimum=None, maximum=None): - if isinstance(minimum, Sequence) and maximum is None and len(minimum) == 2: - minimum, maximum = minimum - elif isinstance(minimum, type(self)): - minimum, maximum = minimum.minimum, minimum.maximum - if minimum is None: - minimum = float("-inf") - if not isinstance(minimum, (float, int)): - raise ValueError(minimum) - minimum = float(minimum) - if maximum is None: - maximum = float("inf") - if not isinstance(maximum, (float, int)): - raise ValueError(maximum) - maximum = float(maximum) - assert minimum <= maximum - self._minimum = minimum - self._maximum = maximum - - def __repr__(self) -> str: - return get_repr(self, multiline=False) - - @staticmethod - def scale(value, input_range, output_range, exponent=1.0): - """ - Scales `value` from `input_range` to `output_range`. - - Curve value exponentially by `exponent`. - - :: - - >>> input_range = supriya.synthdefs.Range(0.0, 10.0) - >>> output_range = supriya.synthdefs.Range(-2.5, 2.5) - - :: - - >>> supriya.synthdefs.Range.scale(0.0, input_range, output_range) - -2.5 - - :: - - >>> supriya.synthdefs.Range.scale(5.0, input_range, output_range) - 0.0 - - :: - - >>> supriya.synthdefs.Range.scale(5.0, input_range, output_range, 2.0) - -1.25 - - :: - - >>> supriya.synthdefs.Range.scale(5.0, input_range, output_range, 0.5) - 1.0355... - - Returns float. - """ - value = (value - input_range.minimum) / input_range.width - if exponent != 1: - value = pow(value, exponent) - value = (value * output_range.width) + output_range.minimum - return value - - ### PUBLIC PROPERTIES ### - - @property - def maximum(self): - return self._maximum - - @property - def minimum(self): - return self._minimum - - @property - def width(self): - return self._maximum - self._minimum - - -@dataclasses.dataclass(unsafe_hash=True) -class Parameter(UGenOperable): - lag: Optional[float] = None - name: Optional[str] = None - parameter_rate: ParameterRate = cast(ParameterRate, ParameterRate.CONTROL) - range_: Optional[Range] = None - unit: Optional[Unit] = None - value: Union[float, Tuple[float, ...]] = 0.0 - - def __post_init__(self): - try: - self.value = float(self.value) - except TypeError: - self.value = tuple(float(_) for _ in self.value) - self.parameter_rate = ParameterRate.from_expr(self.parameter_rate) - self._uuid = None - - ### SPECIAL METHODS ### - - def __getitem__(self, i): - return self._get_output_proxy(i) - - def __len__(self): - if isinstance(self.value, float): - return 1 - return len(self.value) - - ### PRIVATE METHODS ### - - def _get_source(self): - return self - - def _get_output_number(self): - return 0 - - def _optimize_graph(self, sort_bundles): - pass - - ### PUBLIC PROPERTIES ### - - @property - def calculation_rate(self): - return CalculationRate.from_expr(self) - - @property - def has_done_flag(self): - return False - - @property - def inputs(self): - return () - - @property - def signal_range(self): - SignalRange.BIPOLAR - - -class Control(UGen): - """ - A control-rate control ugen. - - Control ugens can be set and routed externally to interact with a running synth. - Controls are created from the parameters of a synthesizer definition, and typically - do not need to be created by hand. - """ - - ### INITIALIZER ### - - def __init__(self, parameters, calculation_rate=None, starting_control_index=0): - coerced_parameters = [] - for parameter in parameters: - if not isinstance(parameter, Parameter): - parameter = Parameter(name=parameter, value=0) - coerced_parameters.append(parameter) - self._parameters = tuple(coerced_parameters) - self._channel_count = len(self) - UGen.__init__( - self, - calculation_rate=calculation_rate, - special_index=starting_control_index, - ) - - ### SPECIAL METHODS ### - - def __getitem__(self, i): - """ - Gets output proxy at `i`, via index or control name. - - Returns output proxy. - """ - if isinstance(i, int): - if len(self) == 1: - return OutputProxy(source=self, output_index=0) - return OutputProxy(source=self, output_index=i) - else: - return self[self._get_control_index(i)] - - def __len__(self): - """ - Gets number of ugen outputs. - - Equal to the number of control names. - - Returns integer. - """ - return sum(len(_) for _ in self.parameters) - - ### PRIVATE METHODS ### - - def _get_control_index(self, control_name): - for i, parameter in enumerate(self._parameters): - if parameter.name == control_name: - return i - raise ValueError - - def _get_outputs(self): - return [self.calculation_rate] * len(self) - - def _get_parameter_output_proxies(self): - output_proxies = [] - for parameter in self.parameters: - output_proxies.extend(parameter) - return output_proxies - - ### PUBLIC PROPERTIES ### - - @property - def controls(self): - """ - Gets controls of control ugen. - - Returns ugen graph. - """ - if len(self.parameters) == 1: - result = self - else: - result = [OutputProxy(self, i) for i in range(len(self.parameters))] - return result - - @property - def parameters(self): - """ - Gets control names associated with control. - - Returns tuple. - """ - return self._parameters - - @property - def starting_control_index(self): - """ - Gets starting control index of control ugen. - - Equivalent to the control ugen's special index. - - Returns integer. - """ - return self._special_index - - -class AudioControl(Control): - """ - A trigger-rate control ugen. - """ - - def __init__(self, parameters, calculation_rate=None, starting_control_index=0): - Control.__init__( - self, - parameters, - calculation_rate=CalculationRate.AUDIO, - starting_control_index=starting_control_index, - ) - - -class LagControl(Control): - """ - A lagged control-rate control ugen. - """ - - ### CLASS VARIABLES ### - - _ordered_input_names = collections.OrderedDict([("lags", None)]) - - _unexpanded_input_names = ("lags",) - - ### INITIALIZER ### - - def __init__(self, parameters, calculation_rate=None, starting_control_index=0): - coerced_parameters = [] - for parameter in parameters: - if not isinstance(parameter, Parameter): - parameter = Parameter(name=parameter, value=0) - coerced_parameters.append(parameter) - self._parameters = tuple(coerced_parameters) - lags = [] - for parameter in self._parameters: - lag = parameter.lag or 0.0 - lags.extend([lag] * len(parameter)) - self._channel_count = len(self) - UGen.__init__( - self, - calculation_rate=calculation_rate, - special_index=starting_control_index, - lags=lags, - ) - - -class TrigControl(Control): - """ - A trigger-rate control ugen. - """ - - ### CLASS VARIABLES ### - - ### INITIALIZER ## - - def __init__(self, parameters, calculation_rate=None, starting_control_index=0): - Control.__init__( - self, - parameters, - calculation_rate=CalculationRate.CONTROL, - starting_control_index=starting_control_index, - ) diff --git a/supriya/synthdefs/envelopes.py b/supriya/synthdefs/envelopes.py deleted file mode 100644 index f4632a05a..000000000 --- a/supriya/synthdefs/envelopes.py +++ /dev/null @@ -1,263 +0,0 @@ -from typing import List, Optional, Sequence, Tuple, Union - -from uqbar.objects import get_repr - -from .. import utils -from ..enums import EnvelopeShape -from ..ugens import UGenArray, UGenOperable - - -class Envelope: - """ - An envelope. - - :: - - >>> from supriya.synthdefs import Envelope - >>> envelope = Envelope() - - :: - - >>> list(envelope.serialize()) - [0, 2, -99, -99, 1, 1, 1, 0.0, 0, 1, 1, 0.0] - """ - - def __init__( - self, - amplitudes: Sequence[Union[UGenOperable, float]] = (0, 1, 0), - durations: Sequence[Union[UGenOperable, float]] = (1, 1), - curves: Sequence[Union[EnvelopeShape, UGenOperable, float, str, None]] = ( - EnvelopeShape.LINEAR, - EnvelopeShape.LINEAR, - ), - release_node: Optional[int] = None, - loop_node: Optional[int] = None, - offset: Union[UGenOperable, float] = 0.0, - ) -> None: - assert len(amplitudes) > 1 - assert len(durations) == (len(amplitudes) - 1) - if isinstance(curves, (int, float, str, EnvelopeShape, UGenOperable)): - curves = [curves] - elif curves is None: - curves = [] - self._release_node = release_node - self._loop_node = loop_node - self._offset = offset - self._initial_amplitude = amplitudes[0] - self._amplitudes: Tuple[Union[UGenOperable, float], ...] = tuple(amplitudes[1:]) - self._durations: Tuple[Union[UGenOperable, float], ...] = tuple(durations) - curves_: List[Union[EnvelopeShape, UGenOperable, float]] = [] - for x in curves: - if isinstance(x, (EnvelopeShape, UGenOperable)): - curves_.append(x) - elif isinstance(x, str) or x is None: - curves_.append(EnvelopeShape.from_expr(x)) - else: - curves_.append(float(x)) - self._curves: Tuple[Union[EnvelopeShape, UGenOperable, float], ...] = tuple( - curves_ - ) - self._envelope_segments = tuple( - utils.zip_cycled(self._amplitudes, self._durations, self._curves) - ) - - def __repr__(self) -> str: - return get_repr(self) - - @classmethod - def adsr( - cls, - attack_time=0.01, - decay_time=0.3, - sustain=0.5, - release_time=1.0, - peak=1.0, - curve=-4.0, - bias=0.0, - ) -> "Envelope": - amplitudes = [x + bias for x in [0, peak, peak * sustain, 0]] - durations = [attack_time, decay_time, release_time] - curves = [curve] - release_node = 2 - return Envelope( - amplitudes=amplitudes, - durations=durations, - curves=curves, - release_node=release_node, - ) - - @classmethod - def asr( - cls, attack_time=0.01, sustain=1.0, release_time=1.0, curve=-4.0 - ) -> "Envelope": - amplitudes = [0, sustain, 0] - durations = [attack_time, release_time] - curves = [curve] - release_node = 1 - return Envelope( - amplitudes=amplitudes, - durations=durations, - curves=curves, - release_node=release_node, - ) - - @classmethod - def from_segments( - cls, - initial_amplitude=0, - segments=None, - release_node=None, - loop_node=None, - offset=None, - ) -> "Envelope": - amplitudes = [initial_amplitude] - durations = [] - curves = [] - for amplitude, duration, curve in segments: - amplitudes.append(amplitude) - durations.append(duration) - curves.append(curve) - return cls( - amplitudes=amplitudes, - durations=durations, - curves=curves, - release_node=release_node, - loop_node=loop_node, - offset=offset, - ) - - @classmethod - def percussive( - cls, - attack_time: Union[UGenOperable, float] = 0.01, - release_time: Union[UGenOperable, float] = 1.0, - amplitude: Union[UGenOperable, float] = 1.0, - curve: Union[EnvelopeShape, UGenOperable, float, str] = -4.0, - ) -> "Envelope": - """ - Make a percussion envelope. - - :: - - >>> from supriya.synthdefs import Envelope - >>> envelope = Envelope.percussive() - >>> envelope - Envelope( - curves=(-4.0, -4.0), - durations=(0.01, 1.0), - ) - - :: - - >>> list(envelope.serialize()) - [0, 2, -99, -99, 1.0, 0.01, 5, -4.0, 0, 1.0, 5, -4.0] - """ - amplitudes = [0, amplitude, 0] - durations = [attack_time, release_time] - curves = [curve] - return Envelope(amplitudes=amplitudes, durations=durations, curves=curves) - - @classmethod - def linen( - cls, attack_time=0.01, sustain_time=1.0, release_time=1.0, level=1.0, curve=1 - ) -> "Envelope": - amplitudes = [0, level, level, 0] - durations = [attack_time, sustain_time, release_time] - curves = [curve] - return Envelope(amplitudes=amplitudes, durations=durations, curves=curves) - - def serialize(self, for_interpolation=False) -> UGenArray: - result: List[Union[UGenOperable, float]] = [] - if for_interpolation: - result.append(self.offset or 0.0) - result.append(self.initial_amplitude) - result.append(len(self.envelope_segments)) - result.append(self.duration) - for amplitude, duration, curve in self._envelope_segments: - result.append(duration) - if isinstance(curve, EnvelopeShape): - shape = int(curve) - curve = 0.0 - else: - shape = 5 - result.append(shape) - result.append(curve) - result.append(amplitude) - else: - result.append(self.initial_amplitude) - result.append(len(self.envelope_segments)) - result.append(-99 if self.release_node is None else self.release_node) - result.append(-99 if self.loop_node is None else self.loop_node) - for amplitude, duration, curve in self._envelope_segments: - result.append(amplitude) - result.append(duration) - if isinstance(curve, EnvelopeShape): - shape = int(curve) - curve = 0.0 - else: - shape = 5 - result.append(shape) - result.append(curve) - return UGenArray(result) - - @classmethod - def triangle(cls, duration=1.0, amplitude=1.0) -> "Envelope": - """ - Make a triangle envelope. - - :: - - >>> from supriya.synthdefs import Envelope - >>> envelope = Envelope.triangle() - >>> envelope - Envelope( - durations=(0.5, 0.5), - ) - - :: - - >>> list(envelope.serialize()) - [0, 2, -99, -99, 1.0, 0.5, 1, 0.0, 0, 0.5, 1, 0.0] - """ - amplitudes = [0, amplitude, 0] - duration = duration / 2.0 - durations = [duration, duration] - return Envelope(amplitudes=amplitudes, durations=durations) - - ### PUBLIC PROPERTIES ### - - @property - def amplitudes(self) -> Tuple[Union[UGenOperable, float]]: - return (self.initial_amplitude,) + tuple(_[0] for _ in self.envelope_segments) - - @property - def curves(self) -> Tuple[Union[EnvelopeShape, UGenOperable, float]]: - return tuple(_[2] for _ in self.envelope_segments) - - @property - def duration(self) -> Union[float, UGenOperable]: - return sum(self.durations) - - @property - def durations(self) -> Tuple[Union[float, UGenOperable]]: - return tuple(_[1] for _ in self.envelope_segments) - - @property - def envelope_segments(self): - return self._envelope_segments - - @property - def initial_amplitude(self) -> Union[float, UGenOperable]: - return self._initial_amplitude - - @property - def loop_node(self) -> Optional[int]: - return self._loop_node - - @property - def offset(self) -> Union[float, UGenOperable]: - return self._offset - - @property - def release_node(self) -> Optional[int]: - return self._release_node diff --git a/supriya/synthdefs/grapher.py b/supriya/synthdefs/grapher.py deleted file mode 100644 index ee6fc7f7a..000000000 --- a/supriya/synthdefs/grapher.py +++ /dev/null @@ -1,220 +0,0 @@ -import uqbar.graphs - -from ..enums import BinaryOperator, CalculationRate, UnaryOperator -from ..ugens import BinaryOpUGen, OutputProxy, UnaryOpUGen -from .controls import Control - - -class SynthDefGrapher: - r""" - Graphs SynthDefs. - - .. container:: example - - :: - - >>> ugen_graph = supriya.ugens.LFNoise2.ar() - >>> result = ugen_graph.transpose([0, 3, 7]) - - :: - - >>> supriya.graph(result) # doctest: +SKIP - - :: - - >>> print(format(result.__graph__(), "graphviz")) - digraph synthdef_c481c3d42e3cfcee0267250247dab51f { - graph [bgcolor=transparent, - color=lightslategrey, - dpi=72, - fontname=Arial, - outputorder=edgesfirst, - overlap=prism, - penwidth=2, - rankdir=LR, - ranksep=1, - splines=spline, - style="dotted, rounded"]; - node [fontname=Arial, - fontsize=12, - penwidth=2, - shape=Mrecord, - style="filled, rounded"]; - edge [penwidth=2]; - ugen_0 [fillcolor=lightsteelblue2, - label=" LFNoise2\n(audio) | { { frequency:\n500.0 } | { 0 } }"]; - ugen_1 [fillcolor=lightsteelblue2, - label=" UnaryOpUGen\n[HZ_TO_MIDI]\n(audio) | { { source } | { 0 } }"]; - ugen_2 [fillcolor=lightsteelblue2, - label=" UnaryOpUGen\n[MIDI_TO_HZ]\n(audio) | { { source } | { 0 } }"]; - ugen_3 [fillcolor=lightsteelblue2, - label=" BinaryOpUGen\n[ADDITION]\n(audio) | { { left | right:\n3.0 } | { 0 } }"]; - ugen_4 [fillcolor=lightsteelblue2, - label=" UnaryOpUGen\n[MIDI_TO_HZ]\n(audio) | { { source } | { 0 } }"]; - ugen_5 [fillcolor=lightsteelblue2, - label=" BinaryOpUGen\n[ADDITION]\n(audio) | { { left | right:\n7.0 } | { 0 } }"]; - ugen_6 [fillcolor=lightsteelblue2, - label=" UnaryOpUGen\n[MIDI_TO_HZ]\n(audio) | { { source } | { 0 } }"]; - ugen_0:f_1_1_0:e -> ugen_1:f_1_0_0:w [color=steelblue]; - ugen_1:f_1_1_0:e -> ugen_2:f_1_0_0:w [color=steelblue]; - ugen_1:f_1_1_0:e -> ugen_3:f_1_0_0:w [color=steelblue]; - ugen_1:f_1_1_0:e -> ugen_5:f_1_0_0:w [color=steelblue]; - ugen_3:f_1_1_0:e -> ugen_4:f_1_0_0:w [color=steelblue]; - ugen_5:f_1_1_0:e -> ugen_6:f_1_0_0:w [color=steelblue]; - } - """ - - ### PRIVATE METHODS ### - - @staticmethod - def _connect_nodes(synthdef, ugen_node_mapping): - for ugen in synthdef.ugens: - tail_node = ugen_node_mapping[ugen] - for i, input_ in enumerate(ugen.inputs): - if not isinstance(input_, OutputProxy): - continue - tail_field = tail_node["inputs"][i] - source = input_.source - head_node = ugen_node_mapping[source] - head_field = head_node["outputs"][input_.output_index] - edge = uqbar.graphs.Edge(head_port_position="w", tail_port_position="e") - edge.attach(head_field, tail_field) - if source.calculation_rate == CalculationRate.CONTROL: - edge.attributes["color"] = "goldenrod" - elif source.calculation_rate == CalculationRate.AUDIO: - edge.attributes["color"] = "steelblue" - else: - edge.attributes["color"] = "salmon" - - @staticmethod - def _create_ugen_input_group(ugen, ugen_index): - if not ugen.inputs: - return None - input_group = uqbar.graphs.RecordGroup(name="inputs") - for i, input_ in enumerate(ugen.inputs): - label = "" - input_name = None - if i < len(ugen._ordered_input_names): - input_name = tuple(ugen._ordered_input_names)[i] - if input_name: - # input_name = r'\n'.join(input_name.split('_')) - if isinstance(input_, float): - label = r"{}:\n{}".format(input_name, input_) - else: - label = input_name - elif isinstance(input_, float): - label = str(input_) - label = label or None - field = uqbar.graphs.RecordField( - label=label, name="ugen_{}_input_{}".format(ugen_index, i) - ) - input_group.append(field) - return input_group - - @staticmethod - def _create_ugen_node_mapping(synthdef): - ugen_node_mapping = {} - for ugen in synthdef.ugens: - ugen_index = synthdef.ugens.index(ugen) - node = uqbar.graphs.Node(name="ugen_{}".format(ugen_index)) - if ugen.calculation_rate == CalculationRate.CONTROL: - node.attributes["fillcolor"] = "lightgoldenrod2" - elif ugen.calculation_rate == CalculationRate.AUDIO: - node.attributes["fillcolor"] = "lightsteelblue2" - else: - node.attributes["fillcolor"] = "lightsalmon2" - title_field = SynthDefGrapher._create_ugen_title_field(ugen) - node.append(title_field) - group = uqbar.graphs.RecordGroup() - input_group = SynthDefGrapher._create_ugen_input_group(ugen, ugen_index) - if input_group is not None: - group.append(input_group) - output_group = SynthDefGrapher._create_ugen_output_group( - synthdef, ugen, ugen_index - ) - if output_group is not None: - group.append(output_group) - node.append(group) - ugen_node_mapping[ugen] = node - return ugen_node_mapping - - @staticmethod - def _create_ugen_output_group(synthdef, ugen, ugen_index): - if not ugen.outputs: - return None - output_group = uqbar.graphs.RecordGroup(name="outputs") - for i, output in enumerate(ugen.outputs): - label = str(i) - if isinstance(ugen, Control): - parameter_index = ugen.special_index + i - parameter = dict(synthdef.indexed_parameters)[parameter_index] - parameter_name = parameter.name - # parameter_name = r'\n'.join(parameter.name.split('_')) - label = r"{}:\n{}".format(parameter_name, parameter.value) - field = uqbar.graphs.RecordField( - label=label, name="ugen_{}_output_{}".format(ugen_index, i) - ) - output_group.append(field) - return output_group - - @staticmethod - def _create_ugen_title_field(ugen): - name = type(ugen).__name__ - calculation_rate = ugen.calculation_rate.name.lower() - label_template = r"{name}\n({calculation_rate})" - operator = None - if isinstance(ugen, BinaryOpUGen): - operator = BinaryOperator(ugen.special_index).name - label_template = r"{name}\n[{operator}]\n({calculation_rate})" - elif isinstance(ugen, UnaryOpUGen): - operator = UnaryOperator(ugen.special_index).name - label_template = r"{name}\n[{operator}]\n({calculation_rate})" - title_field = uqbar.graphs.RecordField( - label=label_template.format( - name=name, operator=operator, calculation_rate=calculation_rate - ) - ) - return title_field - - @staticmethod - def _style_graph(graph): - graph.attributes.update( - { - "bgcolor": "transparent", - "color": "lightslategrey", - "dpi": 72, - "fontname": "Arial", - "outputorder": "edgesfirst", - "overlap": "prism", - "penwidth": 2, - "rankdir": "LR", - "ranksep": 1, - "splines": "spline", - "style": ("dotted", "rounded"), - } - ) - graph.edge_attributes.update({"penwidth": 2}) - graph.node_attributes.update( - { - "fontname": "Arial", - "fontsize": 12, - "penwidth": 2, - "shape": "Mrecord", - "style": ("filled", "rounded"), - } - ) - - ### PUBLIC METHODS ### - - @staticmethod - def graph(synthdef): - from .synthdefs import SynthDef - - assert isinstance(synthdef, SynthDef) - graph = uqbar.graphs.Graph(name="synthdef_{}".format(synthdef.actual_name)) - ugen_node_mapping = SynthDefGrapher._create_ugen_node_mapping(synthdef) - for node in sorted(ugen_node_mapping.values(), key=lambda x: x.name): - graph.append(node) - SynthDefGrapher._connect_nodes(synthdef, ugen_node_mapping) - SynthDefGrapher._style_graph(graph) - return graph diff --git a/supriya/synthdefs/synthdefs.py b/supriya/synthdefs/synthdefs.py deleted file mode 100644 index b08a89b1c..000000000 --- a/supriya/synthdefs/synthdefs.py +++ /dev/null @@ -1,945 +0,0 @@ -import collections -import copy -import hashlib -import pathlib -import subprocess -import tempfile -from typing import Dict, List, Optional, Sequence, Tuple, Union - -from .. import sclang -from ..enums import ( - BinaryOperator, - CalculationRate, - DoneAction, - ParameterRate, - UnaryOperator, -) -from ..ugens import BinaryOpUGen, OutputProxy, UGen, UGenOperable, UnaryOpUGen -from .compilers import SynthDefCompiler -from .controls import AudioControl, Control, LagControl, Parameter, TrigControl -from .grapher import SynthDefGrapher - - -class SynthDef: - """ - A synth definition. - - :: - - >>> from supriya import SynthDefBuilder, ugens - >>> with SynthDefBuilder(frequency=440) as builder: - ... sin_osc = ugens.SinOsc.ar(frequency=builder["frequency"]) - ... out = ugens.Out.ar(bus=0, source=sin_osc) - ... - >>> synthdef = builder.build() - - :: - - >>> supriya.graph(synthdef) # doctest: +SKIP - - :: - - >>> from supriya import Server - >>> server = Server().boot() - - :: - - >>> _ = server.add_synthdefs(synthdef) - - :: - - >>> _ = server.free_synthdefs(synthdef) - - :: - - >>> _ = server.quit() - """ - - ### INITIALIZER ### - - def __init__(self, ugens, name=None, optimize=True, **kwargs): - self._name = name - ugens = list(copy.deepcopy(ugens)) - assert all(isinstance(_, UGen) for _ in ugens) - ugens = self._cleanup_pv_chains(ugens) - ugens = self._cleanup_local_bufs(ugens) - if optimize: - ugens = self._optimize_ugen_graph(ugens) - ugens = self._sort_ugens_topologically(ugens) - self._ugens = tuple(ugens) - self._constants = self._collect_constants(self._ugens) - self._control_ugens = self._collect_control_ugens(self._ugens) - self._indexed_parameters = self._collect_indexed_parameters(self._control_ugens) - self._compiled_ugen_graph = SynthDefCompiler.compile_ugen_graph(self) - - ### SPECIAL METHODS ### - - def __eq__(self, expr) -> bool: - if not isinstance(expr, type(self)): - return False - if expr.name != self.name: - return False - if expr._compiled_ugen_graph != self._compiled_ugen_graph: - return False - return True - - def __graph__(self): - r""" - Graphs SynthDef. - - :: - - >>> with supriya.synthdefs.SynthDefBuilder(frequency=440) as builder: - ... sin_osc = supriya.ugens.SinOsc.ar(frequency=builder["frequency"]) - ... out = supriya.ugens.Out.ar(bus=0, source=sin_osc) - ... - >>> synthdef = builder.build() - >>> print(format(synthdef.__graph__(), "graphviz")) - digraph synthdef_... { - graph [bgcolor=transparent, - color=lightslategrey, - dpi=72, - fontname=Arial, - outputorder=edgesfirst, - overlap=prism, - penwidth=2, - rankdir=LR, - ranksep=1, - splines=spline, - style="dotted, rounded"]; - node [fontname=Arial, - fontsize=12, - penwidth=2, - shape=Mrecord, - style="filled, rounded"]; - edge [penwidth=2]; - ugen_0 [fillcolor=lightgoldenrod2, - label=" Control\n(control) | { { frequency:\n440.0 } }"]; - ugen_1 [fillcolor=lightsteelblue2, - label=" SinOsc\n(audio) | { { frequency | phase:\n0.0 } | { 0 } }"]; - ugen_2 [fillcolor=lightsteelblue2, - label=" Out\n(audio) | { { bus:\n0.0 | source } }"]; - ugen_0:f_1_0_0:e -> ugen_1:f_1_0_0:w [color=goldenrod]; - ugen_1:f_1_1_0:e -> ugen_2:f_1_0_1:w [color=steelblue]; - } - - Returns Graphviz graph. - """ - return SynthDefGrapher.graph(self) - - def __hash__(self) -> int: - hash_values = (type(self), self._name, self._compiled_ugen_graph) - return hash(hash_values) - - def __repr__(self) -> str: - return "<{}: {}>".format(type(self).__name__, self.actual_name) - - def __str__(self) -> str: - """ - 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, BinaryOpUGen): - ugen_op = BinaryOperator.from_expr(ugen.special_index) - parts.append("(" + ugen_op.name + ")") - elif isinstance(ugen, 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_, Parameter): - return ":{}".format(input_.name) - elif isinstance(input_, 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 "" - - ugens = [] - named_ugens = get_ugen_names() - for ugen in self._ugens: - ugen_dict: Dict[str, Union[float, str]] = {} - ugen_name = named_ugens[ugen] - for input_name, input_ in zip(ugen._input_names, ugen._inputs): - if isinstance(input_name, str): - argument_name = input_name - else: - argument_name = f"{input_name[0]}[{input_name[1]}]" - if isinstance(input_, float): - value: Union[float, str] = input_ - else: - output_index = 0 - if isinstance(input_, 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 - ugens.append({ugen_name: ugen_dict or None}) - result = [ - "synthdef:", - f" name: {self.actual_name}", - " ugens:", - ] - for ugen in ugens: - for ugen_name, ugen_dict in ugen.items(): - if not ugen_dict: - result.append(f" - {ugen_name}: null") - continue - result.append(f" - {ugen_name}:") - for parameter_name, parameter_value in ugen_dict.items(): - result.append(f" {parameter_name}: {parameter_value}") - return "\n".join(result) - - ### PRIVATE METHODS ### - - @staticmethod - def _build_control_mapping(parameters): - control_mapping = collections.OrderedDict() - scalar_parameters = [] - trigger_parameters = [] - audio_parameters = [] - control_parameters = [] - mapping = { - ParameterRate.AUDIO: audio_parameters, - ParameterRate.CONTROL: control_parameters, - ParameterRate.SCALAR: scalar_parameters, - ParameterRate.TRIGGER: trigger_parameters, - } - for parameter in parameters: - mapping[parameter.parameter_rate].append(parameter) - for filtered_parameters in mapping.values(): - filtered_parameters.sort(key=lambda x: x.name) - control_ugens = [] - indexed_parameters = [] - starting_control_index = 0 - if scalar_parameters: - control = Control( - parameters=scalar_parameters, - calculation_rate=CalculationRate.SCALAR, - starting_control_index=starting_control_index, - ) - control_ugens.append(control) - for parameter in scalar_parameters: - indexed_parameters.append((starting_control_index, parameter)) - starting_control_index += len(parameter) - for i, output_proxy in enumerate(control._get_parameter_output_proxies()): - control_mapping[output_proxy] = control[i] - if trigger_parameters: - control = TrigControl( - parameters=trigger_parameters, - starting_control_index=starting_control_index, - ) - control_ugens.append(control) - for parameter in trigger_parameters: - indexed_parameters.append((starting_control_index, parameter)) - starting_control_index += len(parameter) - for i, output_proxy in enumerate(control._get_parameter_output_proxies()): - control_mapping[output_proxy] = control[i] - if audio_parameters: - control = AudioControl( - parameters=audio_parameters, - starting_control_index=starting_control_index, - ) - control_ugens.append(control) - for parameter in audio_parameters: - indexed_parameters.append((starting_control_index, parameter)) - starting_control_index += len(parameter) - for i, output_proxy in enumerate(control._get_parameter_output_proxies()): - control_mapping[output_proxy] = control[i] - if control_parameters: - if any(_.lag for _ in control_parameters): - control = LagControl( - parameters=control_parameters, - calculation_rate=CalculationRate.CONTROL, - starting_control_index=starting_control_index, - ) - else: - control = Control( - parameters=control_parameters, - calculation_rate=CalculationRate.CONTROL, - starting_control_index=starting_control_index, - ) - control_ugens.append(control) - for parameter in control_parameters: - indexed_parameters.append((starting_control_index, parameter)) - starting_control_index += len(parameter) - for i, output_proxy in enumerate(control._get_parameter_output_proxies()): - control_mapping[output_proxy] = control[i] - control_ugens = tuple(control_ugens) - indexed_parameters.sort(key=lambda pair: parameters.index(pair[1])) - indexed_parameters = tuple(indexed_parameters) - return control_ugens, control_mapping, indexed_parameters - - @staticmethod - def _build_input_mapping(ugens): - from ..ugens import PV_ChainUGen, PV_Copy - - input_mapping = {} - for ugen in ugens: - if not isinstance(ugen, PV_ChainUGen): - continue - if isinstance(ugen, PV_Copy): - continue - for i, input_ in enumerate(ugen.inputs): - if not isinstance(input_, OutputProxy): - continue - source = input_.source - if not isinstance(source, PV_ChainUGen): - continue - if source not in input_mapping: - input_mapping[source] = [] - input_mapping[source].append((ugen, i)) - return input_mapping - - @staticmethod - def _cleanup_local_bufs(ugens): - from ..ugens import LocalBuf, MaxLocalBufs - - local_bufs = [] - processed_ugens = [] - for ugen in ugens: - if isinstance(ugen, MaxLocalBufs): - continue - if isinstance(ugen, LocalBuf): - local_bufs.append(ugen) - processed_ugens.append(ugen) - if local_bufs: - max_local_bufs = MaxLocalBufs.ir(maximum=len(local_bufs)) - for local_buf in local_bufs: - inputs = list(local_buf.inputs[:2]) - inputs.append(max_local_bufs[0]) - local_buf._inputs = tuple(inputs) - index = processed_ugens.index(local_bufs[0]) - processed_ugens[index:index] = [max_local_bufs] - return tuple(processed_ugens) - - @staticmethod - def _cleanup_pv_chains(ugens): - from ..ugens import LocalBuf, PV_Copy - - input_mapping = SynthDef._build_input_mapping(ugens) - for antecedent, descendants in input_mapping.items(): - if len(descendants) == 1: - continue - for descendant, input_index in descendants[:-1]: - fft_size = antecedent.fft_size - new_buffer = LocalBuf.ir(frame_count=fft_size) - pv_copy = PV_Copy.kr(pv_chain_a=antecedent, pv_chain_b=new_buffer) - inputs = list(descendant._inputs) - inputs[input_index] = pv_copy[0] - descendant._inputs = tuple(inputs) - index = ugens.index(descendant) - replacement = [] - if isinstance(fft_size, UGenOperable): - replacement.append(fft_size) - replacement.extend([new_buffer, pv_copy]) - ugens[index:index] = replacement - return ugens - - @staticmethod - def _collect_constants(ugens) -> Tuple[float, ...]: - constants = [] - for ugen in ugens: - for input_ in ugen._inputs: - if not isinstance(input_, float): - continue - if input_ not in constants: - constants.append(input_) - return tuple(constants) - - @staticmethod - def _collect_control_ugens(ugens): - control_ugens = tuple(_ for _ in ugens if isinstance(_, Control)) - return control_ugens - - @staticmethod - def _collect_indexed_parameters(control_ugens) -> Sequence[Tuple[int, Parameter]]: - indexed_parameters = [] - parameters = {} - for control_ugen in control_ugens: - index = control_ugen.starting_control_index - for parameter in control_ugen.parameters: - parameters[parameter.name] = (index, parameter) - index += len(parameter) - for parameter_name in sorted(parameters): - indexed_parameters.append(parameters[parameter_name]) - return tuple(indexed_parameters) - - @staticmethod - def _extract_parameters(ugens): - parameters = set() - for ugen in ugens: - if isinstance(ugen, Parameter): - parameters.add(ugen) - ugens = tuple(ugen for ugen in ugens if ugen not in parameters) - parameters = tuple(sorted(parameters, key=lambda x: x.name)) - return ugens, parameters - - @staticmethod - def _initialize_topological_sort(ugens): - ugens = list(ugens) - sort_bundles = collections.OrderedDict() - width_first_antecedents = [] - for ugen in ugens: - sort_bundles[ugen] = UGenSortBundle(ugen, width_first_antecedents) - if ugen._is_width_first: - width_first_antecedents.append(ugen) - for ugen in ugens: - sort_bundle = sort_bundles[ugen] - sort_bundle._initialize_topological_sort(sort_bundles) - sort_bundle.descendants[:] = sorted( - sort_bundles[ugen].descendants, key=lambda x: ugens.index(ugen) - ) - return sort_bundles - - @staticmethod - def _optimize_ugen_graph(ugens): - sort_bundles = SynthDef._initialize_topological_sort(ugens) - for ugen in ugens: - ugen._optimize_graph(sort_bundles) - return tuple(sort_bundles) - - @staticmethod - def _remap_controls(ugens, control_mapping): - for ugen in ugens: - inputs = list(ugen.inputs) - for i, input_ in enumerate(inputs): - if input_ in control_mapping: - output_proxy = control_mapping[input_] - inputs[i] = output_proxy - ugen._inputs = tuple(inputs) - - @staticmethod - def _sort_ugens_topologically(ugens): - sort_bundles = SynthDef._initialize_topological_sort(ugens) - available_ugens = [] - for ugen in reversed(ugens): - sort_bundles[ugen]._make_available(available_ugens) - out_stack = [] - while available_ugens: - available_ugen = available_ugens.pop() - sort_bundles[available_ugen]._schedule( - available_ugens, out_stack, sort_bundles - ) - return out_stack - - ### PUBLIC METHODS ### - - def compile(self, use_anonymous_name=False) -> bytes: - from .synthdefs import SynthDefCompiler - - synthdefs = [self] - result = SynthDefCompiler.compile_synthdefs( - synthdefs, use_anonymous_names=use_anonymous_name - ) - return result - - def to_dict(self): - """ - Convert SynthDef to JSON-serializable dictionay. - - :: - - >>> import json - >>> result = supriya.assets.synthdefs.default.to_dict() - >>> result = json.dumps( - ... result, - ... indent=4, - ... separators=(",", ": "), - ... sort_keys=True, - ... ) - >>> print(result) - { - "synthdef": { - "hash": "da0982184cc8fa54cf9d288a0fe1f6ca", - "name": "default", - "parameters": { - "amplitude": { - "range": [ - 0, - 1 - ], - "rate": "control", - "unit": null, - "value": 0.1 - }, - "frequency": { - "range": [ - 0, - 1 - ], - "rate": "control", - "unit": null, - "value": 440.0 - }, - "gate": { - "range": [ - 0, - 1 - ], - "rate": "control", - "unit": null, - "value": 1.0 - }, - "out": { - "range": [ - 0, - 1 - ], - "rate": "scalar", - "unit": null, - "value": 0.0 - }, - "pan": { - "range": [ - 0, - 1 - ], - "rate": "control", - "unit": null, - "value": 0.5 - } - } - } - } - """ - result = { - "name": self.actual_name, - "hash": self.anonymous_name, - "parameters": {}, - } - for parameter_name, parameter in self.parameters.items(): - range_ = [0, 1] - if parameter.range_: - range_ = [parameter.range_.minimum, parameter.range_.maximum] - rate = parameter.parameter_rate.name.lower() - result["parameters"][parameter_name] = { - "rate": rate, - "range": range_, - "unit": parameter.unit, - "value": parameter.value, - } - result = {"synthdef": result} - return result - - ### PUBLIC PROPERTIES ### - - @property - def actual_name(self) -> str: - return self.name or self.anonymous_name - - @property - def anonymous_name(self) -> str: - md5 = hashlib.md5() - md5.update(self._compiled_ugen_graph) - anonymous_name = md5.hexdigest() - return anonymous_name - - @property - def audio_channel_count(self) -> int: - return max(self.audio_input_channel_count, self.audio_output_channel_count) - - @property - def audio_input_channel_count(self) -> int: - """ - Gets audio input channel count of synthdef. - - :: - - >>> with supriya.SynthDefBuilder() as builder: - ... audio_in = supriya.ugens.In.ar(channel_count=1) - ... control_in = supriya.ugens.In.kr(channel_count=2) - ... sin = supriya.ugens.SinOsc.ar( - ... frequency=audio_in, - ... ) - ... source = audio_in * control_in[1] - ... audio_out = supriya.ugens.Out.ar(source=[source] * 4) - ... - >>> synthdef = builder.build() - - :: - - >>> supriya.graph(synthdef) # doctest: +SKIP - - :: - - >>> synthdef.audio_input_channel_count - 1 - - Returns integer. - """ - ugens = tuple( - _ for _ in self.input_ugens if _.calculation_rate == CalculationRate.AUDIO - ) - if len(ugens) == 1: - return len(ugens[0]) - elif not ugens: - return 0 - raise ValueError - - @property - def audio_output_channel_count(self) -> int: - """ - Gets audio output channel count of synthdef. - - :: - - >>> with supriya.SynthDefBuilder() as builder: - ... audio_in = supriya.ugens.In.ar(channel_count=1) - ... control_in = supriya.ugens.In.kr(channel_count=2) - ... sin = supriya.ugens.SinOsc.ar( - ... frequency=audio_in, - ... ) - ... source = sin * control_in[0] - ... audio_out = supriya.ugens.Out.ar(source=[source] * 4) - ... - >>> synthdef = builder.build() - >>> print(synthdef) - synthdef: - name: ... - ugens: - - In.ar: - bus: 0.0 - - SinOsc.ar: - frequency: In.ar[0] - phase: 0.0 - - In.kr: - bus: 0.0 - - BinaryOpUGen(MULTIPLICATION).ar: - left: SinOsc.ar[0] - right: In.kr[0] - - Out.ar: - bus: 0.0 - source[0]: BinaryOpUGen(MULTIPLICATION).ar[0] - source[1]: BinaryOpUGen(MULTIPLICATION).ar[0] - source[2]: BinaryOpUGen(MULTIPLICATION).ar[0] - source[3]: BinaryOpUGen(MULTIPLICATION).ar[0] - - :: - - >>> supriya.graph(synthdef) # doctest: +SKIP - - :: - - >>> synthdef.audio_output_channel_count - 4 - - Returns integer. - """ - ugens = tuple( - _ for _ in self.output_ugens if _.calculation_rate == CalculationRate.AUDIO - ) - if len(ugens) == 1: - return len(ugens[0].source) - elif not ugens: - return 0 - raise ValueError - - @property - def constants(self) -> Tuple[float, ...]: - return self._constants - - @property - def control_ugens(self) -> List[UGen]: - return self._control_ugens - - @property - def control_channel_count(self) -> int: - return max(self.control_input_channel_count, self.control_output_channel_count) - - @property - def control_input_channel_count(self) -> int: - """ - Gets control input channel count of synthdef. - - :: - - >>> with supriya.SynthDefBuilder() as builder: - ... audio_in = supriya.ugens.In.ar(channel_count=1) - ... control_in = supriya.ugens.In.kr(channel_count=2) - ... sin = supriya.ugens.SinOsc.ar( - ... frequency=audio_in, - ... ) - ... source = audio_in * control_in[1] - ... audio_out = supriya.ugens.Out.ar(source=[source] * 4) - ... - >>> synthdef = builder.build() - - :: - - >>> supriya.graph(synthdef) # doctest: +SKIP - - :: - - >>> synthdef.control_input_channel_count - 2 - - Returns integer. - """ - ugens = tuple( - _ for _ in self.input_ugens if _.calculation_rate == CalculationRate.CONTROL - ) - if len(ugens) == 1: - return len(ugens[0]) - elif not ugens: - return 0 - raise ValueError - - @property - def control_output_channel_count(self) -> int: - """ - Gets control output channel count of synthdef. - - :: - - >>> with supriya.SynthDefBuilder() as builder: - ... audio_in = supriya.ugens.In.ar(channel_count=1) - ... control_in = supriya.ugens.In.kr(channel_count=2) - ... sin = supriya.ugens.SinOsc.ar( - ... frequency=audio_in, - ... ) - ... source = audio_in * control_in[1] - ... audio_out = supriya.ugens.Out.ar(source=[source] * 4) - ... - >>> synthdef = builder.build() - - :: - - >>> supriya.graph(synthdef) # doctest: +SKIP - - :: - - >>> synthdef.control_output_channel_count - 0 - - Returns integer. - """ - ugens = tuple( - _ - for _ in self.output_ugens - if _.calculation_rate == CalculationRate.CONTROL - ) - if len(ugens) == 1: - return len(ugens[0].source) - elif not ugens: - return 0 - raise ValueError - - @property - def done_actions(self) -> List[DoneAction]: - done_actions = set() - for ugen in self.ugens: - done_action = ugen._get_done_action() - if done_action is not None: - done_actions.add(done_action) - return sorted(done_actions) - - @property - def has_gate(self) -> bool: - return "gate" in self.parameter_names - - @property - def indexed_parameters(self) -> Sequence[Tuple[int, Parameter]]: - return self._indexed_parameters - - @property - def input_ugens(self) -> Tuple[UGen, ...]: - return tuple(_ for _ in self.ugens if _.is_input_ugen) - - @property - def name(self) -> Optional[str]: - return self._name - - @property - def output_ugens(self) -> Tuple[UGen, ...]: - return tuple(_ for _ in self.ugens if _.is_output_ugen) - - @property - def parameters(self) -> Dict[Optional[str], Parameter]: - return { - parameter.name: parameter for index, parameter in self.indexed_parameters - } - - @property - def parameter_names(self) -> List[Optional[str]]: - return [parameter.name for index, parameter in self.indexed_parameters] - - @property - def ugens(self) -> Tuple[UGen, ...]: - return self._ugens - - -class UGenSortBundle: - ### INITIALIZER ### - - def __init__(self, ugen, width_first_antecedents): - self.antecedents = [] - self.descendants = [] - self.ugen = ugen - self.width_first_antecedents = tuple(width_first_antecedents) - - ### PRIVATE METHODS ### - - def _initialize_topological_sort(self, sort_bundles): - for input_ in self.ugen.inputs: - if isinstance(input_, OutputProxy): - input_ = input_.source - elif not isinstance(input_, UGen): - continue - input_sort_bundle = sort_bundles[input_] - if input_ not in self.antecedents: - self.antecedents.append(input_) - if self.ugen not in input_sort_bundle.descendants: - input_sort_bundle.descendants.append(self.ugen) - for input_ in self.width_first_antecedents: - input_sort_bundle = sort_bundles[input_] - if input_ not in self.antecedents: - self.antecedents.append(input_) - if self.ugen not in input_sort_bundle.descendants: - input_sort_bundle.descendants.append(self.ugen) - - def _make_available(self, available_ugens): - if not self.antecedents: - if self.ugen not in available_ugens: - available_ugens.append(self.ugen) - - def _schedule(self, available_ugens, out_stack, sort_bundles): - for ugen in reversed(self.descendants): - sort_bundle = sort_bundles[ugen] - sort_bundle.antecedents.remove(self.ugen) - sort_bundle._make_available(available_ugens) - out_stack.append(self.ugen) - - ### PUBLIC METHODS ### - - def clear(self) -> None: - self.antecedents[:] = [] - self.descendants[:] = [] - self.width_first_antecedents[:] = [] - - -class SuperColliderSynthDef: - ### INITIALIZER ### - - def __init__(self, name, body, rates=None): - self._name = name - self._body = body - self._rates = rates - - ### PRIVATE METHODS ### - - def _build_sc_input(self, directory_path): - input_ = [] - input_.append("a = SynthDef(") - input_.append(" \\{}, {{".format(self.name)) - for line in self.body.splitlines(): - input_.append(" " + line) - if self.rates: - input_.append("}}, {});".format(self.rates)) - else: - input_.append("});") - input_.append('"Defined SynthDef".postln;') - input_.append('a.writeDefFile("{}");'.format(directory_path)) - input_.append('"Wrote SynthDef".postln;') - input_.append("0.exit;") - input_ = "\n".join(input_) - return input_ - - ### PUBLIC METHODS ### - - def compile(self): - sclang_path = sclang.find() - with tempfile.TemporaryDirectory() as directory: - directory_path = pathlib.Path(directory) - sc_input = self._build_sc_input(directory_path) - sc_file_path = directory_path / f"{self.name}.sc" - sc_file_path.write_text(sc_input) - command = [str(sclang_path), "-D", str(sc_file_path)] - subprocess.run(command, timeout=10) - result = (directory_path / f"{self.name}.scsyndef").read_bytes() - return bytes(result) - - ### PUBLIC PROPERTIES ### - - @property - def body(self): - return self._body - - @property - def rates(self): - return self._rates - - @property - def name(self): - return self._name diff --git a/supriya/typing.py b/supriya/typing.py index 46039a16a..5d3917587 100644 --- a/supriya/typing.py +++ b/supriya/typing.py @@ -25,6 +25,7 @@ DoneAction, EnvelopeShape, HeaderFormat, + ParameterRate, SampleFormat, ) @@ -76,6 +77,7 @@ def __render_memo__(self) -> SupportsRender: AddActionLike: TypeAlias = _EnumLike[AddAction] DoneActionLike: TypeAlias = _EnumLike[DoneAction] CalculationRateLike: TypeAlias = _EnumLike[CalculationRate] +ParameterRateLike: TypeAlias = _EnumLike[ParameterRate] RateLike: TypeAlias = _EnumLike[CalculationRate] EnvelopeShapeLike: TypeAlias = _EnumLike[EnvelopeShape] HeaderFormatLike: TypeAlias = _EnumLike[HeaderFormat] diff --git a/supriya/ugens/__init__.py b/supriya/ugens/__init__.py index 337fa69cc..e7e734892 100644 --- a/supriya/ugens/__init__.py +++ b/supriya/ugens/__init__.py @@ -3,18 +3,31 @@ """ # Need to import these before anything else -from .bases import ( # isort:skip +from .core import ( # isort:skip + AudioControl, BinaryOpUGen, Check, + Control, + LagControl, OutputProxy, + Parameter, PseudoUGen, + SuperColliderSynthDef, + SynthDef, + SynthDefBuilder, + TrigControl, UGen, - UGenArray, UGenOperable, UGenSerializable, + UGenVector, UnaryOpUGen, + compile_synthdefs, + decompile_synthdef, + decompile_synthdefs, + param, + synthdef, + ugen, ) -from .bases import param, ugen # isort:skip from .basic import Mix, MulAdd, Sum3, Sum4 from .beq import ( @@ -108,6 +121,7 @@ from .envelopes import ( Done, EnvGen, + Envelope, Free, FreeSelf, FreeSelfWhenDone, @@ -343,6 +357,7 @@ "AmpComp", "AmpCompA", "Amplitude", + "AudioControl", "BAllPass", "BBandPass", "BBandStop", @@ -396,6 +411,7 @@ "CombN", "Compander", "CompanderD", + "Control", "ControlDur", "ControlRate", "Convolution", @@ -446,6 +462,7 @@ "Dwrand", "Dxrand", "EnvGen", + "Envelope", "ExpRand", "FBSineC", "FBSineL", @@ -512,6 +529,7 @@ "Lag2UD", "Lag3", "Lag3UD", + "LagControl", "LagUD", "Latch", "LatoocarfianC", @@ -601,6 +619,7 @@ "PanAz", "PanB", "PanB2", + "Parameter", "Pause", "PauseSelf", "PauseSelfWhenDone", @@ -625,6 +644,7 @@ "Rand", "RandID", "RandSeed", + "Range", "RecordBuf", "ReplaceOut", "Ringz", @@ -656,8 +676,11 @@ "SubsampleOffset", "Sum3", "Sum4", + "SuperColliderSynthDef", "Sweep", "SyncSaw", + "SynthDef", + "SynthDefBuilder", "TBall", "TDelay", "TExpRand", @@ -667,12 +690,13 @@ "ToggleFF", "Trig", "Trig1", + "TrigControl", "TwoPole", "TwoZero", "UGen", - "UGenArray", "UGenOperable", "UGenSerializable", + "UGenVector", "UnaryOpUGen", "VDiskIn", "VOsc", @@ -687,6 +711,10 @@ "XLine", "XOut", "ZeroCrossing", + "compile_synthdefs", + "decompile_synthdef", + "decompile_synthdefs", "param", + "synthdef", "ugen", ] diff --git a/supriya/ugens/basic.py b/supriya/ugens/basic.py index 27724aec2..aa7d8e606 100644 --- a/supriya/ugens/basic.py +++ b/supriya/ugens/basic.py @@ -2,7 +2,7 @@ from .. import utils from ..enums import CalculationRate -from .bases import PseudoUGen, UGen, UGenArray, param, ugen +from .core import PseudoUGen, UGen, UGenVector, param, ugen class Mix(PseudoUGen): @@ -13,9 +13,13 @@ class Mix(PseudoUGen): :: - >>> with supriya.synthdefs.SynthDefBuilder() as builder: - ... oscillators = [supriya.ugens.DC.ar(source=1) for _ in range(5)] - ... mix = supriya.ugens.Mix.new(oscillators) + >>> from supriya.ugens import DC, Mix, SynthDefBuilder + + :: + + >>> with SynthDefBuilder() as builder: + ... oscillators = [DC.ar(source=1) for _ in range(5)] + ... mix = Mix.new(oscillators) ... >>> synthdef = builder.build(name="mix1", optimize=False) >>> supriya.graph(synthdef) # doctest: +SKIP @@ -49,9 +53,9 @@ class Mix(PseudoUGen): :: - >>> with supriya.synthdefs.SynthDefBuilder() as builder: - ... oscillators = [supriya.ugens.DC.ar(source=1) for _ in range(15)] - ... mix = supriya.ugens.Mix.new(oscillators) + >>> with SynthDefBuilder() as builder: + ... oscillators = [DC.ar(source=1) for _ in range(15)] + ... mix = Mix.new(oscillators) ... >>> synthdef = builder.build("mix2") >>> supriya.graph(synthdef) # doctest: +SKIP @@ -124,11 +128,11 @@ class Mix(PseudoUGen): def _flatten_sources(cls, sources): flattened_sources = [] for source in sources: - if isinstance(source, UGenArray): + if isinstance(source, UGenVector): flattened_sources.extend(source) else: flattened_sources.append(source) - return UGenArray(flattened_sources) + return UGenVector(*flattened_sources) ### PUBLIC METHODS ### @@ -313,7 +317,7 @@ def multichannel(cls, sources, channel_count): parts.append(sources[i : i + channel_count]) for columns in zip(*parts): mixes.append(cls.new(columns)) - return UGenArray(mixes) + return UGenVector(*mixes) @ugen(new=True) @@ -330,7 +334,7 @@ class MulAdd(UGen): ... source=source, ... ) >>> mul_add - MulAdd.ar() + MulAdd.ar()[0] """ ### CLASS VARIABLES ### @@ -411,7 +415,7 @@ class Sum3(UGen): ... input_two=input_two, ... input_three=input_three, ... ) - Sum3.ar() + Sum3.ar()[0] """ input_one = param() @@ -469,7 +473,7 @@ class Sum4(UGen): ... input_three=input_three, ... input_four=input_four, ... ) - Sum4.ar() + Sum4.ar()[0] """ input_one = param() diff --git a/supriya/ugens/beq.py b/supriya/ugens/beq.py index 8cf7ec863..5d57736a8 100644 --- a/supriya/ugens/beq.py +++ b/supriya/ugens/beq.py @@ -1,4 +1,4 @@ -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True, is_pure=True) @@ -15,7 +15,7 @@ class BAllPass(UGen): ... source=source, ... ) >>> ball_pass - BAllPass.ar() + BAllPass.ar()[0] """ source = param() @@ -37,7 +37,7 @@ class BBandPass(UGen): ... source=source, ... ) >>> bband_pass - BBandPass.ar() + BBandPass.ar()[0] """ source = param() @@ -59,7 +59,7 @@ class BBandStop(UGen): ... source=source, ... ) >>> bband_stop - BBandStop.ar() + BBandStop.ar()[0] """ source = param() @@ -82,7 +82,7 @@ class BHiCut(UGen): ... source=source, ... ) >>> bhi_cut - BHiCut.ar() + BHiCut.ar()[0] """ source = param() @@ -105,7 +105,7 @@ class BHiPass(UGen): ... source=source, ... ) >>> bhi_pass - BHiPass.ar() + BHiPass.ar()[0] """ source = param() @@ -128,7 +128,7 @@ class BHiShelf(UGen): ... source=source, ... ) >>> bhi_shelf - BHiShelf.ar() + BHiShelf.ar()[0] """ source = param() @@ -152,7 +152,7 @@ class BLowCut(UGen): ... source=source, ... ) >>> blow_cut - BLowCut.ar() + BLowCut.ar()[0] """ source = param() @@ -175,7 +175,7 @@ class BLowPass(UGen): ... source=source, ... ) >>> blow_pass - BLowPass.ar() + BLowPass.ar()[0] """ source = param() @@ -198,7 +198,7 @@ class BLowShelf(UGen): ... source=source, ... ) >>> blow_shelf - BLowShelf.ar() + BLowShelf.ar()[0] """ source = param() @@ -222,7 +222,7 @@ class BPeakEQ(UGen): ... source=source, ... ) >>> bpeak_eq - BPeakEQ.ar() + BPeakEQ.ar()[0] """ source = param() diff --git a/supriya/ugens/bufio.py b/supriya/ugens/bufio.py index f6e101d25..66dfba4f7 100644 --- a/supriya/ugens/bufio.py +++ b/supriya/ugens/bufio.py @@ -1,7 +1,7 @@ from typing import Any, Dict, Tuple from ..enums import CalculationRate, DoneAction -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True, kr=True, is_multichannel=True) @@ -25,7 +25,7 @@ class BufRd(UGen): ... phase=phase, ... ) >>> buf_rd - UGenArray({2}) + UGenVector({2}) """ buffer_id = param() @@ -55,7 +55,7 @@ class BufWr(UGen): ... source=source, ... ) >>> buf_wr - BufWr.ar() + BufWr.ar()[0] """ buffer_id = param() @@ -73,7 +73,7 @@ class ClearBuf(UGen): ... buffer_id=23, ... ) >>> clear_buf - ClearBuf.ir() + ClearBuf.ir()[0] """ buffer_id = param() @@ -86,26 +86,30 @@ class LocalBuf(UGen): :: - >>> local_buf = supriya.ugens.LocalBuf.ir( + >>> from supriya.ugens import FFT, IFFT, LocalBuf, Out, PinkNoise, SynthDefBuilder + + :: + + >>> local_buf = LocalBuf.ir( ... channel_count=1, ... frame_count=1, ... ) >>> local_buf - LocalBuf.ir() + LocalBuf.ir()[0] LocalBuf creates a ``MaxLocalBufs`` UGen implicitly during SynthDef compilation: :: - >>> with supriya.synthdefs.SynthDefBuilder() as builder: - ... local_buf = supriya.ugens.LocalBuf.ir(frame_count=2048) - ... source = supriya.ugens.PinkNoise.ar() - ... pv_chain = supriya.ugens.FFT.kr( + >>> with SynthDefBuilder() as builder: + ... local_buf = LocalBuf.ir(frame_count=2048) + ... source = PinkNoise.ar() + ... pv_chain = FFT.kr( ... buffer_id=local_buf, ... source=source, ... ) - ... ifft = supriya.ugens.IFFT.ar(pv_chain=pv_chain) - ... out = supriya.ugens.Out.ar(bus=0, source=ifft) + ... ifft = IFFT.ar(pv_chain=pv_chain) + ... out = Out.ar(bus=0, source=ifft) ... >>> synthdef = builder.build() >>> for ugen in synthdef.ugens: @@ -139,7 +143,7 @@ class MaxLocalBufs(UGen): >>> max_local_bufs = supriya.ugens.MaxLocalBufs.ir(maximum=1) >>> max_local_bufs - MaxLocalBufs.ir() + MaxLocalBufs.ir()[0] """ maximum = param(0) @@ -150,7 +154,7 @@ def increment(self): :: - >>> max_local_bufs = supriya.ugens.MaxLocalBufs.ir(maximum=1) + >>> max_local_bufs = supriya.ugens.MaxLocalBufs.ir(maximum=1).source >>> max_local_bufs.inputs (1.0,) @@ -183,7 +187,7 @@ class PlayBuf(UGen): ... trigger=1, ... ) >>> play_buf - UGenArray({2}) + UGenVector({2}) """ buffer_id = param() @@ -215,7 +219,7 @@ class RecordBuf(UGen): ... trigger=1, ... ) >>> record_buf - RecordBuf.ar() + RecordBuf.ar()[0] """ buffer_id = param() diff --git a/supriya/ugens/chaos.py b/supriya/ugens/chaos.py index 5f98f8ba9..849a3c868 100644 --- a/supriya/ugens/chaos.py +++ b/supriya/ugens/chaos.py @@ -1,4 +1,4 @@ -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True) @@ -15,7 +15,7 @@ class CuspL(UGen): ... xi=0, ... ) >>> cusp_l - CuspL.ar() + CuspL.ar()[0] """ frequency = param(22050) @@ -38,7 +38,7 @@ class CuspN(UGen): ... xi=0, ... ) >>> cusp_n - CuspN.ar() + CuspN.ar()[0] """ frequency = param(22050) @@ -64,7 +64,7 @@ class FBSineC(UGen): ... yi=0.1, ... ) >>> fbsine_c - FBSineC.ar() + FBSineC.ar()[0] """ frequency = param(22050) @@ -93,7 +93,7 @@ class FBSineL(UGen): ... yi=0.1, ... ) >>> fbsine_l - FBSineL.ar() + FBSineL.ar()[0] """ frequency = param(22050) @@ -122,7 +122,7 @@ class FBSineN(UGen): ... yi=0.1, ... ) >>> fbsine_n - FBSineN.ar() + FBSineN.ar()[0] """ frequency = param(22050) @@ -147,7 +147,7 @@ class GbmanL(UGen): ... yi=2.1, ... ) >>> gbman_l - GbmanL.ar() + GbmanL.ar()[0] """ frequency = param(22050) @@ -168,7 +168,7 @@ class GbmanN(UGen): ... yi=2.1, ... ) >>> gbman_n - GbmanN.ar() + GbmanN.ar()[0] """ frequency = param(22050) @@ -191,7 +191,7 @@ class HenonC(UGen): ... x_1=0, ... ) >>> henon_c - HenonC.ar() + HenonC.ar()[0] """ frequency = param(22050) @@ -216,7 +216,7 @@ class HenonL(UGen): ... x_1=0, ... ) >>> henon_l - HenonL.ar() + HenonL.ar()[0] """ frequency = param(22050) @@ -241,7 +241,7 @@ class HenonN(UGen): ... x_1=0, ... ) >>> henon_n - HenonN.ar() + HenonN.ar()[0] """ frequency = param(22050) @@ -268,7 +268,7 @@ class LatoocarfianC(UGen): ... yi=0.5, ... ) >>> latoocarfian_c - LatoocarfianC.ar() + LatoocarfianC.ar()[0] """ frequency = param(22050) @@ -297,7 +297,7 @@ class LatoocarfianL(UGen): ... yi=0.5, ... ) >>> latoocarfian_l - LatoocarfianL.ar() + LatoocarfianL.ar()[0] """ frequency = param(22050) @@ -326,7 +326,7 @@ class LatoocarfianN(UGen): ... yi=0.5, ... ) >>> latoocarfian_n - LatoocarfianN.ar() + LatoocarfianN.ar()[0] """ frequency = param(22050) @@ -353,7 +353,7 @@ class LinCongC(UGen): ... xi=0, ... ) >>> lin_cong_c - LinCongC.ar() + LinCongC.ar()[0] """ frequency = param(22050) @@ -378,7 +378,7 @@ class LinCongL(UGen): ... xi=0, ... ) >>> lin_cong_l - LinCongL.ar() + LinCongL.ar()[0] """ frequency = param(22050) @@ -403,7 +403,7 @@ class LinCongN(UGen): ... xi=0, ... ) >>> lin_cong_n - LinCongN.ar() + LinCongN.ar()[0] """ frequency = param(22050) @@ -431,7 +431,7 @@ class LorenzL(UGen): ... zi=0, ... ) >>> lorenz_l - LorenzL.ar() + LorenzL.ar()[0] """ frequency = param(22050) @@ -459,7 +459,7 @@ class QuadC(UGen): ... xi=0, ... ) >>> quad_c - QuadC.ar() + QuadC.ar()[0] """ frequency = param(22050) @@ -484,7 +484,7 @@ class QuadL(UGen): ... xi=0, ... ) >>> quad_l - QuadL.ar() + QuadL.ar()[0] """ frequency = param(22050) @@ -509,7 +509,7 @@ class QuadN(UGen): ... xi=0, ... ) >>> quad_n - QuadN.ar() + QuadN.ar()[0] """ frequency = param(22050) @@ -533,7 +533,7 @@ class StandardL(UGen): ... yi=0, ... ) >>> standard_l - StandardL.ar() + StandardL.ar()[0] """ frequency = param(22050) @@ -556,7 +556,7 @@ class StandardN(UGen): ... yi=0, ... ) >>> standard_n - StandardN.ar() + StandardN.ar()[0] """ frequency = param(22050) diff --git a/docs/notebooks/introduction.css b/supriya/ugens/compilers.py similarity index 100% rename from docs/notebooks/introduction.css rename to supriya/ugens/compilers.py diff --git a/supriya/ugens/convolution.py b/supriya/ugens/convolution.py index a53e3ca79..8509b2e03 100644 --- a/supriya/ugens/convolution.py +++ b/supriya/ugens/convolution.py @@ -1,4 +1,4 @@ -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True) @@ -19,7 +19,7 @@ class Convolution(UGen): ... source=source, ... ) >>> convolution - Convolution.ar() + Convolution.ar()[0] """ source = param() @@ -46,7 +46,7 @@ class Convolution2(UGen): ... trigger=0, ... ) >>> convolution_2 - Convolution2.ar() + Convolution2.ar()[0] """ source = param() @@ -75,7 +75,7 @@ class Convolution2L(UGen): ... trigger=0, ... ) >>> convolution_2_l - Convolution2L.ar() + Convolution2L.ar()[0] """ source = param() @@ -104,7 +104,7 @@ class Convolution3(UGen): ... trigger=0, ... ) >>> convolution_3 - Convolution3.ar() + Convolution3.ar()[0] """ source = param() diff --git a/supriya/ugens/bases.py b/supriya/ugens/core.py similarity index 62% rename from supriya/ugens/bases.py rename to supriya/ugens/core.py index 4526989c0..282413840 100644 --- a/supriya/ugens/bases.py +++ b/supriya/ugens/core.py @@ -1,6 +1,15 @@ import abc +import collections import copy +import dataclasses +import hashlib import inspect +import pathlib +import struct +import subprocess +import tempfile +import threading +import uuid from enum import Enum from typing import ( Any, @@ -19,19 +28,25 @@ cast, ) +from ..typing import CalculationRateLike, Default, Missing + try: from typing import TypeAlias except ImportError: from typing_extensions import TypeAlias # noqa +import uqbar.graphs +from uqbar.objects import new + +from .. import sclang, utils from ..enums import ( BinaryOperator, CalculationRate, DoneAction, + ParameterRate, SignalRange, UnaryOperator, ) -from ..typing import CalculationRateLike, Default, Missing class Check(Enum): @@ -97,14 +112,14 @@ def _add_param_fn(cls, name: str, index: int, unexpanded: bool) -> None: name=name, args=["self"], body=( - [f"return UGenArray(self._inputs[{index}:])"] + [f"return UGenVector(*self._inputs[{index}:])"] if unexpanded - else [f"return UGenArray(self._inputs[{index}:{index} + 1])"] + else [f"return UGenVector(*self._inputs[{index}:{index} + 1])"] ), decorator=property, globals_=_get_fn_globals(), override=True, - return_type=UGenArray, + return_type=UGenVector, ) @@ -199,7 +214,7 @@ def _get_fn_globals(): "OutputProxy": OutputProxy, "Sequence": Sequence, "SupportsFloat": SupportsFloat, - "UGenArray": UGenArray, + "UGenVector": UGenVector, "UGenInitScalarParam": UGenInitScalarParam, "UGenInitVectorParam": UGenInitVectorParam, "UGenOperable": UGenOperable, @@ -370,7 +385,7 @@ def __abs__(self) -> "UGenOperable": ... ) >>> result = abs(ugen_graph) >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -448,7 +463,7 @@ def __add__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = ugen_graph + expr >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -594,7 +609,7 @@ def __div__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = ugen_graph / expr >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -718,7 +733,7 @@ def __ge__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = ugen_graph >= expr >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -832,7 +847,7 @@ def __gt__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = ugen_graph > expr >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -944,7 +959,7 @@ def __le__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = ugen_graph <= expr >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -1061,7 +1076,7 @@ def __lt__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = ugen_graph < expr >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -1173,7 +1188,7 @@ def __mod__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = ugen_graph % expr >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -1285,7 +1300,7 @@ def __mul__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = ugen_graph * expr >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -1393,7 +1408,7 @@ def __neg__(self) -> "UGenOperable": ... ) >>> result = -ugen_graph >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -1505,7 +1520,7 @@ def __pow__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = ugen_graph ** expr >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -1616,7 +1631,7 @@ def __rpow__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = expr ** ugen_graph >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -1696,7 +1711,7 @@ def __radd__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = expr + ugen_graph >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -1776,7 +1791,7 @@ def __rdiv__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = expr / ugen_graph >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -1858,7 +1873,7 @@ def __rmod__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = expr % ugen_graph >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -1940,7 +1955,7 @@ def __rmul__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = expr * ugen_graph >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -2022,7 +2037,7 @@ def __rsub__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = expr - ugen_graph >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -2145,7 +2160,7 @@ def __sub__(self, expr: "UGenOperand") -> "UGenOperable": ... ) >>> result = ugen_graph - expr >>> result - UGenArray({3}) + UGenVector({3}) :: @@ -2263,11 +2278,11 @@ def recurse(uuid, ugen, all_ugens): if ugen not in all_ugens: all_ugens.append(ugen) - from ..synthdefs import SynthDefBuilder + from . import SynthDefBuilder builder = SynthDefBuilder() ugens = copy.deepcopy(self) - if not isinstance(ugens, UGenArray): + if not isinstance(ugens, UGenVector): ugens = [ugens] all_ugens = [] for u in ugens: @@ -2294,9 +2309,13 @@ def _compute_binary_op(left, right, operator) -> "UGenOperable": for expanded_dict in UGen._expand_dictionary(dictionary): left = expanded_dict["left"] right = expanded_dict["right"] - calculation_rate = UGenOperable._compute_binary_rate(left, right) ugen = BinaryOpUGen._new_single( - calculation_rate=calculation_rate, + calculation_rate=max( + [ + CalculationRate.from_expr(left), + CalculationRate.from_expr(right), + ] + ), left=left, right=right, special_index=special_index, @@ -2305,19 +2324,7 @@ def _compute_binary_op(left, right, operator) -> "UGenOperable": if len(result) == 1: # TODO: remove cast(...) return cast(UGenOperable, result[0]) - return UGenArray(result) - - @staticmethod - def _compute_binary_rate(ugen_a, ugen_b) -> CalculationRate: - a_rate = CalculationRate.from_expr(ugen_a) - b_rate = CalculationRate.from_expr(ugen_b) - if a_rate == CalculationRate.DEMAND or a_rate == CalculationRate.DEMAND: - return CalculationRate.DEMAND - elif a_rate == CalculationRate.AUDIO or b_rate == CalculationRate.AUDIO: - return CalculationRate.AUDIO - elif a_rate == CalculationRate.CONTROL or b_rate == CalculationRate.CONTROL: - return CalculationRate.CONTROL - return CalculationRate.SCALAR + return UGenVector(*result) def _compute_ugen_map(self, map_ugen, **kwargs): sources = [] @@ -2331,7 +2338,7 @@ def _compute_ugen_map(self, map_ugen, **kwargs): ugen = method(source=source, **kwargs) ugens.extend(ugen) if 1 < len(ugens): - return UGenArray(ugens) + return UGenVector(*ugens) elif len(ugens) == 1: return ugens[0].source return [] @@ -2354,7 +2361,7 @@ def _compute_unary_op(source, operator) -> "UGenOperable": if len(result) == 1: # TODO: remove cast(...) return cast(UGenOperable, result[0]) - return UGenArray(result) + return UGenVector(*result) def _get_output_proxy(self, i): if isinstance(i, int): @@ -2367,7 +2374,7 @@ def _get_output_proxy(self, i): output_proxies = ( OutputProxy(source=self, output_index=i) for i in range(*indices) ) - return UGenArray(output_proxies) + return UGenVector(*output_proxies) ### PUBLIC METHODS ### @@ -3578,15 +3585,12 @@ def serialize(self) -> Sequence[Union[SupportsFloat, "OutputProxy"]]: pass -class UGenArray(UGenOperable, Sequence): +class UGenVector(UGenOperable, Sequence): ### INITIALIZER ### - def __init__(self, ugens): - assert isinstance(ugens, Iterable) - ugens = tuple(ugens) - assert len(ugens) - self._ugens = ugens + def __init__(self, *ugens): + self._ugens = tuple(ugens) ### SPECIAL METHODS ### @@ -3712,8 +3716,6 @@ def __init__( special_index: int = 0, **kwargs, ) -> None: - from ..synthdefs import Parameter, SynthDefBuilder - calculation_rate_ = CalculationRate.from_expr(calculation_rate) if self._valid_calculation_rates: assert calculation_rate_ in self._valid_calculation_rates @@ -3767,7 +3769,7 @@ def __getitem__(self, i): :: - >>> ugen = supriya.ugens.SinOsc.ar() + >>> ugen = supriya.ugens.SinOsc.ar().source >>> ugen[0] SinOsc.ar()[0] @@ -3789,19 +3791,19 @@ def __repr__(self): :: - >>> ugen = supriya.ugens.SinOsc.ar() + >>> ugen = supriya.ugens.SinOsc.ar().source >>> repr(ugen) 'SinOsc.ar()' :: - >>> ugen = supriya.ugens.WhiteNoise.kr() + >>> ugen = supriya.ugens.WhiteNoise.kr().source >>> repr(ugen) 'WhiteNoise.kr()' :: - >>> ugen = supriya.ugens.Rand.ir() + >>> ugen = supriya.ugens.Rand.ir().source >>> repr(ugen) 'Rand.ir()' @@ -3824,7 +3826,7 @@ def _as_audio_rate_input(expr): return expr return K2A.ar(source=expr) elif isinstance(expr, Iterable): - return UGenArray(UGen._as_audio_rate_input(x) for x in expr) + return UGenVector(*(UGen._as_audio_rate_input(x) for x in expr)) raise ValueError(expr) def _add_constant_input(self, name, value): @@ -3862,8 +3864,6 @@ def _check_range_of_inputs_at_audio_rate(self, start=None, stop=None): return True def _configure_input(self, name, value): - from ..synthdefs import Parameter - ugen_prototype = (OutputProxy, Parameter, UGen) if hasattr(value, "__float__"): self._add_constant_input(name, float(value)) @@ -3884,14 +3884,14 @@ def _configure_input(self, name, value): else: raise ValueError(f"Invalid input: {value!r}") - @staticmethod - def _expand_dictionary(dictionary, unexpanded_input_names=None): + @classmethod + def _expand_dictionary(cls, kwargs, unexpanded_input_names=()): """ Expands a dictionary into multichannel dictionaries. :: - >>> dictionary = {"foo": 0, "bar": (1, 2), "baz": (3, 4, 5)} + >>> dictionary = {"foo": 0, "bar": [1, 2], "baz": [3, 4, 5]} >>> result = UGen._expand_dictionary(dictionary) >>> for x in result: ... sorted(x.items()) @@ -3902,7 +3902,7 @@ def _expand_dictionary(dictionary, unexpanded_input_names=None): :: - >>> dictionary = {"bus": (8, 9), "source": (1, 2, 3)} + >>> dictionary = {"bus": [8, 9], "source": [1, 2, 3]} >>> result = UGen._expand_dictionary( ... dictionary, ... unexpanded_input_names=("source",), @@ -3910,36 +3910,45 @@ def _expand_dictionary(dictionary, unexpanded_input_names=None): >>> for x in result: ... sorted(x.items()) ... - [('bus', 8), ('source', (1, 2, 3))] - [('bus', 9), ('source', (1, 2, 3))] + [('bus', 8), ('source', [1, 2, 3])] + [('bus', 9), ('source', [1, 2, 3])] """ - from ..synthdefs import Parameter - - dictionary = dictionary.copy() - cached_unexpanded_inputs = {} - if unexpanded_input_names is not None: - for input_name in unexpanded_input_names: - if input_name not in dictionary: + size = 0 + for k, v in kwargs.items(): + if isinstance(v, (OutputProxy, str)) or not hasattr(v, "__len__"): + continue + elif k in unexpanded_input_names: + if all( + hasattr(x, "__len__") and not isinstance(x, OutputProxy) for x in v + ): + size = max(size, len(v)) + else: continue - cached_unexpanded_inputs[input_name] = dictionary[input_name] - del dictionary[input_name] - maximum_length = 1 - result = [] - prototype = (Sequence, UGen, Parameter) - for name, value in dictionary.items(): - if isinstance(value, prototype) and not isinstance(value, str): - maximum_length = max(maximum_length, len(value)) - for i in range(maximum_length): - result.append({}) - for name, value in dictionary.items(): - if isinstance(value, prototype) and not isinstance(value, str): - value = value[i % len(value)] - result[i][name] = value + else: + size = max(size, len(v)) + if not size: + return [kwargs] + results = [] + for i in range(size): + new_kwargs = {} + for k, v in kwargs.items(): + if isinstance(v, (OutputProxy, str)) or not hasattr(v, "__len__"): + new_kwargs[k] = v + elif k in unexpanded_input_names: + if all( + hasattr(x, "__len__") and not isinstance(x, OutputProxy) + for x in v + ): + new_kwargs[k] = v[i % len(v)] + else: + new_kwargs[k] = v else: - result[i][name] = value - for expanded_inputs in result: - expanded_inputs.update(cached_unexpanded_inputs) - return result + try: + new_kwargs[k] = v[i % len(v)] + except TypeError: + new_kwargs[k] = v + results.extend(cls._expand_dictionary(new_kwargs, unexpanded_input_names)) + return results def _get_done_action(self): if "done_action" not in self._ordered_input_names: @@ -3982,19 +3991,22 @@ def _is_valid_input(self, input_value): return False @classmethod - def _new_expanded(cls, **kwargs) -> Union[OutputProxy, UGenArray]: + def _new_expanded(cls, **kwargs) -> Union[OutputProxy, UGenVector]: output_proxies = [] - for input_dict in UGen._expand_dictionary( - kwargs, unexpanded_input_names=cls._unexpanded_input_names - ): - ugen = cls._new_single(**input_dict) - if len(ugen) <= 1: + dictionaries = UGen._expand_dictionary( + kwargs, + unexpanded_input_names=cls._unexpanded_input_names, + ) + for input_dict in dictionaries: + if isinstance(ugen := cls._new_single(**input_dict), OutputProxy): output_proxies.append(ugen) - else: + elif len(ugen): output_proxies.extend(ugen[:]) + else: + output_proxies.append(ugen) if len(output_proxies) == 1: return output_proxies[0] - return UGenArray(output_proxies) + return UGenVector(*output_proxies) @classmethod def _new_single(cls, **kwargs): @@ -4064,7 +4076,7 @@ def inputs(self): >>> ugen = supriya.ugens.SinOsc.ar( ... frequency=supriya.ugens.WhiteNoise.kr(), ... phase=0.5, - ... ) + ... ).source >>> for input_ in ugen.inputs: ... input_ ... @@ -4093,7 +4105,7 @@ def outputs(self) -> Tuple[OutputProxy, ...]: >>> ugen = supriya.ugens.SinOsc.ar( ... frequency=supriya.ugens.WhiteNoise.kr(), ... phase=0.5, - ... ) + ... ).source >>> ugen.outputs (CalculationRate.AUDIO,) @@ -4132,7 +4144,7 @@ def special_index(self): >>> ugen = supriya.ugens.SinOsc.ar( ... frequency=supriya.ugens.WhiteNoise.kr(), ... phase=0.5, - ... ) + ... ).source >>> ugen.special_index 0 @@ -4301,3 +4313,2039 @@ class PseudoUGen: @abc.abstractmethod def __init__(self): raise NotImplementedError + + +@dataclasses.dataclass(unsafe_hash=True) +class Parameter(UGenOperable): + lag: Optional[float] = None + name: Optional[str] = None + parameter_rate: ParameterRate = cast(ParameterRate, ParameterRate.CONTROL) + value: Union[float, Tuple[float, ...]] = 0.0 + + def __post_init__(self): + try: + self.value = float(self.value) + except TypeError: + self.value = tuple(float(_) for _ in self.value) + self.parameter_rate = ParameterRate.from_expr(self.parameter_rate) + self._uuid = None + + ### SPECIAL METHODS ### + + def __getitem__(self, i): + return self._get_output_proxy(i) + + def __len__(self): + if isinstance(self.value, float): + return 1 + return len(self.value) + + ### PRIVATE METHODS ### + + def _get_source(self): + return self + + def _get_output_number(self): + return 0 + + def _optimize_graph(self, sort_bundles): + pass + + ### PUBLIC PROPERTIES ### + + @property + def calculation_rate(self): + if (name := self.parameter_rate.name) == "TRIGGER": + return cast(CalculationRate, CalculationRate.CONTROL) + return CalculationRate.from_expr(name) + + @property + def has_done_flag(self): + return False + + @property + def inputs(self): + return () + + @property + def signal_range(self): + SignalRange.BIPOLAR + + +class Control(UGen): + """ + A control-rate control ugen. + + Control ugens can be set and routed externally to interact with a running synth. + Controls are created from the parameters of a synthesizer definition, and typically + do not need to be created by hand. + """ + + ### INITIALIZER ### + + def __init__(self, parameters, calculation_rate=None, starting_control_index=0): + coerced_parameters = [] + for parameter in parameters: + if not isinstance(parameter, Parameter): + parameter = Parameter(name=parameter, value=0) + coerced_parameters.append(parameter) + self._parameters = tuple(coerced_parameters) + self._channel_count = len(self) + UGen.__init__( + self, + calculation_rate=calculation_rate, + special_index=starting_control_index, + ) + + ### SPECIAL METHODS ### + + def __getitem__(self, i): + """ + Gets output proxy at `i`, via index or control name. + + Returns output proxy. + """ + if isinstance(i, int): + if len(self) == 1: + return OutputProxy(source=self, output_index=0) + return OutputProxy(source=self, output_index=i) + else: + return self[self._get_control_index(i)] + + def __len__(self): + """ + Gets number of ugen outputs. + + Equal to the number of control names. + + Returns integer. + """ + return sum(len(_) for _ in self.parameters) + + ### PRIVATE METHODS ### + + def _get_control_index(self, control_name): + for i, parameter in enumerate(self._parameters): + if parameter.name == control_name: + return i + raise ValueError + + def _get_outputs(self): + return [self.calculation_rate] * len(self) + + def _get_parameter_output_proxies(self): + output_proxies = [] + for parameter in self.parameters: + output_proxies.extend(parameter) + return output_proxies + + ### PUBLIC PROPERTIES ### + + @property + def controls(self): + """ + Gets controls of control ugen. + + Returns ugen graph. + """ + if len(self.parameters) == 1: + result = self + else: + result = [OutputProxy(self, i) for i in range(len(self.parameters))] + return result + + @property + def parameters(self): + """ + Gets control names associated with control. + + Returns tuple. + """ + return self._parameters + + @property + def starting_control_index(self): + """ + Gets starting control index of control ugen. + + Equivalent to the control ugen's special index. + + Returns integer. + """ + return self._special_index + + +class AudioControl(Control): + """ + A trigger-rate control ugen. + """ + + def __init__(self, parameters, calculation_rate=None, starting_control_index=0): + Control.__init__( + self, + parameters, + calculation_rate=CalculationRate.AUDIO, + starting_control_index=starting_control_index, + ) + + +class LagControl(Control): + """ + A lagged control-rate control ugen. + """ + + ### CLASS VARIABLES ### + + _ordered_input_names = collections.OrderedDict([("lags", None)]) + + _unexpanded_input_names = ("lags",) + + ### INITIALIZER ### + + def __init__(self, parameters, calculation_rate=None, starting_control_index=0): + coerced_parameters = [] + for parameter in parameters: + if not isinstance(parameter, Parameter): + parameter = Parameter(name=parameter, value=0) + coerced_parameters.append(parameter) + self._parameters = tuple(coerced_parameters) + lags = [] + for parameter in self._parameters: + lag = parameter.lag or 0.0 + lags.extend([lag] * len(parameter)) + self._channel_count = len(self) + UGen.__init__( + self, + calculation_rate=calculation_rate, + special_index=starting_control_index, + lags=lags, + ) + + +class TrigControl(Control): + """ + A trigger-rate control ugen. + """ + + ### CLASS VARIABLES ### + + ### INITIALIZER ## + + def __init__(self, parameters, calculation_rate=None, starting_control_index=0): + Control.__init__( + self, + parameters, + calculation_rate=CalculationRate.CONTROL, + starting_control_index=starting_control_index, + ) + + +class SynthDef: + """ + A synth definition. + + :: + + >>> from supriya import SynthDefBuilder, ugens + >>> with SynthDefBuilder(frequency=440) as builder: + ... sin_osc = ugens.SinOsc.ar(frequency=builder["frequency"]) + ... out = ugens.Out.ar(bus=0, source=sin_osc) + ... + >>> synthdef = builder.build() + + :: + + >>> supriya.graph(synthdef) # doctest: +SKIP + + :: + + >>> from supriya import Server + >>> server = Server().boot() + + :: + + >>> _ = server.add_synthdefs(synthdef) + + :: + + >>> _ = server.free_synthdefs(synthdef) + + :: + + >>> _ = server.quit() + """ + + ### INITIALIZER ### + + def __init__( + self, + ugens: Sequence[Union[Parameter, UGen, OutputProxy]], + name: Optional[str] = None, + optimize: bool = True, + ) -> None: + self._name = name + ugens_: List[UGen] = list( + ugen.source if isinstance(ugen, OutputProxy) else ugen + for ugen in copy.deepcopy(ugens) + ) + assert all(isinstance(_, UGen) for _ in ugens_) + ugens_ = self._cleanup_pv_chains(ugens_) + ugens_ = self._cleanup_local_bufs(ugens_) + if optimize: + ugens_ = self._optimize_ugen_graph(ugens_) + ugens_ = self._sort_ugens_topologically(ugens_) + self._ugens = tuple(ugens_) + self._constants = self._collect_constants(self._ugens) + self._control_ugens = self._collect_control_ugens(self._ugens) + self._indexed_parameters = self._collect_indexed_parameters(self._control_ugens) + self._compiled_ugen_graph = SynthDefCompiler.compile_ugen_graph(self) + + ### SPECIAL METHODS ### + + def __eq__(self, expr) -> bool: + if not isinstance(expr, type(self)): + return False + if expr.name != self.name: + return False + if expr._compiled_ugen_graph != self._compiled_ugen_graph: + return False + return True + + def __graph__(self): + r""" + Graphs SynthDef. + + :: + + >>> from supriya.ugens import Out, SinOsc, SynthDefBuilder + + :: + + >>> with SynthDefBuilder(frequency=440) as builder: + ... sin_osc = SinOsc.ar(frequency=builder["frequency"]) + ... out = Out.ar(bus=0, source=sin_osc) + ... + >>> synthdef = builder.build() + >>> print(format(synthdef.__graph__(), "graphviz")) + digraph synthdef_... { + graph [bgcolor=transparent, + color=lightslategrey, + dpi=72, + fontname=Arial, + outputorder=edgesfirst, + overlap=prism, + penwidth=2, + rankdir=LR, + ranksep=1, + splines=spline, + style="dotted, rounded"]; + node [fontname=Arial, + fontsize=12, + penwidth=2, + shape=Mrecord, + style="filled, rounded"]; + edge [penwidth=2]; + ugen_0 [fillcolor=lightgoldenrod2, + label=" Control\n(control) | { { frequency:\n440.0 } }"]; + ugen_1 [fillcolor=lightsteelblue2, + label=" SinOsc\n(audio) | { { frequency | phase:\n0.0 } | { 0 } }"]; + ugen_2 [fillcolor=lightsteelblue2, + label=" Out\n(audio) | { { bus:\n0.0 | source } }"]; + ugen_0:f_1_0_0:e -> ugen_1:f_1_0_0:w [color=goldenrod]; + ugen_1:f_1_1_0:e -> ugen_2:f_1_0_1:w [color=steelblue]; + } + + Returns Graphviz graph. + """ + return SynthDefGrapher.graph(self) + + def __hash__(self) -> int: + hash_values = (type(self), self._name, self._compiled_ugen_graph) + return hash(hash_values) + + def __repr__(self) -> str: + return "<{}: {}>".format(type(self).__name__, self.actual_name) + + def __str__(self) -> str: + """ + Gets string representation of synth definition. + + :: + + >>> from supriya.ugens import Out, SinOsc, SynthDefBuilder + + :: + + >>> with supriya.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() -> Dict[UGen, str]: + grouped_ugens: Dict[Tuple[Type[UGen], CalculationRate, int], List[UGen]] = ( + {} + ) + named_ugens: Dict[UGen, str] = {} + 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, BinaryOpUGen): + ugen_op = BinaryOperator.from_expr(ugen.special_index) + parts.append("(" + ugen_op.name + ")") + elif isinstance(ugen, 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_: Union[Control, Parameter], output_index: int = 0 + ) -> str: + if isinstance(input_, Parameter): + return ":{}".format(input_.name) + elif isinstance(input_, 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 "" + + result = [ + "synthdef:", + f" name: {self.actual_name}", + " ugens:", + ] + ugen_dicts: List[Dict[str, Dict[str, Union[float, str]]]] = [] + named_ugens = get_ugen_names() + for ugen in self._ugens: + parameter_dict: Dict[str, Union[float, str]] = {} + ugen_name = named_ugens[ugen] + for input_name, input_ in zip(ugen._input_names, ugen._inputs): + if isinstance(input_name, str): + argument_name = input_name + else: + argument_name = f"{input_name[0]}[{input_name[1]}]" + if isinstance(input_, SupportsFloat): + value: Union[float, str] = float(input_) + else: + output_index = 0 + if isinstance(input_, 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), + ) + parameter_dict[argument_name] = value + ugen_dicts.append({ugen_name: parameter_dict}) + for ugen_dict in ugen_dicts: + for ugen_name, parameter_dict in ugen_dict.items(): + if not parameter_dict: + result.append(f" - {ugen_name}: null") + continue + result.append(f" - {ugen_name}:") + for parameter_name, parameter_value in parameter_dict.items(): + result.append(f" {parameter_name}: {parameter_value}") + return "\n".join(result) + + ### PRIVATE METHODS ### + + @staticmethod + def _build_control_mapping(parameters): + control_mapping = {} + scalar_parameters = [] + trigger_parameters = [] + audio_parameters = [] + control_parameters = [] + mapping = { + ParameterRate.AUDIO: audio_parameters, + ParameterRate.CONTROL: control_parameters, + ParameterRate.SCALAR: scalar_parameters, + ParameterRate.TRIGGER: trigger_parameters, + } + for parameter in parameters: + mapping[parameter.parameter_rate].append(parameter) + for filtered_parameters in mapping.values(): + filtered_parameters.sort(key=lambda x: x.name) + control_ugens = [] + starting_control_index = 0 + if scalar_parameters: + control = Control( + parameters=scalar_parameters, + calculation_rate=CalculationRate.SCALAR, + starting_control_index=starting_control_index, + ) + control_ugens.append(control) + for parameter in scalar_parameters: + starting_control_index += len(parameter) + for i, output_proxy in enumerate(control._get_parameter_output_proxies()): + control_mapping[output_proxy] = control[i] + if trigger_parameters: + control = TrigControl( + parameters=trigger_parameters, + starting_control_index=starting_control_index, + ) + control_ugens.append(control) + for parameter in trigger_parameters: + starting_control_index += len(parameter) + for i, output_proxy in enumerate(control._get_parameter_output_proxies()): + control_mapping[output_proxy] = control[i] + if audio_parameters: + control = AudioControl( + parameters=audio_parameters, + starting_control_index=starting_control_index, + ) + control_ugens.append(control) + for parameter in audio_parameters: + starting_control_index += len(parameter) + for i, output_proxy in enumerate(control._get_parameter_output_proxies()): + control_mapping[output_proxy] = control[i] + if control_parameters: + if any(_.lag for _ in control_parameters): + control = LagControl( + parameters=control_parameters, + calculation_rate=CalculationRate.CONTROL, + starting_control_index=starting_control_index, + ) + else: + control = Control( + parameters=control_parameters, + calculation_rate=CalculationRate.CONTROL, + starting_control_index=starting_control_index, + ) + control_ugens.append(control) + for parameter in control_parameters: + starting_control_index += len(parameter) + for i, output_proxy in enumerate(control._get_parameter_output_proxies()): + control_mapping[output_proxy] = control[i] + control_ugens = tuple(control_ugens) + return control_ugens, control_mapping + + @staticmethod + def _build_input_mapping(ugens): + from . import PV_ChainUGen, PV_Copy + + input_mapping = {} + for ugen in ugens: + if not isinstance(ugen, PV_ChainUGen): + continue + if isinstance(ugen, PV_Copy): + continue + for i, input_ in enumerate(ugen.inputs): + if not isinstance(input_, OutputProxy): + continue + source = input_.source + if not isinstance(source, PV_ChainUGen): + continue + if source not in input_mapping: + input_mapping[source] = [] + input_mapping[source].append((ugen, i)) + return input_mapping + + @staticmethod + def _cleanup_local_bufs(ugens): + from . import LocalBuf, MaxLocalBufs + + local_bufs = [] + processed_ugens = [] + for ugen in ugens: + if isinstance(ugen, OutputProxy): + ugen = ugen.source + if isinstance(ugen, MaxLocalBufs): + continue + if isinstance(ugen, LocalBuf): + local_bufs.append(ugen) + processed_ugens.append(ugen) + if local_bufs: + max_local_bufs = MaxLocalBufs.ir(maximum=len(local_bufs)) + for local_buf in local_bufs: + inputs = list(local_buf.inputs[:2]) + inputs.append(max_local_bufs) + local_buf._inputs = tuple(inputs) + index = processed_ugens.index(local_bufs[0]) + processed_ugens[index:index] = [max_local_bufs.source] + return tuple(processed_ugens) + + @staticmethod + def _cleanup_pv_chains(ugens): + from . import LocalBuf, PV_Copy + + input_mapping = SynthDef._build_input_mapping(ugens) + for antecedent, descendants in input_mapping.items(): + if len(descendants) == 1: + continue + for descendant, input_index in descendants[:-1]: + fft_size = antecedent.fft_size + new_buffer = LocalBuf.ir(frame_count=fft_size) + pv_copy = PV_Copy.kr(pv_chain_a=antecedent, pv_chain_b=new_buffer) + inputs = list(descendant._inputs) + inputs[input_index] = pv_copy + descendant._inputs = tuple(inputs) + index = ugens.index(descendant) + replacement = [] + if isinstance(fft_size, UGenOperable): + replacement.append(fft_size) + replacement.extend([new_buffer.source, pv_copy.source]) + ugens[index:index] = replacement + return ugens + + @staticmethod + def _collect_constants(ugens) -> Tuple[float, ...]: + constants = [] + for ugen in ugens: + for input_ in ugen._inputs: + if not isinstance(input_, float): + continue + if input_ not in constants: + constants.append(input_) + return tuple(constants) + + @staticmethod + def _collect_control_ugens(ugens): + control_ugens = tuple(_ for _ in ugens if isinstance(_, Control)) + return control_ugens + + @staticmethod + def _collect_indexed_parameters(control_ugens) -> Sequence[Tuple[int, Parameter]]: + indexed_parameters = [] + parameters = {} + for control_ugen in control_ugens: + index = control_ugen.starting_control_index + for parameter in control_ugen.parameters: + parameters[parameter.name] = (index, parameter) + index += len(parameter) + for parameter_name in sorted(parameters): + indexed_parameters.append(parameters[parameter_name]) + return tuple(indexed_parameters) + + @staticmethod + def _extract_parameters(ugens): + parameters = set() + for ugen in ugens: + if isinstance(ugen, Parameter): + parameters.add(ugen) + ugens = tuple(ugen for ugen in ugens if ugen not in parameters) + parameters = tuple(sorted(parameters, key=lambda x: x.name)) + return ugens, parameters + + @staticmethod + def _initialize_topological_sort(ugens): + ugens = list(ugens) + sort_bundles = collections.OrderedDict() + width_first_antecedents = [] + # The UGens are in the order they were added to the SynthDef + # and that order already mostly places inputs before outputs. + # In sclang, the per-UGen width-first antecedents list is + # updated at the moment the UGen is added to the SynthDef. + # Because we don't store that state on UGens in supriya, we'll + # do it here. + for ugen in ugens: + sort_bundles[ugen] = UGenSortBundle(ugen, width_first_antecedents) + if ugen._is_width_first: + width_first_antecedents.append(ugen) + for ugen in ugens: + sort_bundle = sort_bundles[ugen] + sort_bundle._initialize_topological_sort(sort_bundles) + sort_bundle.descendants[:] = sorted( + sort_bundles[ugen].descendants, key=lambda x: ugens.index(ugen) + ) + return sort_bundles + + @staticmethod + def _optimize_ugen_graph(ugens): + sort_bundles = SynthDef._initialize_topological_sort(ugens) + for ugen in ugens: + ugen._optimize_graph(sort_bundles) + return tuple(sort_bundles) + + @staticmethod + def _remap_controls(ugens, control_mapping): + for ugen in ugens: + inputs = list(ugen.inputs) + for i, input_ in enumerate(inputs): + if input_ in control_mapping: + output_proxy = control_mapping[input_] + inputs[i] = output_proxy + ugen._inputs = tuple(inputs) + + @staticmethod + def _sort_ugens_topologically(ugens): + sort_bundles = SynthDef._initialize_topological_sort(ugens) + available_ugens = [] + for ugen in reversed(ugens): + sort_bundles[ugen]._make_available(available_ugens) + out_stack = [] + while available_ugens: + available_ugen = available_ugens.pop() + sort_bundles[available_ugen]._schedule( + available_ugens, out_stack, sort_bundles + ) + return out_stack + + ### PUBLIC METHODS ### + + def compile(self, use_anonymous_name=False) -> bytes: + synthdefs = [self] + result = compile_synthdefs(synthdefs, use_anonymous_names=use_anonymous_name) + return result + + ### PUBLIC PROPERTIES ### + + @property + def actual_name(self) -> str: + return self.name or self.anonymous_name + + @property + def anonymous_name(self) -> str: + md5 = hashlib.md5() + md5.update(self._compiled_ugen_graph) + anonymous_name = md5.hexdigest() + return anonymous_name + + @property + def audio_channel_count(self) -> int: + return max(self.audio_input_channel_count, self.audio_output_channel_count) + + @property + def audio_input_channel_count(self) -> int: + """ + Gets audio input channel count of synthdef. + + :: + + >>> with supriya.SynthDefBuilder() as builder: + ... audio_in = supriya.ugens.In.ar(channel_count=1) + ... control_in = supriya.ugens.In.kr(channel_count=2) + ... sin = supriya.ugens.SinOsc.ar( + ... frequency=audio_in, + ... ) + ... source = audio_in * control_in[1] + ... audio_out = supriya.ugens.Out.ar(source=[source] * 4) + ... + >>> synthdef = builder.build() + + :: + + >>> supriya.graph(synthdef) # doctest: +SKIP + + :: + + >>> synthdef.audio_input_channel_count + 1 + + Returns integer. + """ + ugens = tuple( + _ for _ in self.input_ugens if _.calculation_rate == CalculationRate.AUDIO + ) + if len(ugens) == 1: + return len(ugens[0]) + elif not ugens: + return 0 + raise ValueError + + @property + def audio_output_channel_count(self) -> int: + """ + Gets audio output channel count of synthdef. + + :: + + >>> with supriya.SynthDefBuilder() as builder: + ... audio_in = supriya.ugens.In.ar(channel_count=1) + ... control_in = supriya.ugens.In.kr(channel_count=2) + ... sin = supriya.ugens.SinOsc.ar( + ... frequency=audio_in, + ... ) + ... source = sin * control_in[0] + ... audio_out = supriya.ugens.Out.ar(source=[source] * 4) + ... + >>> synthdef = builder.build() + >>> print(synthdef) + synthdef: + name: ... + ugens: + - In.ar: + bus: 0.0 + - SinOsc.ar: + frequency: In.ar[0] + phase: 0.0 + - In.kr: + bus: 0.0 + - BinaryOpUGen(MULTIPLICATION).ar: + left: SinOsc.ar[0] + right: In.kr[0] + - Out.ar: + bus: 0.0 + source[0]: BinaryOpUGen(MULTIPLICATION).ar[0] + source[1]: BinaryOpUGen(MULTIPLICATION).ar[0] + source[2]: BinaryOpUGen(MULTIPLICATION).ar[0] + source[3]: BinaryOpUGen(MULTIPLICATION).ar[0] + + :: + + >>> supriya.graph(synthdef) # doctest: +SKIP + + :: + + >>> synthdef.audio_output_channel_count + 4 + + Returns integer. + """ + ugens = tuple( + _ for _ in self.output_ugens if _.calculation_rate == CalculationRate.AUDIO + ) + if len(ugens) == 1: + return len(ugens[0].source) + elif not ugens: + return 0 + raise ValueError + + @property + def constants(self) -> Tuple[float, ...]: + return self._constants + + @property + def control_ugens(self) -> List[UGen]: + return self._control_ugens + + @property + def control_channel_count(self) -> int: + return max(self.control_input_channel_count, self.control_output_channel_count) + + @property + def control_input_channel_count(self) -> int: + """ + Gets control input channel count of synthdef. + + :: + + >>> with supriya.SynthDefBuilder() as builder: + ... audio_in = supriya.ugens.In.ar(channel_count=1) + ... control_in = supriya.ugens.In.kr(channel_count=2) + ... sin = supriya.ugens.SinOsc.ar( + ... frequency=audio_in, + ... ) + ... source = audio_in * control_in[1] + ... audio_out = supriya.ugens.Out.ar(source=[source] * 4) + ... + >>> synthdef = builder.build() + + :: + + >>> supriya.graph(synthdef) # doctest: +SKIP + + :: + + >>> synthdef.control_input_channel_count + 2 + + Returns integer. + """ + ugens = tuple( + _ for _ in self.input_ugens if _.calculation_rate == CalculationRate.CONTROL + ) + if len(ugens) == 1: + return len(ugens[0]) + elif not ugens: + return 0 + raise ValueError + + @property + def control_output_channel_count(self) -> int: + """ + Gets control output channel count of synthdef. + + :: + + >>> with supriya.SynthDefBuilder() as builder: + ... audio_in = supriya.ugens.In.ar(channel_count=1) + ... control_in = supriya.ugens.In.kr(channel_count=2) + ... sin = supriya.ugens.SinOsc.ar( + ... frequency=audio_in, + ... ) + ... source = audio_in * control_in[1] + ... audio_out = supriya.ugens.Out.ar(source=[source] * 4) + ... + >>> synthdef = builder.build() + + :: + + >>> supriya.graph(synthdef) # doctest: +SKIP + + :: + + >>> synthdef.control_output_channel_count + 0 + + Returns integer. + """ + ugens = tuple( + _ + for _ in self.output_ugens + if _.calculation_rate == CalculationRate.CONTROL + ) + if len(ugens) == 1: + return len(ugens[0].source) + elif not ugens: + return 0 + raise ValueError + + @property + def done_actions(self) -> List[DoneAction]: + done_actions = set() + for ugen in self.ugens: + done_action = ugen._get_done_action() + if done_action is not None: + done_actions.add(done_action) + return sorted(done_actions) + + @property + def has_gate(self) -> bool: + return "gate" in self.parameter_names + + @property + def indexed_parameters(self) -> Sequence[Tuple[int, Parameter]]: + return self._indexed_parameters + + @property + def input_ugens(self) -> Tuple[UGen, ...]: + return tuple(_ for _ in self.ugens if _.is_input_ugen) + + @property + def name(self) -> Optional[str]: + return self._name + + @property + def output_ugens(self) -> Tuple[UGen, ...]: + return tuple(_ for _ in self.ugens if _.is_output_ugen) + + @property + def parameters(self) -> Dict[Optional[str], Parameter]: + return { + parameter.name: parameter for index, parameter in self.indexed_parameters + } + + @property + def parameter_names(self) -> List[Optional[str]]: + return [parameter.name for index, parameter in self.indexed_parameters] + + @property + def ugens(self) -> Tuple[UGen, ...]: + return self._ugens + + +class UGenSortBundle: + ### INITIALIZER ### + + def __init__(self, ugen, width_first_antecedents): + self.antecedents = [] + self.descendants = [] + self.ugen = ugen + self.width_first_antecedents = tuple(width_first_antecedents) + + ### PRIVATE METHODS ### + + def _initialize_topological_sort(self, sort_bundles): + for input_ in self.ugen.inputs: + if isinstance(input_, OutputProxy): + input_ = input_.source + elif not isinstance(input_, UGen): + continue + input_sort_bundle = sort_bundles[input_] + if input_ not in self.antecedents: + self.antecedents.append(input_) + if self.ugen not in input_sort_bundle.descendants: + input_sort_bundle.descendants.append(self.ugen) + for input_ in self.width_first_antecedents: + input_sort_bundle = sort_bundles[input_] + if input_ not in self.antecedents: + self.antecedents.append(input_) + if self.ugen not in input_sort_bundle.descendants: + input_sort_bundle.descendants.append(self.ugen) + + def _make_available(self, available_ugens): + if not self.antecedents: + if self.ugen not in available_ugens: + available_ugens.append(self.ugen) + + def _schedule(self, available_ugens, out_stack, sort_bundles): + for ugen in reversed(self.descendants): + sort_bundle = sort_bundles[ugen] + sort_bundle.antecedents.remove(self.ugen) + sort_bundle._make_available(available_ugens) + out_stack.append(self.ugen) + + ### PUBLIC METHODS ### + + def clear(self) -> None: + self.antecedents[:] = [] + self.descendants[:] = [] + self.width_first_antecedents[:] = [] + + +class SuperColliderSynthDef: + ### INITIALIZER ### + + def __init__(self, name, body, rates=None): + self._name = name + self._body = body + self._rates = rates + + ### PRIVATE METHODS ### + + def _build_sc_input(self, directory_path): + input_ = [] + input_.append("a = SynthDef(") + input_.append(" \\{}, {{".format(self.name)) + for line in self.body.splitlines(): + input_.append(" " + line) + if self.rates: + input_.append("}}, {});".format(self.rates)) + else: + input_.append("});") + input_.append('"Defined SynthDef".postln;') + input_.append('a.writeDefFile("{}");'.format(directory_path)) + input_.append('"Wrote SynthDef".postln;') + input_.append("0.exit;") + input_ = "\n".join(input_) + return input_ + + ### PUBLIC METHODS ### + + def compile(self): + sclang_path = sclang.find() + with tempfile.TemporaryDirectory() as directory: + directory_path = pathlib.Path(directory) + sc_input = self._build_sc_input(directory_path) + sc_file_path = directory_path / f"{self.name}.sc" + sc_file_path.write_text(sc_input) + command = [str(sclang_path), "-D", str(sc_file_path)] + subprocess.run(command, timeout=10) + result = (directory_path / f"{self.name}.scsyndef").read_bytes() + return bytes(result) + + ### PUBLIC PROPERTIES ### + + @property + def body(self): + return self._body + + @property + def rates(self): + return self._rates + + @property + def name(self): + return self._name + + +_local = threading.local() +_local._active_builders = [] + + +class SynthDefBuilder: + """ + A SynthDef builder. + + :: + + >>> from supriya import ParameterRate + >>> from supriya.ugens import Decay, Out, Parameter, SinOsc, SynthDefBuilder + + :: + + >>> builder = SynthDefBuilder( + ... frequency=440, + ... trigger=Parameter( + ... value=0, + ... parameter_rate=ParameterRate.TRIGGER, + ... ), + ... ) + + :: + + >>> with builder: + ... sin_osc = SinOsc.ar( + ... frequency=builder["frequency"], + ... ) + ... decay = Decay.kr( + ... decay_time=0.5, + ... source=builder["trigger"], + ... ) + ... enveloped_sin = sin_osc * decay + ... out = Out.ar(bus=0, source=enveloped_sin) + ... + + :: + + >>> synthdef = builder.build() + >>> supriya.graph(synthdef) # doctest: +SKIP + """ + + ### CLASS VARIABLES ### + + _active_builders: List["SynthDefBuilder"] = _local._active_builders + + __slots__ = ("_name", "_parameters", "_ugens", "_uuid") + + ### INITIALIZER ### + + def __init__(self, name: Optional[str] = None, **kwargs) -> None: + self._name = name + self._uuid = uuid.uuid4() + self._parameters: Dict[Optional[str], Parameter] = collections.OrderedDict() + self._ugens: List[Union[Parameter, UGen]] = [] + for key, value in kwargs.items(): + self._add_parameter(key, value) + + ### SPECIAL METHODS ### + + def __enter__(self) -> "SynthDefBuilder": + SynthDefBuilder._active_builders.append(self) + return self + + def __exit__(self, exc_type, exc_value, traceback): + SynthDefBuilder._active_builders.pop() + + def __getitem__(self, item: str) -> Parameter: + return self._parameters[item] + + ### PRIVATE METHODS ### + + def _add_ugens(self, ugen: Union[OutputProxy, Parameter, UGen]): + if isinstance(ugen, OutputProxy): + source = ugen.source + else: + source = ugen + if source._uuid != self._uuid: + raise ValueError + self._ugens.append(source) + + def _add_parameter(self, *args) -> Parameter: + # TODO: Refactor without *args for clarity + if 3 < len(args): + raise ValueError(args) + if len(args) == 1: + assert isinstance(args[0], Parameter) + name, value, parameter_rate = args[0].name, args[0], args[0].parameter_rate + elif len(args) == 2: + name, value = args + if isinstance(value, Parameter): + parameter_rate = value.parameter_rate + else: + parameter_rate = ParameterRate.CONTROL + if name.startswith("a_"): + parameter_rate = ParameterRate.AUDIO + elif name.startswith("i_"): + parameter_rate = ParameterRate.SCALAR + elif name.startswith("t_"): + parameter_rate = ParameterRate.TRIGGER + elif len(args) == 3: + name, value, parameter_rate = args + parameter_rate = ParameterRate.from_expr(parameter_rate) + else: + raise ValueError(args) + if not isinstance(value, Parameter): + parameter = Parameter(name=name, parameter_rate=parameter_rate, value=value) + else: + parameter = new(value, parameter_rate=parameter_rate, name=name) + assert parameter._uuid is None + parameter._uuid = self._uuid + self._parameters[name] = parameter + return parameter + + ### PUBLIC METHODS ### + + def build(self, name: Optional[str] = None, optimize: bool = True) -> SynthDef: + # Calling build() creates controls each time, so strip out + # previously created ones. This could be made cleaner by preventing + # Control subclasses from being aggregated into SynthDefBuilders in + # the first place. + self._ugens[:] = [ugen for ugen in self._ugens if not isinstance(ugen, Control)] + name = self.name or name + with self: + ugens: List[Union[Parameter, UGen]] = [] + ugens.extend(self._parameters.values()) + ugens.extend(self._ugens) + ugens = copy.deepcopy(ugens) + ugens, parameters = SynthDef._extract_parameters(ugens) + ( + control_ugens, + control_mapping, + ) = SynthDef._build_control_mapping(parameters) + SynthDef._remap_controls(ugens, control_mapping) + ugens = control_ugens + ugens + synthdef = SynthDef(ugens, name=name, optimize=optimize) + return synthdef + + def poll_ugen( + self, + ugen: UGen, + label: Optional[str] = None, + trigger: Optional[UGen] = None, + trigger_id: int = -1, + ) -> None: + from . import Impulse, Poll + + poll = Poll.new( + source=ugen, + label=label, + trigger=trigger or Impulse.kr(frequency=1), + trigger_id=trigger_id, + ) + self._add_ugens(poll) + + ### PUBLIC PROPERTIES ### + + @property + def name(self) -> Optional[str]: + return self._name + + +def synthdef(*args: Union[str, Tuple[str, float]]) -> Callable[[Callable], SynthDef]: + """ + Decorator for quickly constructing SynthDefs from functions. + + :: + + >>> from supriya import Envelope, synthdef + >>> from supriya.ugens import EnvGen, Out, SinOsc + + :: + + >>> @synthdef() + ... def sine(freq=440, amp=0.1, gate=1): + ... sig = SinOsc.ar(frequency=freq) * amp + ... env = EnvGen.kr(envelope=Envelope.adsr(), gate=gate, done_action=2) + ... Out.ar(bus=0, source=[sig * env] * 2) + ... + + :: + + >>> print(sine) + synthdef: + name: sine + ugens: + - Control.kr: null + - SinOsc.ar: + frequency: Control.kr[1:freq] + phase: 0.0 + - BinaryOpUGen(MULTIPLICATION).ar/0: + left: SinOsc.ar[0] + right: Control.kr[0:amp] + - EnvGen.kr: + gate: Control.kr[2:gate] + level_scale: 1.0 + level_bias: 0.0 + time_scale: 1.0 + done_action: 2.0 + envelope[0]: 0.0 + envelope[1]: 3.0 + envelope[2]: 2.0 + envelope[3]: -99.0 + envelope[4]: 1.0 + envelope[5]: 0.01 + envelope[6]: 5.0 + envelope[7]: -4.0 + envelope[8]: 0.5 + envelope[9]: 0.3 + envelope[10]: 5.0 + envelope[11]: -4.0 + envelope[12]: 0.0 + envelope[13]: 1.0 + envelope[14]: 5.0 + envelope[15]: -4.0 + - BinaryOpUGen(MULTIPLICATION).ar/1: + left: BinaryOpUGen(MULTIPLICATION).ar/0[0] + right: EnvGen.kr[0] + - Out.ar: + bus: 0.0 + source[0]: BinaryOpUGen(MULTIPLICATION).ar/1[0] + source[1]: BinaryOpUGen(MULTIPLICATION).ar/1[0] + + :: + + >>> @synthdef("ar", ("kr", 0.5)) + ... def sine(freq=440, amp=0.1, gate=1): + ... sig = SinOsc.ar(frequency=freq) * amp + ... env = EnvGen.kr(envelope=Envelope.adsr(), gate=gate, done_action=2) + ... Out.ar(bus=0, source=[sig * env] * 2) + ... + + :: + + >>> print(sine) + synthdef: + name: sine + ugens: + - AudioControl.ar: null + - SinOsc.ar: + frequency: AudioControl.ar[0:freq] + phase: 0.0 + - LagControl.kr: + lags[0]: 0.5 + lags[1]: 0.0 + - BinaryOpUGen(MULTIPLICATION).ar/0: + left: SinOsc.ar[0] + right: LagControl.kr[0:amp] + - EnvGen.kr: + gate: LagControl.kr[1:gate] + level_scale: 1.0 + level_bias: 0.0 + time_scale: 1.0 + done_action: 2.0 + envelope[0]: 0.0 + envelope[1]: 3.0 + envelope[2]: 2.0 + envelope[3]: -99.0 + envelope[4]: 1.0 + envelope[5]: 0.01 + envelope[6]: 5.0 + envelope[7]: -4.0 + envelope[8]: 0.5 + envelope[9]: 0.3 + envelope[10]: 5.0 + envelope[11]: -4.0 + envelope[12]: 0.0 + envelope[13]: 1.0 + envelope[14]: 5.0 + envelope[15]: -4.0 + - BinaryOpUGen(MULTIPLICATION).ar/1: + left: BinaryOpUGen(MULTIPLICATION).ar/0[0] + right: EnvGen.kr[0] + - Out.ar: + bus: 0.0 + source[0]: BinaryOpUGen(MULTIPLICATION).ar/1[0] + source[1]: BinaryOpUGen(MULTIPLICATION).ar/1[0] + """ + + def inner(func): + signature = inspect.signature(func) + builder = SynthDefBuilder() + kwargs = {} + for i, (name, parameter) in enumerate(signature.parameters.items()): + rate = ParameterRate.CONTROL + lag = None + try: + if isinstance(args[i], str): + rate_expr = args[i] + else: + rate_expr, lag = args[i] + rate = ParameterRate.from_expr(rate_expr) + except (IndexError, TypeError): + pass + value = parameter.default + if value is inspect._empty: + value = 0.0 + parameter = Parameter(lag=lag, name=name, parameter_rate=rate, value=value) + kwargs[name] = builder._add_parameter(parameter) + with builder: + func(**kwargs) + return builder.build(name=func.__name__) + + return inner + + +class SynthDefGrapher: + r""" + Graphs SynthDefs. + + .. container:: example + + :: + + >>> ugen_graph = supriya.ugens.LFNoise2.ar() + >>> result = ugen_graph.transpose([0, 3, 7]) + + :: + + >>> supriya.graph(result) # doctest: +SKIP + + :: + + >>> print(format(result.__graph__(), "graphviz")) + digraph synthdef_c481c3d42e3cfcee0267250247dab51f { + graph [bgcolor=transparent, + color=lightslategrey, + dpi=72, + fontname=Arial, + outputorder=edgesfirst, + overlap=prism, + penwidth=2, + rankdir=LR, + ranksep=1, + splines=spline, + style="dotted, rounded"]; + node [fontname=Arial, + fontsize=12, + penwidth=2, + shape=Mrecord, + style="filled, rounded"]; + edge [penwidth=2]; + ugen_0 [fillcolor=lightsteelblue2, + label=" LFNoise2\n(audio) | { { frequency:\n500.0 } | { 0 } }"]; + ugen_1 [fillcolor=lightsteelblue2, + label=" UnaryOpUGen\n[HZ_TO_MIDI]\n(audio) | { { source } | { 0 } }"]; + ugen_2 [fillcolor=lightsteelblue2, + label=" UnaryOpUGen\n[MIDI_TO_HZ]\n(audio) | { { source } | { 0 } }"]; + ugen_3 [fillcolor=lightsteelblue2, + label=" BinaryOpUGen\n[ADDITION]\n(audio) | { { left | right:\n3.0 } | { 0 } }"]; + ugen_4 [fillcolor=lightsteelblue2, + label=" UnaryOpUGen\n[MIDI_TO_HZ]\n(audio) | { { source } | { 0 } }"]; + ugen_5 [fillcolor=lightsteelblue2, + label=" BinaryOpUGen\n[ADDITION]\n(audio) | { { left | right:\n7.0 } | { 0 } }"]; + ugen_6 [fillcolor=lightsteelblue2, + label=" UnaryOpUGen\n[MIDI_TO_HZ]\n(audio) | { { source } | { 0 } }"]; + ugen_0:f_1_1_0:e -> ugen_1:f_1_0_0:w [color=steelblue]; + ugen_1:f_1_1_0:e -> ugen_2:f_1_0_0:w [color=steelblue]; + ugen_1:f_1_1_0:e -> ugen_3:f_1_0_0:w [color=steelblue]; + ugen_1:f_1_1_0:e -> ugen_5:f_1_0_0:w [color=steelblue]; + ugen_3:f_1_1_0:e -> ugen_4:f_1_0_0:w [color=steelblue]; + ugen_5:f_1_1_0:e -> ugen_6:f_1_0_0:w [color=steelblue]; + } + """ + + ### PRIVATE METHODS ### + + @staticmethod + def _connect_nodes(synthdef, ugen_node_mapping): + for ugen in synthdef.ugens: + tail_node = ugen_node_mapping[ugen] + for i, input_ in enumerate(ugen.inputs): + if not isinstance(input_, OutputProxy): + continue + tail_field = tail_node["inputs"][i] + source = input_.source + head_node = ugen_node_mapping[source] + head_field = head_node["outputs"][input_.output_index] + edge = uqbar.graphs.Edge(head_port_position="w", tail_port_position="e") + edge.attach(head_field, tail_field) + if source.calculation_rate == CalculationRate.CONTROL: + edge.attributes["color"] = "goldenrod" + elif source.calculation_rate == CalculationRate.AUDIO: + edge.attributes["color"] = "steelblue" + else: + edge.attributes["color"] = "salmon" + + @staticmethod + def _create_ugen_input_group(ugen, ugen_index): + if not ugen.inputs: + return None + input_group = uqbar.graphs.RecordGroup(name="inputs") + for i, input_ in enumerate(ugen.inputs): + label = "" + input_name = None + if i < len(ugen._ordered_input_names): + input_name = tuple(ugen._ordered_input_names)[i] + if input_name: + # input_name = r'\n'.join(input_name.split('_')) + if isinstance(input_, float): + label = r"{}:\n{}".format(input_name, input_) + else: + label = input_name + elif isinstance(input_, float): + label = str(input_) + label = label or None + field = uqbar.graphs.RecordField( + label=label, name="ugen_{}_input_{}".format(ugen_index, i) + ) + input_group.append(field) + return input_group + + @staticmethod + def _create_ugen_node_mapping(synthdef): + ugen_node_mapping = {} + for ugen in synthdef.ugens: + ugen_index = synthdef.ugens.index(ugen) + node = uqbar.graphs.Node(name="ugen_{}".format(ugen_index)) + if ugen.calculation_rate == CalculationRate.CONTROL: + node.attributes["fillcolor"] = "lightgoldenrod2" + elif ugen.calculation_rate == CalculationRate.AUDIO: + node.attributes["fillcolor"] = "lightsteelblue2" + else: + node.attributes["fillcolor"] = "lightsalmon2" + title_field = SynthDefGrapher._create_ugen_title_field(ugen) + node.append(title_field) + group = uqbar.graphs.RecordGroup() + input_group = SynthDefGrapher._create_ugen_input_group(ugen, ugen_index) + if input_group is not None: + group.append(input_group) + output_group = SynthDefGrapher._create_ugen_output_group( + synthdef, ugen, ugen_index + ) + if output_group is not None: + group.append(output_group) + node.append(group) + ugen_node_mapping[ugen] = node + return ugen_node_mapping + + @staticmethod + def _create_ugen_output_group(synthdef, ugen, ugen_index): + if not ugen.outputs: + return None + output_group = uqbar.graphs.RecordGroup(name="outputs") + for i, output in enumerate(ugen.outputs): + label = str(i) + if isinstance(ugen, Control): + parameter_index = ugen.special_index + i + parameter = dict(synthdef.indexed_parameters)[parameter_index] + parameter_name = parameter.name + # parameter_name = r'\n'.join(parameter.name.split('_')) + label = r"{}:\n{}".format(parameter_name, parameter.value) + field = uqbar.graphs.RecordField( + label=label, name="ugen_{}_output_{}".format(ugen_index, i) + ) + output_group.append(field) + return output_group + + @staticmethod + def _create_ugen_title_field(ugen): + name = type(ugen).__name__ + calculation_rate = ugen.calculation_rate.name.lower() + label_template = r"{name}\n({calculation_rate})" + operator = None + if isinstance(ugen, BinaryOpUGen): + operator = BinaryOperator(ugen.special_index).name + label_template = r"{name}\n[{operator}]\n({calculation_rate})" + elif isinstance(ugen, UnaryOpUGen): + operator = UnaryOperator(ugen.special_index).name + label_template = r"{name}\n[{operator}]\n({calculation_rate})" + title_field = uqbar.graphs.RecordField( + label=label_template.format( + name=name, operator=operator, calculation_rate=calculation_rate + ) + ) + return title_field + + @staticmethod + def _style_graph(graph): + graph.attributes.update( + { + "bgcolor": "transparent", + "color": "lightslategrey", + "dpi": 72, + "fontname": "Arial", + "outputorder": "edgesfirst", + "overlap": "prism", + "penwidth": 2, + "rankdir": "LR", + "ranksep": 1, + "splines": "spline", + "style": ("dotted", "rounded"), + } + ) + graph.edge_attributes.update({"penwidth": 2}) + graph.node_attributes.update( + { + "fontname": "Arial", + "fontsize": 12, + "penwidth": 2, + "shape": "Mrecord", + "style": ("filled", "rounded"), + } + ) + + ### PUBLIC METHODS ### + + @staticmethod + def graph(synthdef): + assert isinstance(synthdef, SynthDef) + graph = uqbar.graphs.Graph(name="synthdef_{}".format(synthdef.actual_name)) + ugen_node_mapping = SynthDefGrapher._create_ugen_node_mapping(synthdef) + for node in sorted(ugen_node_mapping.values(), key=lambda x: x.name): + graph.append(node) + SynthDefGrapher._connect_nodes(synthdef, ugen_node_mapping) + SynthDefGrapher._style_graph(graph) + return graph + + +def compile_synthdef(synthdef, use_anonymous_names=False): + return SynthDefCompiler.compile_synthdef(synthdef, use_anonymous_names) + + +def compile_synthdefs(synthdefs, use_anonymous_names=False): + return SynthDefCompiler.compile_synthdefs(synthdefs, use_anonymous_names) + + +def decompile_synthdef(value): + return SynthDefDecompiler.decompile_synthdef(value) + + +def decompile_synthdefs(value): + return SynthDefDecompiler.decompile_synthdefs(value) + + +class SynthDefCompiler: + @staticmethod + def compile_synthdef(synthdef, name): + result = SynthDefCompiler.encode_string(name) + result += synthdef._compiled_ugen_graph + return result + + @staticmethod + def compile_parameters(synthdef): + result = [] + result.append( + SynthDefCompiler.encode_unsigned_int_32bit( + sum(len(_[1]) for _ in synthdef.indexed_parameters) + ) + ) + for control_ugen in synthdef.control_ugens: + for parameter in control_ugen.parameters: + value = parameter.value + if not isinstance(value, tuple): + value = (value,) + for x in value: + result.append(SynthDefCompiler.encode_float(x)) + result.append( + SynthDefCompiler.encode_unsigned_int_32bit(len(synthdef.indexed_parameters)) + ) + for index, parameter in synthdef.indexed_parameters: + name = parameter.name + result.append(SynthDefCompiler.encode_string(name)) + result.append(SynthDefCompiler.encode_unsigned_int_32bit(index)) + return bytes().join(result) + + @staticmethod + def compile_synthdefs(synthdefs, use_anonymous_names=False): + def flatten(value): + if isinstance(value, Sequence) and not isinstance( + value, (bytes, bytearray) + ): + return bytes().join(flatten(x) for x in value) + return value + + result = [] + encoded_file_type_id = b"SCgf" + result.append(encoded_file_type_id) + encoded_file_version = SynthDefCompiler.encode_unsigned_int_32bit(2) + result.append(encoded_file_version) + encoded_synthdef_count = SynthDefCompiler.encode_unsigned_int_16bit( + len(synthdefs) + ) + result.append(encoded_synthdef_count) + for synthdef in synthdefs: + name = synthdef.name + if not name or use_anonymous_names: + name = synthdef.anonymous_name + result.append(SynthDefCompiler.compile_synthdef(synthdef, name)) + result = flatten(result) + result = bytes(result) + return result + + @staticmethod + def compile_ugen(ugen, synthdef): + outputs = ugen._get_outputs() + result = [] + result.append(SynthDefCompiler.encode_string(type(ugen).__name__)) + result.append(SynthDefCompiler.encode_unsigned_int_8bit(ugen.calculation_rate)) + result.append(SynthDefCompiler.encode_unsigned_int_32bit(len(ugen.inputs))) + result.append(SynthDefCompiler.encode_unsigned_int_32bit(len(outputs))) + result.append( + SynthDefCompiler.encode_unsigned_int_16bit(int(ugen.special_index)) + ) + for input_ in ugen.inputs: + result.append(SynthDefCompiler.compile_ugen_input_spec(input_, synthdef)) + for output in outputs: + result.append(SynthDefCompiler.encode_unsigned_int_8bit(output)) + result = bytes().join(result) + return result + + @staticmethod + def compile_ugen_graph(synthdef): + result = [] + result.append( + SynthDefCompiler.encode_unsigned_int_32bit(len(synthdef.constants)) + ) + for constant in synthdef.constants: + result.append(SynthDefCompiler.encode_float(constant)) + result.append(SynthDefCompiler.compile_parameters(synthdef)) + result.append(SynthDefCompiler.encode_unsigned_int_32bit(len(synthdef.ugens))) + for ugen_index, ugen in enumerate(synthdef.ugens): + result.append(SynthDefCompiler.compile_ugen(ugen, synthdef)) + result.append(SynthDefCompiler.encode_unsigned_int_16bit(0)) + result = bytes().join(result) + return result + + @staticmethod + def compile_ugen_input_spec(input_, synthdef): + result = [] + if isinstance(input_, float): + result.append(SynthDefCompiler.encode_unsigned_int_32bit(0xFFFFFFFF)) + constant_index = synthdef._constants.index(input_) + result.append(SynthDefCompiler.encode_unsigned_int_32bit(constant_index)) + elif isinstance(input_, OutputProxy): + ugen = input_.source + output_index = input_.output_index + ugen_index = synthdef._ugens.index(ugen) + result.append(SynthDefCompiler.encode_unsigned_int_32bit(ugen_index)) + result.append(SynthDefCompiler.encode_unsigned_int_32bit(output_index)) + else: + raise Exception("Unhandled input spec: {}".format(input_)) + return bytes().join(result) + + @staticmethod + def encode_string(value): + result = bytes(struct.pack(">B", len(value))) + result += bytes(bytearray(value, encoding="ascii")) + return result + + @staticmethod + def encode_float(value): + return bytes(struct.pack(">f", float(value))) + + @staticmethod + def encode_unsigned_int_8bit(value): + return bytes(struct.pack(">B", int(value))) + + @staticmethod + def encode_unsigned_int_16bit(value): + return bytes(struct.pack(">H", int(value))) + + @staticmethod + def encode_unsigned_int_32bit(value): + return bytes(struct.pack(">I", int(value))) + + +class SynthDefDecompiler: + """ + SynthDef decompiler. + + :: + + >>> from supriya import ParameterRate + >>> from supriya.ugens import Decay, Out, Parameter, SinOsc, SynthDefBuilder, decompile_synthdefs + + :: + + >>> with SynthDefBuilder( + ... frequency=440, + ... trigger=Parameter( + ... value=0.0, + ... parameter_rate=ParameterRate.TRIGGER, + ... ), + ... ) as builder: + ... sin_osc = SinOsc.ar(frequency=builder["frequency"]) + ... decay = Decay.kr( + ... decay_time=0.5, + ... source=builder["trigger"], + ... ) + ... enveloped_sin = sin_osc * decay + ... out = Out.ar(bus=0, source=enveloped_sin) + ... + >>> synthdef = builder.build() + >>> supriya.graph(synthdef) # doctest: +SKIP + + :: + + >>> print(synthdef) + synthdef: + name: 001520731aee5371fefab6b505cf64dd + ugens: + - TrigControl.kr: null + - Decay.kr: + source: TrigControl.kr[0:trigger] + decay_time: 0.5 + - Control.kr: null + - SinOsc.ar: + frequency: Control.kr[0:frequency] + phase: 0.0 + - BinaryOpUGen(MULTIPLICATION).ar: + left: SinOsc.ar[0] + right: Decay.kr[0] + - Out.ar: + bus: 0.0 + source[0]: BinaryOpUGen(MULTIPLICATION).ar[0] + + :: + + >>> compiled_synthdef = synthdef.compile() + >>> decompiled_synthdef = decompile_synthdefs(compiled_synthdef)[0] + >>> supriya.graph(decompiled_synthdef) # doctest: +SKIP + + :: + + >>> print(decompiled_synthdef) + synthdef: + name: 001520731aee5371fefab6b505cf64dd + ugens: + - TrigControl.kr: null + - Decay.kr: + source: TrigControl.kr[0:trigger] + decay_time: 0.5 + - Control.kr: null + - SinOsc.ar: + frequency: Control.kr[0:frequency] + phase: 0.0 + - BinaryOpUGen(MULTIPLICATION).ar: + left: SinOsc.ar[0] + right: Decay.kr[0] + - Out.ar: + bus: 0.0 + source[0]: BinaryOpUGen(MULTIPLICATION).ar[0] + + :: + + >>> str(synthdef) == str(decompiled_synthdef) + True + """ + + ### PRIVATE METHODS ### + + @staticmethod + def _decode_constants(value, index): + sdd = SynthDefDecompiler + constants = [] + constants_count, index = sdd._decode_int_32bit(value, index) + for _ in range(constants_count): + constant, index = sdd._decode_float(value, index) + constants.append(constant) + return constants, index + + @staticmethod + def _decode_parameters(value, index): + sdd = SynthDefDecompiler + parameter_values = [] + parameter_count, index = sdd._decode_int_32bit(value, index) + for _ in range(parameter_count): + parameter_value, index = sdd._decode_float(value, index) + parameter_values.append(parameter_value) + parameter_count, index = sdd._decode_int_32bit(value, index) + parameter_names = [] + parameter_indices = [] + for _ in range(parameter_count): + parameter_name, index = sdd._decode_string(value, index) + parameter_index, index = sdd._decode_int_32bit(value, index) + parameter_names.append(parameter_name) + parameter_indices.append(parameter_index) + indexed_parameters = [] + if parameter_count: + pairs = tuple(zip(parameter_indices, parameter_names)) + pairs = sorted(pairs, key=lambda x: x[0]) + iterator = utils.iterate_nwise(pairs) + for (index_one, name_one), (index_two, name_two) in iterator: + value = parameter_values[index_one:index_two] + if len(value) == 1: + value = value[0] + parameter = Parameter(name=name_one, value=value) + indexed_parameters.append((index_one, parameter)) + index_one, name_one = pairs[-1] + value = parameter_values[index_one:] + if len(value) == 1: + value = value[0] + parameter = Parameter(name=name_one, value=value) + indexed_parameters.append((index_one, parameter)) + indexed_parameters.sort(key=lambda x: parameter_names.index(x[1].name)) + indexed_parameters = collections.OrderedDict(indexed_parameters) + return indexed_parameters, index + + @staticmethod + def _decompile_synthdef(value, index): + from .. import 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) + decompiled_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 = 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 = decompiled_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(ugens, ugen_name, None) + ugen = UGen.__new__(ugen_class) + if issubclass(ugen_class, 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:]) + ugen._channel_count = output_count + UGen.__init__( + ugen, + calculation_rate=calculation_rate, + special_index=special_index, + **kwargs, + ) + decompiled_ugens.append(ugen) + variants_count, index = sdd._decode_int_16bit(value, index) + synthdef = SynthDef(ugens=decompiled_ugens, name=name) + if synthdef.name == synthdef.anonymous_name: + synthdef._name = None + return synthdef, index + + @staticmethod + def _decode_string(value, index): + length = struct.unpack(">B", value[index : index + 1])[0] + index += 1 + result = value[index : index + length] + result = result.decode("ascii") + index += length + return result, index + + @staticmethod + def _decode_float(value, index): + result = struct.unpack(">f", value[index : index + 4])[0] + index += 4 + return result, index + + @staticmethod + def _decode_int_8bit(value, index): + result = struct.unpack(">B", value[index : index + 1])[0] + index += 1 + return result, index + + @staticmethod + def _decode_int_16bit(value, index): + result = struct.unpack(">H", value[index : index + 2])[0] + index += 2 + return result, index + + @staticmethod + def _decode_int_32bit(value, index): + result = struct.unpack(">I", value[index : index + 4])[0] + index += 4 + return result, index + + @staticmethod + def _collect_parameters_for_control( + calculation_rate, + indexed_parameters, + inputs, + output_count, + starting_control_index, + ugen_class, + ): + parameter_rate = ParameterRate.CONTROL + if issubclass(ugen_class, TrigControl): + parameter_rate = ParameterRate.TRIGGER + elif calculation_rate == CalculationRate.SCALAR: + parameter_rate = ParameterRate.SCALAR + elif calculation_rate == CalculationRate.AUDIO: + parameter_rate = ParameterRate.AUDIO + parameters = [] + collected_output_count = 0 + lag = 0.0 + while collected_output_count < output_count: + if inputs: + lag = inputs[collected_output_count] + parameter = indexed_parameters[ + starting_control_index + collected_output_count + ] + parameter.parameter_rate = parameter_rate + if lag: + parameter.lag = lag + parameters.append(parameter) + collected_output_count += len(parameter) + return parameters + + ### PUBLIC METHODS ### + + @staticmethod + def decompile_synthdef(value): + synthdefs = SynthDefDecompiler.decompile_synthdefs(value) + assert len(synthdefs) == 1 + return synthdefs[0] + + @staticmethod + def decompile_synthdefs(value): + synthdefs = [] + sdd = SynthDefDecompiler + index = 4 + assert value[:index] == b"SCgf" + file_version, index = sdd._decode_int_32bit(value, index) + synthdef_count, index = sdd._decode_int_16bit(value, index) + for _ in range(synthdef_count): + synthdef, index = sdd._decompile_synthdef(value, index) + synthdefs.append(synthdef) + return synthdefs diff --git a/supriya/ugens/decorators.py b/supriya/ugens/decorators.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/supriya/ugens/delay.py b/supriya/ugens/delay.py index 7c3426ca4..68056bed7 100644 --- a/supriya/ugens/delay.py +++ b/supriya/ugens/delay.py @@ -1,4 +1,4 @@ -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True, kr=True, is_pure=True) @@ -11,7 +11,7 @@ class AllpassC(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> allpass_c = supriya.ugens.AllpassC.ar(source=source) >>> allpass_c - AllpassC.ar() + AllpassC.ar()[0] """ source = param() @@ -30,7 +30,7 @@ class AllpassL(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> allpass_l = supriya.ugens.AllpassL.ar(source=source) >>> allpass_l - AllpassL.ar() + AllpassL.ar()[0] """ source = param() @@ -49,7 +49,7 @@ class AllpassN(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> allpass_n = supriya.ugens.AllpassN.ar(source=source) >>> allpass_n - AllpassN.ar() + AllpassN.ar()[0] """ source = param() @@ -71,7 +71,7 @@ class BufAllpassC(UGen): ... buffer_id=buffer_id, ... source=source, ... ) - BufAllpassC.ar() + BufAllpassC.ar()[0] """ buffer_id = param() @@ -94,7 +94,7 @@ class BufAllpassL(UGen): ... buffer_id=buffer_id, ... source=source, ... ) - BufAllpassL.ar() + BufAllpassL.ar()[0] """ buffer_id = param() @@ -117,7 +117,7 @@ class BufAllpassN(UGen): ... buffer_id=buffer_id, ... source=source, ... ) - BufAllpassN.ar() + BufAllpassN.ar()[0] """ buffer_id = param() @@ -140,7 +140,7 @@ class BufCombC(UGen): ... buffer_id=buffer_id, ... source=source, ... ) - BufCombC.ar() + BufCombC.ar()[0] """ buffer_id = param() @@ -163,7 +163,7 @@ class BufCombL(UGen): ... buffer_id=buffer_id, ... source=source, ... ) - BufCombL.ar() + BufCombL.ar()[0] """ buffer_id = param() @@ -186,7 +186,7 @@ class BufCombN(UGen): ... buffer_id=buffer_id, ... source=source, ... ) - BufCombN.ar() + BufCombN.ar()[0] """ buffer_id = param() @@ -209,7 +209,7 @@ class BufDelayC(UGen): ... buffer_id=buffer_id, ... source=source, ... ) - BufDelayC.ar() + BufDelayC.ar()[0] """ buffer_id = param() @@ -231,7 +231,7 @@ class BufDelayL(UGen): ... buffer_id=buffer_id, ... source=source, ... ) - BufDelayL.ar() + BufDelayL.ar()[0] """ buffer_id = param() @@ -253,7 +253,7 @@ class BufDelayN(UGen): ... buffer_id=buffer_id, ... source=source, ... ) - BufDelayN.ar() + BufDelayN.ar()[0] """ buffer_id = param() @@ -271,7 +271,7 @@ class CombC(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> supriya.ugens.CombC.ar(source=source) - CombC.ar() + CombC.ar()[0] """ source = param() @@ -289,7 +289,7 @@ class CombL(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> supriya.ugens.CombL.ar(source=source) - CombL.ar() + CombL.ar()[0] """ source = param() @@ -307,7 +307,7 @@ class CombN(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> supriya.ugens.CombN.ar(source=source) - CombN.ar() + CombN.ar()[0] """ source = param() @@ -333,7 +333,7 @@ class DelTapRd(UGen): :: >>> tapin - DelTapWr.ar() + DelTapWr.ar()[0] :: @@ -347,7 +347,7 @@ class DelTapRd(UGen): :: >>> tapout - DelTapRd.ar() + DelTapRd.ar()[0] """ buffer_id = param() @@ -373,7 +373,7 @@ class DelTapWr(UGen): :: >>> tapin - DelTapWr.ar() + DelTapWr.ar()[0] :: @@ -387,7 +387,7 @@ class DelTapWr(UGen): :: >>> tapout - DelTapRd.ar() + DelTapRd.ar()[0] """ buffer_id = param() @@ -403,7 +403,7 @@ class DelayC(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> supriya.ugens.DelayC.ar(source=source) - DelayC.ar() + DelayC.ar()[0] """ source = param() @@ -420,7 +420,7 @@ class DelayL(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> supriya.ugens.DelayL.ar(source=source) - DelayL.ar() + DelayL.ar()[0] """ source = param() @@ -437,7 +437,7 @@ class DelayN(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> supriya.ugens.DelayN.ar(source=source) - DelayN.ar() + DelayN.ar()[0] """ source = param() @@ -454,7 +454,7 @@ class Delay1(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> supriya.ugens.Delay1.ar(source=source) - Delay1.ar() + Delay1.ar()[0] """ source = param() @@ -469,7 +469,7 @@ class Delay2(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> supriya.ugens.Delay2.ar(source=source) - Delay2.ar() + Delay2.ar()[0] """ source = param() diff --git a/supriya/ugens/demand.py b/supriya/ugens/demand.py index 62d5085af..e98d748ae 100644 --- a/supriya/ugens/demand.py +++ b/supriya/ugens/demand.py @@ -2,7 +2,7 @@ from typing import Any, Dict, Tuple from ..enums import CalculationRate -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(dr=True) @@ -19,7 +19,7 @@ class Dbrown(UGen): ... step=0.01, ... ) >>> dbrown - Dbrown.dr() + Dbrown.dr()[0] """ minimum = param(0.0) @@ -41,7 +41,7 @@ class Dbufrd(UGen): ... phase=0, ... ) >>> dbufrd - Dbufrd.dr() + Dbufrd.dr()[0] """ buffer_id = param(0) @@ -63,7 +63,7 @@ class Dbufwr(UGen): ... phase=0, ... ) >>> dbufwr - Dbufwr.dr() + Dbufwr.dr()[0] """ source = param(0.0) @@ -90,7 +90,7 @@ class Demand(UGen): ... trigger=trigger, ... ) >>> demand - UGenArray({2}) + UGenVector({2}) """ trigger = param(0) @@ -129,7 +129,7 @@ class DemandEnvGen(UGen): ... time_scale=1, ... ) >>> demand_env_gen - DemandEnvGen.ar() + DemandEnvGen.ar()[0] """ level = param() @@ -157,7 +157,7 @@ class Dgeom(UGen): ... start=1, ... ) >>> dgeom - Dgeom.dr() + Dgeom.dr()[0] """ start = param(1) @@ -179,7 +179,7 @@ class Dibrown(UGen): ... step=0.01, ... ) >>> dibrown - Dibrown.dr() + Dibrown.dr()[0] """ minimum = param(0) @@ -201,7 +201,7 @@ class Diwhite(UGen): ... minimum=0, ... ) >>> diwhite - Diwhite.dr() + Diwhite.dr()[0] """ minimum = param(0) @@ -222,7 +222,7 @@ class Drand(UGen): ... sequence=sequence, ... ) >>> drand - Drand.dr() + Drand.dr()[0] """ repeats = param(1) @@ -242,7 +242,7 @@ class Dreset(UGen): ... source=source, ... ) >>> dreset - Dreset.dr() + Dreset.dr()[0] """ source = param() @@ -262,7 +262,7 @@ class Dseq(UGen): ... sequence=sequence, ... ) >>> dseq - Dseq.dr() + Dseq.dr()[0] """ repeats = param(1) @@ -282,7 +282,7 @@ class Dser(UGen): ... sequence=sequence, ... ) >>> dser - Dser.dr() + Dser.dr()[0] """ repeats = param(1) @@ -302,7 +302,7 @@ class Dseries(UGen): ... step=1, ... ) >>> dseries - Dseries.dr() + Dseries.dr()[0] """ length = param(float("inf")) @@ -323,7 +323,7 @@ class Dshuf(UGen): ... sequence=sequence, ... ) >>> dshuf - Dshuf.dr() + Dshuf.dr()[0] """ repeats = param(1) @@ -343,7 +343,7 @@ class Dstutter(UGen): ... source=source, ... ) >>> dstutter - Dstutter.dr() + Dstutter.dr()[0] """ n = param(2) @@ -364,7 +364,7 @@ class Dswitch(UGen): ... sequence=sequence, ... ) >>> dswitch - Dswitch.dr() + Dswitch.dr()[0] """ index = param() @@ -385,7 +385,7 @@ class Dswitch1(UGen): ... sequence=sequence, ... ) >>> dswitch_1 - Dswitch1.dr() + Dswitch1.dr()[0] """ index = param() @@ -406,7 +406,7 @@ class Dunique(UGen): ... source=source, ... ) >>> dunique - Dunique.dr() + Dunique.dr()[0] """ source = param() @@ -434,7 +434,7 @@ class Duty(UGen): ... ), ... ) >>> duty - Duty.kr() + Duty.kr()[0] """ duration = param(1.0) @@ -456,7 +456,7 @@ class Dwhite(UGen): ... minimum=0, ... ) >>> dwhite - Dwhite.dr() + Dwhite.dr()[0] """ minimum = param(0.0) @@ -479,7 +479,7 @@ class Dwrand(UGen): ... weights=weights, ... ) >>> dwrand - Dwrand.dr() + Dwrand.dr()[0] """ repeats = param(1) @@ -519,7 +519,7 @@ class Dxrand(UGen): ... sequence=sequence, ... ) >>> dxrand - Dxrand.dr() + Dxrand.dr()[0] """ repeats = param(1) diff --git a/supriya/ugens/diskio.py b/supriya/ugens/diskio.py index 3f887ba06..078ee6b48 100644 --- a/supriya/ugens/diskio.py +++ b/supriya/ugens/diskio.py @@ -1,4 +1,4 @@ -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True, is_multichannel=True, has_done_flag=True) @@ -15,7 +15,7 @@ class DiskIn(UGen): ... loop=0, ... ) >>> disk_in - UGenArray({2}) + UGenVector({2}) """ buffer_id = param() @@ -36,7 +36,7 @@ class DiskOut(UGen): ... source=source, ... ) >>> disk_out - DiskOut.ar() + DiskOut.ar()[0] """ buffer_id = param() @@ -59,7 +59,7 @@ class VDiskIn(UGen): ... send_id=0, ... ) >>> vdisk_in - UGenArray({2}) + UGenVector({2}) """ buffer_id = param() diff --git a/supriya/ugens/dynamics.py b/supriya/ugens/dynamics.py index ea71389b6..3bc9ba4f2 100644 --- a/supriya/ugens/dynamics.py +++ b/supriya/ugens/dynamics.py @@ -1,5 +1,5 @@ from ..enums import CalculationRate -from .bases import PseudoUGen, UGen, param, ugen +from .core import PseudoUGen, UGen, param, ugen from .delay import DelayN @@ -17,7 +17,7 @@ class Amplitude(UGen): ... source=source, ... ) >>> amplitude - Amplitude.kr() + Amplitude.kr()[0] """ source = param() @@ -122,7 +122,7 @@ class Limiter(UGen): ... source=source, ... ) >>> limiter - Limiter.ar() + Limiter.ar()[0] """ source = param() @@ -144,7 +144,7 @@ class Normalizer(UGen): ... source=source, ... ) >>> normalizer - Normalizer.ar() + Normalizer.ar()[0] """ source = param() diff --git a/supriya/ugens/envelopes.py b/supriya/ugens/envelopes.py index 1eee01ce6..28540d69d 100644 --- a/supriya/ugens/envelopes.py +++ b/supriya/ugens/envelopes.py @@ -1,5 +1,266 @@ -from ..enums import DoneAction -from .bases import UGen, param, ugen +from typing import List, Optional, Sequence, Tuple, Union + +from uqbar.objects import get_repr + +from .. import utils +from ..enums import DoneAction, EnvelopeShape +from .core import Parameter, UGen, UGenOperable, UGenVector, param, ugen + + +class Envelope: + """ + An envelope. + + :: + + >>> from supriya.ugens import Envelope + >>> envelope = Envelope() + + :: + + >>> list(envelope.serialize()) + [0, 2, -99, -99, 1, 1, 1, 0.0, 0, 1, 1, 0.0] + """ + + def __init__( + self, + amplitudes: Sequence[Union[UGenOperable, float]] = (0, 1, 0), + durations: Sequence[Union[UGenOperable, float]] = (1, 1), + curves: Sequence[Union[EnvelopeShape, UGenOperable, float, str, None]] = ( + EnvelopeShape.LINEAR, + EnvelopeShape.LINEAR, + ), + release_node: Optional[int] = None, + loop_node: Optional[int] = None, + offset: Union[UGenOperable, float] = 0.0, + ) -> None: + assert len(amplitudes) > 1 + assert len(durations) == (len(amplitudes) - 1) + if isinstance(curves, (int, float, str, EnvelopeShape, UGenOperable)): + curves = [curves] + elif curves is None: + curves = [] + self._release_node = release_node + self._loop_node = loop_node + self._offset = offset + self._initial_amplitude = amplitudes[0] + self._amplitudes: Tuple[Union[UGenOperable, float], ...] = tuple(amplitudes[1:]) + self._durations: Tuple[Union[UGenOperable, float], ...] = tuple(durations) + curves_: List[Union[EnvelopeShape, UGenOperable, float]] = [] + for x in curves: + if isinstance(x, (EnvelopeShape, UGenOperable)): + curves_.append(x) + elif isinstance(x, str) or x is None: + curves_.append(EnvelopeShape.from_expr(x)) + else: + curves_.append(float(x)) + self._curves: Tuple[Union[EnvelopeShape, UGenOperable, float], ...] = tuple( + curves_ + ) + self._envelope_segments = tuple( + utils.zip_cycled(self._amplitudes, self._durations, self._curves) + ) + + def __repr__(self) -> str: + return get_repr(self) + + @classmethod + def adsr( + cls, + attack_time=0.01, + decay_time=0.3, + sustain=0.5, + release_time=1.0, + peak=1.0, + curve=-4.0, + bias=0.0, + ) -> "Envelope": + amplitudes = [x + bias for x in [0, peak, peak * sustain, 0]] + durations = [attack_time, decay_time, release_time] + curves = [curve] + release_node = 2 + return Envelope( + amplitudes=amplitudes, + durations=durations, + curves=curves, + release_node=release_node, + ) + + @classmethod + def asr( + cls, attack_time=0.01, sustain=1.0, release_time=1.0, curve=-4.0 + ) -> "Envelope": + amplitudes = [0, sustain, 0] + durations = [attack_time, release_time] + curves = [curve] + release_node = 1 + return Envelope( + amplitudes=amplitudes, + durations=durations, + curves=curves, + release_node=release_node, + ) + + @classmethod + def from_segments( + cls, + initial_amplitude=0, + segments=None, + release_node=None, + loop_node=None, + offset=None, + ) -> "Envelope": + amplitudes = [initial_amplitude] + durations = [] + curves = [] + for amplitude, duration, curve in segments: + amplitudes.append(amplitude) + durations.append(duration) + curves.append(curve) + return cls( + amplitudes=amplitudes, + durations=durations, + curves=curves, + release_node=release_node, + loop_node=loop_node, + offset=offset, + ) + + @classmethod + def percussive( + cls, + attack_time: Union[UGenOperable, float] = 0.01, + release_time: Union[UGenOperable, float] = 1.0, + amplitude: Union[UGenOperable, float] = 1.0, + curve: Union[EnvelopeShape, UGenOperable, float, str] = -4.0, + ) -> "Envelope": + """ + Make a percussion envelope. + + :: + + >>> from supriya.ugens import Envelope + >>> envelope = Envelope.percussive() + >>> envelope + Envelope( + curves=(-4.0, -4.0), + durations=(0.01, 1.0), + ) + + :: + + >>> list(envelope.serialize()) + [0, 2, -99, -99, 1.0, 0.01, 5, -4.0, 0, 1.0, 5, -4.0] + """ + amplitudes = [0, amplitude, 0] + durations = [attack_time, release_time] + curves = [curve] + return Envelope(amplitudes=amplitudes, durations=durations, curves=curves) + + @classmethod + def linen( + cls, attack_time=0.01, sustain_time=1.0, release_time=1.0, level=1.0, curve=1 + ) -> "Envelope": + amplitudes = [0, level, level, 0] + durations = [attack_time, sustain_time, release_time] + curves = [curve] + return Envelope(amplitudes=amplitudes, durations=durations, curves=curves) + + def serialize(self, for_interpolation=False) -> UGenVector: + result: List[Union[UGenOperable, float]] = [] + if for_interpolation: + result.append(self.offset or 0.0) + result.append(self.initial_amplitude) + result.append(len(self.envelope_segments)) + result.append(self.duration) + for amplitude, duration, curve in self._envelope_segments: + result.append(duration) + if isinstance(curve, EnvelopeShape): + shape = int(curve) + curve = 0.0 + else: + shape = 5 + result.append(shape) + result.append(curve) + result.append(amplitude) + else: + result.append(self.initial_amplitude) + result.append(len(self.envelope_segments)) + result.append(-99 if self.release_node is None else self.release_node) + result.append(-99 if self.loop_node is None else self.loop_node) + for amplitude, duration, curve in self._envelope_segments: + result.append(amplitude) + result.append(duration) + if isinstance(curve, EnvelopeShape): + shape = int(curve) + curve = 0.0 + else: + shape = 5 + result.append(shape) + result.append(curve) + return UGenVector(*result) + + @classmethod + def triangle(cls, duration=1.0, amplitude=1.0) -> "Envelope": + """ + Make a triangle envelope. + + :: + + >>> from supriya.ugens import Envelope + >>> envelope = Envelope.triangle() + >>> envelope + Envelope( + durations=(0.5, 0.5), + ) + + :: + + >>> list(envelope.serialize()) + [0, 2, -99, -99, 1.0, 0.5, 1, 0.0, 0, 0.5, 1, 0.0] + """ + amplitudes = [0, amplitude, 0] + duration = duration / 2.0 + durations = [duration, duration] + return Envelope(amplitudes=amplitudes, durations=durations) + + ### PUBLIC PROPERTIES ### + + @property + def amplitudes(self) -> Tuple[Union[UGenOperable, float]]: + return (self.initial_amplitude,) + tuple(_[0] for _ in self.envelope_segments) + + @property + def curves(self) -> Tuple[Union[EnvelopeShape, UGenOperable, float]]: + return tuple(_[2] for _ in self.envelope_segments) + + @property + def duration(self) -> Union[float, UGenOperable]: + return sum(self.durations) + + @property + def durations(self) -> Tuple[Union[float, UGenOperable]]: + return tuple(_[1] for _ in self.envelope_segments) + + @property + def envelope_segments(self): + return self._envelope_segments + + @property + def initial_amplitude(self) -> Union[float, UGenOperable]: + return self._initial_amplitude + + @property + def loop_node(self) -> Optional[int]: + return self._loop_node + + @property + def offset(self) -> Union[float, UGenOperable]: + return self._offset + + @property + def release_node(self) -> Optional[int]: + return self._release_node @ugen(kr=True) @@ -14,7 +275,7 @@ class Done(UGen): ... source=source, ... ) >>> done - Done.kr() + Done.kr()[0] """ source = param() @@ -27,9 +288,9 @@ class EnvGen(UGen): :: - >>> envelope = supriya.synthdefs.Envelope.percussive() - >>> supriya.ugens.EnvGen.ar(envelope=envelope) - EnvGen.ar() + >>> from supriya.ugens import Envelope, EnvGen + >>> EnvGen.ar(envelope=Envelope.percussive()) + EnvGen.ar()[0] """ gate = param(1.0) @@ -50,8 +311,6 @@ def _new_expanded( level_scale=1.0, time_scale=1.0, ): - from ..synthdefs import Envelope, Parameter - if not isinstance(done_action, Parameter): done_action = DoneAction.from_expr(done_action) if envelope is None: @@ -83,7 +342,7 @@ class Free(UGen): ... trigger=trigger, ... ) >>> free - Free.kr() + Free.kr()[0] """ trigger = param(0) @@ -102,7 +361,7 @@ class FreeSelf(UGen): ... trigger=trigger, ... ) >>> free_self - FreeSelf.kr() + FreeSelf.kr()[0] """ trigger = param() @@ -120,7 +379,7 @@ class FreeSelfWhenDone(UGen): ... source=source, ... ) >>> free_self_when_done - FreeSelfWhenDone.kr() + FreeSelfWhenDone.kr()[0] """ source = param() @@ -134,7 +393,7 @@ class Linen(UGen): :: >>> supriya.ugens.Linen.kr() - Linen.kr() + Linen.kr()[0] """ gate = param(1.0) @@ -158,7 +417,7 @@ class Pause(UGen): ... trigger=trigger, ... ) >>> pause - Pause.kr() + Pause.kr()[0] """ trigger = param() @@ -177,7 +436,7 @@ class PauseSelf(UGen): ... trigger=trigger, ... ) >>> pause_self - PauseSelf.kr() + PauseSelf.kr()[0] """ trigger = param() @@ -195,7 +454,7 @@ class PauseSelfWhenDone(UGen): ... source=source, ... ) >>> pause_self_when_done - PauseSelfWhenDone.kr() + PauseSelfWhenDone.kr()[0] """ source = param() diff --git a/supriya/synthdefs/factories.py b/supriya/ugens/factories.py similarity index 98% rename from supriya/synthdefs/factories.py rename to supriya/ugens/factories.py index d2c771304..39e14382b 100644 --- a/supriya/synthdefs/factories.py +++ b/supriya/ugens/factories.py @@ -2,7 +2,7 @@ import types from ..enums import DoneAction -from ..ugens import ( +from . import ( DetectSilence, In, InFeedback, @@ -12,14 +12,14 @@ LocalOut, Mix, Out, + Parameter, RandID, ReplaceOut, - UGenArray, + SynthDefBuilder, UGenOperable, + UGenVector, XOut, ) -from .builders import SynthDefBuilder -from .controls import Parameter class SynthDefFactory: @@ -30,7 +30,8 @@ class SynthDefFactory: :: - >>> factory = supriya.synthdefs.SynthDefFactory() + >>> from supriya.ugens.factories import SynthDefFactory + >>> factory = SynthDefFactory() :: @@ -365,7 +366,7 @@ def build(self, name=None, **kwargs): for signal_block in self._signal_blocks: source = signal_block(builder, source, state) if not isinstance(source, UGenOperable): - source = UGenArray(source) + source = UGenVector(source) self._build_output(builder, source, state) self._build_feedback_loop_output(builder, source, state) self._build_silence_detection(builder, source, state) @@ -379,7 +380,8 @@ def with_channel_count(self, channel_count): :: - >>> factory = supriya.synthdefs.SynthDefFactory() + >>> from supriya.ugens.factories import SynthDefFactory + >>> factory = SynthDefFactory() :: @@ -561,7 +563,8 @@ def with_feedback_loop(self, block_function=None): :: - >>> factory = supriya.synthdefs.SynthDefFactory() + >>> from supriya.ugens.factories import SynthDefFactory + >>> factory = SynthDefFactory() :: @@ -713,7 +716,8 @@ def with_gate(self, attack_time=0.02, release_time=0.02): :: - >>> factory = supriya.synthdefs.SynthDefFactory() + >>> from supriya.ugens.factories import SynthDefFactory + >>> factory = SynthDefFactory() :: @@ -803,7 +807,8 @@ def with_initial_state(self, **state): :: - >>> factory = supriya.synthdefs.SynthDefFactory() + >>> from supriya.ugens.factories import SynthDefFactory + >>> factory = SynthDefFactory() :: @@ -905,7 +910,8 @@ def with_input(self, feedback=False, private=False, windowed=False): :: - >>> factory = supriya.synthdefs.SynthDefFactory() + >>> from supriya.ugens.factories import SynthDefFactory + >>> factory = SynthDefFactory() :: @@ -1146,7 +1152,8 @@ def with_output( :: - >>> factory = supriya.synthdefs.SynthDefFactory() + >>> from supriya.ugens.factories import SynthDefFactory + >>> factory = SynthDefFactory() :: @@ -1637,7 +1644,8 @@ def with_parameter_block(self, block_function): :: - >>> factory = supriya.synthdefs.SynthDefFactory() + >>> from supriya.ugens.factories import SynthDefFactory + >>> factory = SynthDefFactory() >>> factory = factory.with_initial_state(frequencies=(300, 1200, 9600)) >>> factory = factory.with_parameter_block(parameter_block) >>> factory = factory.with_input() @@ -2065,7 +2073,8 @@ def with_rand_id(self, rand_id=0): :: - >>> factory = supriya.synthdefs.SynthDefFactory() + >>> from supriya.ugens.factories import SynthDefFactory + >>> factory = SynthDefFactory() :: @@ -2162,7 +2171,8 @@ def with_signal_block(self, block_function): :: - >>> factory = supriya.synthdefs.SynthDefFactory() + >>> from supriya.ugens.factories import SynthDefFactory + >>> factory = SynthDefFactory() :: @@ -2260,7 +2270,8 @@ def with_silence_detection(self): :: - >>> factory = supriya.synthdefs.SynthDefFactory() + >>> from supriya.ugens.factories import SynthDefFactory + >>> factory = SynthDefFactory() :: diff --git a/supriya/ugens/ffsinosc.py b/supriya/ugens/ffsinosc.py index a66c8d3f1..832b755e6 100644 --- a/supriya/ugens/ffsinosc.py +++ b/supriya/ugens/ffsinosc.py @@ -2,7 +2,7 @@ from supriya import utils -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True, kr=True) @@ -17,7 +17,7 @@ class Blip(UGen): ... harmonic_count=200, ... ) >>> blip - Blip.ar() + Blip.ar()[0] """ frequency = param(440.0) @@ -36,7 +36,7 @@ class FSinOsc(UGen): ... initial_phase=0, ... ) >>> fsin_osc - FSinOsc.ar() + FSinOsc.ar()[0] """ frequency = param(440.0) @@ -63,7 +63,7 @@ class Klank(UGen): ... specifications=specifications, ... ) >>> klank - Klank.ar() + Klank.ar()[0] """ source = param() @@ -118,7 +118,7 @@ class Pulse(UGen): ... width=0.5, ... ) >>> pulse - Pulse.ar() + Pulse.ar()[0] """ frequency = param(440.0) @@ -133,7 +133,7 @@ class Saw(UGen): :: >>> supriya.ugens.Saw.ar() - Saw.ar() + Saw.ar()[0] """ frequency = param(440.0) diff --git a/supriya/ugens/filters.py b/supriya/ugens/filters.py index b781b676c..ff7ecb29a 100644 --- a/supriya/ugens/filters.py +++ b/supriya/ugens/filters.py @@ -1,5 +1,5 @@ from ..enums import DoneAction -from .bases import PseudoUGen, UGen, UGenOperable, param, ugen +from .core import PseudoUGen, UGen, UGenOperable, param, ugen @ugen(ar=True, kr=True, is_pure=True) @@ -16,7 +16,7 @@ class APF(UGen): ... source=source, ... ) >>> apf - APF.ar() + APF.ar()[0] """ source = param() @@ -34,7 +34,7 @@ class BPF(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> b_p_f = supriya.ugens.BPF.ar(source=source) >>> b_p_f - BPF.ar() + BPF.ar()[0] """ source = param() @@ -54,7 +54,7 @@ class BPZ2(UGen): ... source=source, ... ) >>> bpz_2 - BPZ2.ar() + BPZ2.ar()[0] """ source = param() @@ -70,7 +70,7 @@ class BRF(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> b_r_f = supriya.ugens.BRF.ar(source=source) >>> b_r_f - BRF.ar() + BRF.ar()[0] """ source = param() @@ -90,7 +90,7 @@ class BRZ2(UGen): ... source=source, ... ) >>> brz_2 - BRZ2.ar() + BRZ2.ar()[0] """ source = param() @@ -209,7 +209,7 @@ class Decay(UGen): ... source=source, ... ) >>> decay - Decay.ar() + Decay.ar()[0] """ source = param() @@ -228,7 +228,7 @@ class Decay2(UGen): ... source=source, ... ) >>> decay_2 - Decay2.ar() + Decay2.ar()[0] """ source = param() @@ -252,7 +252,7 @@ class DetectSilence(UGen): ... time=1.0, ... ) >>> detect_silence - DetectSilence.kr() + DetectSilence.kr()[0] """ ### CLASS VARIABLES ### @@ -282,7 +282,7 @@ class FOS(UGen): ... source=source, ... ) >>> fos - FOS.ar() + FOS.ar()[0] """ source = param() @@ -306,7 +306,7 @@ class Formlet(UGen): ... source=source, ... ) >>> formlet - Formlet.ar() + Formlet.ar()[0] """ source = param() @@ -324,7 +324,7 @@ class HPF(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> supriya.ugens.HPF.ar(source=source) - HPF.ar() + HPF.ar()[0] """ source = param() @@ -343,7 +343,7 @@ class HPZ1(UGen): ... source=source, ... ) >>> hpz_1 - HPZ1.ar() + HPZ1.ar()[0] """ source = param() @@ -361,7 +361,7 @@ class HPZ2(UGen): ... source=source, ... ) >>> hpz_2 - HPZ2.ar() + HPZ2.ar()[0] """ source = param() @@ -380,7 +380,7 @@ class Integrator(UGen): ... source=source, ... ) >>> integrator - Integrator.ar() + Integrator.ar()[0] """ source = param() @@ -399,7 +399,7 @@ class Lag(UGen): ... lag_time=0.5, ... source=source, ... ) - Lag.kr() + Lag.kr()[0] """ source = param() @@ -419,7 +419,7 @@ class LagUD(UGen): ... lag_time_up=0.5, ... source=source, ... ) - LagUD.kr() + LagUD.kr()[0] """ source = param() @@ -440,7 +440,7 @@ class Lag2(UGen): ... source=source, ... ) >>> lag_2 - Lag2.ar() + Lag2.ar()[0] """ source = param() @@ -461,7 +461,7 @@ class Lag2UD(UGen): ... source=source, ... ) >>> lag_2_ud - Lag2UD.ar() + Lag2UD.ar()[0] """ source = param() @@ -482,7 +482,7 @@ class Lag3(UGen): ... source=source, ... ) >>> lag_3 - Lag3.ar() + Lag3.ar()[0] """ source = param() @@ -503,7 +503,7 @@ class Lag3UD(UGen): ... source=source, ... ) >>> lag_3_ud - Lag3UD.ar() + Lag3UD.ar()[0] """ source = param() @@ -524,7 +524,7 @@ class LeakDC(UGen): ... coefficient=0.995, ... ) >>> leak_d_c - LeakDC.ar() + LeakDC.ar()[0] """ source = param() @@ -540,7 +540,7 @@ class LPF(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> supriya.ugens.LPF.ar(source=source) - LPF.ar() + LPF.ar()[0] """ source = param() @@ -559,7 +559,7 @@ class LPZ1(UGen): ... source=source, ... ) >>> lpz_1 - LPZ1.ar() + LPZ1.ar()[0] """ source = param() @@ -577,7 +577,7 @@ class LPZ2(UGen): ... source=source, ... ) >>> lpz_2 - LPZ2.ar() + LPZ2.ar()[0] """ source = param() @@ -596,7 +596,7 @@ class Median(UGen): ... source=source, ... ) >>> median - Median.ar() + Median.ar()[0] """ length = param(3) @@ -618,7 +618,7 @@ class MidEQ(UGen): ... source=source, ... ) >>> mid_eq - MidEQ.ar() + MidEQ.ar()[0] """ source = param() @@ -642,7 +642,7 @@ class MoogFF(UGen): ... source=source, ... ) >>> moog_ff - MoogFF.ar() + MoogFF.ar()[0] """ source = param() @@ -664,7 +664,7 @@ class OnePole(UGen): ... source=source, ... ) >>> one_pole - OnePole.ar() + OnePole.ar()[0] """ source = param() @@ -684,7 +684,7 @@ class OneZero(UGen): ... source=source, ... ) >>> one_zero - OneZero.ar() + OneZero.ar()[0] """ source = param() @@ -700,7 +700,7 @@ class RHPF(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> supriya.ugens.RLPF.ar(source=source) - RLPF.ar() + RLPF.ar()[0] """ source = param() @@ -717,7 +717,7 @@ class RLPF(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> supriya.ugens.RLPF.ar(source=source) - RLPF.ar() + RLPF.ar()[0] """ source = param() @@ -738,7 +738,7 @@ class Ramp(UGen): ... source=source, ... ) >>> ramp - Ramp.ar() + Ramp.ar()[0] """ source = param() @@ -759,7 +759,7 @@ class Ringz(UGen): ... source=source, ... ) >>> ringz - Ringz.ar() + Ringz.ar()[0] """ source = param() @@ -788,7 +788,7 @@ class SOS(UGen): ... source=source, ... ) >>> sos - SOS.ar() + SOS.ar()[0] """ source = param() @@ -813,7 +813,7 @@ class Slew(UGen): ... down=1, ... ) >>> slew - Slew.ar() + Slew.ar()[0] """ source = param() @@ -833,7 +833,7 @@ class Slope(UGen): ... source=source, ... ) >>> slope - Slope.ar() + Slope.ar()[0] """ source = param() @@ -853,7 +853,7 @@ class TwoPole(UGen): ... source=source, ... ) >>> two_pole - TwoPole.ar() + TwoPole.ar()[0] """ source = param() @@ -875,7 +875,7 @@ class TwoZero(UGen): ... source=source, ... ) >>> two_zero - TwoZero.ar() + TwoZero.ar()[0] """ source = param() diff --git a/supriya/ugens/gendyn.py b/supriya/ugens/gendyn.py index a63f92cd8..fbccefc79 100644 --- a/supriya/ugens/gendyn.py +++ b/supriya/ugens/gendyn.py @@ -2,7 +2,7 @@ from ..enums import CalculationRate from ..typing import Default -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True, kr=True) @@ -25,7 +25,7 @@ class Gendy1(UGen): ... minfrequency=440, ... ) >>> gendy_1 - Gendy1.ar() + Gendy1.ar()[0] """ ampdist = param(1) @@ -72,7 +72,7 @@ class Gendy2(UGen): ... minfrequency=440, ... ) >>> gendy_2 - Gendy2.ar() + Gendy2.ar()[0] """ ampdist = param(1) @@ -118,7 +118,7 @@ class Gendy3(UGen): ... knum=10, ... ) >>> gendy_3 - Gendy3.ar() + Gendy3.ar()[0] """ ampdist = param(1) diff --git a/supriya/ugens/granular.py b/supriya/ugens/granular.py index df892197f..9ce4553c4 100644 --- a/supriya/ugens/granular.py +++ b/supriya/ugens/granular.py @@ -1,4 +1,4 @@ -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True, is_multichannel=True) @@ -19,7 +19,7 @@ class GrainBuf(UGen): ... trigger=0, ... ) >>> grain_buf - UGenArray({2}) + UGenVector({2}) """ trigger = param(0) @@ -49,7 +49,7 @@ class GrainIn(UGen): ... trigger=0, ... ) >>> grain_in - UGenArray({2}) + UGenVector({2}) """ trigger = param(0) @@ -71,7 +71,7 @@ class PitchShift(UGen): >>> supriya.ugens.PitchShift.ar( ... source=source, ... ) - PitchShift.ar() + PitchShift.ar()[0] """ source = param() @@ -98,7 +98,7 @@ class Warp1(UGen): ... window_size=0.2, ... ) >>> warp_1 - Warp1.ar() + Warp1.ar()[0] """ buffer_id = param(0) diff --git a/supriya/ugens/hilbert.py b/supriya/ugens/hilbert.py index 2f72b93f9..ad08d0865 100644 --- a/supriya/ugens/hilbert.py +++ b/supriya/ugens/hilbert.py @@ -1,4 +1,4 @@ -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True) @@ -13,7 +13,7 @@ class FreqShift(UGen): ... source=source, ... ) >>> freq_shift - FreqShift.ar() + FreqShift.ar()[0] """ source = param() @@ -33,7 +33,7 @@ class Hilbert(UGen): ... source=source, ... ) >>> hilbert - UGenArray({2}) + UGenVector({2}) """ source = param() @@ -52,7 +52,7 @@ class HilbertFIR(UGen): ... source=source, ... ) >>> hilbert_fir - HilbertFIR.ar() + HilbertFIR.ar()[0] """ source = param() diff --git a/supriya/ugens/info.py b/supriya/ugens/info.py index d18ce1c04..24cc7d49f 100644 --- a/supriya/ugens/info.py +++ b/supriya/ugens/info.py @@ -1,4 +1,4 @@ -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ir=True) @@ -9,7 +9,7 @@ class BlockSize(UGen): :: >>> supriya.ugens.BlockSize.ir() - BlockSize.ir() + BlockSize.ir()[0] """ @@ -21,7 +21,7 @@ class BufChannels(UGen): :: >>> supriya.ugens.BufChannels.kr(buffer_id=0) - BufChannels.kr() + BufChannels.kr()[0] """ buffer_id = param() @@ -35,7 +35,7 @@ class BufDur(UGen): :: >>> supriya.ugens.BufDur.kr(buffer_id=0) - BufDur.kr() + BufDur.kr()[0] """ buffer_id = param() @@ -49,7 +49,7 @@ class BufFrames(UGen): :: >>> supriya.ugens.BufFrames.kr(buffer_id=0) - BufFrames.kr() + BufFrames.kr()[0] """ buffer_id = param() @@ -63,7 +63,7 @@ class BufRateScale(UGen): :: >>> supriya.ugens.BufRateScale.kr(buffer_id=0) - BufRateScale.kr() + BufRateScale.kr()[0] """ buffer_id = param() @@ -77,7 +77,7 @@ class BufSampleRate(UGen): :: >>> supriya.ugens.BufSampleRate.kr(buffer_id=0) - BufSampleRate.kr() + BufSampleRate.kr()[0] """ buffer_id = param() @@ -91,7 +91,7 @@ class BufSamples(UGen): :: >>> supriya.ugens.BufSamples.kr(buffer_id=0) - BufSamples.kr() + BufSamples.kr()[0] """ buffer_id = param() @@ -105,7 +105,7 @@ class ControlDur(UGen): :: >>> supriya.ugens.ControlDur.ir() - ControlDur.ir() + ControlDur.ir()[0] """ @@ -117,7 +117,7 @@ class ControlRate(UGen): :: >>> supriya.ugens.ControlRate.ir() - ControlRate.ir() + ControlRate.ir()[0] """ @@ -129,7 +129,7 @@ class NodeID(UGen): :: >>> supriya.ugens.NodeID.ir() - NodeID.ir() + NodeID.ir()[0] """ @@ -141,7 +141,7 @@ class NumAudioBuses(UGen): :: >>> supriya.ugens.NumAudioBuses.ir() - NumAudioBuses.ir() + NumAudioBuses.ir()[0] """ @@ -153,7 +153,7 @@ class NumBuffers(UGen): :: >>> supriya.ugens.NumBuffers.ir() - NumBuffers.ir() + NumBuffers.ir()[0] """ @@ -165,7 +165,7 @@ class NumControlBuses(UGen): :: >>> supriya.ugens.NumControlBuses.ir() - NumControlBuses.ir() + NumControlBuses.ir()[0] """ @@ -177,7 +177,7 @@ class NumInputBuses(UGen): :: >>> supriya.ugens.NumInputBuses.ir() - NumInputBuses.ir() + NumInputBuses.ir()[0] """ @@ -189,7 +189,7 @@ class NumOutputBuses(UGen): :: >>> supriya.ugens.NumOutputBuses.ir() - NumOutputBuses.ir() + NumOutputBuses.ir()[0] """ @@ -201,7 +201,7 @@ class NumRunningSynths(UGen): :: >>> supriya.ugens.NumRunningSynths.ir() - NumRunningSynths.ir() + NumRunningSynths.ir()[0] """ @@ -213,7 +213,7 @@ class RadiansPerSample(UGen): :: >>> supriya.ugens.RadiansPerSample.ir() - RadiansPerSample.ir() + RadiansPerSample.ir()[0] """ @@ -225,7 +225,7 @@ class SampleDur(UGen): :: >>> supriya.ugens.SampleDur.ir() - SampleDur.ir() + SampleDur.ir()[0] """ @@ -237,7 +237,7 @@ class SampleRate(UGen): :: >>> supriya.ugens.SampleRate.ir() - SampleRate.ir() + SampleRate.ir()[0] """ @@ -249,5 +249,5 @@ class SubsampleOffset(UGen): :: >>> supriya.ugens.SubsampleOffset.ir() - SubsampleOffset.ir() + SubsampleOffset.ir()[0] """ diff --git a/supriya/ugens/inout.py b/supriya/ugens/inout.py index bd5c9bcd1..6335c766d 100644 --- a/supriya/ugens/inout.py +++ b/supriya/ugens/inout.py @@ -2,7 +2,7 @@ from ..enums import CalculationRate from ..utils import repeat_to_length -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True, kr=True, is_input=True, is_multichannel=True) @@ -13,7 +13,7 @@ class In(UGen): :: >>> supriya.ugens.In.ar(bus=0, channel_count=4) - UGenArray({4}) + UGenVector({4}) """ bus = param(0.0) @@ -33,7 +33,7 @@ class InFeedback(UGen): ... channel_count=2, ... ) >>> in_feedback - UGenArray({2}) + UGenVector({2}) """ bus = param(0.0) @@ -47,7 +47,7 @@ class LocalIn(UGen): :: >>> supriya.ugens.LocalIn.ar(channel_count=2) - UGenArray({2}) + UGenVector({2}) """ default = param(0.0, unexpanded=True) diff --git a/supriya/ugens/lines.py b/supriya/ugens/lines.py index d6aafa6cd..55cdee183 100644 --- a/supriya/ugens/lines.py +++ b/supriya/ugens/lines.py @@ -1,8 +1,8 @@ from typing import Any, Dict, Tuple from ..enums import CalculationRate, DoneAction -from .bases import PseudoUGen, UGen, UGenArray, UGenOperable, param, ugen from .basic import MulAdd +from .core import PseudoUGen, UGen, UGenOperable, UGenVector, param, ugen @ugen(kr=True, is_pure=True) @@ -17,7 +17,7 @@ class A2K(UGen): ... source=source, ... ) >>> a_2_k - A2K.kr() + A2K.kr()[0] """ source = param() @@ -36,7 +36,7 @@ class AmpComp(UGen): ... root=0, ... ) >>> amp_comp - AmpComp.ar() + AmpComp.ar()[0] """ frequency = param(1000.0) @@ -58,7 +58,7 @@ class AmpCompA(UGen): ... root_amp=1, ... ) >>> amp_comp_a - AmpCompA.ar() + AmpCompA.ar()[0] """ frequency = param(1000.0) @@ -77,14 +77,14 @@ class DC(UGen): >>> supriya.ugens.DC.ar( ... source=0, ... ) - DC.ar() + DC.ar()[0] :: >>> supriya.ugens.DC.ar( ... source=(1, 2, 3), ... ) - UGenArray({3}) + UGenVector({3}) """ source = param() @@ -102,7 +102,7 @@ class K2A(UGen): ... source=source, ... ) >>> k_2_a - K2A.ar() + K2A.ar()[0] """ source = param() @@ -124,7 +124,7 @@ class LinExp(UGen): ... source=source, ... ) >>> lin_exp - LinExp.ar() + LinExp.ar()[0] """ source = param() @@ -170,7 +170,7 @@ class Line(UGen): :: >>> supriya.ugens.Line.ar() - Line.ar() + Line.ar()[0] """ start = param(0.0) @@ -197,7 +197,7 @@ class Silence(PseudoUGen): :: >>> supriya.ugens.Silence.ar(channel_count=2) - UGenArray({2}) + UGenVector({2}) """ @classmethod @@ -209,8 +209,8 @@ def ar(cls, channel_count=1): silence = DC.ar(source=0) if channel_count == 1: return silence - output_proxies = [silence[0]] * channel_count - return UGenArray(output_proxies) + output_proxies = [silence] * channel_count + return UGenVector(*output_proxies) @ugen(ar=True, kr=True, has_done_flag=True) @@ -221,7 +221,7 @@ class XLine(UGen): :: >>> supriya.ugens.XLine.ar() - XLine.ar() + XLine.ar()[0] """ start = param(0.0) diff --git a/supriya/ugens/mac.py b/supriya/ugens/mac.py index fab397e97..7c38ebc2a 100644 --- a/supriya/ugens/mac.py +++ b/supriya/ugens/mac.py @@ -1,5 +1,5 @@ from ..enums import SignalRange -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(kr=True, signal_range=SignalRange.UNIPOLAR) @@ -18,7 +18,7 @@ class MouseButton(UGen): :: >>> supriya.ugens.MouseButton.kr() - MouseButton.kr() + MouseButton.kr()[0] """ minimum = param(0.0) @@ -36,7 +36,7 @@ class MouseX(UGen): :: >>> supriya.ugens.MouseX.kr() - MouseX.kr() + MouseX.kr()[0] """ minimum = param(0.0) @@ -55,7 +55,7 @@ class MouseY(UGen): :: >>> supriya.ugens.MouseY.kr() - MouseY.kr() + MouseY.kr()[0] """ minimum = param(0.0) diff --git a/supriya/ugens/ml.py b/supriya/ugens/ml.py index d7fe3025c..66492db71 100644 --- a/supriya/ugens/ml.py +++ b/supriya/ugens/ml.py @@ -3,7 +3,7 @@ from uqbar.enums import IntEnumeration from ..enums import CalculationRate -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(kr=True, channel_count=4, fixed_channel_count=True) @@ -20,7 +20,7 @@ class BeatTrack(UGen): ... lock=0, ... ) >>> beat_track - UGenArray({4}) + UGenVector({4}) """ pv_chain = param() @@ -43,7 +43,7 @@ class BeatTrack2(UGen): ... window_size=2, ... ) >>> beat_track_2 - UGenArray({6}) + UGenVector({6}) """ bus_index = param(0.0) @@ -69,7 +69,7 @@ class KeyTrack(UGen): ... key_decay=2, ... ) >>> key_track - KeyTrack.kr() + KeyTrack.kr()[0] """ pv_chain = param() @@ -92,7 +92,7 @@ class Loudness(UGen): ... tmask=1, ... ) >>> loudness - Loudness.kr() + Loudness.kr()[0] """ pv_chain = param() @@ -113,7 +113,7 @@ class MFCC(UGen): ... pv_chain=pv_chain, ... ) >>> mfcc - UGenArray({13}) + UGenVector({13}) """ pv_chain = param() @@ -150,7 +150,7 @@ class Onsets(UGen): ... whtype=1, ... ) >>> onsets - Onsets.kr() + Onsets.kr()[0] """ class ODFType(IntEnumeration): @@ -183,7 +183,7 @@ class Pitch(UGen): >>> source = supriya.ugens.In.ar(bus=0) >>> pitch = supriya.ugens.Pitch.kr(source=source) >>> pitch - UGenArray({2}) + UGenVector({2}) """ source = param() @@ -212,7 +212,7 @@ class SpecCentroid(UGen): ... pv_chain=pv_chain, ... ) >>> spec_centroid - SpecCentroid.kr() + SpecCentroid.kr()[0] """ pv_chain = param() @@ -231,7 +231,7 @@ class SpecFlatness(UGen): ... pv_chain=pv_chain, ... ) >>> spec_flatness - SpecFlatness.kr() + SpecFlatness.kr()[0] """ pv_chain = param() @@ -252,7 +252,7 @@ class SpecPcile(UGen): ... interpolate=0, ... ) >>> spec_pcile - SpecPcile.kr() + SpecPcile.kr()[0] """ pv_chain = param() diff --git a/supriya/ugens/noise.py b/supriya/ugens/noise.py index d6236a319..0b05f3295 100644 --- a/supriya/ugens/noise.py +++ b/supriya/ugens/noise.py @@ -1,7 +1,7 @@ from typing import Any, Dict, Tuple from ..enums import CalculationRate, SignalRange -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True, kr=True) @@ -12,7 +12,7 @@ class BrownNoise(UGen): :: >>> supriya.ugens.BrownNoise.ar() - BrownNoise.ar() + BrownNoise.ar()[0] """ @@ -24,7 +24,7 @@ class ClipNoise(UGen): :: >>> supriya.ugens.ClipNoise.ar() - ClipNoise.ar() + ClipNoise.ar()[0] """ @@ -41,7 +41,7 @@ class CoinGate(UGen): ... trigger=trigger, ... ) >>> coin_gate - CoinGate.ar() + CoinGate.ar()[0] """ probability = param(0.5) @@ -59,7 +59,7 @@ class Crackle(UGen): ... chaos_parameter=1.25, ... ) >>> crackle - Crackle.ar() + Crackle.ar()[0] """ chaos_parameter = param(1.5) @@ -76,7 +76,7 @@ class Dust(UGen): ... density=23, ... ) >>> dust - Dust.ar() + Dust.ar()[0] """ density = param(0.0) @@ -93,7 +93,7 @@ class Dust2(UGen): ... density=23, ... ) >>> dust_2 - Dust2.ar() + Dust2.ar()[0] """ density = param(0.0) @@ -108,7 +108,7 @@ class ExpRand(UGen): >>> exp_rand = supriya.ugens.ExpRand.ir() >>> exp_rand - ExpRand.ir() + ExpRand.ir()[0] """ minimum = param(0.0) @@ -137,7 +137,7 @@ class GrayNoise(UGen): :: >>> supriya.ugens.GrayNoise.ar() - GrayNoise.ar() + GrayNoise.ar()[0] """ @@ -153,7 +153,7 @@ class Hasher(UGen): ... source=source, ... ) >>> hasher - Hasher.ar() + Hasher.ar()[0] """ source = param() @@ -167,7 +167,7 @@ class IRand(UGen): :: >>> supriya.ugens.IRand.ir() - IRand.ir() + IRand.ir()[0] """ minimum = param(0) @@ -182,7 +182,7 @@ class LFClipNoise(UGen): :: >>> supriya.ugens.LFClipNoise.ar() - LFClipNoise.ar() + LFClipNoise.ar()[0] """ frequency = param(500.0) @@ -196,7 +196,7 @@ class LFDClipNoise(UGen): :: >>> supriya.ugens.LFDClipNoise.ar() - LFDClipNoise.ar() + LFDClipNoise.ar()[0] """ frequency = param(500.0) @@ -210,7 +210,7 @@ class LFDNoise0(UGen): :: >>> supriya.ugens.LFDNoise0.ar() - LFDNoise0.ar() + LFDNoise0.ar()[0] """ frequency = param(500.0) @@ -224,7 +224,7 @@ class LFDNoise1(UGen): :: >>> supriya.ugens.LFDNoise1.ar() - LFDNoise1.ar() + LFDNoise1.ar()[0] """ frequency = param(500.0) @@ -238,7 +238,7 @@ class LFDNoise3(UGen): :: >>> supriya.ugens.LFDNoise3.ar() - LFDNoise3.ar() + LFDNoise3.ar()[0] """ frequency = param(500.0) @@ -252,7 +252,7 @@ class LFNoise0(UGen): :: >>> supriya.ugens.LFNoise0.ar() - LFNoise0.ar() + LFNoise0.ar()[0] """ frequency = param(500.0) @@ -266,7 +266,7 @@ class LFNoise1(UGen): :: >>> supriya.ugens.LFNoise1.ar() - LFNoise1.ar() + LFNoise1.ar()[0] """ frequency = param(500.0) @@ -280,7 +280,7 @@ class LFNoise2(UGen): :: >>> supriya.ugens.LFNoise2.ar() - LFNoise2.ar() + LFNoise2.ar()[0] """ frequency = param(500.0) @@ -299,7 +299,7 @@ class LinRand(UGen): ... skew=0.5, ... ) >>> lin_rand - LinRand.ir() + LinRand.ir()[0] """ minimum = param(0.0) @@ -320,7 +320,7 @@ class Logistic(UGen): ... initial_y=0.5, ... ) >>> logistic - Logistic.ar() + Logistic.ar()[0] """ chaos_parameter = param(3) @@ -341,7 +341,7 @@ class MantissaMask(UGen): ... bits=3, ... ) >>> mantissa_mask - MantissaMask.ar() + MantissaMask.ar()[0] """ source = param(0) @@ -361,7 +361,7 @@ class NRand(UGen): ... n=1, ... ) >>> n_rand - NRand.ir() + NRand.ir()[0] """ minimum = param(0.0) @@ -377,7 +377,7 @@ class PinkNoise(UGen): :: >>> supriya.ugens.PinkNoise.ar() - PinkNoise.ar() + PinkNoise.ar()[0] """ @@ -389,7 +389,7 @@ class Rand(UGen): :: >>> supriya.ugens.Rand.ir() - Rand.ir() + Rand.ir()[0] """ minimum = param(0.0) @@ -407,7 +407,7 @@ class RandID(UGen): ... rand_id=1, ... ) >>> rand_id - RandID.ir() + RandID.ir()[0] """ rand_id = param(1) @@ -426,7 +426,7 @@ class RandSeed(UGen): ... trigger=trigger, ... ) >>> rand_seed - RandSeed.ar() + RandSeed.ar()[0] """ trigger = param(0) @@ -447,7 +447,7 @@ class TExpRand(UGen): ... trigger=trigger, ... ) >>> t_exp_rand - TExpRand.ar() + TExpRand.ar()[0] """ minimum = param(0.01) @@ -469,7 +469,7 @@ class TIRand(UGen): ... trigger=trigger, ... ) >>> t_i_rand - TIRand.ar() + TIRand.ar()[0] """ minimum = param(0) @@ -501,7 +501,7 @@ class TRand(UGen): ... trigger=trigger, ... ) >>> t_rand - TRand.ar() + TRand.ar()[0] """ minimum = param(0.0) @@ -523,7 +523,7 @@ class TWindex(UGen): ... array=[1, 2, 3], ... ) >>> t_windex - TWindex.ar() + TWindex.ar()[0] """ trigger = param() @@ -539,5 +539,5 @@ class WhiteNoise(UGen): :: >>> supriya.ugens.WhiteNoise.ar() - WhiteNoise.ar() + WhiteNoise.ar()[0] """ diff --git a/supriya/ugens/osc.py b/supriya/ugens/osc.py index 146b2f386..afe08de4f 100644 --- a/supriya/ugens/osc.py +++ b/supriya/ugens/osc.py @@ -1,7 +1,7 @@ from typing import Any, Dict, Tuple from ..enums import CalculationRate, DoneAction -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True, kr=True, is_pure=True) @@ -17,7 +17,7 @@ class COsc(UGen): ... frequency=440, ... ) >>> cosc - COsc.ar() + COsc.ar()[0] """ buffer_id = param() @@ -39,7 +39,7 @@ class DegreeToKey(UGen): ... source=source, ... ) >>> degree_to_key - DegreeToKey.ar() + DegreeToKey.ar()[0] """ buffer_id = param() @@ -55,7 +55,7 @@ class Impulse(UGen): :: >>> supriya.ugens.Impulse.ar() - Impulse.ar() + Impulse.ar()[0] """ frequency = param(440.0) @@ -75,7 +75,7 @@ class Index(UGen): ... source=source, ... ) >>> index - Index.ar() + Index.ar()[0] """ buffer_id = param() @@ -90,7 +90,7 @@ class LFCub(UGen): :: >>> supriya.ugens.LFCub.ar() - LFCub.ar() + LFCub.ar()[0] """ frequency = param(440.0) @@ -105,7 +105,7 @@ class LFGauss(UGen): :: >>> supriya.ugens.LFGauss.ar() - LFGauss.ar() + LFGauss.ar()[0] """ duration = param(1) @@ -134,7 +134,7 @@ class LFPar(UGen): :: >>> supriya.ugens.LFPar.ar() - LFPar.ar() + LFPar.ar()[0] """ frequency = param(440.0) @@ -149,7 +149,7 @@ class LFPulse(UGen): :: >>> supriya.ugens.LFPulse.ar() - LFPulse.ar() + LFPulse.ar()[0] """ frequency = param(440.0) @@ -165,7 +165,7 @@ class LFSaw(UGen): :: >>> supriya.ugens.LFSaw.ar() - LFSaw.ar() + LFSaw.ar()[0] """ frequency = param(440.0) @@ -180,7 +180,7 @@ class LFTri(UGen): :: >>> supriya.ugens.LFTri.ar() - LFTri.ar() + LFTri.ar()[0] """ frequency = param(440.0) @@ -223,7 +223,7 @@ class Select(UGen): ... selector=selector, ... ) >>> select - Select.ar() + Select.ar()[0] """ selector = param() @@ -238,7 +238,7 @@ class SinOsc(UGen): :: >>> supriya.ugens.SinOsc.ar() - SinOsc.ar() + SinOsc.ar()[0] :: @@ -267,7 +267,7 @@ class SyncSaw(UGen): ... sync_frequency=440, ... ) >>> sync_saw - SyncSaw.ar() + SyncSaw.ar()[0] """ sync_frequency = param(440.0) @@ -287,7 +287,7 @@ class VOsc(UGen): ... phase=0, ... ) >>> vosc - VOsc.ar() + VOsc.ar()[0] """ buffer_id = param() @@ -309,7 +309,7 @@ class VOsc3(UGen): ... freq_3=440, ... ) >>> vosc_3 - VOsc3.ar() + VOsc3.ar()[0] """ buffer_id = param() @@ -326,7 +326,7 @@ class VarSaw(UGen): :: >>> supriya.ugens.VarSaw.ar() - VarSaw.ar() + VarSaw.ar()[0] """ frequency = param(440.0) @@ -352,7 +352,7 @@ class Vibrato(UGen): ... rate_variation=0.04, ... ) >>> vibrato - Vibrato.ar() + Vibrato.ar()[0] """ frequency = param(440) @@ -378,7 +378,7 @@ class WrapIndex(UGen): ... source=source, ... ) >>> wrap_index - WrapIndex.ar() + WrapIndex.ar()[0] """ buffer_id = param() diff --git a/supriya/ugens/panning.py b/supriya/ugens/panning.py index 15b6e2ab5..dceaadcff 100644 --- a/supriya/ugens/panning.py +++ b/supriya/ugens/panning.py @@ -2,8 +2,8 @@ import math from ..enums import CalculationRate -from .bases import PseudoUGen, UGen, param, ugen from .basic import Mix +from .core import PseudoUGen, UGen, param, ugen @ugen(ar=True, kr=True, channel_count=2, fixed_channel_count=True) @@ -22,7 +22,7 @@ class Balance2(UGen): ... right=right, ... ) >>> balance_2 - UGenArray({2}) + UGenVector({2}) """ left = param() @@ -47,7 +47,7 @@ class BiPanB2(UGen): ... in_b=in_b, ... ) >>> bi_pan_b_2 - UGenArray({3}) + UGenVector({3}) :: @@ -80,7 +80,7 @@ class DecodeB2(UGen): ... y=y, ... ) >>> decode_b_2 - UGenArray({4}) + UGenVector({4}) """ w = param() @@ -101,7 +101,7 @@ class Pan2(UGen): ... source=source, ... ) >>> pan_2 - UGenArray({2}) + UGenVector({2}) """ source = param() @@ -124,7 +124,7 @@ class Pan4(UGen): ... y_position=0, ... ) >>> pan_4 - UGenArray({4}) + UGenVector({4}) """ source = param() @@ -150,7 +150,7 @@ class PanAz(UGen): ... width=2, ... ) >>> pan_az - UGenArray({8}) + UGenVector({8}) """ source = param() @@ -175,7 +175,7 @@ class PanB(UGen): ... source=source, ... ) >>> pan_b - UGenArray({3}) + UGenVector({3}) """ source = param() @@ -198,7 +198,7 @@ class PanB2(UGen): ... source=source, ... ) >>> pan_b_2 - UGenArray({3}) + UGenVector({3}) """ source = param() @@ -223,7 +223,7 @@ class Rotate2(UGen): ... position=position, ... ) >>> rotate_2 - UGenArray({2}) + UGenVector({2}) Returns an array of the rotator's left and right outputs. """ @@ -242,7 +242,7 @@ class Splay(PseudoUGen): >>> source = supriya.ugens.SinOsc.ar(frequency=[333, 444, 555, 666, 777]) >>> splay = supriya.ugens.Splay.ar(source=source) >>> splay - UGenArray({2}) + UGenVector({2}) :: @@ -396,7 +396,7 @@ class XFade2(UGen): ... pan=supriya.ugens.LFTri.kr(frequency=0.1), ... ) >>> xfade_3 - XFade2.ar() + XFade2.ar()[0] """ in_a = param() diff --git a/supriya/ugens/physical.py b/supriya/ugens/physical.py index 1e8c63c05..894488287 100644 --- a/supriya/ugens/physical.py +++ b/supriya/ugens/physical.py @@ -1,4 +1,4 @@ -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True, kr=True) @@ -16,7 +16,7 @@ class Ball(UGen): ... source=source, ... ) >>> ball - Ball.ar() + Ball.ar()[0] """ source = param() @@ -43,7 +43,7 @@ class Pluck(UGen): ... trigger=trigger, ... ) >>> pluck - Pluck.ar() + Pluck.ar()[0] """ source = param() @@ -68,7 +68,7 @@ class Spring(UGen): ... spring=1, ... ) >>> spring - Spring.ar() + Spring.ar()[0] """ source = param() @@ -91,7 +91,7 @@ class TBall(UGen): ... source=source, ... ) >>> tball - TBall.ar() + TBall.ar()[0] """ source = param() diff --git a/supriya/ugens/pv.py b/supriya/ugens/pv.py index 354ff97a2..fd3503d4e 100644 --- a/supriya/ugens/pv.py +++ b/supriya/ugens/pv.py @@ -2,8 +2,8 @@ from ..enums import CalculationRate from ..typing import Default -from .bases import UGen, UGenOperable, param, ugen from .bufio import LocalBuf +from .core import UGen, UGenOperable, param, ugen from .info import BufFrames @@ -41,7 +41,7 @@ class FFT(PV_ChainUGen): ... window_type=0, ... ) >>> fft - FFT.kr() + FFT.kr()[0] """ ### CLASS VARIABLES ### @@ -88,7 +88,7 @@ class IFFT(UGen): ... window_type=0, ... ) >>> ifft - IFFT.ar() + IFFT.ar()[0] """ pv_chain = param() @@ -114,7 +114,7 @@ class PV_Add(PV_ChainUGen): ... pv_chain_b=pv_chain_b, ... ) >>> pv_add - PV_Add.kr() + PV_Add.kr()[0] """ pv_chain_a = param() @@ -138,7 +138,7 @@ class PV_BinScramble(PV_ChainUGen): ... wipe=0, ... ) >>> pv_bin_scramble - PV_BinScramble.kr() + PV_BinScramble.kr()[0] """ pv_chain = param() @@ -164,7 +164,7 @@ class PV_BinShift(PV_ChainUGen): ... stretch=1, ... ) >>> pv_bin_shift - PV_BinShift.kr() + PV_BinShift.kr()[0] """ pv_chain = param() @@ -192,7 +192,7 @@ class PV_BinWipe(PV_ChainUGen): ... wipe=0, ... ) >>> pv_bin_wipe - PV_BinWipe.kr() + PV_BinWipe.kr()[0] """ pv_chain_a = param() @@ -220,7 +220,7 @@ class PV_BrickWall(PV_ChainUGen): ... wipe=0, ... ) >>> pv_brick_wall - PV_BrickWall.kr() + PV_BrickWall.kr()[0] """ pv_chain = param() @@ -243,7 +243,7 @@ class PV_ConformalMap(PV_ChainUGen): ... pv_chain=pv_chain, ... ) >>> pv_conformal_map - PV_ConformalMap.kr() + PV_ConformalMap.kr()[0] """ pv_chain = param() @@ -265,7 +265,7 @@ class PV_Conj(PV_ChainUGen): ... pv_chain=pv_chain, ... ) >>> pv_conj - PV_Conj.kr() + PV_Conj.kr()[0] """ pv_chain = param() @@ -289,7 +289,7 @@ class PV_Copy(PV_ChainUGen): ... pv_chain_b=pv_chain_b, ... ) >>> pv_copy - PV_Copy.kr() + PV_Copy.kr()[0] """ pv_chain_a = param() @@ -314,7 +314,7 @@ class PV_CopyPhase(PV_ChainUGen): ... pv_chain_b=pv_chain_b, ... ) >>> pv_copy_phase - PV_CopyPhase.kr() + PV_CopyPhase.kr()[0] """ pv_chain_a = param() @@ -336,7 +336,7 @@ class PV_Diffuser(PV_ChainUGen): ... trigger=0, ... ) >>> pv_diffuser - PV_Diffuser.kr() + PV_Diffuser.kr()[0] """ pv_chain = param() @@ -361,7 +361,7 @@ class PV_Div(PV_ChainUGen): ... pv_chain_b=pv_chain_b, ... ) >>> pv_div - PV_Div.kr() + PV_Div.kr()[0] """ pv_chain_a = param() @@ -386,7 +386,7 @@ class PV_HainsworthFoote(PV_ChainUGen): ... waittime=0.04, ... ) >>> pv_hainsworth_foote - PV_HainsworthFoote.kr() + PV_HainsworthFoote.kr()[0] """ pv_chain = param() @@ -416,7 +416,7 @@ class PV_JensenAndersen(PV_ChainUGen): ... waittime=0.04, ... ) >>> pv_jensen_andersen - PV_JensenAndersen.kr() + PV_JensenAndersen.kr()[0] """ pv_chain = param() @@ -443,7 +443,7 @@ class PV_LocalMax(PV_ChainUGen): ... threshold=0, ... ) >>> pv_local_max - PV_LocalMax.kr() + PV_LocalMax.kr()[0] """ pv_chain = param() @@ -465,7 +465,7 @@ class PV_MagAbove(PV_ChainUGen): ... threshold=0, ... ) >>> pv_mag_above - PV_MagAbove.kr() + PV_MagAbove.kr()[0] """ pv_chain = param() @@ -487,7 +487,7 @@ class PV_MagBelow(PV_ChainUGen): ... threshold=0, ... ) >>> pv_mag_below - PV_MagBelow.kr() + PV_MagBelow.kr()[0] """ pv_chain = param() @@ -509,7 +509,7 @@ class PV_MagClip(PV_ChainUGen): ... threshold=0, ... ) >>> pv_mag_clip - PV_MagClip.kr() + PV_MagClip.kr()[0] """ pv_chain = param() @@ -535,7 +535,7 @@ class PV_MagDiv(PV_ChainUGen): ... zeroed=0.0001, ... ) >>> pv_mag_div - PV_MagDiv.kr() + PV_MagDiv.kr()[0] """ pv_chain_a = param() @@ -558,7 +558,7 @@ class PV_MagFreeze(PV_ChainUGen): ... freeze=0, ... ) >>> pv_mag_freeze - PV_MagFreeze.kr() + PV_MagFreeze.kr()[0] """ pv_chain = param() @@ -583,7 +583,7 @@ class PV_MagMul(PV_ChainUGen): ... pv_chain_b=pv_chain_b, ... ) >>> pv_mag_mul - PV_MagMul.kr() + PV_MagMul.kr()[0] """ pv_chain_a = param() @@ -604,7 +604,7 @@ class PV_MagNoise(PV_ChainUGen): ... pv_chain=pv_chain, ... ) >>> pv_mag_noise - PV_MagNoise.kr() + PV_MagNoise.kr()[0] """ pv_chain = param() @@ -626,7 +626,7 @@ class PV_MagShift(PV_ChainUGen): ... stretch=1, ... ) >>> pv_mag_shift - PV_MagShift.kr() + PV_MagShift.kr()[0] """ pv_chain = param() @@ -649,7 +649,7 @@ class PV_MagSmear(PV_ChainUGen): ... pv_chain=pv_chain, ... ) >>> pv_mag_smear - PV_MagSmear.kr() + PV_MagSmear.kr()[0] """ pv_chain = param() @@ -670,7 +670,7 @@ class PV_MagSquared(PV_ChainUGen): ... pv_chain=pv_chain, ... ) >>> pv_mag_squared - PV_MagSquared.kr() + PV_MagSquared.kr()[0] """ pv_chain = param() @@ -694,7 +694,7 @@ class PV_Max(PV_ChainUGen): ... pv_chain_b=pv_chain_b, ... ) >>> pv_max - PV_Max.kr() + PV_Max.kr()[0] """ pv_chain_a = param() @@ -719,7 +719,7 @@ class PV_Min(PV_ChainUGen): ... pv_chain_b=pv_chain_b, ... ) >>> pv_min - PV_Min.kr() + PV_Min.kr()[0] """ pv_chain_a = param() @@ -744,7 +744,7 @@ class PV_Mul(PV_ChainUGen): ... pv_chain_b=pv_chain_b, ... ) >>> pv_mul - PV_Mul.kr() + PV_Mul.kr()[0] """ pv_chain_a = param() @@ -768,7 +768,7 @@ class PV_PhaseShift(PV_ChainUGen): ... shift=shift, ... ) >>> pv_phase_shift - PV_PhaseShift.kr() + PV_PhaseShift.kr()[0] """ pv_chain = param() @@ -790,7 +790,7 @@ class PV_PhaseShift270(PV_ChainUGen): ... pv_chain=pv_chain, ... ) >>> pv_phase_shift_270 - PV_PhaseShift270.kr() + PV_PhaseShift270.kr()[0] """ pv_chain = param() @@ -810,7 +810,7 @@ class PV_PhaseShift90(PV_ChainUGen): ... pv_chain=pv_chain, ... ) >>> pv_phase_shift_90 - PV_PhaseShift90.kr() + PV_PhaseShift90.kr()[0] """ pv_chain = param() @@ -832,7 +832,7 @@ class PV_RandComb(PV_ChainUGen): ... wipe=0, ... ) >>> pv_rand_comb - PV_RandComb.kr() + PV_RandComb.kr()[0] """ pv_chain = param() @@ -860,7 +860,7 @@ class PV_RandWipe(PV_ChainUGen): ... wipe=0, ... ) >>> pv_rand_wipe - PV_RandWipe.kr() + PV_RandWipe.kr()[0] """ pv_chain_a = param() @@ -886,7 +886,7 @@ class PV_RectComb(PV_ChainUGen): ... width=0.5, ... ) >>> pv_rect_comb - PV_RectComb.kr() + PV_RectComb.kr()[0] """ pv_chain = param() @@ -916,7 +916,7 @@ class PV_RectComb2(PV_ChainUGen): ... width=0.5, ... ) >>> pv_rect_comb_2 - PV_RectComb2.kr() + PV_RectComb2.kr()[0] """ pv_chain_a = param() @@ -939,7 +939,7 @@ class RunningSum(UGen): ... source=source, ... ) >>> running_sum - RunningSum.ar() + RunningSum.ar()[0] """ source = param() diff --git a/supriya/ugens/reverb.py b/supriya/ugens/reverb.py index 7f0f0a128..392ca8352 100644 --- a/supriya/ugens/reverb.py +++ b/supriya/ugens/reverb.py @@ -1,4 +1,4 @@ -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True) @@ -12,7 +12,7 @@ class FreeVerb(UGen): >>> supriya.ugens.FreeVerb.ar( ... source=source, ... ) - FreeVerb.ar() + FreeVerb.ar()[0] """ source = param() diff --git a/supriya/ugens/safety.py b/supriya/ugens/safety.py index 186b7e127..caf89007f 100644 --- a/supriya/ugens/safety.py +++ b/supriya/ugens/safety.py @@ -1,7 +1,7 @@ from typing import Any, Dict, Tuple from ..enums import CalculationRate -from .bases import UGen, param, ugen +from .core import UGen, param, ugen @ugen(ar=True, kr=True) @@ -20,7 +20,7 @@ class CheckBadValues(UGen): ... post_mode=post_mode, ... ) >>> check_bad_values - CheckBadValues.ar() + CheckBadValues.ar()[0] """ source = param() diff --git a/supriya/ugens/triggers.py b/supriya/ugens/triggers.py index 6530e24e4..9cf3b2df3 100644 --- a/supriya/ugens/triggers.py +++ b/supriya/ugens/triggers.py @@ -1,5 +1,5 @@ from ..enums import CalculationRate -from .bases import OutputProxy, UGen, param, ugen +from .core import OutputProxy, UGen, param, ugen @ugen(ar=True, kr=True, ir=True) @@ -16,7 +16,7 @@ class Clip(UGen): ... source=source, ... ) >>> clip - Clip.ar() + Clip.ar()[0] """ source = param() @@ -38,7 +38,7 @@ class Fold(UGen): ... source=source, ... ) >>> fold - Fold.ar() + Fold.ar()[0] """ source = param() @@ -60,7 +60,7 @@ class Gate(UGen): ... trigger=trigger, ... ) >>> gate - Gate.ar() + Gate.ar()[0] """ source = param() @@ -81,7 +81,7 @@ class InRange(UGen): ... source=source, ... ) >>> in_range - InRange.ar() + InRange.ar()[0] """ source = param() @@ -103,7 +103,7 @@ class Latch(UGen): ... trigger=trigger, ... ) >>> latch - Latch.ar() + Latch.ar()[0] """ source = param() @@ -122,7 +122,7 @@ class LeastChange(UGen): ... b=0, ... ) >>> least_change - LeastChange.ar() + LeastChange.ar()[0] """ a = param(0) @@ -141,7 +141,7 @@ class MostChange(UGen): ... b=0, ... ) >>> most_change - MostChange.ar() + MostChange.ar()[0] """ a = param(0) @@ -162,7 +162,7 @@ class Peak(UGen): ... trigger=trigger, ... ) >>> peak - Peak.ar() + Peak.ar()[0] """ source = param() @@ -182,7 +182,7 @@ class PeakFollower(UGen): ... source=source, ... ) >>> peak_follower - PeakFollower.ar() + PeakFollower.ar()[0] """ source = param() @@ -205,7 +205,7 @@ class Phasor(UGen): ... trigger=trigger, ... ) >>> phasor - Phasor.ar() + Phasor.ar()[0] """ trigger = param(0) @@ -230,7 +230,7 @@ class Poll(UGen): ... trigger_id=1234, ... ) >>> poll - Poll.ar() + Poll.ar()[0] .. container:: example @@ -358,7 +358,7 @@ def label(self): ... source=sine, ... trigger=trigger, ... trigger_id=1234, - ... ) + ... ).source >>> poll.label 'Foo' @@ -385,7 +385,7 @@ class RunningMax(UGen): ... trigger=0, ... ) >>> running_max - RunningMax.ar() + RunningMax.ar()[0] """ source = param() @@ -406,7 +406,7 @@ class RunningMin(UGen): ... trigger=trigger, ... ) >>> running_min - RunningMin.ar() + RunningMin.ar()[0] """ source = param() @@ -427,7 +427,7 @@ class Schmidt(UGen): ... source=source, ... ) >>> schmidt - Schmidt.ar() + Schmidt.ar()[0] """ source = param() @@ -634,7 +634,7 @@ class Sweep(UGen): ... trigger=0, ... ) >>> sweep - Sweep.ar() + Sweep.ar()[0] """ trigger = param(0) @@ -654,7 +654,7 @@ class TDelay(UGen): ... source=source, ... ) >>> tdelay - TDelay.ar() + TDelay.ar()[0] """ source = param() @@ -673,7 +673,7 @@ class ToggleFF(UGen): ... trigger=trigger, ... ) >>> toggle_ff - ToggleFF.ar() + ToggleFF.ar()[0] """ trigger = param(0) @@ -692,7 +692,7 @@ class Trig1(UGen): ... source=source, ... ) >>> trig_1 - Trig1.ar() + Trig1.ar()[0] """ source = param() @@ -712,7 +712,7 @@ class Trig(UGen): ... source=source, ... ) >>> trig - Trig.ar() + Trig.ar()[0] """ source = param() @@ -733,7 +733,7 @@ class Wrap(UGen): ... source=source, ... ) >>> wrap - Wrap.ar() + Wrap.ar()[0] """ source = param() @@ -753,7 +753,7 @@ class ZeroCrossing(UGen): ... source=source, ... ) >>> zero_crossing - ZeroCrossing.ar() + ZeroCrossing.ar()[0] """ source = param() diff --git a/supriya/utils/iterables.py b/supriya/utils/iterables.py index 0e82ee47e..6fc8cf1b6 100644 --- a/supriya/utils/iterables.py +++ b/supriya/utils/iterables.py @@ -12,7 +12,7 @@ ) T = TypeVar("T") -TI = Iterable[Union[T, "TI"]] +IT = Iterable[Union[T, "IT"]] class Expander(Generic[T]): @@ -55,7 +55,7 @@ def expand( return Expander[T]()(mapping, unexpanded, only) -def flatten(iterable: TI) -> Generator[T, None, None]: +def flatten(iterable: IT) -> Generator[T, None, None]: for x in iterable: if isinstance(x, Iterable): yield from flatten(x) diff --git a/tests/book/test_ext_book.py b/tests/book/test_ext_book.py index 3fc8c5997..5122a155a 100644 --- a/tests/book/test_ext_book.py +++ b/tests/book/test_ext_book.py @@ -28,13 +28,12 @@ def test_sphinx_book_html(caplog, app, status, warning, rm_dirs): assert not warning.getvalue().strip() image_path = pathlib.Path(app.outdir) / "_images" expected_file_names = [ - "audio-08abe38d842cbaa19789618fe4675f1cf64de0eb6f9ab7ebd2165c078ce31429.mp3", - "audio-08abe38d842cbaa19789618fe4675f1cf64de0eb6f9ab7ebd2165c078ce31429.wav", - "plot-397eb6446e5486ac9137cb98affdda8577148ae41ef7857807f53be0793bc74a.svg", + "audio-4f0fd44621b74146c936fab67a7544438ddb60abe59b506082268778ec2e285f.mp3", + "audio-4f0fd44621b74146c936fab67a7544438ddb60abe59b506082268778ec2e285f.wav", + "plot-6e8cafcdb775004ffba3051b743f9d5a539d541c6601f723ecfcc3145f0217b4.svg", "score-759292a876c9e866721fda737f939bcc7e84e04108d6adb207480e887de6b24a.aiff", "score-759292a876c9e866721fda737f939bcc7e84e04108d6adb207480e887de6b24a.osc", ] - if platform.system() != "Windows": expected_file_names.extend( [ diff --git a/tests/contexts/test_Score_nodes.py b/tests/contexts/test_Score_nodes.py index f749b3129..6e5fecb44 100644 --- a/tests/contexts/test_Score_nodes.py +++ b/tests/contexts/test_Score_nodes.py @@ -4,7 +4,7 @@ from supriya.assets.synthdefs import test_two_voice from supriya.contexts.nonrealtime import Score from supriya.osc import OscBundle, OscMessage -from supriya.synthdefs import SynthDefCompiler +from supriya.ugens import compile_synthdefs @pytest.fixture @@ -50,7 +50,7 @@ def test_add_group(context): def test_add_synth(context): def compiled(x): - return SynthDefCompiler.compile_synthdefs(x) + return compile_synthdefs(x) with context.at(0): context.add_synthdefs(default) diff --git a/tests/contexts/test_Score_synthdefs.py b/tests/contexts/test_Score_synthdefs.py index e60afe490..1525861e2 100644 --- a/tests/contexts/test_Score_synthdefs.py +++ b/tests/contexts/test_Score_synthdefs.py @@ -5,8 +5,7 @@ from supriya.contexts.errors import MomentClosed from supriya.contexts.nonrealtime import Score from supriya.osc import OscBundle, OscMessage -from supriya.synthdefs import SynthDefBuilder, SynthDefCompiler -from supriya.ugens import Out, SinOsc +from supriya.ugens import Out, SinOsc, SynthDefBuilder, compile_synthdefs @pytest.fixture(autouse=True) @@ -31,7 +30,7 @@ def synthdefs(): def test_add_synthdefs(context, synthdefs): def compiled(x): - return SynthDefCompiler.compile_synthdefs(x) + return compile_synthdefs(x) with context.at(0): # no synthdefs provided diff --git a/tests/contexts/test_Server_synthdefs.py b/tests/contexts/test_Server_synthdefs.py index e4b5b9076..ce827c4cf 100644 --- a/tests/contexts/test_Server_synthdefs.py +++ b/tests/contexts/test_Server_synthdefs.py @@ -7,8 +7,7 @@ from supriya.contexts.errors import MomentClosed from supriya.contexts.realtime import AsyncServer, Server from supriya.osc import OscBundle, OscMessage -from supriya.synthdefs import SynthDefBuilder, SynthDefCompiler -from supriya.ugens import Out, SinOsc +from supriya.ugens import Out, SinOsc, SynthDefBuilder, compile_synthdefs async def get(x): @@ -42,7 +41,7 @@ def synthdefs(): @pytest.mark.asyncio async def test_add_synthdefs(context, synthdefs): def compiled(x): - return SynthDefCompiler.compile_synthdefs(x) + return compile_synthdefs(x) with context.osc_protocol.capture() as transcript: # no synthdefs provided diff --git a/tests/patterns/test_FxPattern.py b/tests/patterns/test_FxPattern.py index ae73b021d..611d7af8e 100644 --- a/tests/patterns/test_FxPattern.py +++ b/tests/patterns/test_FxPattern.py @@ -13,8 +13,7 @@ ) from supriya.patterns.testutils import MockUUID as M from supriya.patterns.testutils import run_pattern_test -from supriya.synthdefs import SynthDefBuilder -from supriya.ugens import FreeVerb, In, Out +from supriya.ugens import FreeVerb, In, Out, SynthDefBuilder with SynthDefBuilder(in_=0, out=0, mix=0.0) as builder: in_ = In.ar(bus=builder["in_"], channel_count=2) diff --git a/tests/synthdefs/__init__.py b/tests/ugens/__init__.py similarity index 100% rename from tests/synthdefs/__init__.py rename to tests/ugens/__init__.py diff --git a/tests/synthdefs/test_synthdefs_SynthDefFactory.py b/tests/ugens/test_SynthDefFactory.py similarity index 95% rename from tests/synthdefs/test_synthdefs_SynthDefFactory.py rename to tests/ugens/test_SynthDefFactory.py index 3b218b6ea..a8ecf609e 100644 --- a/tests/synthdefs/test_synthdefs_SynthDefFactory.py +++ b/tests/ugens/test_SynthDefFactory.py @@ -1,12 +1,12 @@ from uqbar.strings import normalize -import supriya.ugens -from supriya.synthdefs import SynthDefFactory +from supriya.ugens import SinOsc +from supriya.ugens.factories import SynthDefFactory def test_gate_01(): def signal_block(builder, source, state): - return supriya.ugens.SinOsc.ar() + return SinOsc.ar() factory = SynthDefFactory(channel_count=1) factory = factory.with_signal_block(signal_block) @@ -40,7 +40,7 @@ def signal_block(builder, source, state): def test_gate_02(): def signal_block(builder, source, state): - return supriya.ugens.SinOsc.ar() + return SinOsc.ar() factory = SynthDefFactory(channel_count=1) factory = factory.with_signal_block(signal_block) @@ -75,7 +75,7 @@ def signal_block(builder, source, state): def test_gate_03(): def signal_block(builder, source, state): - return supriya.ugens.SinOsc.ar() + return SinOsc.ar() factory = SynthDefFactory(channel_count=1) factory = factory.with_signal_block(signal_block) @@ -117,7 +117,7 @@ def signal_block(builder, source, state): def test_gate_04(): def signal_block(builder, source, state): - return supriya.ugens.SinOsc.ar() + return SinOsc.ar() factory = SynthDefFactory(channel_count=1) factory = factory.with_signal_block(signal_block) diff --git a/tests/synthdefs/test_synthdefs_SynthDef___str__.py b/tests/ugens/test_SynthDef___str__.py similarity index 75% rename from tests/synthdefs/test_synthdefs_SynthDef___str__.py rename to tests/ugens/test_SynthDef___str__.py index b1b394323..1f533d0e7 100644 --- a/tests/synthdefs/test_synthdefs_SynthDef___str__.py +++ b/tests/ugens/test_SynthDef___str__.py @@ -1,15 +1,14 @@ from uqbar.strings import normalize -import supriya.synthdefs -import supriya.ugens +from supriya.ugens import Mix, Out, SinOsc, SynthDefBuilder def test_multi_value_parameters(): - with supriya.synthdefs.SynthDefBuilder(amp=0.1, freqs=[300, 400], out=0) as builder: - sines = supriya.ugens.SinOsc.ar(frequency=builder["freqs"]) - sines = supriya.ugens.Mix.new(sines) + with SynthDefBuilder(amp=0.1, freqs=[300, 400], out=0) as builder: + sines = SinOsc.ar(frequency=builder["freqs"]) + sines = Mix.new(sines) sines = sines * builder["amp"] - supriya.ugens.Out.ar(bus=builder["out"], source=sines) + Out.ar(bus=builder["out"], source=sines) synthdef = builder.build() assert str(synthdef) == normalize( """ diff --git a/tests/synthdefs/test_synthdefs_SynthDefCompiler_ambisonics.py b/tests/ugens/test_SynthDef_ambisonics.py similarity index 86% rename from tests/synthdefs/test_synthdefs_SynthDefCompiler_ambisonics.py rename to tests/ugens/test_SynthDef_ambisonics.py index d5742e8d7..c7872c241 100644 --- a/tests/synthdefs/test_synthdefs_SynthDefCompiler_ambisonics.py +++ b/tests/ugens/test_SynthDef_ambisonics.py @@ -4,25 +4,30 @@ import pytest -import supriya.synthdefs -import supriya.ugens +from supriya.ugens import ( + DecodeB2, + LFNoise2, + Out, + PanB2, + PinkNoise, + SuperColliderSynthDef, + SynthDefBuilder, +) @pytest.fixture def py_synthdef(): - with supriya.synthdefs.SynthDefBuilder() as builder: - source = supriya.ugens.PinkNoise.ar() - azimuth = supriya.ugens.LFNoise2.kr(frequency=0.25) - w, x, y = supriya.ugens.PanB2.ar(source=source, azimuth=azimuth) - source = supriya.ugens.DecodeB2.ar( - channel_count=4, w=w, x=x, y=y, orientation=0.5 - ) - supriya.ugens.Out.ar(bus=0, source=source) + with SynthDefBuilder() as builder: + source = PinkNoise.ar() + azimuth = LFNoise2.kr(frequency=0.25) + w, x, y = PanB2.ar(source=source, azimuth=azimuth) + source = DecodeB2.ar(channel_count=4, w=w, x=x, y=y, orientation=0.5) + Out.ar(bus=0, source=source) py_synthdef = builder.build("ambisonics") return py_synthdef -def test_SynthDefCompiler_ambisonics_supriya_vs_bytes(py_synthdef): +def test_ambisonics_supriya_vs_bytes(py_synthdef): # fmt: off test_compiled_synthdef = bytes( b'SCgf' @@ -109,8 +114,8 @@ def test_SynthDefCompiler_ambisonics_supriya_vs_bytes(py_synthdef): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_ambisonics_supriya_vs_sclang(py_synthdef): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( +def test_ambisonics_supriya_vs_sclang(py_synthdef): + sc_synthdef = SuperColliderSynthDef( "ambisonics", r""" var source, azimuth, w, x, y; diff --git a/tests/synthdefs/test_synthdefs_SynthDefCompiler_basic.py b/tests/ugens/test_SynthDef_basic.py similarity index 83% rename from tests/synthdefs/test_synthdefs_SynthDefCompiler_basic.py rename to tests/ugens/test_SynthDef_basic.py index 52df05c55..779b8c969 100644 --- a/tests/synthdefs/test_synthdefs_SynthDefCompiler_basic.py +++ b/tests/ugens/test_SynthDef_basic.py @@ -4,22 +4,29 @@ import pytest -import supriya.synthdefs -import supriya.ugens +from supriya.ugens import ( + DetectSilence, + FreeSelf, + In, + Out, + SinOsc, + SuperColliderSynthDef, + SynthDefBuilder, +) @pytest.fixture def py_synthdef_01(): - with supriya.synthdefs.SynthDefBuilder() as builder: - sine_one = supriya.ugens.SinOsc.ar(frequency=420) - sine_two = supriya.ugens.SinOsc.ar(frequency=440) + with SynthDefBuilder() as builder: + sine_one = SinOsc.ar(frequency=420) + sine_two = SinOsc.ar(frequency=440) sines = sine_one * sine_two - supriya.ugens.Out.ar(bus=0, source=sines) + Out.ar(bus=0, source=sines) py_synthdef = builder.build("foo") return py_synthdef -def test_SynthDefCompiler_basic_01_supriya_vs_bytes(py_synthdef_01): +def test_basic_01_supriya_vs_bytes(py_synthdef_01): # fmt: off test_compiled_synthdef = bytes( b'SCgf' @@ -84,8 +91,8 @@ def test_SynthDefCompiler_basic_01_supriya_vs_bytes(py_synthdef_01): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_basic_01_supriya_vs_sclang(py_synthdef_01): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( +def test_basic_01_supriya_vs_sclang(py_synthdef_01): + sc_synthdef = SuperColliderSynthDef( "foo", "Out.ar(0, SinOsc.ar(freq: 420) * SinOsc.ar(freq: 440))" ) sc_compiled_synthdef = sc_synthdef.compile() @@ -95,15 +102,15 @@ def test_SynthDefCompiler_basic_01_supriya_vs_sclang(py_synthdef_01): @pytest.fixture def py_synthdef_02(): - with supriya.synthdefs.SynthDefBuilder() as builder: - sine = supriya.ugens.SinOsc.ar() + with SynthDefBuilder() as builder: + sine = SinOsc.ar() sine = -sine - supriya.ugens.Out.ar(bus=99, source=sine) + Out.ar(bus=99, source=sine) py_synthdef = builder.build("test") return py_synthdef -def test_SynthDefCompiler_basic_02_supriya_vs_bytes(py_synthdef_02): +def test_basic_02_supriya_vs_bytes(py_synthdef_02): # fmt: off test_compiled_synthdef = bytes( b'SCgf' @@ -156,10 +163,8 @@ def test_SynthDefCompiler_basic_02_supriya_vs_bytes(py_synthdef_02): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_basic_02_supriya_vs_sclang(py_synthdef_02): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( - "test", "Out.ar(99, SinOsc.ar(freq: 440).neg)" - ) +def test_basic_02_supriya_vs_sclang(py_synthdef_02): + sc_synthdef = SuperColliderSynthDef("test", "Out.ar(99, SinOsc.ar(freq: 440).neg)") sc_compiled_synthdef = sc_synthdef.compile() py_compiled_synthdef = py_synthdef_02.compile() assert py_compiled_synthdef == sc_compiled_synthdef @@ -167,14 +172,14 @@ def test_SynthDefCompiler_basic_02_supriya_vs_sclang(py_synthdef_02): @pytest.fixture def py_synthdef_03(): - with supriya.synthdefs.SynthDefBuilder() as builder: - inputs = supriya.ugens.In.ar(bus=8, channel_count=2) - supriya.ugens.Out.ar(bus=0, source=inputs) + with SynthDefBuilder() as builder: + inputs = In.ar(bus=8, channel_count=2) + Out.ar(bus=0, source=inputs) py_synthdef = builder.build("test") return py_synthdef -def test_SynthDefCompiler_basic_03_supriya_vs_bytes(py_synthdef_03): +def test_basic_03_supriya_vs_bytes(py_synthdef_03): # fmt: off test_compiled_synthdef = bytes( b'SCgf' @@ -219,8 +224,8 @@ def test_SynthDefCompiler_basic_03_supriya_vs_bytes(py_synthdef_03): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_basic_03_supriya_vs_sclang(py_synthdef_03): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( +def test_basic_03_supriya_vs_sclang(py_synthdef_03): + sc_synthdef = SuperColliderSynthDef( "test", r""" Out.ar(0, In.ar(8, 2)) @@ -233,15 +238,15 @@ def test_SynthDefCompiler_basic_03_supriya_vs_sclang(py_synthdef_03): @pytest.fixture def py_synthdef_04(): - with supriya.synthdefs.SynthDefBuilder() as builder: - sin_osc = supriya.ugens.SinOsc.ar() - supriya.ugens.FreeSelf.kr(trigger=sin_osc) - supriya.ugens.Out.ar(bus=0, source=sin_osc) + with SynthDefBuilder() as builder: + sin_osc = SinOsc.ar() + FreeSelf.kr(trigger=sin_osc) + Out.ar(bus=0, source=sin_osc) py_synthdef = builder.build("test") return py_synthdef -def test_SynthDefCompiler_basic_04_supriya_vs_bytes(py_synthdef_04): +def test_basic_04_supriya_vs_bytes(py_synthdef_04): """ FreeSelf. """ @@ -296,8 +301,8 @@ def test_SynthDefCompiler_basic_04_supriya_vs_bytes(py_synthdef_04): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_basic_04_supriya_vs_sclang(py_synthdef_04): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( +def test_basic_04_supriya_vs_sclang(py_synthdef_04): + sc_synthdef = SuperColliderSynthDef( "test", r""" Out.ar(0, FreeSelf.kr(SinOsc.ar())) @@ -313,14 +318,14 @@ def test_SynthDefCompiler_basic_04_supriya_vs_sclang(py_synthdef_04): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_basic_05_supriya_vs_sclang(): - with supriya.synthdefs.SynthDefBuilder() as builder: - source = supriya.ugens.In.ar(bus=8, channel_count=2) - supriya.ugens.DetectSilence.ar(source=source) - supriya.ugens.Out.ar(bus=0, source=source) +def test_basic_05_supriya_vs_sclang(): + with SynthDefBuilder() as builder: + source = In.ar(bus=8, channel_count=2) + DetectSilence.ar(source=source) + Out.ar(bus=0, source=source) py_synthdef = builder.build("DetectSilenceTest") py_compiled_synthdef = py_synthdef.compile() - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( + sc_synthdef = SuperColliderSynthDef( "DetectSilenceTest", r""" var source, detect_silence, out; diff --git a/tests/synthdefs/test_synthdefs_SynthDefDecompiler.py b/tests/ugens/test_SynthDef_decompile.py similarity index 64% rename from tests/synthdefs/test_synthdefs_SynthDefDecompiler.py rename to tests/ugens/test_SynthDef_decompile.py index e6ad0f570..24ff5839e 100644 --- a/tests/synthdefs/test_synthdefs_SynthDefDecompiler.py +++ b/tests/ugens/test_SynthDef_decompile.py @@ -1,18 +1,25 @@ -import supriya.synthdefs -import supriya.ugens - -decompiler = supriya.synthdefs.SynthDefDecompiler +from supriya.ugens import ( + Decay2, + DelayC, + In, + Mix, + Out, + Parameter, + SinOsc, + SynthDefBuilder, + decompile_synthdef, +) def test_SynthDefDecompiler_01(): r"""Anonymous SynthDef without parameters.""" - with supriya.synthdefs.SynthDefBuilder() as builder: - sine = supriya.ugens.SinOsc.ar() + with SynthDefBuilder() as builder: + sine = SinOsc.ar() sine = -sine - supriya.ugens.Out.ar(bus=99, source=sine) + Out.ar(bus=99, source=sine) old_synthdef = builder.build() compiled_synthdef = old_synthdef.compile() - new_synthdef = decompiler.decompile_synthdef(compiled_synthdef) + new_synthdef = decompile_synthdef(compiled_synthdef) assert str(old_synthdef) == str(new_synthdef) assert old_synthdef.indexed_parameters == new_synthdef.indexed_parameters assert compiled_synthdef == new_synthdef.compile() @@ -22,12 +29,12 @@ def test_SynthDefDecompiler_01(): def test_SynthDefDecompiler_02(): r"""Anonymous SynthDef with one parameter.""" - with supriya.synthdefs.SynthDefBuilder(freq=440) as builder: - sine = supriya.ugens.SinOsc.ar(frequency=builder["freq"]) - supriya.ugens.Out.ar(bus=0, source=sine) + with SynthDefBuilder(freq=440) as builder: + sine = SinOsc.ar(frequency=builder["freq"]) + Out.ar(bus=0, source=sine) old_synthdef = builder.build() compiled_synthdef = old_synthdef.compile() - new_synthdef = decompiler.decompile_synthdef(compiled_synthdef) + new_synthdef = decompile_synthdef(compiled_synthdef) assert str(old_synthdef) == str(new_synthdef) assert old_synthdef.indexed_parameters == new_synthdef.indexed_parameters assert compiled_synthdef == new_synthdef.compile() @@ -37,12 +44,12 @@ def test_SynthDefDecompiler_02(): def test_SynthDefDecompiler_03(): r"""Named SynthDef with one parameter.""" - with supriya.synthdefs.SynthDefBuilder(freq=440) as builder: - sine = supriya.ugens.SinOsc.ar(frequency=builder["freq"]) - supriya.ugens.Out.ar(bus=0, source=sine) + with SynthDefBuilder(freq=440) as builder: + sine = SinOsc.ar(frequency=builder["freq"]) + Out.ar(bus=0, source=sine) old_synthdef = builder.build("test") compiled_synthdef = old_synthdef.compile() - new_synthdef = decompiler.decompile_synthdef(compiled_synthdef) + new_synthdef = decompile_synthdef(compiled_synthdef) assert str(old_synthdef) == str(new_synthdef) assert old_synthdef.indexed_parameters == new_synthdef.indexed_parameters assert compiled_synthdef == new_synthdef.compile() @@ -52,12 +59,12 @@ def test_SynthDefDecompiler_03(): def test_SynthDefDecompiler_04(): r"""Multiple parameters.""" - with supriya.synthdefs.SynthDefBuilder(freq=1200, out=23) as builder: - sine = supriya.ugens.SinOsc.ar(frequency=builder["freq"]) - supriya.ugens.Out.ar(bus=builder["out"], source=sine) + with SynthDefBuilder(freq=1200, out=23) as builder: + sine = SinOsc.ar(frequency=builder["freq"]) + Out.ar(bus=builder["out"], source=sine) old_synthdef = builder.build("test") compiled_synthdef = old_synthdef.compile() - new_synthdef = decompiler.decompile_synthdef(compiled_synthdef) + new_synthdef = decompile_synthdef(compiled_synthdef) assert str(old_synthdef) == str(new_synthdef) assert old_synthdef.indexed_parameters == new_synthdef.indexed_parameters assert compiled_synthdef == new_synthdef.compile() @@ -67,18 +74,16 @@ def test_SynthDefDecompiler_04(): def test_SynthDefDecompiler_05(): """Multiple parameters.""" - builder = supriya.synthdefs.SynthDefBuilder( - damping=0.5, delay_time=1.0, room_size=0.75 - ) + builder = SynthDefBuilder(damping=0.5, delay_time=1.0, room_size=0.75) with builder: - microphone = supriya.ugens.In.ar(bus=0) - delay = supriya.ugens.DelayC.ar( + microphone = In.ar(bus=0) + delay = DelayC.ar( source=microphone, maximum_delay_time=5.0, delay_time=builder["delay_time"] ) - supriya.ugens.Out.ar(bus=0, source=delay) + Out.ar(bus=0, source=delay) old_synthdef = builder.build("test") compiled_synthdef = old_synthdef.compile() - new_synthdef = decompiler.decompile_synthdef(compiled_synthdef) + new_synthdef = decompile_synthdef(compiled_synthdef) assert str(old_synthdef) == str(new_synthdef) assert old_synthdef.indexed_parameters == new_synthdef.indexed_parameters assert compiled_synthdef == new_synthdef.compile() @@ -88,23 +93,21 @@ def test_SynthDefDecompiler_05(): def test_SynthDefDecompiler_06(): r"""Multiple parameters with different rates.""" - builder = supriya.synthdefs.SynthDefBuilder( + builder = SynthDefBuilder( a_phase=0.0, freq=440, i_decay_time=1.0, t_trig_a=0, t_trig_b=0 ) with builder: - decay = supriya.ugens.Decay2.kr( + decay = Decay2.kr( source=(builder["t_trig_a"], builder["t_trig_b"]), attack_time=0.5, decay_time=builder["i_decay_time"], ) - sin_osc = supriya.ugens.SinOsc.ar( - frequency=builder["freq"], phase=builder["a_phase"] - ) + sin_osc = SinOsc.ar(frequency=builder["freq"], phase=builder["a_phase"]) enveloped_sin_osc = sin_osc * decay - supriya.ugens.Out.ar(bus=0, source=enveloped_sin_osc) + Out.ar(bus=0, source=enveloped_sin_osc) old_synthdef = builder.build("trigTest") compiled_synthdef = old_synthdef.compile() - new_synthdef = decompiler.decompile_synthdef(compiled_synthdef) + new_synthdef = decompile_synthdef(compiled_synthdef) assert str(old_synthdef) == str(new_synthdef) assert old_synthdef.indexed_parameters == new_synthdef.indexed_parameters assert compiled_synthdef == new_synthdef.compile() @@ -113,15 +116,15 @@ def test_SynthDefDecompiler_06(): def test_SynthDefDecompiler_07(): - builder = supriya.synthdefs.SynthDefBuilder(amp=0.5, freqs=[300, 400]) + builder = SynthDefBuilder(amp=0.5, freqs=[300, 400]) with builder: - sines = supriya.ugens.SinOsc.ar(frequency=builder["freqs"]) - sines = supriya.ugens.Mix.new(sines) + sines = SinOsc.ar(frequency=builder["freqs"]) + sines = Mix.new(sines) sines = sines * builder["amp"] - supriya.ugens.Out.ar(bus=0, source=sines) + Out.ar(bus=0, source=sines) old_synthdef = builder.build("arrayarg") compiled_synthdef = old_synthdef.compile() - new_synthdef = decompiler.decompile_synthdef(compiled_synthdef) + new_synthdef = decompile_synthdef(compiled_synthdef) assert str(old_synthdef) == str(new_synthdef) assert old_synthdef.indexed_parameters == new_synthdef.indexed_parameters assert compiled_synthdef == new_synthdef.compile() @@ -131,17 +134,15 @@ def test_SynthDefDecompiler_07(): def test_SynthDefDecompiler_08(): r"""Multiple parameters with different lags.""" - builder = supriya.synthdefs.SynthDefBuilder( - amp=0.5, freqs=supriya.synthdefs.Parameter(lag=0.5, value=[300, 400]) - ) + builder = SynthDefBuilder(amp=0.5, freqs=Parameter(lag=0.5, value=[300, 400])) with builder: - sines = supriya.ugens.SinOsc.ar(frequency=builder["freqs"]) - sines = supriya.ugens.Mix.new(sines) + sines = SinOsc.ar(frequency=builder["freqs"]) + sines = Mix.new(sines) sines = sines * builder["amp"] - supriya.ugens.Out.ar(bus=0, source=sines) + Out.ar(bus=0, source=sines) old_synthdef = builder.build("arrayarg") compiled_synthdef = old_synthdef.compile() - new_synthdef = decompiler.decompile_synthdef(compiled_synthdef) + new_synthdef = decompile_synthdef(compiled_synthdef) assert str(old_synthdef) == str(new_synthdef) assert old_synthdef.indexed_parameters == new_synthdef.indexed_parameters assert compiled_synthdef == new_synthdef.compile() diff --git a/tests/synthdefs/test_synthdefs_SynthDefCompiler_demand.py b/tests/ugens/test_SynthDef_demand.py similarity index 93% rename from tests/synthdefs/test_synthdefs_SynthDefCompiler_demand.py rename to tests/ugens/test_SynthDef_demand.py index da4a4591b..416ee8b42 100644 --- a/tests/synthdefs/test_synthdefs_SynthDefCompiler_demand.py +++ b/tests/ugens/test_SynthDef_demand.py @@ -4,8 +4,15 @@ import pytest -from supriya.synthdefs import SuperColliderSynthDef, SynthDefBuilder -from supriya.ugens import Demand, Dseries, Impulse, Out, SinOsc +from supriya.ugens import ( + Demand, + Dseries, + Impulse, + Out, + SinOsc, + SuperColliderSynthDef, + SynthDefBuilder, +) @pytest.fixture @@ -19,7 +26,7 @@ def py_synthdef(): return py_synthdef -def test_SynthDefCompiler_demand_supriya_vs_bytes(py_synthdef): +def test_demand_supriya_vs_bytes(py_synthdef): # fmt: off test_compiled_synthdef = bytes( b'SCgf' @@ -99,7 +106,7 @@ def test_SynthDefCompiler_demand_supriya_vs_bytes(py_synthdef): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_demand_supriya_vs_sclang(py_synthdef): +def test_demand_supriya_vs_sclang(py_synthdef): sc_synthdef = SuperColliderSynthDef( "foo", """ diff --git a/tests/ugens/test_SynthDef_expansion.py b/tests/ugens/test_SynthDef_expansion.py new file mode 100644 index 000000000..eb9199947 --- /dev/null +++ b/tests/ugens/test_SynthDef_expansion.py @@ -0,0 +1,100 @@ +import os +import platform + +import pytest +from uqbar.strings import normalize + +from supriya.ugens import SuperColliderSynthDef, decompile_synthdef + + +@pytest.fixture +def sc_synthdef_expansion(): + return SuperColliderSynthDef( + "expansionTest", + """ + var a, b, c, d; + a = SinOsc.ar([1, 2]); + b = Pan2.ar(a); + c = Pan2.ar(b).softclip; + Out.ar(0, c); + """, + ) + + +@pytest.mark.skipif(platform.system() == "Windows", reason="hangs on Windows") +@pytest.mark.skipif( + platform.system() == "Darwin" and os.environ.get("CI") == "true", + reason="sclang hangs without QT", +) +def test_sc_format(sc_synthdef_expansion): + sc_compiled_synthdef = bytes(sc_synthdef_expansion.compile()) + sc_synthdef = decompile_synthdef(sc_compiled_synthdef) + assert str(sc_synthdef) == normalize( + """ + synthdef: + name: expansionTest + ugens: + - SinOsc.ar/0: + frequency: 1.0 + phase: 0.0 + - Pan2.ar/0: + source: SinOsc.ar/0[0] + position: 0.0 + level: 1.0 + - Pan2.ar/1: + source: Pan2.ar/0[0] + position: 0.0 + level: 1.0 + - UnaryOpUGen(SOFTCLIP).ar/0: + source: Pan2.ar/1[0] + - UnaryOpUGen(SOFTCLIP).ar/1: + source: Pan2.ar/1[1] + - Pan2.ar/2: + source: Pan2.ar/0[1] + position: 0.0 + level: 1.0 + - UnaryOpUGen(SOFTCLIP).ar/2: + source: Pan2.ar/2[0] + - UnaryOpUGen(SOFTCLIP).ar/3: + source: Pan2.ar/2[1] + - SinOsc.ar/1: + frequency: 2.0 + phase: 0.0 + - Pan2.ar/3: + source: SinOsc.ar/1[0] + position: 0.0 + level: 1.0 + - Pan2.ar/4: + source: Pan2.ar/3[0] + position: 0.0 + level: 1.0 + - UnaryOpUGen(SOFTCLIP).ar/4: + source: Pan2.ar/4[0] + - Out.ar/0: + bus: 0.0 + source[0]: UnaryOpUGen(SOFTCLIP).ar/0[0] + source[1]: UnaryOpUGen(SOFTCLIP).ar/4[0] + - UnaryOpUGen(SOFTCLIP).ar/5: + source: Pan2.ar/4[1] + - Out.ar/1: + bus: 0.0 + source[0]: UnaryOpUGen(SOFTCLIP).ar/1[0] + source[1]: UnaryOpUGen(SOFTCLIP).ar/5[0] + - Pan2.ar/5: + source: Pan2.ar/3[1] + position: 0.0 + level: 1.0 + - UnaryOpUGen(SOFTCLIP).ar/6: + source: Pan2.ar/5[0] + - Out.ar/2: + bus: 0.0 + source[0]: UnaryOpUGen(SOFTCLIP).ar/2[0] + source[1]: UnaryOpUGen(SOFTCLIP).ar/6[0] + - UnaryOpUGen(SOFTCLIP).ar/7: + source: Pan2.ar/5[1] + - Out.ar/3: + bus: 0.0 + source[0]: UnaryOpUGen(SOFTCLIP).ar/3[0] + source[1]: UnaryOpUGen(SOFTCLIP).ar/7[0] + """ + ) diff --git a/tests/synthdefs/test_synthdefs_SynthDefCompiler_mfcc.py b/tests/ugens/test_SynthDef_mfcc.py similarity index 95% rename from tests/synthdefs/test_synthdefs_SynthDefCompiler_mfcc.py rename to tests/ugens/test_SynthDef_mfcc.py index d73a66c3c..7876cb49e 100644 --- a/tests/synthdefs/test_synthdefs_SynthDefCompiler_mfcc.py +++ b/tests/ugens/test_SynthDef_mfcc.py @@ -5,9 +5,15 @@ import pytest from uqbar.strings import normalize -from supriya import SynthDefBuilder -from supriya.synthdefs import SuperColliderSynthDef, SynthDefDecompiler -from supriya.ugens import FFT, MFCC, In, Out +from supriya.ugens import ( + FFT, + MFCC, + In, + Out, + SuperColliderSynthDef, + SynthDefBuilder, + decompile_synthdef, +) @pytest.fixture @@ -50,7 +56,7 @@ def test_ugens(py_synthdef_mfcc, sc_synthdef_mfcc): "Out.kr()", ) sc_compiled_synthdef = bytes(sc_synthdef_mfcc.compile()) - sc_synthdef = SynthDefDecompiler.decompile_synthdef(sc_compiled_synthdef) + sc_synthdef = decompile_synthdef(sc_compiled_synthdef) sc_ugens = tuple(repr(_) for _ in sc_synthdef.ugens) assert py_ugens == sc_ugens @@ -102,7 +108,7 @@ def test_format(py_synthdef_mfcc, sc_synthdef_mfcc): """ ) sc_compiled_synthdef = bytes(sc_synthdef_mfcc.compile()) - sc_synthdef = SynthDefDecompiler.decompile_synthdef(sc_compiled_synthdef) + sc_synthdef = decompile_synthdef(sc_compiled_synthdef) sc_format = str(sc_synthdef) assert py_format == sc_format diff --git a/tests/synthdefs/test_synthdefs_SynthDefCompiler_optimization.py b/tests/ugens/test_SynthDef_optimization.py similarity index 77% rename from tests/synthdefs/test_synthdefs_SynthDefCompiler_optimization.py rename to tests/ugens/test_SynthDef_optimization.py index 00ec56d4e..dc3308bc9 100644 --- a/tests/synthdefs/test_synthdefs_SynthDefCompiler_optimization.py +++ b/tests/ugens/test_SynthDef_optimization.py @@ -4,23 +4,22 @@ import pytest -import supriya.synthdefs -import supriya.ugens +from supriya.ugens import Out, SinOsc, SuperColliderSynthDef, SynthDefBuilder @pytest.fixture def py_synthdef(): - with supriya.synthdefs.SynthDefBuilder() as builder: - sine_a = supriya.ugens.SinOsc.ar(frequency=420) - sine_b = supriya.ugens.SinOsc.ar(frequency=440) # noqa - sine_c = supriya.ugens.SinOsc.ar(frequency=460) - sine_d = supriya.ugens.SinOsc.ar(frequency=sine_c) # noqa - supriya.ugens.Out.ar(bus=0, source=sine_a) + with SynthDefBuilder() as builder: + sine_a = SinOsc.ar(frequency=420) + sine_b = SinOsc.ar(frequency=440) # noqa + sine_c = SinOsc.ar(frequency=460) + sine_d = SinOsc.ar(frequency=sine_c) # noqa + Out.ar(bus=0, source=sine_a) py_synthdef = builder.build("optimized") return py_synthdef -def test_SynthDefCompiler_optimization_01_supriya_vs_bytes(py_synthdef): +def test_optimization_01_supriya_vs_bytes(py_synthdef): # fmt: off test_compiled_synthdef = bytes( b'SCgf' @@ -64,8 +63,8 @@ def test_SynthDefCompiler_optimization_01_supriya_vs_bytes(py_synthdef): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_optimization_01_supriya_vs_sclang(py_synthdef): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( +def test_optimization_01_supriya_vs_sclang(py_synthdef): + sc_synthdef = SuperColliderSynthDef( "optimized", r""" var sine_a, sine_b, sine_c, sine_d; diff --git a/tests/synthdefs/test_synthdefs_SynthDefCompiler_parameters.py b/tests/ugens/test_SynthDef_parameters.py similarity index 82% rename from tests/synthdefs/test_synthdefs_SynthDefCompiler_parameters.py rename to tests/ugens/test_SynthDef_parameters.py index 9e862cf90..b83d06513 100644 --- a/tests/synthdefs/test_synthdefs_SynthDefCompiler_parameters.py +++ b/tests/ugens/test_SynthDef_parameters.py @@ -5,27 +5,34 @@ import pytest from uqbar.strings import normalize -import supriya.synthdefs -import supriya.ugens from supriya.enums import ParameterRate +from supriya.ugens import ( + Decay2, + DelayC, + In, + Mix, + Out, + Parameter, + SinOsc, + SuperColliderSynthDef, + SynthDefBuilder, +) @pytest.fixture def py_synthdef_01(): - with supriya.synthdefs.SynthDefBuilder(freq=440) as builder: - sine = supriya.ugens.SinOsc.ar(frequency=builder["freq"]) - supriya.ugens.Out.ar(bus=0, source=sine) + with SynthDefBuilder(freq=440) as builder: + sine = SinOsc.ar(frequency=builder["freq"]) + Out.ar(bus=0, source=sine) py_synthdef = builder.build("test") return py_synthdef -def test_SynthDefCompiler_parameters_01_parameters(py_synthdef_01): +def test_parameters_01_parameters(py_synthdef_01): assert py_synthdef_01.indexed_parameters == ( ( 0, - supriya.synthdefs.Parameter( - name="freq", parameter_rate=ParameterRate.CONTROL, value=440.0 - ), + Parameter(name="freq", parameter_rate=ParameterRate.CONTROL, value=440.0), ), ) @@ -35,8 +42,8 @@ def test_SynthDefCompiler_parameters_01_parameters(py_synthdef_01): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_parameters_01_supriya_vs_sclang(py_synthdef_01): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( +def test_parameters_01_supriya_vs_sclang(py_synthdef_01): + sc_synthdef = SuperColliderSynthDef( "test", r""" | freq = 440 | @@ -48,7 +55,7 @@ def test_SynthDefCompiler_parameters_01_supriya_vs_sclang(py_synthdef_01): assert py_compiled_synthdef == sc_compiled_synthdef -def test_SynthDefCompiler_parameters_01_supriya_vs_bytes(py_synthdef_01): +def test_parameters_01_supriya_vs_bytes(py_synthdef_01): # fmt: off test_compiled_synthdef = bytes( b'SCgf' @@ -97,26 +104,22 @@ def test_SynthDefCompiler_parameters_01_supriya_vs_bytes(py_synthdef_01): @pytest.fixture def py_synthdef_02(): - with supriya.synthdefs.SynthDefBuilder(freq=1200, out=23) as builder: - sine = supriya.ugens.SinOsc.ar(frequency=builder["freq"]) - supriya.ugens.Out.ar(bus=builder["out"], source=sine) + with SynthDefBuilder(freq=1200, out=23) as builder: + sine = SinOsc.ar(frequency=builder["freq"]) + Out.ar(bus=builder["out"], source=sine) py_synthdef = builder.build("test") return py_synthdef -def test_SynthDefCompiler_parameters_02_parameters(py_synthdef_02): +def test_parameters_02_parameters(py_synthdef_02): assert py_synthdef_02.indexed_parameters == ( ( 0, - supriya.synthdefs.Parameter( - name="freq", parameter_rate=ParameterRate.CONTROL, value=1200.0 - ), + Parameter(name="freq", parameter_rate=ParameterRate.CONTROL, value=1200.0), ), ( 1, - supriya.synthdefs.Parameter( - name="out", parameter_rate=ParameterRate.CONTROL, value=23.0 - ), + Parameter(name="out", parameter_rate=ParameterRate.CONTROL, value=23.0), ), ) @@ -126,8 +129,8 @@ def test_SynthDefCompiler_parameters_02_parameters(py_synthdef_02): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_parameters_02_supriya_vs_sclang(py_synthdef_02): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( +def test_parameters_02_supriya_vs_sclang(py_synthdef_02): + sc_synthdef = SuperColliderSynthDef( "test", r""" arg freq=1200, out=23; @@ -139,7 +142,7 @@ def test_SynthDefCompiler_parameters_02_supriya_vs_sclang(py_synthdef_02): assert py_compiled_synthdef == sc_compiled_synthdef -def test_SynthDefCompiler_parameters_02_supriya_vs_bytes(py_synthdef_02): +def test_parameters_02_supriya_vs_bytes(py_synthdef_02): # fmt: off test_compiled_synthdef = bytes( b'SCgf' @@ -192,39 +195,35 @@ def test_SynthDefCompiler_parameters_02_supriya_vs_bytes(py_synthdef_02): @pytest.fixture def py_synthdef_03(): - builder = supriya.synthdefs.SynthDefBuilder( - damping=0.1, delay_time=1.0, room_size=0.9 - ) + builder = SynthDefBuilder(damping=0.1, delay_time=1.0, room_size=0.9) with builder: - microphone = supriya.ugens.In.ar(bus=0) - delay = supriya.ugens.DelayC.ar( + microphone = In.ar(bus=0) + delay = DelayC.ar( source=microphone, maximum_delay_time=5.0, delay_time=builder["delay_time"] ) - supriya.ugens.Out.ar(bus=0, source=delay) + Out.ar(bus=0, source=delay) py_synthdef = builder.build("test") return py_synthdef -def test_SynthDefCompiler_parameters_03_parameters(py_synthdef_03): +def test_parameters_03_parameters(py_synthdef_03): """ Multiple parameters, including unused parameters. """ assert py_synthdef_03.indexed_parameters == ( ( 0, - supriya.synthdefs.Parameter( - name="damping", parameter_rate=ParameterRate.CONTROL, value=0.1 - ), + Parameter(name="damping", parameter_rate=ParameterRate.CONTROL, value=0.1), ), ( 1, - supriya.synthdefs.Parameter( + Parameter( name="delay_time", parameter_rate=ParameterRate.CONTROL, value=1.0 ), ), ( 2, - supriya.synthdefs.Parameter( + Parameter( name="room_size", parameter_rate=ParameterRate.CONTROL, value=0.9 ), ), @@ -236,8 +235,8 @@ def test_SynthDefCompiler_parameters_03_parameters(py_synthdef_03): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_parameters_03_supriya_vs_sclang(py_synthdef_03): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( +def test_parameters_03_supriya_vs_sclang(py_synthdef_03): + sc_synthdef = SuperColliderSynthDef( "test", r""" | damping=0.1, delay_time=1.0, room_size=0.9 | @@ -249,7 +248,7 @@ def test_SynthDefCompiler_parameters_03_supriya_vs_sclang(py_synthdef_03): assert py_compiled_synthdef == sc_compiled_synthdef -def test_SynthDefCompiler_parameters_03_supriya_vs_bytes(py_synthdef_03): +def test_parameters_03_supriya_vs_bytes(py_synthdef_03): # fmt: off test_compiled_synthdef = bytes( b'SCgf' @@ -317,58 +316,48 @@ def test_SynthDefCompiler_parameters_03_supriya_vs_bytes(py_synthdef_03): @pytest.fixture def py_synthdef_04(): - builder = supriya.synthdefs.SynthDefBuilder( + builder = SynthDefBuilder( a_phase=0.0, freq=440, i_decay_time=1.0, t_trig_a=0, t_trig_b=0 ) with builder: - decay = supriya.ugens.Decay2.kr( + decay = Decay2.kr( source=(builder["t_trig_a"], builder["t_trig_b"]), attack_time=0.005, decay_time=builder["i_decay_time"], ) - sin_osc = supriya.ugens.SinOsc.ar( - frequency=builder["freq"], phase=builder["a_phase"] - ) + sin_osc = SinOsc.ar(frequency=builder["freq"], phase=builder["a_phase"]) enveloped_sin_osc = sin_osc * decay - supriya.ugens.Out.ar(bus=0, source=enveloped_sin_osc) + Out.ar(bus=0, source=enveloped_sin_osc) py_synthdef = builder.build("trigTest") return py_synthdef -def test_SynthDefCompiler_parameters_04_parameters(py_synthdef_04): +def test_parameters_04_parameters(py_synthdef_04): """ Different calculation rates. """ assert py_synthdef_04.indexed_parameters == ( ( 3, - supriya.synthdefs.Parameter( - name="a_phase", parameter_rate=ParameterRate.AUDIO, value=0.0 - ), + Parameter(name="a_phase", parameter_rate=ParameterRate.AUDIO, value=0.0), ), ( 4, - supriya.synthdefs.Parameter( - name="freq", parameter_rate=ParameterRate.CONTROL, value=440.0 - ), + Parameter(name="freq", parameter_rate=ParameterRate.CONTROL, value=440.0), ), ( 0, - supriya.synthdefs.Parameter( + Parameter( name="i_decay_time", parameter_rate=ParameterRate.SCALAR, value=1.0 ), ), ( 1, - supriya.synthdefs.Parameter( - name="t_trig_a", parameter_rate=ParameterRate.TRIGGER, value=0.0 - ), + Parameter(name="t_trig_a", parameter_rate=ParameterRate.TRIGGER, value=0.0), ), ( 2, - supriya.synthdefs.Parameter( - name="t_trig_b", parameter_rate=ParameterRate.TRIGGER, value=0.0 - ), + Parameter(name="t_trig_b", parameter_rate=ParameterRate.TRIGGER, value=0.0), ), ) @@ -378,8 +367,8 @@ def test_SynthDefCompiler_parameters_04_parameters(py_synthdef_04): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_parameters_04_supriya_vs_sclang(py_synthdef_04): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( +def test_parameters_04_supriya_vs_sclang(py_synthdef_04): + sc_synthdef = SuperColliderSynthDef( "trigTest", r""" | @@ -398,7 +387,7 @@ def test_SynthDefCompiler_parameters_04_supriya_vs_sclang(py_synthdef_04): assert py_compiled_synthdef == sc_compiled_synthdef -def test_SynthDefCompiler_parameters_04_supriya_vs_bytes(py_synthdef_04): +def test_parameters_04_supriya_vs_bytes(py_synthdef_04): # fmt: off test_compiled_synthdef = bytes( b'SCgf' @@ -525,30 +514,28 @@ def test_SynthDefCompiler_parameters_04_supriya_vs_bytes(py_synthdef_04): @pytest.fixture def py_synthdef_05(): - builder = supriya.synthdefs.SynthDefBuilder(amp=0.1, freqs=[300, 400]) + builder = SynthDefBuilder(amp=0.1, freqs=[300, 400]) with builder: - sines = supriya.ugens.SinOsc.ar(frequency=builder["freqs"]) - sines = supriya.ugens.Mix.new(sines) + sines = SinOsc.ar(frequency=builder["freqs"]) + sines = Mix.new(sines) sines = sines * builder["amp"] - supriya.ugens.Out.ar(bus=0, source=sines) + Out.ar(bus=0, source=sines) py_synthdef = builder.build("arrayarg") return py_synthdef -def test_SynthDefCompiler_parameters_05_parameters(py_synthdef_05): +def test_parameters_05_parameters(py_synthdef_05): """ Literal array arguments. """ assert py_synthdef_05.indexed_parameters == ( ( 0, - supriya.synthdefs.Parameter( - name="amp", parameter_rate=ParameterRate.CONTROL, value=0.1 - ), + Parameter(name="amp", parameter_rate=ParameterRate.CONTROL, value=0.1), ), ( 1, - supriya.synthdefs.Parameter( + Parameter( name="freqs", parameter_rate=ParameterRate.CONTROL, value=(300.0, 400.0) ), ), @@ -560,8 +547,8 @@ def test_SynthDefCompiler_parameters_05_parameters(py_synthdef_05): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_parameters_05_supriya_vs_sclang(py_synthdef_05): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( +def test_parameters_05_supriya_vs_sclang(py_synthdef_05): + sc_synthdef = SuperColliderSynthDef( "arrayarg", r""" | @@ -578,7 +565,7 @@ def test_SynthDefCompiler_parameters_05_supriya_vs_sclang(py_synthdef_05): assert py_compiled_synthdef == sc_compiled_synthdef -def test_SynthDefCompiler_parameters_05_supriya_vs_bytes(py_synthdef_05): +def test_parameters_05_supriya_vs_bytes(py_synthdef_05): # fmt: off test_compiled_synthdef = bytes( b'SCgf' @@ -663,32 +650,28 @@ def test_SynthDefCompiler_parameters_05_supriya_vs_bytes(py_synthdef_05): @pytest.fixture def py_synthdef_06(): - builder = supriya.synthdefs.SynthDefBuilder( - amp=0.1, freqs=supriya.synthdefs.Parameter(lag=0.5, value=[300, 400]) - ) + builder = SynthDefBuilder(amp=0.1, freqs=Parameter(lag=0.5, value=[300, 400])) with builder: - sines = supriya.ugens.SinOsc.ar(frequency=builder["freqs"]) - sines = supriya.ugens.Mix.new(sines) + sines = SinOsc.ar(frequency=builder["freqs"]) + sines = Mix.new(sines) sines = sines * builder["amp"] - supriya.ugens.Out.ar(bus=0, source=sines) + Out.ar(bus=0, source=sines) py_synthdef = builder.build("arrayarg") return py_synthdef -def test_SynthDefCompiler_parameters_06_parameters(py_synthdef_06): +def test_parameters_06_parameters(py_synthdef_06): """ Literal array arguments. """ assert py_synthdef_06.indexed_parameters == ( ( 0, - supriya.synthdefs.Parameter( - name="amp", parameter_rate=ParameterRate.CONTROL, value=0.1 - ), + Parameter(name="amp", parameter_rate=ParameterRate.CONTROL, value=0.1), ), ( 1, - supriya.synthdefs.Parameter( + Parameter( lag=0.5, name="freqs", parameter_rate=ParameterRate.CONTROL, @@ -703,8 +686,8 @@ def test_SynthDefCompiler_parameters_06_parameters(py_synthdef_06): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_parameters_06_supriya_vs_sclang(py_synthdef_06): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( +def test_parameters_06_supriya_vs_sclang(py_synthdef_06): + sc_synthdef = SuperColliderSynthDef( "arrayarg", r""" | @@ -722,7 +705,7 @@ def test_SynthDefCompiler_parameters_06_supriya_vs_sclang(py_synthdef_06): assert py_compiled_synthdef == sc_compiled_synthdef -def test_SynthDefCompiler_parameters_06_supriya_vs_bytes(py_synthdef_06): +def test_parameters_06_supriya_vs_bytes(py_synthdef_06): # fmt: off test_compiled_synthdef = bytes( b'SCgf' @@ -812,12 +795,12 @@ def test_SynthDefCompiler_parameters_06_supriya_vs_bytes(py_synthdef_06): assert py_compiled_synthdef == test_compiled_synthdef -def test_SynthDefCompiler_parameters_07(): - builder = supriya.SynthDefBuilder(amplitude=0, bus=0, frequency=440) +def test_parameters_07(): + builder = SynthDefBuilder(amplitude=0, bus=0, frequency=440) with builder: - sine = supriya.ugens.SinOsc.ar(frequency=builder["frequency"]) + sine = SinOsc.ar(frequency=builder["frequency"]) source = sine * builder["amplitude"] - supriya.ugens.Out.ar(bus=builder["bus"], source=source) + Out.ar(bus=builder["bus"], source=source) synthdef = builder.build(name="simple_sine") assert normalize(str(synthdef)) == normalize( """ @@ -838,12 +821,12 @@ def test_SynthDefCompiler_parameters_07(): ) -def test_SynthDefCompiler_building_is_idempotent(): - builder = supriya.SynthDefBuilder(amplitude=0, bus=0, frequency=440) +def test_building_is_idempotent(): + builder = SynthDefBuilder(amplitude=0, bus=0, frequency=440) with builder as builder: - sine = supriya.ugens.SinOsc.ar(frequency=builder["frequency"]) + sine = SinOsc.ar(frequency=builder["frequency"]) source = sine * builder["amplitude"] - supriya.ugens.Out.ar(bus=builder["bus"], source=source) + Out.ar(bus=builder["bus"], source=source) synthdef_a = builder.build() synthdef_b = builder.build() synthdef_c = builder.build() diff --git a/tests/synthdefs/test_synthdefs_SynthDefCompiler_rngs.py b/tests/ugens/test_SynthDef_rngs.py similarity index 85% rename from tests/synthdefs/test_synthdefs_SynthDefCompiler_rngs.py rename to tests/ugens/test_SynthDef_rngs.py index 3cb34dd7a..dc7907e01 100644 --- a/tests/synthdefs/test_synthdefs_SynthDefCompiler_rngs.py +++ b/tests/ugens/test_SynthDef_rngs.py @@ -4,17 +4,23 @@ import pytest -import supriya.synthdefs -import supriya.ugens +from supriya.ugens import ( + Out, + RandID, + RandSeed, + SuperColliderSynthDef, + SynthDefBuilder, + WhiteNoise, +) @pytest.fixture def py_synthdef_01(): - with supriya.synthdefs.SynthDefBuilder(rand_id=0, seed=0) as builder: - supriya.ugens.RandID.ir(rand_id=builder["rand_id"]) - supriya.ugens.RandSeed.ir(seed=builder["seed"], trigger=1) - source = supriya.ugens.WhiteNoise.ar() - supriya.ugens.Out.ar(bus=0, source=source) + with SynthDefBuilder(rand_id=0, seed=0) as builder: + RandID.ir(rand_id=builder["rand_id"]) + RandSeed.ir(seed=builder["seed"], trigger=1) + source = WhiteNoise.ar() + Out.ar(bus=0, source=source) py_synthdef = builder.build("seedednoise") return py_synthdef @@ -24,8 +30,8 @@ def py_synthdef_01(): platform.system() == "Darwin" and os.environ.get("CI") == "true", reason="sclang hangs without QT", ) -def test_SynthDefCompiler_rngs_01_supriya_vs_sclang(py_synthdef_01): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( +def test_rngs_01_supriya_vs_sclang(py_synthdef_01): + sc_synthdef = SuperColliderSynthDef( "seedednoise", r""" arg rand_id=0, seed=0; @@ -39,7 +45,7 @@ def test_SynthDefCompiler_rngs_01_supriya_vs_sclang(py_synthdef_01): assert py_compiled_synthdef == sc_compiled_synthdef -def test_SynthDefCompiler_rngs_01_supriya_vs_bytes(py_synthdef_01): +def test_rngs_01_supriya_vs_bytes(py_synthdef_01): # fmt: off test_compiled_synthdef = bytes( b'SCgf' diff --git a/tests/synthdefs/test_synthdefs_SynthDefCompiler_shared.py b/tests/ugens/test_SynthDef_shared.py similarity index 100% rename from tests/synthdefs/test_synthdefs_SynthDefCompiler_shared.py rename to tests/ugens/test_SynthDef_shared.py diff --git a/tests/synthdefs/test_synthdefs_SynthDefCompiler_splay.py b/tests/ugens/test_SynthDef_splay.py similarity index 95% rename from tests/synthdefs/test_synthdefs_SynthDefCompiler_splay.py rename to tests/ugens/test_SynthDef_splay.py index 1b6712c94..21fa1ce5d 100644 --- a/tests/synthdefs/test_synthdefs_SynthDefCompiler_splay.py +++ b/tests/ugens/test_SynthDef_splay.py @@ -4,8 +4,14 @@ import pytest from uqbar.strings import normalize -import supriya.synthdefs -import supriya.ugens +from supriya.ugens import ( + In, + Out, + Splay, + SuperColliderSynthDef, + SynthDefBuilder, + decompile_synthdefs, +) @pytest.mark.skipif(platform.system() == "Windows", reason="hangs on Windows") @@ -14,7 +20,7 @@ reason="sclang hangs without QT", ) def test_Splay_01_sclang(server): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( + sc_synthdef = SuperColliderSynthDef( "test", r""" arg spread=1, level=0.2, center=0.0; @@ -22,9 +28,7 @@ def test_Splay_01_sclang(server): """, ) sc_compiled_synthdef = sc_synthdef.compile() - synthdef = supriya.synthdefs.SynthDefDecompiler.decompile_synthdefs( - sc_compiled_synthdef - )[0] + synthdef = decompile_synthdefs(sc_compiled_synthdef)[0] assert normalize(str(synthdef)) == normalize( """ synthdef: @@ -101,14 +105,14 @@ def test_Splay_01_sclang(server): def test_Splay_01_supriya(server): - with supriya.synthdefs.SynthDefBuilder(spread=1, level=0.2, center=0.0) as builder: - source = supriya.ugens.Splay.ar( - source=supriya.ugens.In.ar(bus=0, channel_count=5), + with SynthDefBuilder(spread=1, level=0.2, center=0.0) as builder: + source = Splay.ar( + source=In.ar(bus=0, channel_count=5), spread=builder["spread"], level=builder["level"], center=builder["center"], ) - supriya.ugens.Out.ar(bus=0, source=source) + Out.ar(bus=0, source=source) py_synthdef = builder.build(name="test") assert normalize(str(py_synthdef)) == normalize( """ @@ -198,7 +202,7 @@ def test_Splay_01_supriya(server): reason="sclang hangs without QT", ) def test_Splay_02_sclang(server): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( + sc_synthdef = SuperColliderSynthDef( "test", r""" arg spread=1, level=0.2; @@ -206,9 +210,7 @@ def test_Splay_02_sclang(server): """, ) sc_compiled_synthdef = sc_synthdef.compile() - synthdef = supriya.synthdefs.SynthDefDecompiler.decompile_synthdefs( - sc_compiled_synthdef - )[0] + synthdef = decompile_synthdefs(sc_compiled_synthdef)[0] assert normalize(str(synthdef)) == normalize( """ synthdef: @@ -348,14 +350,14 @@ def test_Splay_02_sclang(server): def test_Splay_02_supriya(server): - with supriya.synthdefs.SynthDefBuilder(spread=1, level=0.2) as builder: - source = supriya.ugens.Splay.ar( - source=supriya.ugens.In.ar(bus=0, channel_count=5), + with SynthDefBuilder(spread=1, level=0.2) as builder: + source = Splay.ar( + source=In.ar(bus=0, channel_count=5), spread=builder["spread"], level=builder["level"], center=[-0.25, 0.25], ) - supriya.ugens.Out.ar(bus=0, source=source) + Out.ar(bus=0, source=source) py_synthdef = builder.build(name="test") assert normalize(str(py_synthdef)) == normalize( """ diff --git a/tests/synthdefs/test_synthdefs_SynthDefCompiler_system.py b/tests/ugens/test_SynthDef_system.py similarity index 98% rename from tests/synthdefs/test_synthdefs_SynthDefCompiler_system.py rename to tests/ugens/test_SynthDef_system.py index 161d68231..fead91ba8 100644 --- a/tests/synthdefs/test_synthdefs_SynthDefCompiler_system.py +++ b/tests/ugens/test_SynthDef_system.py @@ -5,7 +5,7 @@ from uqbar.strings import normalize from supriya.assets.synthdefs import system_link_audio_1, system_link_audio_2 -from supriya.synthdefs import SuperColliderSynthDef, SynthDefDecompiler +from supriya.ugens import SuperColliderSynthDef, decompile_synthdef def test_system_link_audio_1_supriya(): @@ -93,7 +93,7 @@ def test_system_link_audio_1_sclang(): """, r"[\kr, \kr, \kr, \kr, \kr, \ir]", ).compile() - sc_synthdef = SynthDefDecompiler.decompile_synthdef(sc_compiled) + sc_synthdef = decompile_synthdef(sc_compiled) assert normalize(str(sc_synthdef)) == normalize( """ synthdef: @@ -234,7 +234,7 @@ def test_system_link_audio_2_sclang(): """, r"[\kr, \kr, \kr, \kr, \kr, \ir]", ).compile() - sc_synthdef = SynthDefDecompiler.decompile_synthdef(sc_compiled) + sc_synthdef = decompile_synthdef(sc_compiled) assert normalize(str(sc_synthdef)) == normalize( """ synthdef: diff --git a/tests/synthdefs/test_synthdefs_SynthDefCompiler_width_first.py b/tests/ugens/test_SynthDef_width_first.py similarity index 91% rename from tests/synthdefs/test_synthdefs_SynthDefCompiler_width_first.py rename to tests/ugens/test_SynthDef_width_first.py index 5208091fa..aee5e8b34 100644 --- a/tests/synthdefs/test_synthdefs_SynthDefCompiler_width_first.py +++ b/tests/ugens/test_SynthDef_width_first.py @@ -5,17 +5,28 @@ import pytest from uqbar.strings import normalize -import supriya.synthdefs -import supriya.ugens +from supriya.ugens import ( + FFT, + IFFT, + LocalBuf, + Out, + PV_BinScramble, + PV_MagFreeze, + PV_MagMul, + PinkNoise, + SuperColliderSynthDef, + SynthDefBuilder, + decompile_synthdef, +) def test_01(): - with supriya.synthdefs.SynthDefBuilder() as builder: - local_buf = supriya.ugens.LocalBuf.ir(frame_count=2048) - source = supriya.ugens.PinkNoise.ar() - pv_chain = supriya.ugens.FFT.kr(buffer_id=local_buf, source=source) - ifft = supriya.ugens.IFFT.ar(pv_chain=pv_chain) - supriya.ugens.Out.ar(bus=0, source=ifft) + with SynthDefBuilder() as builder: + local_buf = LocalBuf.ir(frame_count=2048) + source = PinkNoise.ar() + pv_chain = FFT.kr(buffer_id=local_buf, source=source) + ifft = IFFT.ar(pv_chain=pv_chain) + Out.ar(bus=0, source=ifft) py_synthdef = builder.build("LocalBufTest") # fmt: off test_compiled_synthdef = ( @@ -105,17 +116,15 @@ def test_01(): @pytest.fixture def py_synthdef_02(): - with supriya.synthdefs.SynthDefBuilder() as builder: - source = supriya.ugens.PinkNoise.ar() - local_buf = supriya.ugens.LocalBuf.ir(frame_count=2048) - pv_chain = supriya.ugens.FFT.kr(buffer_id=local_buf, source=source) - pv_chain_a = supriya.ugens.PV_BinScramble.kr(pv_chain=pv_chain) - pv_chain_b = supriya.ugens.PV_MagFreeze.kr(pv_chain=pv_chain) - pv_chain = supriya.ugens.PV_MagMul.kr( - pv_chain_a=pv_chain_a, pv_chain_b=pv_chain_b - ) - ifft = supriya.ugens.IFFT.ar(pv_chain=pv_chain) - supriya.ugens.Out.ar(bus=0, source=ifft) + with SynthDefBuilder() as builder: + source = PinkNoise.ar() + local_buf = LocalBuf.ir(frame_count=2048) + pv_chain = FFT.kr(buffer_id=local_buf, source=source) + pv_chain_a = PV_BinScramble.kr(pv_chain=pv_chain) + pv_chain_b = PV_MagFreeze.kr(pv_chain=pv_chain) + pv_chain = PV_MagMul.kr(pv_chain_a=pv_chain_a, pv_chain_b=pv_chain_b) + ifft = IFFT.ar(pv_chain=pv_chain) + Out.ar(bus=0, source=ifft) py_synthdef = builder.build("PVCopyTest") return py_synthdef @@ -189,7 +198,7 @@ def test_02_ugens(py_synthdef_02): reason="sclang hangs without QT", ) def test_02_supriya_vs_sclang(py_synthdef_02): - sc_synthdef = supriya.synthdefs.SuperColliderSynthDef( + sc_synthdef = SuperColliderSynthDef( "PVCopyTest", r""" var source, pv_chain, pv_chain_a, pv_chain_b, ifft, out; @@ -205,9 +214,7 @@ def test_02_supriya_vs_sclang(py_synthdef_02): sc_compiled_synthdef = bytes(sc_synthdef.compile()) py_compiled_synthdef = py_synthdef_02.compile() assert py_compiled_synthdef == sc_compiled_synthdef - sc_synthdef = supriya.synthdefs.SynthDefDecompiler.decompile_synthdef( - sc_compiled_synthdef - ) + sc_synthdef = decompile_synthdef(sc_compiled_synthdef) assert tuple(repr(_) for _ in sc_synthdef.ugens) == ( "PinkNoise.ar()", "MaxLocalBufs.ir()",