From e3ab5ee914f8ca6fce5f7fc8f3f1952feabb5b8e Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 1 Jan 2024 18:54:40 +0100 Subject: [PATCH 01/51] Initial commit --- plugins/ts404/.cargo/config | 2 + plugins/ts404/.gitignore | 1 + plugins/ts404/.idea/.gitignore | 8 + plugins/ts404/.idea/misc.xml | 6 + plugins/ts404/.idea/modules.xml | 8 + plugins/ts404/.idea/ts404.iml | 18 + plugins/ts404/Cargo.lock | 895 +++++++++++++++++++++++++++++++ plugins/ts404/Cargo.toml | 31 ++ plugins/ts404/Makefile.toml | 3 + plugins/ts404/README.md | 9 + plugins/ts404/bundler.toml | 8 + plugins/ts404/gen_statespace.py | 107 ++++ plugins/ts404/poetry.lock | 881 ++++++++++++++++++++++++++++++ plugins/ts404/pyproject.toml | 16 + plugins/ts404/src/gen.rs | 4 + plugins/ts404/src/gen/clipper.rs | 23 + plugins/ts404/src/gen/tone.rs | 25 + plugins/ts404/src/lib.rs | 159 ++++++ plugins/ts404/xtask/Cargo.toml | 7 + plugins/ts404/xtask/src/main.rs | 3 + 20 files changed, 2214 insertions(+) create mode 100644 plugins/ts404/.cargo/config create mode 100644 plugins/ts404/.gitignore create mode 100644 plugins/ts404/.idea/.gitignore create mode 100644 plugins/ts404/.idea/misc.xml create mode 100644 plugins/ts404/.idea/modules.xml create mode 100644 plugins/ts404/.idea/ts404.iml create mode 100644 plugins/ts404/Cargo.lock create mode 100644 plugins/ts404/Cargo.toml create mode 100644 plugins/ts404/Makefile.toml create mode 100644 plugins/ts404/README.md create mode 100644 plugins/ts404/bundler.toml create mode 100644 plugins/ts404/gen_statespace.py create mode 100644 plugins/ts404/poetry.lock create mode 100644 plugins/ts404/pyproject.toml create mode 100644 plugins/ts404/src/gen.rs create mode 100644 plugins/ts404/src/gen/clipper.rs create mode 100644 plugins/ts404/src/gen/tone.rs create mode 100644 plugins/ts404/src/lib.rs create mode 100644 plugins/ts404/xtask/Cargo.toml create mode 100644 plugins/ts404/xtask/src/main.rs diff --git a/plugins/ts404/.cargo/config b/plugins/ts404/.cargo/config new file mode 100644 index 0000000..4e547e5 --- /dev/null +++ b/plugins/ts404/.cargo/config @@ -0,0 +1,2 @@ +[alias] +xtask = "run --package xtask --release --" diff --git a/plugins/ts404/.gitignore b/plugins/ts404/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/plugins/ts404/.gitignore @@ -0,0 +1 @@ +/target diff --git a/plugins/ts404/.idea/.gitignore b/plugins/ts404/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/plugins/ts404/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/plugins/ts404/.idea/misc.xml b/plugins/ts404/.idea/misc.xml new file mode 100644 index 0000000..96d9004 --- /dev/null +++ b/plugins/ts404/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/plugins/ts404/.idea/modules.xml b/plugins/ts404/.idea/modules.xml new file mode 100644 index 0000000..8b6f284 --- /dev/null +++ b/plugins/ts404/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/ts404/.idea/ts404.iml b/plugins/ts404/.idea/ts404.iml new file mode 100644 index 0000000..3571d02 --- /dev/null +++ b/plugins/ts404/.idea/ts404.iml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/ts404/Cargo.lock b/plugins/ts404/Cargo.lock new file mode 100644 index 0000000..5a821ca --- /dev/null +++ b/plugins/ts404/Cargo.lock @@ -0,0 +1,895 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "anyhow" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca87830a3e3fb156dc96cfbd31cb620265dd053be734723f22b760d6cc3c3051" + +[[package]] +name = "anymap" +version = "1.0.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1f8f5a6f3d50d89e3797d7593a50f96bb2aaa20ca0cc7be1fb673232c91d72" + +[[package]] +name = "assert_no_alloc" +version = "1.1.2" +source = "git+https://github.com/robbert-vdh/rust-assert-no-alloc.git?branch=feature/nested-permit-forbid#a6fb4f62b9624715291e320ea5f0f70e73b035cf" +dependencies = [ + "backtrace", + "log", +] + +[[package]] +name = "atomic_float" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62af46d040ba9df09edc6528dae9d8e49f5f3e82f55b7d2ec31a733c38dbc49d" + +[[package]] +name = "atomic_refcell" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap-sys" +version = "0.3.0" +source = "git+https://github.com/robbert-vdh/clap-sys.git?branch=feature/cstr-macro#523a5f8a8dd021ec99e7d6e0c0ebe7741a3da9d4" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "crossbeam" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eb9105919ca8e40d437fc9cbb8f1975d916f1bd28afe795a48aae32a2cc8920" +dependencies = [ + "cfg-if", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82a9b73a36529d9c47029b9fb3a6f0ea3cc916a261195352ba19e770fc1748b2" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc6598521bb5a83d491e8c1fe51db7296019d2ca3cb93cc6c2a20369a4d78a2" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "goblin" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6b4de4a8eb6c46a8c77e1d3be942cb9a8bf073c22374578e5ba4b08ed0ff68" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] +name = "midi-consts" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f2dd5c7f8aaf48a76e389068ab25ed80bdbc226b887f9013844c415698c9952" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "nih_log" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0cdb52ef79af48ae110401c883bdb9c15e0306a99ab6ecf18bc52068b668e54" +dependencies = [ + "atty", + "log", + "once_cell", + "termcolor", + "time", + "windows", +] + +[[package]] +name = "nih_plug" +version = "0.0.0" +source = "git+https://github.com/robbert-vdh/nih-plug.git#4e8beb1098749e55df1774b49ad854f6a33a9130" +dependencies = [ + "anyhow", + "anymap", + "assert_no_alloc", + "atomic_float", + "atomic_refcell", + "backtrace", + "bitflags", + "cfg-if", + "clap-sys", + "core-foundation", + "crossbeam", + "lazy_static", + "libc", + "log", + "midi-consts", + "nih_log", + "nih_plug_derive", + "objc", + "parking_lot", + "raw-window-handle", + "serde", + "serde_json", + "vst3-sys", + "widestring", + "windows", +] + +[[package]] +name = "nih_plug_derive" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/nih-plug.git#4e8beb1098749e55df1774b49ad854f6a33a9130" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "nih_plug_xtask" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/nih-plug.git#4e8beb1098749e55df1774b49ad854f6a33a9130" +dependencies = [ + "anyhow", + "goblin", + "reflink", + "serde", + "toml", +] + +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "proc-macro2" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dd5e8a1f1029c43224ad5898e50140c2aebb1705f19e67c918ebf5b9e797fe1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22a37c9326af5ed140c86a46655b5278de879853be5573c01df185b6f49a580a" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags", +] + +[[package]] +name = "reflink" +version = "0.1.3" +source = "git+https://github.com/nicokoch/reflink.git?rev=e8d93b465f5d9ad340cd052b64bbc77b8ee107e2#e8d93b465f5d9ad340cd052b64bbc77b8ee107e2" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "ryu" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.44", +] + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.44", +] + +[[package]] +name = "serde_json" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0652c533506ad7a2e353cce269330d6afd8bdfb6d75e0ace5b35aacbd7b9e9" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d27c2c202598d05175a6dd3af46824b7f747f8d8e9b14c623f19fa5069735d" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "termcolor" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "time" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +dependencies = [ + "deranged", + "itoa", + "libc", + "num_threads", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" +dependencies = [ + "time-core", +] + +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "ts404" +version = "0.1.0" +dependencies = [ + "nih_plug", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "vst3-com" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix/drop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" +dependencies = [ + "vst3-com-macros", +] + +[[package]] +name = "vst3-com-macros" +version = "0.2.0" +source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix/drop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "vst3-com-macros-support", +] + +[[package]] +name = "vst3-com-macros-support" +version = "0.2.0" +source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix/drop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "vst3-sys" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix/drop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" +dependencies = [ + "vst3-com", +] + +[[package]] +name = "widestring" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "winnow" +version = "0.5.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a4882e6b134d6c28953a387571f1acdd3496830d5e36c5e3a1075580ea641c" +dependencies = [ + "memchr", +] + +[[package]] +name = "xtask" +version = "0.1.0" +dependencies = [ + "nih_plug_xtask", +] diff --git a/plugins/ts404/Cargo.toml b/plugins/ts404/Cargo.toml new file mode 100644 index 0000000..4df4b0c --- /dev/null +++ b/plugins/ts404/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "ts404" +version = "0.1.0" +edition = "2021" +authors = ["SolarLiner "] +license = "GPL-3.0-or-later" +homepage = "https://solarliner.dev" +description = "An inspired but fantasy screamer guitar pedal emulation" + +[workspace] +members = ["xtask"] + +[lib] +crate-type = ["cdylib"] + +[dependencies] +# Remove the `assert_process_allocs` feature to allow allocations on the audio +# thread in debug builds. +nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git", features = ["assert_process_allocs"] } +# Uncomment the below line to disable the on-by-default VST3 feature to remove +# the GPL compatibility requirement +# nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git", default_features = false, features = ["assert_process_allocs"] } + +[profile.release] +lto = "thin" +strip = "symbols" + +[profile.profiling] +inherits = "release" +debug = true +strip = "none" diff --git a/plugins/ts404/Makefile.toml b/plugins/ts404/Makefile.toml new file mode 100644 index 0000000..24c7ebf --- /dev/null +++ b/plugins/ts404/Makefile.toml @@ -0,0 +1,3 @@ +[tasks.venv] +command = "poetry" +args = ["install", "--no-root"] \ No newline at end of file diff --git a/plugins/ts404/README.md b/plugins/ts404/README.md new file mode 100644 index 0000000..1db93a3 --- /dev/null +++ b/plugins/ts404/README.md @@ -0,0 +1,9 @@ +# TS-404 + +## Building + +After installing [Rust](https://rustup.rs/), you can compile TS-404 as follows: + +```shell +cargo xtask bundle ts404 --release +``` diff --git a/plugins/ts404/bundler.toml b/plugins/ts404/bundler.toml new file mode 100644 index 0000000..104c45c --- /dev/null +++ b/plugins/ts404/bundler.toml @@ -0,0 +1,8 @@ +# This provides metadata for NIH-plug's `cargo xtask bundle ` plugin +# bundler. This file's syntax is as follows: +# +# [package_name] +# name = "Human Readable Plugin Name" # defaults to + +[ts404] +name = "TS-404" diff --git a/plugins/ts404/gen_statespace.py b/plugins/ts404/gen_statespace.py new file mode 100644 index 0000000..0d76d51 --- /dev/null +++ b/plugins/ts404/gen_statespace.py @@ -0,0 +1,107 @@ +import os +from pathlib import Path +from typing import Iterable + +from lcapy import * +import sympy as s +from sympy.core.evalf import evalf +from sympy.core.numbers import One +from sympy.printing.codeprinter import CodePrinter +from sympy.printing.rust import RustCodePrinter +from sympy.utilities.codegen import RustCodeGen + + +def opamp_neg(fb: LaplaceDomainImpedance, gnd: LaplaceDomainImpedance) -> LaplaceDomainImpedance: + return impedance(1 + fb / gnd) + + +def create_discrete_statespace(hs: LaplaceDomainImpedance) -> tuple[DTStateSpace, dict[str, ExprDict]]: + hz = hs.bilinear_transform() + hzp, hz_defs = hz.parameterize_ZPK() + return hzp.ss, hz_defs + + +def statespace_clipper(): + dist = symbol("pdist", real=True, positive=True) + ff = LSection(C(1e-6), R(10e3)).Vtransfer.as_expr().simplify() + fb = (R(500e3 * dist) + R(51e3)) | C(51e-9) + fb = fb.Z.as_expr().simplify() + fbg = C(0.047e-6) + R(4.7e3) + fbg = fbg.Z.as_expr().simplify() + + hs = (ff * opamp_neg(fb, fbg)).simplify() + return create_discrete_statespace(hs) + + +def tone_h_bass(): + bass_pre = LSection(R(1e3), C(0.22e-6)).chain(Shunt(C(0.22e-6) + R(220))).chain(Shunt(R(10e3) + V(4.5))) + return bass_pre.Vtransfer.as_expr() * opamp_neg(impedance(1e3), impedance(1)).as_expr() + + +def tone_h_treble(): + treble_pre = LSection(R(1e3), C(0.22e-6)).chain(Shunt(R(10e3) + V(4.5))) + treble_gnd = C(0.22e-6) + R(220) + return treble_pre.Vtransfer.as_expr() * opamp_neg(impedance(1e3), treble_gnd.Z.as_expr()).as_expr() + + +def lerp(a, b, t): + return a + (b - a) * t + + +def statespace_tone(): + tone = symbol("ptone", real=True, positive=True) + hs = lerp(tone_h_treble().as_expr(), tone_h_bass().as_expr(), tone) + return create_discrete_statespace(hs) + +class MyRustPrinter(RustCodePrinter): + def _print_Exp1(self, expr, _type=False): + return "T::simd_e()" + + def _print_Pi(self, expr, _type=False): + return "T::simd_pi()" + + def _print_Float(self, expr, _type=False): + ret = str(evalf(expr, expr._prec, {})) + return f"T::from_f64({ret})" + + def _print_Rational(self, expr): + if expr.p == 1: + return f"T::from_f64({self._print(expr.q)}).simd_recip()" + + p, q = tuple(f"T::from_f64({self._print(i)}.0)" for i in (expr.p, expr.q)) + return f"{p} / {q}" + + def _print_MatrixBase(self, A): + values = ", ".join(self._print(x) for x in A) + return f"SMatrix::<_, {A.rows}, {A.cols}>::new({values})" + +def write_codegen(prefix: str, name: str, state_space: DTStateSpace, params: dict): + codegen = RustCodeGen(project="ts404", printer=MyRustPrinter()) + routines = [ + codegen.routine(f"{name}_params", [v.sympy for v in params.values()], argument_sequence=None, + global_vars=[]), + codegen.routine(name, tuple(m.sympy for m in [state_space.A, state_space.B, state_space.C, state_space.D]), + argument_sequence=None, + global_vars=[]) + ] + codegen.write(routines, str(prefix), to_files=True, header=True) + + +def codegen_function(name: str, *exprs: s.Expr, public="pub(crate)") -> Iterable[str]: + from sympy.codegen import Assignment + + printer = RustCodePrinter() + e = s.Tuple(*exprs) + sub, simpl = s.cse(e) + args = ", ".join(f"{name}: T" for name in e.atoms(s.Idx)) + yield f"{public} fn {name}({args}) {{" + for var, e in sub: + yield f" let {printer.doprint(Assignment(var, e))}" + yield " " + printer.doprint(simpl) + yield "}}" + +if __name__ == "__main__": + OUT_DIR = "src/gen" + os.makedirs(OUT_DIR, exist_ok=True) + write_codegen("src/gen/clipper", "clipper", *statespace_clipper()) + write_codegen("src/gen/tone", "tone", *statespace_tone()) diff --git a/plugins/ts404/poetry.lock b/plugins/ts404/poetry.lock new file mode 100644 index 0000000..ae8bde6 --- /dev/null +++ b/plugins/ts404/poetry.lock @@ -0,0 +1,881 @@ +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "contourpy" +version = "1.2.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, + {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, + {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, + {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, + {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, + {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, + {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, + {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, + {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, + {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, + {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, +] + +[package.dependencies] +numpy = ">=1.20,<2.0" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "fonttools" +version = "4.47.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.47.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2d2404107626f97a221dc1a65b05396d2bb2ce38e435f64f26ed2369f68675d9"}, + {file = "fonttools-4.47.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c01f409be619a9a0f5590389e37ccb58b47264939f0e8d58bfa1f3ba07d22671"}, + {file = "fonttools-4.47.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d986b66ff722ef675b7ee22fbe5947a41f60a61a4da15579d5e276d897fbc7fa"}, + {file = "fonttools-4.47.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8acf6dd0434b211b3bd30d572d9e019831aae17a54016629fa8224783b22df8"}, + {file = "fonttools-4.47.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:495369c660e0c27233e3c572269cbe520f7f4978be675f990f4005937337d391"}, + {file = "fonttools-4.47.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c59227d7ba5b232281c26ae04fac2c73a79ad0e236bca5c44aae904a18f14faf"}, + {file = "fonttools-4.47.0-cp310-cp310-win32.whl", hash = "sha256:59a6c8b71a245800e923cb684a2dc0eac19c56493e2f896218fcf2571ed28984"}, + {file = "fonttools-4.47.0-cp310-cp310-win_amd64.whl", hash = "sha256:52c82df66201f3a90db438d9d7b337c7c98139de598d0728fb99dab9fd0495ca"}, + {file = "fonttools-4.47.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:854421e328d47d70aa5abceacbe8eef231961b162c71cbe7ff3f47e235e2e5c5"}, + {file = "fonttools-4.47.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:511482df31cfea9f697930f61520f6541185fa5eeba2fa760fe72e8eee5af88b"}, + {file = "fonttools-4.47.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0e2c88c8c985b7b9a7efcd06511fb0a1fe3ddd9a6cd2895ef1dbf9059719d7"}, + {file = "fonttools-4.47.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7a0a8848726956e9d9fb18c977a279013daadf0cbb6725d2015a6dd57527992"}, + {file = "fonttools-4.47.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e869da810ae35afb3019baa0d0306cdbab4760a54909c89ad8904fa629991812"}, + {file = "fonttools-4.47.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dd23848f877c3754f53a4903fb7a593ed100924f9b4bff7d5a4e2e8a7001ae11"}, + {file = "fonttools-4.47.0-cp311-cp311-win32.whl", hash = "sha256:bf1810635c00f7c45d93085611c995fc130009cec5abdc35b327156aa191f982"}, + {file = "fonttools-4.47.0-cp311-cp311-win_amd64.whl", hash = "sha256:61df4dee5d38ab65b26da8efd62d859a1eef7a34dcbc331299a28e24d04c59a7"}, + {file = "fonttools-4.47.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e3f4d61f3a8195eac784f1d0c16c0a3105382c1b9a74d99ac4ba421da39a8826"}, + {file = "fonttools-4.47.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:174995f7b057e799355b393e97f4f93ef1f2197cbfa945e988d49b2a09ecbce8"}, + {file = "fonttools-4.47.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea592e6a09b71cb7a7661dd93ac0b877a6228e2d677ebacbad0a4d118494c86d"}, + {file = "fonttools-4.47.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40bdbe90b33897d9cc4a39f8e415b0fcdeae4c40a99374b8a4982f127ff5c767"}, + {file = "fonttools-4.47.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:843509ae9b93db5aaf1a6302085e30bddc1111d31e11d724584818f5b698f500"}, + {file = "fonttools-4.47.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9acfa1cdc479e0dde528b61423855913d949a7f7fe09e276228298fef4589540"}, + {file = "fonttools-4.47.0-cp312-cp312-win32.whl", hash = "sha256:66c92ec7f95fd9732550ebedefcd190a8d81beaa97e89d523a0d17198a8bda4d"}, + {file = "fonttools-4.47.0-cp312-cp312-win_amd64.whl", hash = "sha256:e8fa20748de55d0021f83754b371432dca0439e02847962fc4c42a0e444c2d78"}, + {file = "fonttools-4.47.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c75e19971209fbbce891ebfd1b10c37320a5a28e8d438861c21d35305aedb81c"}, + {file = "fonttools-4.47.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e79f1a3970d25f692bbb8c8c2637e621a66c0d60c109ab48d4a160f50856deff"}, + {file = "fonttools-4.47.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:562681188c62c024fe2c611b32e08b8de2afa00c0c4e72bed47c47c318e16d5c"}, + {file = "fonttools-4.47.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a77a60315c33393b2bd29d538d1ef026060a63d3a49a9233b779261bad9c3f71"}, + {file = "fonttools-4.47.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4fabb8cc9422efae1a925160083fdcbab8fdc96a8483441eb7457235df625bd"}, + {file = "fonttools-4.47.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2a78dba8c2a1e9d53a0fb5382979f024200dc86adc46a56cbb668a2249862fda"}, + {file = "fonttools-4.47.0-cp38-cp38-win32.whl", hash = "sha256:e6b968543fde4119231c12c2a953dcf83349590ca631ba8216a8edf9cd4d36a9"}, + {file = "fonttools-4.47.0-cp38-cp38-win_amd64.whl", hash = "sha256:4a9a51745c0439516d947480d4d884fa18bd1458e05b829e482b9269afa655bc"}, + {file = "fonttools-4.47.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:62d8ddb058b8e87018e5dc26f3258e2c30daad4c87262dfeb0e2617dd84750e6"}, + {file = "fonttools-4.47.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5dde0eab40faaa5476133123f6a622a1cc3ac9b7af45d65690870620323308b4"}, + {file = "fonttools-4.47.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4da089f6dfdb822293bde576916492cd708c37c2501c3651adde39804630538"}, + {file = "fonttools-4.47.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:253bb46bab970e8aae254cebf2ae3db98a4ef6bd034707aa68a239027d2b198d"}, + {file = "fonttools-4.47.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1193fb090061efa2f9e2d8d743ae9850c77b66746a3b32792324cdce65784154"}, + {file = "fonttools-4.47.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:084511482dd265bce6dca24c509894062f0117e4e6869384d853f46c0e6d43be"}, + {file = "fonttools-4.47.0-cp39-cp39-win32.whl", hash = "sha256:97620c4af36e4c849e52661492e31dc36916df12571cb900d16960ab8e92a980"}, + {file = "fonttools-4.47.0-cp39-cp39-win_amd64.whl", hash = "sha256:e77bdf52185bdaf63d39f3e1ac3212e6cfa3ab07d509b94557a8902ce9c13c82"}, + {file = "fonttools-4.47.0-py3-none-any.whl", hash = "sha256:d6477ba902dd2d7adda7f0fd3bfaeb92885d45993c9e1928c9f28fc3961415f7"}, + {file = "fonttools-4.47.0.tar.gz", hash = "sha256:ec13a10715eef0e031858c1c23bfaee6cba02b97558e4a7bfa089dba4a8c2ebf"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0,<5)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "ipython" +version = "8.19.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +files = [ + {file = "ipython-8.19.0-py3-none-any.whl", hash = "sha256:2f55d59370f59d0d2b2212109fe0e6035cfea436b1c0e6150ad2244746272ec5"}, + {file = "ipython-8.19.0.tar.gz", hash = "sha256:ac4da4ecf0042fb4e0ce57c60430c2db3c719fa8bdf92f8631d6bd8a5785d1f0"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" + +[package.extras] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.23)", "pandas", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath", "trio"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + +[[package]] +name = "lcapy" +version = "1.20" +description = "Symbolic linear circuit analysis" +optional = false +python-versions = ">=3.7" +files = [ + {file = "lcapy-1.20-py3-none-any.whl", hash = "sha256:98ef1a056a0b1bffcc74995b267d5440a6a13efc9e0fe1f241bc59683de77e40"}, + {file = "lcapy-1.20.tar.gz", hash = "sha256:391daaedbf7a681c1a9414770c8775fa595a4f28ffbac92b54fd6140b5e6ebdc"}, +] + +[package.dependencies] +IPython = "*" +matplotlib = "*" +networkx = "*" +numpy = "*" +property-cached = "*" +scipy = "*" +setuptools = "*" +sympy = ">=1.10.1" +wheel = "*" + +[package.extras] +doc = ["ipython", "sphinx"] +release = ["twine", "wheel"] +test = ["flake8", "flake8-bugbear", "flake8-comprehensions", "flake8-requirements", "nose"] + +[[package]] +name = "matplotlib" +version = "3.8.2" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"}, + {file = "matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367"}, + {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18"}, + {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31"}, + {file = "matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a"}, + {file = "matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a"}, + {file = "matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63"}, + {file = "matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8"}, + {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6"}, + {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788"}, + {file = "matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0"}, + {file = "matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717"}, + {file = "matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627"}, + {file = "matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4"}, + {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d"}, + {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331"}, + {file = "matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213"}, + {file = "matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630"}, + {file = "matplotlib-3.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f"}, + {file = "matplotlib-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89"}, + {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917"}, + {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843"}, + {file = "matplotlib-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8"}, + {file = "matplotlib-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa"}, + {file = "matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.21,<2" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "networkx" +version = "3.2.1" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.9" +files = [ + {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, + {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, +] + +[package.extras] +default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "numpy" +version = "1.26.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f"}, + {file = "numpy-1.26.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523"}, + {file = "numpy-1.26.2-cp310-cp310-win32.whl", hash = "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9"}, + {file = "numpy-1.26.2-cp310-cp310-win_amd64.whl", hash = "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8"}, + {file = "numpy-1.26.2-cp311-cp311-win32.whl", hash = "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186"}, + {file = "numpy-1.26.2-cp311-cp311-win_amd64.whl", hash = "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec"}, + {file = "numpy-1.26.2-cp312-cp312-win32.whl", hash = "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167"}, + {file = "numpy-1.26.2-cp312-cp312-win_amd64.whl", hash = "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36"}, + {file = "numpy-1.26.2-cp39-cp39-win32.whl", hash = "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80"}, + {file = "numpy-1.26.2-cp39-cp39-win_amd64.whl", hash = "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841"}, + {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, +] + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pillow" +version = "10.1.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, + {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, + {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, + {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, + {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, + {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, + {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "property-cached" +version = "1.6.4" +description = "A decorator for caching properties in classes (forked from cached-property)." +optional = false +python-versions = ">= 3.5" +files = [ + {file = "property-cached-1.6.4.zip", hash = "sha256:3e9c4ef1ed3653909147510481d7df62a3cfb483461a6986a6f1dcd09b2ebb73"}, + {file = "property_cached-1.6.4-py2.py3-none-any.whl", hash = "sha256:135fc059ec969c1646424a0db15e7fbe1b5f8c36c0006d0b3c91ba568c11e7d8"}, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pygments" +version = "2.17.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] + +[package.extras] +plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pyparsing" +version = "3.1.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "scipy" +version = "1.11.4" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, + {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, + {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, + {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, + {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, + {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, + {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, + {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, + {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, + {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, + {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, + {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, + {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, + {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, + {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, + {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, + {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, + {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, + {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, + {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, + {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, + {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, + {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, + {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, + {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, +] + +[package.dependencies] +numpy = ">=1.21.6,<1.28.0" + +[package.extras] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "setuptools" +version = "69.0.3" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, + {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "sympy" +version = "1.12" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, + {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, +] + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +name = "traitlets" +version = "5.14.0" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.0-py3-none-any.whl", hash = "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33"}, + {file = "traitlets-5.14.0.tar.gz", hash = "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "wcwidth" +version = "0.2.12" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.12-py2.py3-none-any.whl", hash = "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"}, + {file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"}, +] + +[[package]] +name = "wheel" +version = "0.42.0" +description = "A built-package format for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, + {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.12" +content-hash = "2012e5628d12ed7e06d9d99f4225365ce6d93069331b8618a7d00bffa6d4dbfe" diff --git a/plugins/ts404/pyproject.toml b/plugins/ts404/pyproject.toml new file mode 100644 index 0000000..be8e23d --- /dev/null +++ b/plugins/ts404/pyproject.toml @@ -0,0 +1,16 @@ +[tool.poetry] +name = "ts404" +version = "0.1.0" +description = "" +authors = ["Nathan Graule "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.12" +sympy = "^1.12" +lcapy = "^1.20" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/plugins/ts404/src/gen.rs b/plugins/ts404/src/gen.rs new file mode 100644 index 0000000..5e34562 --- /dev/null +++ b/plugins/ts404/src/gen.rs @@ -0,0 +1,4 @@ +#![allow(non_snake_case)] +#![allow(unused)] +pub mod clipper; +pub mod tone; \ No newline at end of file diff --git a/plugins/ts404/src/gen/clipper.rs b/plugins/ts404/src/gen/clipper.rs new file mode 100644 index 0000000..703579f --- /dev/null +++ b/plugins/ts404/src/gen/clipper.rs @@ -0,0 +1,23 @@ + +fn clipper_params(Delta_t: f64, pdist: f64) -> (f64, i32, f64, f64, f64, f64, f64) { + + let out1 = (2500000000000*Delta_t.powi(2) + 245000000000*Delta_t*pdist + 26094500000*Delta_t + 56329500*pdist + 5745609)/(125000000000000*Delta_t.powi(3) + 6375000000000*Delta_t.powi(2)*pdist + 3205475000000*Delta_t.powi(2) + 130316475000*Delta_t*pdist + 14396780450*Delta_t + 56329500*pdist + 5745609); + let out2 = 1; + let out3 = (-2500000000000*Delta_t.powi(2) - 500000*Delta_t*(240100000000*pdist.powi(2) + 48892040000*pdist + 2493867361).sqrt() + 56329500*pdist + 5745609)/(2500000000000*Delta_t.powi(2) + 245000000000*Delta_t*pdist + 26094500000*Delta_t + 56329500*pdist + 5745609); + let out4 = (-2500000000000*Delta_t.powi(2) + 500000*Delta_t*(240100000000*pdist.powi(2) + 48892040000*pdist + 2493867361).sqrt() + 56329500*pdist + 5745609)/(2500000000000*Delta_t.powi(2) + 245000000000*Delta_t*pdist + 26094500000*Delta_t + 56329500*pdist + 5745609); + let out5 = (1 - 50*Delta_t)/(50*Delta_t + 1); + let out6 = (-500000*Delta_t + 25500*pdist + 2601)/(500000*Delta_t + 25500*pdist + 2601); + let out7 = (2209 - 5000000*Delta_t)/(5000000*Delta_t + 2209); + (out1, out2, out3, out4, out5, out6, out7) + +} + +fn clipper(K: f64, p1: f64, p2: f64, p3: f64, z1: f64, z2: f64, z3: f64) -> (f64, i32, f64, f64) { + + let out1 = SMatrix::<_, 3, 3>::new(0, 1, 0, 0, 0, 1, p1*p2*p3, -p1*p2 - p1*p3 - p2*p3, p1 + p2 + p3); + let out2 = SMatrix::<_, 3, 1>::new(0, 0, 1); + let out3 = SMatrix::<_, 1, 3>::new(K*p1*p2*p3 - K*z1*z2*z3, K*z1*z2 + K*z1*z3 + K*z2*z3 - K*(p1*p2 + p1*p3 + p2*p3), -K*z1 - K*z2 - K*z3 - K*(-p1 - p2 - p3)); + let out4 = SMatrix::<_, 1, 1>::new(K); + (out1, out2, out3, out4) + +} diff --git a/plugins/ts404/src/gen/tone.rs b/plugins/ts404/src/gen/tone.rs new file mode 100644 index 0000000..7371738 --- /dev/null +++ b/plugins/ts404/src/gen/tone.rs @@ -0,0 +1,25 @@ + +fn tone_params(Delta_t: f64, ptone: f64) -> (f64, i32, f64, f64, f64, f64, f64, f64, f64) { + + let out1 = (97656250000000000000000*Delta_t.powi(4)*ptone + 97656250000000000000*Delta_t.powi(4) + 57886718750000000000*Delta_t.powi(3)*ptone + 140000000000000000*Delta_t.powi(3) + 8435246875000000*Delta_t.powi(2)*ptone + 50793187500000*Delta_t.powi(2) + 364361250000*Delta_t*ptone + 2029775000*Delta_t)/(107421875000000000000*Delta_t.powi(4) + 149703125000000000*Delta_t.powi(3) + 56178443750000*Delta_t.powi(2) + 5796505000*Delta_t + 161051); + let out2 = -1; + let out3 = -T::from_f64(3).simd_recip()*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2))/((T::from_f64(2).simd_recip())*(-4*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2)).powi(3) + (27*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - 9*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + 2*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).powi(2)).sqrt() + (T::from_f64(27.0) / T::from_f64(2.0))*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - T::from_f64(9.0) / T::from_f64(2.0)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).cbrt() - T::from_f64(3).simd_recip()*((T::from_f64(2).simd_recip())*(-4*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2)).powi(3) + (27*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - 9*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + 2*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).powi(2)).sqrt() + (T::from_f64(27.0) / T::from_f64(2.0))*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - T::from_f64(9.0) / T::from_f64(2.0)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).cbrt() - T::from_f64(3).simd_recip()*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191); + let out4 = -T::from_f64(3).simd_recip()*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2))/((T::from_f64(-1.0) / T::from_f64(2.0) + (T::from_f64(2).simd_recip())*T::from_f64(((0, 3900231685776981, -51, 52), None, 53, None))*I)*((T::from_f64(2).simd_recip())*(-4*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2)).powi(3) + (27*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - 9*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + 2*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).powi(2)).sqrt() + (T::from_f64(27.0) / T::from_f64(2.0))*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - T::from_f64(9.0) / T::from_f64(2.0)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).cbrt()) - T::from_f64(3).simd_recip()*(T::from_f64(-1.0) / T::from_f64(2.0) + (T::from_f64(2).simd_recip())*T::from_f64(((0, 3900231685776981, -51, 52), None, 53, None))*I)*((T::from_f64(2).simd_recip())*(-4*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2)).powi(3) + (27*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - 9*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + 2*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).powi(2)).sqrt() + (T::from_f64(27.0) / T::from_f64(2.0))*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - T::from_f64(9.0) / T::from_f64(2.0)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).cbrt() - T::from_f64(3).simd_recip()*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191); + let out5 = -T::from_f64(3).simd_recip()*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2))/((T::from_f64(-1.0) / T::from_f64(2.0) - T::from_f64(2).simd_recip()*T::from_f64(((0, 3900231685776981, -51, 52), None, 53, None))*I)*((T::from_f64(2).simd_recip())*(-4*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2)).powi(3) + (27*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - 9*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + 2*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).powi(2)).sqrt() + (T::from_f64(27.0) / T::from_f64(2.0))*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - T::from_f64(9.0) / T::from_f64(2.0)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).cbrt()) - T::from_f64(3).simd_recip()*(T::from_f64(-1.0) / T::from_f64(2.0) - T::from_f64(2).simd_recip()*T::from_f64(((0, 3900231685776981, -51, 52), None, 53, None))*I)*((T::from_f64(2).simd_recip())*(-4*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2)).powi(3) + (27*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - 9*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + 2*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).powi(2)).sqrt() + (T::from_f64(27.0) / T::from_f64(2.0))*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - T::from_f64(9.0) / T::from_f64(2.0)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).cbrt() - T::from_f64(3).simd_recip()*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191); + let out6 = (1 - 2500*Delta_t)/(2500*Delta_t + 1); + let out7 = (121 - 1250000*Delta_t)/(1250000*Delta_t + 121); + let out8 = (-3125000000*Delta_t.powi(2) - 2500*T::from_f64(((0, 8860250840835989, -43, 53), None, 53, None))*Delta_t + 121)/(3125000000*Delta_t.powi(2) + 2802500*Delta_t + 121); + let out9 = (-3125000000*Delta_t.powi(2) + 2500*T::from_f64(((0, 8860250840835989, -43, 53), None, 53, None))*Delta_t + 121)/(3125000000*Delta_t.powi(2) + 2802500*Delta_t + 121); + (out1, out2, out3, out4, out5, out6, out7, out8, out9) + +} + +fn tone(K: f64, p1: f64, p2: f64, p3: f64, p4: f64, z1: f64, z2: f64, z3: f64, z4: f64) -> (f64, i32, f64, f64) { + + let out1 = SMatrix::<_, 4, 4>::new(0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -p1*p2*p3*p4, p1*p2*p3 + p1*p2*p4 + p1*p3*p4 + p2*p3*p4, -p1*p2 - p1*p3 - p1*p4 - p2*p3 - p2*p4 - p3*p4, p1 + p2 + p3 + p4); + let out2 = SMatrix::<_, 4, 1>::new(0, 0, 0, 1); + let out3 = SMatrix::<_, 1, 4>::new(-K*p1*p2*p3*p4 + K*z1*z2*z3*z4, -K*z1*z2*z3 - K*z1*z2*z4 - K*z1*z3*z4 - K*z2*z3*z4 - K*(-p1*p2*p3 - p1*p2*p4 - p1*p3*p4 - p2*p3*p4), K*z1*z2 + K*z1*z3 + K*z1*z4 + K*z2*z3 + K*z2*z4 + K*z3*z4 - K*(p1*p2 + p1*p3 + p1*p4 + p2*p3 + p2*p4 + p3*p4), -K*z1 - K*z2 - K*z3 - K*z4 - K*(-p1 - p2 - p3 - p4)); + let out4 = SMatrix::<_, 1, 1>::new(K); + (out1, out2, out3, out4) + +} diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs new file mode 100644 index 0000000..8fd0fff --- /dev/null +++ b/plugins/ts404/src/lib.rs @@ -0,0 +1,159 @@ +mod gen; + +use nih_plug::prelude::*; +use std::sync::Arc; + +// This is a shortened version of the gain example with most comments removed, check out +// https://github.com/robbert-vdh/nih-plug/blob/master/plugins/examples/gain/src/lib.rs to get +// started + +struct Ts404 { + params: Arc, +} + +#[derive(Params)] +struct Ts404Params { + /// The parameter's ID is used to identify the parameter in the wrappred plugin API. As long as + /// these IDs remain constant, you can rename and reorder these fields as you wish. The + /// parameters are exposed to the host in the same order they were defined. In this case, this + /// gain parameter is stored as linear gain while the values are displayed in decibels. + #[id = "gain"] + pub gain: FloatParam, +} + +impl Default for Ts404 { + fn default() -> Self { + Self { + params: Arc::new(Ts404Params::default()), + } + } +} + +impl Default for Ts404Params { + fn default() -> Self { + Self { + // This gain is stored as linear gain. NIH-plug comes with useful conversion functions + // to treat these kinds of parameters as if we were dealing with decibels. Storing this + // as decibels is easier to work with, but requires a conversion for every sample. + gain: FloatParam::new( + "Gain", + util::db_to_gain(0.0), + FloatRange::Skewed { + min: util::db_to_gain(-30.0), + max: util::db_to_gain(30.0), + // This makes the range appear as if it was linear when displaying the values as + // decibels + factor: FloatRange::gain_skew_factor(-30.0, 30.0), + }, + ) + // Because the gain parameter is stored as linear gain instead of storing the value as + // decibels, we need logarithmic smoothing + .with_smoother(SmoothingStyle::Logarithmic(50.0)) + .with_unit(" dB") + // There are many predefined formatters we can use here. If the gain was stored as + // decibels instead of as a linear gain value, we could have also used the + // `.with_step_size(0.1)` function to get internal rounding. + .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) + .with_string_to_value(formatters::s2v_f32_gain_to_db()), + } + } +} + +impl Plugin for Ts404 { + const NAME: &'static str = "TS-404"; + const VENDOR: &'static str = "SolarLiner"; + const URL: &'static str = env!("CARGO_PKG_HOMEPAGE"); + const EMAIL: &'static str = "me@solarliner.dev"; + + const VERSION: &'static str = env!("CARGO_PKG_VERSION"); + + // The first audio IO layout is used as the default. The other layouts may be selected either + // explicitly or automatically by the host or the user depending on the plugin API/backend. + const AUDIO_IO_LAYOUTS: &'static [AudioIOLayout] = &[AudioIOLayout { + main_input_channels: NonZeroU32::new(2), + main_output_channels: NonZeroU32::new(2), + + aux_input_ports: &[], + aux_output_ports: &[], + + // Individual ports and the layout as a whole can be named here. By default these names + // are generated as needed. This layout will be called 'Stereo', while a layout with + // only one input and output channel would be called 'Mono'. + names: PortNames::const_default(), + }]; + + + const MIDI_INPUT: MidiConfig = MidiConfig::None; + const MIDI_OUTPUT: MidiConfig = MidiConfig::None; + + const SAMPLE_ACCURATE_AUTOMATION: bool = true; + + // If the plugin can send or receive SysEx messages, it can define a type to wrap around those + // messages here. The type implements the `SysExMessage` trait, which allows conversion to and + // from plain byte buffers. + type SysExMessage = (); + // More advanced plugins can use this to run expensive background tasks. See the field's + // documentation for more information. `()` means that the plugin does not have any background + // tasks. + type BackgroundTask = (); + + fn params(&self) -> Arc { + self.params.clone() + } + + fn initialize( + &mut self, + _audio_io_layout: &AudioIOLayout, + _buffer_config: &BufferConfig, + _context: &mut impl InitContext, + ) -> bool { + // Resize buffers and perform other potentially expensive initialization operations here. + // The `reset()` function is always called right after this function. You can remove this + // function if you do not need it. + true + } + + fn reset(&mut self) { + // Reset buffers and envelopes here. This can be called from the audio thread and may not + // allocate. You can remove this function if you do not need it. + } + + fn process( + &mut self, + buffer: &mut Buffer, + _aux: &mut AuxiliaryBuffers, + _context: &mut impl ProcessContext, + ) -> ProcessStatus { + for channel_samples in buffer.iter_samples() { + // Smoothing is optionally built into the parameters themselves + let gain = self.params.gain.smoothed.next(); + + for sample in channel_samples { + *sample *= gain; + } + } + + ProcessStatus::Normal + } +} + +impl ClapPlugin for Ts404 { + const CLAP_ID: &'static str = "dev.solarliner.ts404"; + const CLAP_DESCRIPTION: Option<&'static str> = Some("An inspired but fantasy screamer guitar pedal emulation"); + const CLAP_MANUAL_URL: Option<&'static str> = Some(Self::URL); + const CLAP_SUPPORT_URL: Option<&'static str> = None; + + // Don't forget to change these features + const CLAP_FEATURES: &'static [ClapFeature] = &[ClapFeature::AudioEffect, ClapFeature::Stereo]; +} + +impl Vst3Plugin for Ts404 { + const VST3_CLASS_ID: [u8; 16] = *b"SolNrPluginTs404"; + + // And also don't forget to change these categories + const VST3_SUBCATEGORIES: &'static [Vst3SubCategory] = + &[Vst3SubCategory::Fx, Vst3SubCategory::Dynamics]; +} + +nih_export_clap!(Ts404); +nih_export_vst3!(Ts404); diff --git a/plugins/ts404/xtask/Cargo.toml b/plugins/ts404/xtask/Cargo.toml new file mode 100644 index 0000000..6ea187b --- /dev/null +++ b/plugins/ts404/xtask/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "xtask" +version = "0.1.0" +edition = "2021" + +[dependencies] +nih_plug_xtask = { git = "https://github.com/robbert-vdh/nih-plug.git" } diff --git a/plugins/ts404/xtask/src/main.rs b/plugins/ts404/xtask/src/main.rs new file mode 100644 index 0000000..11fecb6 --- /dev/null +++ b/plugins/ts404/xtask/src/main.rs @@ -0,0 +1,3 @@ +fn main() -> nih_plug_xtask::Result<()> { + nih_plug_xtask::main() +} From 0b5631fad2168a60aa429c7413569f9b4c5d873e Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 1 Jan 2024 18:56:22 +0100 Subject: [PATCH 02/51] chore: cleaning + more ignore --- plugins/ts404/.gitignore | 3 +++ plugins/ts404/.idea/vcs.xml | 6 ++++++ plugins/ts404/gen_statespace.py | 8 ++++---- 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 plugins/ts404/.idea/vcs.xml diff --git a/plugins/ts404/.gitignore b/plugins/ts404/.gitignore index ea8c4bf..d497890 100644 --- a/plugins/ts404/.gitignore +++ b/plugins/ts404/.gitignore @@ -1 +1,4 @@ +.vscode +.idea +.venv /target diff --git a/plugins/ts404/.idea/vcs.xml b/plugins/ts404/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/plugins/ts404/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/plugins/ts404/gen_statespace.py b/plugins/ts404/gen_statespace.py index 0d76d51..d851e2f 100644 --- a/plugins/ts404/gen_statespace.py +++ b/plugins/ts404/gen_statespace.py @@ -1,12 +1,9 @@ import os -from pathlib import Path from typing import Iterable -from lcapy import * import sympy as s +from lcapy import * from sympy.core.evalf import evalf -from sympy.core.numbers import One -from sympy.printing.codeprinter import CodePrinter from sympy.printing.rust import RustCodePrinter from sympy.utilities.codegen import RustCodeGen @@ -53,6 +50,7 @@ def statespace_tone(): hs = lerp(tone_h_treble().as_expr(), tone_h_bass().as_expr(), tone) return create_discrete_statespace(hs) + class MyRustPrinter(RustCodePrinter): def _print_Exp1(self, expr, _type=False): return "T::simd_e()" @@ -75,6 +73,7 @@ def _print_MatrixBase(self, A): values = ", ".join(self._print(x) for x in A) return f"SMatrix::<_, {A.rows}, {A.cols}>::new({values})" + def write_codegen(prefix: str, name: str, state_space: DTStateSpace, params: dict): codegen = RustCodeGen(project="ts404", printer=MyRustPrinter()) routines = [ @@ -100,6 +99,7 @@ def codegen_function(name: str, *exprs: s.Expr, public="pub(crate)") -> Iterable yield " " + printer.doprint(simpl) yield "}}" + if __name__ == "__main__": OUT_DIR = "src/gen" os.makedirs(OUT_DIR, exist_ok=True) From 5963cdd51311c3486582dcc296a13d13089efbde Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 1 Jan 2024 19:04:28 +0100 Subject: [PATCH 03/51] doc: update README --- plugins/ts404/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/ts404/README.md b/plugins/ts404/README.md index 1db93a3..01148cc 100644 --- a/plugins/ts404/README.md +++ b/plugins/ts404/README.md @@ -1,4 +1,6 @@ -# TS-404 +# Error 404: Screamer not found + +A guitar pedal plugin inspired by the most popular screamer pedal. ## Building From f52220ad25c30aad3d3e58ffe0420739d6b7c181 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 1 Jan 2024 21:48:41 +0100 Subject: [PATCH 04/51] feat: integrate clipper and tone stages --- plugins/ts404/.gitignore | 3 + plugins/ts404/.python-version | 1 + plugins/ts404/Cargo.lock | 182 +++++++++++++++++++++++++++++-- plugins/ts404/Cargo.toml | 13 ++- plugins/ts404/Makefile.toml | 26 ++++- plugins/ts404/bundler.toml | 6 - plugins/ts404/gen_statespace.py | 78 ++++++++----- plugins/ts404/rust-toolchain | 1 + plugins/ts404/src/dsp.rs | 67 ++++++++++++ plugins/ts404/src/gen.rs | 4 - plugins/ts404/src/gen/clipper.rs | 23 ---- plugins/ts404/src/gen/tone.rs | 25 ----- plugins/ts404/src/lib.rs | 104 ++++++++++-------- 13 files changed, 385 insertions(+), 148 deletions(-) create mode 100644 plugins/ts404/.python-version create mode 100644 plugins/ts404/rust-toolchain create mode 100644 plugins/ts404/src/dsp.rs delete mode 100644 plugins/ts404/src/gen.rs delete mode 100644 plugins/ts404/src/gen/clipper.rs delete mode 100644 plugins/ts404/src/gen/tone.rs diff --git a/plugins/ts404/.gitignore b/plugins/ts404/.gitignore index d497890..a9d64c4 100644 --- a/plugins/ts404/.gitignore +++ b/plugins/ts404/.gitignore @@ -2,3 +2,6 @@ .idea .venv /target + +# Generated in-tree source files +src/gen.rs \ No newline at end of file diff --git a/plugins/ts404/.python-version b/plugins/ts404/.python-version new file mode 100644 index 0000000..92536a9 --- /dev/null +++ b/plugins/ts404/.python-version @@ -0,0 +1 @@ +3.12.0 diff --git a/plugins/ts404/Cargo.lock b/plugins/ts404/Cargo.lock index 5a821ca..f2e7897 100644 --- a/plugins/ts404/Cargo.lock +++ b/plugins/ts404/Cargo.lock @@ -30,12 +30,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f1f8f5a6f3d50d89e3797d7593a50f96bb2aaa20ca0cc7be1fb673232c91d72" [[package]] -name = "assert_no_alloc" -version = "1.1.2" -source = "git+https://github.com/robbert-vdh/rust-assert-no-alloc.git?branch=feature/nested-permit-forbid#a6fb4f62b9624715291e320ea5f0f70e73b035cf" +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" dependencies = [ - "backtrace", - "log", + "num-traits", ] [[package]] @@ -67,6 +67,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + [[package]] name = "backtrace" version = "0.3.69" @@ -88,6 +94,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bytemuck" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" + [[package]] name = "cc" version = "1.0.83" @@ -289,6 +301,16 @@ dependencies = [ "libc", ] +[[package]] +name = "matrixmultiply" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +dependencies = [ + "autocfg", + "rawpointer", +] + [[package]] name = "memchr" version = "2.7.1" @@ -310,6 +332,33 @@ dependencies = [ "adler", ] +[[package]] +name = "nalgebra" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "307ed9b18cc2423f29e83f84fd23a8e73628727990181f18641a8b5dc2ab1caa" +dependencies = [ + "approx", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "nih_log" version = "0.3.1" @@ -331,7 +380,6 @@ source = "git+https://github.com/robbert-vdh/nih-plug.git#4e8beb1098749e55df1774 dependencies = [ "anyhow", "anymap", - "assert_no_alloc", "atomic_float", "atomic_refcell", "backtrace", @@ -378,6 +426,45 @@ dependencies = [ "toml", ] +[[package]] +name = "num-complex" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + [[package]] name = "num_threads" version = "0.1.6" @@ -387,6 +474,16 @@ dependencies = [ "libc", ] +[[package]] +name = "numeric_literals" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "095aa67b0b9f2081746998f4f17106bdb51d56dc8c211afca5531b92b83bf98a" +dependencies = [ + "quote", + "syn 1.0.109", +] + [[package]] name = "objc" version = "0.2.7" @@ -434,6 +531,12 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "plain" version = "0.2.3" @@ -470,6 +573,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + [[package]] name = "redox_syscall" version = "0.4.1" @@ -500,6 +609,15 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +[[package]] +name = "safe_arch" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" +dependencies = [ + "bytemuck", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -523,7 +641,7 @@ checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ "proc-macro2", "quote", - "syn 2.0.44", + "syn 2.0.45", ] [[package]] @@ -543,7 +661,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.44", + "syn 2.0.45", ] [[package]] @@ -566,6 +684,19 @@ dependencies = [ "serde", ] +[[package]] +name = "simba" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + [[package]] name = "smallvec" version = "1.11.2" @@ -585,9 +716,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.44" +version = "2.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d27c2c202598d05175a6dd3af46824b7f747f8d8e9b14c623f19fa5069735d" +checksum = "0eae3c679c56dc214320b67a1bc04ef3dfbd6411f6443974b5e4893231298e66" dependencies = [ "proc-macro2", "quote", @@ -672,15 +803,36 @@ dependencies = [ name = "ts404" version = "0.1.0" dependencies = [ + "nalgebra", "nih_plug", + "num-traits", + "valib", ] +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "valib" +version = "0.1.0" +source = "git+https://github.com/SolarLiner/valib.git#efdae667d020d62cbce4da2be38b3bd1f6850f60" +dependencies = [ + "az", + "nalgebra", + "num-traits", + "numeric_literals", + "simba", +] + [[package]] name = "vst3-com" version = "0.1.0" @@ -718,6 +870,16 @@ dependencies = [ "vst3-com", ] +[[package]] +name = "wide" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" +dependencies = [ + "bytemuck", + "safe_arch", +] + [[package]] name = "widestring" version = "1.0.2" diff --git a/plugins/ts404/Cargo.toml b/plugins/ts404/Cargo.toml index 4df4b0c..2bdceed 100644 --- a/plugins/ts404/Cargo.toml +++ b/plugins/ts404/Cargo.toml @@ -14,12 +14,13 @@ members = ["xtask"] crate-type = ["cdylib"] [dependencies] -# Remove the `assert_process_allocs` feature to allow allocations on the audio -# thread in debug builds. -nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git", features = ["assert_process_allocs"] } -# Uncomment the below line to disable the on-by-default VST3 feature to remove -# the GPL compatibility requirement -# nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git", default_features = false, features = ["assert_process_allocs"] } +nalgebra = "0.32.3" +nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git" } +num-traits = "0.2.17" +valib = { git = "https://github.com/SolarLiner/valib.git" } + +[profile.dev] +opt-level = 1 [profile.release] lto = "thin" diff --git a/plugins/ts404/Makefile.toml b/plugins/ts404/Makefile.toml index 24c7ebf..9d6c763 100644 --- a/plugins/ts404/Makefile.toml +++ b/plugins/ts404/Makefile.toml @@ -1,3 +1,25 @@ +[tasks.default] +alias = "bundle" + [tasks.venv] -command = "poetry" -args = ["install", "--no-root"] \ No newline at end of file +script_runner = "@shell" +script = """ +poetry install --no-root +""" + +[tasks.generate] +script_runner = "@shell" +script = """ +source .venv/bin/activate # shell2batch: call .\\.venv\\Scripts\\activate.bat +python ./gen_statespace.py +""" +condition = { files_modified = { input = ["./gen_statespace.py"], output = ["./src/gen.rs"] } } + +[tasks.build] +dependencies = ["generate"] + +[tasks.bundle] +dependencies = ["build"] +command = "cargo" +args = ["xtask", "bundle", "ts404"] +install_crate = false \ No newline at end of file diff --git a/plugins/ts404/bundler.toml b/plugins/ts404/bundler.toml index 104c45c..f9094ee 100644 --- a/plugins/ts404/bundler.toml +++ b/plugins/ts404/bundler.toml @@ -1,8 +1,2 @@ -# This provides metadata for NIH-plug's `cargo xtask bundle ` plugin -# bundler. This file's syntax is as follows: -# -# [package_name] -# name = "Human Readable Plugin Name" # defaults to - [ts404] name = "TS-404" diff --git a/plugins/ts404/gen_statespace.py b/plugins/ts404/gen_statespace.py index d851e2f..234d766 100644 --- a/plugins/ts404/gen_statespace.py +++ b/plugins/ts404/gen_statespace.py @@ -1,9 +1,8 @@ -import os +from pathlib import Path from typing import Iterable -import sympy as s +import sympy as sm from lcapy import * -from sympy.core.evalf import evalf from sympy.printing.rust import RustCodePrinter from sympy.utilities.codegen import RustCodeGen @@ -12,10 +11,9 @@ def opamp_neg(fb: LaplaceDomainImpedance, gnd: LaplaceDomainImpedance) -> Laplac return impedance(1 + fb / gnd) -def create_discrete_statespace(hs: LaplaceDomainImpedance) -> tuple[DTStateSpace, dict[str, ExprDict]]: - hz = hs.bilinear_transform() - hzp, hz_defs = hz.parameterize_ZPK() - return hzp.ss, hz_defs +def create_discrete_statespace(hs: LaplaceDomainImpedance) -> DTStateSpace: + hz = hs.bilinear_transform().simplify() + return hz.ss def statespace_clipper(): @@ -52,21 +50,31 @@ def statespace_tone(): class MyRustPrinter(RustCodePrinter): + def __init__(self): + RustCodePrinter.__init__(self, {'user_functions': {'recip': 'simd_recip'}}) + + def _print_Zero(self, expr): + return "T::from_f64(0f64)" + def _print_Exp1(self, expr, _type=False): return "T::simd_e()" def _print_Pi(self, expr, _type=False): return "T::simd_pi()" + def _print_Integer(self, expr, _type=False): + s = str(expr) + return f"T::from_f64({s}f64)" + def _print_Float(self, expr, _type=False): - ret = str(evalf(expr, expr._prec, {})) + ret = str(expr) return f"T::from_f64({ret})" def _print_Rational(self, expr): if expr.p == 1: return f"T::from_f64({self._print(expr.q)}).simd_recip()" - p, q = tuple(f"T::from_f64({self._print(i)}.0)" for i in (expr.p, expr.q)) + p, q = tuple(f"T::from_f64({self._print(i)}f64)" for i in (expr.p, expr.q)) return f"{p} / {q}" def _print_MatrixBase(self, A): @@ -77,31 +85,47 @@ def _print_MatrixBase(self, A): def write_codegen(prefix: str, name: str, state_space: DTStateSpace, params: dict): codegen = RustCodeGen(project="ts404", printer=MyRustPrinter()) routines = [ - codegen.routine(f"{name}_params", [v.sympy for v in params.values()], argument_sequence=None, - global_vars=[]), + codegen.routine(f"{name}_params", [v.sympy for v in params.values()], argument_sequence=None, global_vars=[]), codegen.routine(name, tuple(m.sympy for m in [state_space.A, state_space.B, state_space.C, state_space.D]), - argument_sequence=None, - global_vars=[]) - ] + argument_sequence=None, global_vars=[])] codegen.write(routines, str(prefix), to_files=True, header=True) -def codegen_function(name: str, *exprs: s.Expr, public="pub(crate)") -> Iterable[str]: +def codegen_header() -> Iterable[str]: + yield from ["#![allow(unused)]", "#![allow(non_snake_case)]", "", "use nalgebra::SMatrix;", "use valib::Scalar;", + "use valib::filters::statespace::StateSpace;", ] + + +def codegen_statespace(name: str, state_space: DTStateSpace, public="pub(crate)") -> Iterable[str]: from sympy.codegen import Assignment - printer = RustCodePrinter() - e = s.Tuple(*exprs) - sub, simpl = s.cse(e) - args = ", ".join(f"{name}: T" for name in e.atoms(s.Idx)) - yield f"{public} fn {name}({args}) {{" + nin = state_space.u.rows + nstate = state_space.x.rows + nout = state_space.y.rows + + printer = MyRustPrinter() + e = sm.Tuple(state_space.A, state_space.B, state_space.C, state_space.D) + sub, simpl = sm.cse(e) + args = ", ".join(f"{name}: T" for name in e.atoms(sm.Symbol)) + yield f"{public} fn {name}({args}) -> StateSpace {{" for var, e in sub: - yield f" let {printer.doprint(Assignment(var, e))}" - yield " " + printer.doprint(simpl) - yield "}}" + # Replacing in string after printing because there's no easy way of doing it from the printer + yield f" let {printer.doprint(Assignment(var, e)).replace('.recip(', '.simd_recip(').replace('.powi(', '.simd_powf(').replace('.powf(', '.simd_powf(')}" + yield " StateSpace::new(" + for e in simpl[0]: + yield f" {printer.doprint(e)}," + yield " )" + yield "}" + + +def codegen_full(*names: tuple[str, DTStateSpace], public="pub(crate)") -> Iterable[str]: + yield from codegen_header() + yield "" + for name, state_space in names: + yield from codegen_statespace(name, state_space, public) + yield "" if __name__ == "__main__": - OUT_DIR = "src/gen" - os.makedirs(OUT_DIR, exist_ok=True) - write_codegen("src/gen/clipper", "clipper", *statespace_clipper()) - write_codegen("src/gen/tone", "tone", *statespace_tone()) + OUT_FILE = Path("src/gen.rs") + OUT_FILE.write_text("\n".join(codegen_full(("clipper", statespace_clipper()), ("tone", statespace_tone())))) diff --git a/plugins/ts404/rust-toolchain b/plugins/ts404/rust-toolchain new file mode 100644 index 0000000..1d77724 --- /dev/null +++ b/plugins/ts404/rust-toolchain @@ -0,0 +1 @@ +nightly-2023-11-16 diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs new file mode 100644 index 0000000..3130200 --- /dev/null +++ b/plugins/ts404/src/dsp.rs @@ -0,0 +1,67 @@ +use valib::dsp::DSP; +use valib::filters::statespace::StateSpace; +use valib::saturators::Slew; +use valib::Scalar; + +#[derive(Debug, Copy, Clone)] +pub struct ClipperStage(StateSpace, Slew); + +impl DSP<1, 1> for ClipperStage { + type Sample = T; + + fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { + let [y] = self.0.process(x); + self.1.process([y.simd_asinh()]) + } + + fn latency(&self) -> usize { + self.0.latency() + self.1.latency() + } + + fn reset(&mut self) { + self.0.reset(); + self.1.reset(); + } +} + +impl ClipperStage { + pub fn new(samplerate: T, dist: T) -> Self { + let dt = samplerate.simd_recip(); + Self(crate::gen::clipper(dist, dt), Slew::new(T::from_f64(1e5) * dt)) + } + + pub fn set_params(&mut self, samplerate: T, dist: T) { + let dt = samplerate.simd_recip(); + self.0.update_matrices(&crate::gen::clipper(dist, dt)); + self.1.set_max_diff(T::from_f64(1e5), dt); + } +} + +#[derive(Debug, Copy, Clone)] +pub struct ToneStage(StateSpace); + +impl DSP<1, 1> for ToneStage { + type Sample = T; + + fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { + self.0.process(x) + } + + fn latency(&self) -> usize { + self.0.latency() + } + + fn reset(&mut self) { + self.0.reset(); + } +} + +impl ToneStage { + pub fn new(samplerate: T, tone: T) -> Self { + Self(crate::gen::tone(tone, samplerate.simd_recip())) + } + + pub fn update_params(&mut self, samplerate: T, tone: T) { + self.0.update_matrices(&crate::gen::tone(tone, samplerate.simd_recip())); + } +} \ No newline at end of file diff --git a/plugins/ts404/src/gen.rs b/plugins/ts404/src/gen.rs deleted file mode 100644 index 5e34562..0000000 --- a/plugins/ts404/src/gen.rs +++ /dev/null @@ -1,4 +0,0 @@ -#![allow(non_snake_case)] -#![allow(unused)] -pub mod clipper; -pub mod tone; \ No newline at end of file diff --git a/plugins/ts404/src/gen/clipper.rs b/plugins/ts404/src/gen/clipper.rs deleted file mode 100644 index 703579f..0000000 --- a/plugins/ts404/src/gen/clipper.rs +++ /dev/null @@ -1,23 +0,0 @@ - -fn clipper_params(Delta_t: f64, pdist: f64) -> (f64, i32, f64, f64, f64, f64, f64) { - - let out1 = (2500000000000*Delta_t.powi(2) + 245000000000*Delta_t*pdist + 26094500000*Delta_t + 56329500*pdist + 5745609)/(125000000000000*Delta_t.powi(3) + 6375000000000*Delta_t.powi(2)*pdist + 3205475000000*Delta_t.powi(2) + 130316475000*Delta_t*pdist + 14396780450*Delta_t + 56329500*pdist + 5745609); - let out2 = 1; - let out3 = (-2500000000000*Delta_t.powi(2) - 500000*Delta_t*(240100000000*pdist.powi(2) + 48892040000*pdist + 2493867361).sqrt() + 56329500*pdist + 5745609)/(2500000000000*Delta_t.powi(2) + 245000000000*Delta_t*pdist + 26094500000*Delta_t + 56329500*pdist + 5745609); - let out4 = (-2500000000000*Delta_t.powi(2) + 500000*Delta_t*(240100000000*pdist.powi(2) + 48892040000*pdist + 2493867361).sqrt() + 56329500*pdist + 5745609)/(2500000000000*Delta_t.powi(2) + 245000000000*Delta_t*pdist + 26094500000*Delta_t + 56329500*pdist + 5745609); - let out5 = (1 - 50*Delta_t)/(50*Delta_t + 1); - let out6 = (-500000*Delta_t + 25500*pdist + 2601)/(500000*Delta_t + 25500*pdist + 2601); - let out7 = (2209 - 5000000*Delta_t)/(5000000*Delta_t + 2209); - (out1, out2, out3, out4, out5, out6, out7) - -} - -fn clipper(K: f64, p1: f64, p2: f64, p3: f64, z1: f64, z2: f64, z3: f64) -> (f64, i32, f64, f64) { - - let out1 = SMatrix::<_, 3, 3>::new(0, 1, 0, 0, 0, 1, p1*p2*p3, -p1*p2 - p1*p3 - p2*p3, p1 + p2 + p3); - let out2 = SMatrix::<_, 3, 1>::new(0, 0, 1); - let out3 = SMatrix::<_, 1, 3>::new(K*p1*p2*p3 - K*z1*z2*z3, K*z1*z2 + K*z1*z3 + K*z2*z3 - K*(p1*p2 + p1*p3 + p2*p3), -K*z1 - K*z2 - K*z3 - K*(-p1 - p2 - p3)); - let out4 = SMatrix::<_, 1, 1>::new(K); - (out1, out2, out3, out4) - -} diff --git a/plugins/ts404/src/gen/tone.rs b/plugins/ts404/src/gen/tone.rs deleted file mode 100644 index 7371738..0000000 --- a/plugins/ts404/src/gen/tone.rs +++ /dev/null @@ -1,25 +0,0 @@ - -fn tone_params(Delta_t: f64, ptone: f64) -> (f64, i32, f64, f64, f64, f64, f64, f64, f64) { - - let out1 = (97656250000000000000000*Delta_t.powi(4)*ptone + 97656250000000000000*Delta_t.powi(4) + 57886718750000000000*Delta_t.powi(3)*ptone + 140000000000000000*Delta_t.powi(3) + 8435246875000000*Delta_t.powi(2)*ptone + 50793187500000*Delta_t.powi(2) + 364361250000*Delta_t*ptone + 2029775000*Delta_t)/(107421875000000000000*Delta_t.powi(4) + 149703125000000000*Delta_t.powi(3) + 56178443750000*Delta_t.powi(2) + 5796505000*Delta_t + 161051); - let out2 = -1; - let out3 = -T::from_f64(3).simd_recip()*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2))/((T::from_f64(2).simd_recip())*(-4*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2)).powi(3) + (27*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - 9*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + 2*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).powi(2)).sqrt() + (T::from_f64(27.0) / T::from_f64(2.0))*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - T::from_f64(9.0) / T::from_f64(2.0)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).cbrt() - T::from_f64(3).simd_recip()*((T::from_f64(2).simd_recip())*(-4*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2)).powi(3) + (27*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - 9*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + 2*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).powi(2)).sqrt() + (T::from_f64(27.0) / T::from_f64(2.0))*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - T::from_f64(9.0) / T::from_f64(2.0)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).cbrt() - T::from_f64(3).simd_recip()*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191); - let out4 = -T::from_f64(3).simd_recip()*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2))/((T::from_f64(-1.0) / T::from_f64(2.0) + (T::from_f64(2).simd_recip())*T::from_f64(((0, 3900231685776981, -51, 52), None, 53, None))*I)*((T::from_f64(2).simd_recip())*(-4*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2)).powi(3) + (27*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - 9*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + 2*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).powi(2)).sqrt() + (T::from_f64(27.0) / T::from_f64(2.0))*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - T::from_f64(9.0) / T::from_f64(2.0)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).cbrt()) - T::from_f64(3).simd_recip()*(T::from_f64(-1.0) / T::from_f64(2.0) + (T::from_f64(2).simd_recip())*T::from_f64(((0, 3900231685776981, -51, 52), None, 53, None))*I)*((T::from_f64(2).simd_recip())*(-4*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2)).powi(3) + (27*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - 9*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + 2*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).powi(2)).sqrt() + (T::from_f64(27.0) / T::from_f64(2.0))*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - T::from_f64(9.0) / T::from_f64(2.0)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).cbrt() - T::from_f64(3).simd_recip()*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191); - let out5 = -T::from_f64(3).simd_recip()*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2))/((T::from_f64(-1.0) / T::from_f64(2.0) - T::from_f64(2).simd_recip()*T::from_f64(((0, 3900231685776981, -51, 52), None, 53, None))*I)*((T::from_f64(2).simd_recip())*(-4*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2)).powi(3) + (27*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - 9*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + 2*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).powi(2)).sqrt() + (T::from_f64(27.0) / T::from_f64(2.0))*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - T::from_f64(9.0) / T::from_f64(2.0)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).cbrt()) - T::from_f64(3).simd_recip()*(T::from_f64(-1.0) / T::from_f64(2.0) - T::from_f64(2).simd_recip()*T::from_f64(((0, 3900231685776981, -51, 52), None, 53, None))*I)*((T::from_f64(2).simd_recip())*(-4*(-3*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(2)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2)).powi(3) + (27*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - 9*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + 2*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).powi(2)).sqrt() + (T::from_f64(27.0) / T::from_f64(2.0))*(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t - 14574450*ptone - 81191)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191) - T::from_f64(9.0) / T::from_f64(2.0)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) - 2315468750000000*Delta_t.powi(2)*ptone - 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t + 43723350*ptone + 243573)*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(2) + (11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573).powi(3)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191).powi(3)).cbrt() - T::from_f64(3).simd_recip()*(11718750000000000000*Delta_t.powi(3)*ptone + 11718750000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) - 337409875000*Delta_t*ptone - 2031727500*Delta_t - 43723350*ptone - 243573)/(3906250000000000000*Delta_t.powi(3)*ptone + 3906250000000000*Delta_t.powi(3) + 2315468750000000*Delta_t.powi(2)*ptone + 5600000000000*Delta_t.powi(2) + 337409875000*Delta_t*ptone + 2031727500*Delta_t + 14574450*ptone + 81191); - let out6 = (1 - 2500*Delta_t)/(2500*Delta_t + 1); - let out7 = (121 - 1250000*Delta_t)/(1250000*Delta_t + 121); - let out8 = (-3125000000*Delta_t.powi(2) - 2500*T::from_f64(((0, 8860250840835989, -43, 53), None, 53, None))*Delta_t + 121)/(3125000000*Delta_t.powi(2) + 2802500*Delta_t + 121); - let out9 = (-3125000000*Delta_t.powi(2) + 2500*T::from_f64(((0, 8860250840835989, -43, 53), None, 53, None))*Delta_t + 121)/(3125000000*Delta_t.powi(2) + 2802500*Delta_t + 121); - (out1, out2, out3, out4, out5, out6, out7, out8, out9) - -} - -fn tone(K: f64, p1: f64, p2: f64, p3: f64, p4: f64, z1: f64, z2: f64, z3: f64, z4: f64) -> (f64, i32, f64, f64) { - - let out1 = SMatrix::<_, 4, 4>::new(0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -p1*p2*p3*p4, p1*p2*p3 + p1*p2*p4 + p1*p3*p4 + p2*p3*p4, -p1*p2 - p1*p3 - p1*p4 - p2*p3 - p2*p4 - p3*p4, p1 + p2 + p3 + p4); - let out2 = SMatrix::<_, 4, 1>::new(0, 0, 0, 1); - let out3 = SMatrix::<_, 1, 4>::new(-K*p1*p2*p3*p4 + K*z1*z2*z3*z4, -K*z1*z2*z3 - K*z1*z2*z4 - K*z1*z3*z4 - K*z2*z3*z4 - K*(-p1*p2*p3 - p1*p2*p4 - p1*p3*p4 - p2*p3*p4), K*z1*z2 + K*z1*z3 + K*z1*z4 + K*z2*z3 + K*z2*z4 + K*z3*z4 - K*(p1*p2 + p1*p3 + p1*p4 + p2*p3 + p2*p4 + p3*p4), -K*z1 - K*z2 - K*z3 - K*z4 - K*(-p1 - p2 - p3 - p4)); - let out4 = SMatrix::<_, 1, 1>::new(K); - (out1, out2, out3, out4) - -} diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index 8fd0fff..30b0289 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -1,30 +1,43 @@ mod gen; +mod dsp; use nih_plug::prelude::*; use std::sync::Arc; - -// This is a shortened version of the gain example with most comments removed, check out -// https://github.com/robbert-vdh/nih-plug/blob/master/plugins/examples/gain/src/lib.rs to get -// started +use nih_plug::prelude::SmoothingStyle::OversamplingAware; +use num_traits::Zero; +use valib::dsp::blocks::Series2; +use valib::dsp::{DSP, DSPBlock}; +use valib::dsp::utils::{slice_to_mono_block, slice_to_mono_block_mut}; +use valib::oversample::Oversample; +use valib::simd::{AutoF64x2, SimdValue}; +use crate::dsp::{ClipperStage, ToneStage}; + +type Sample = AutoF64x2; +type Dsp = Series2, ToneStage, 1>; +const OVERSAMPLE: usize = 4; +const MAX_BLOCK_SIZE: usize = 512; struct Ts404 { params: Arc, + dsp: Dsp, + oversample: Oversample, } #[derive(Params)] struct Ts404Params { - /// The parameter's ID is used to identify the parameter in the wrappred plugin API. As long as - /// these IDs remain constant, you can rename and reorder these fields as you wish. The - /// parameters are exposed to the host in the same order they were defined. In this case, this - /// gain parameter is stored as linear gain while the values are displayed in decibels. - #[id = "gain"] - pub gain: FloatParam, + #[id = "dist"] + dist: FloatParam, + #[id = "tone"] + tone: FloatParam, } impl Default for Ts404 { fn default() -> Self { + let samplerate = Sample::splat(OVERSAMPLE as f64 * 44100.0); Self { params: Arc::new(Ts404Params::default()), + dsp: Series2::new(ClipperStage::new(samplerate, Sample::splat(0.1)), ToneStage::new(samplerate, Sample::splat(0.5))), + oversample: Oversample::new(OVERSAMPLE, MAX_BLOCK_SIZE), } } } @@ -32,29 +45,14 @@ impl Default for Ts404 { impl Default for Ts404Params { fn default() -> Self { Self { - // This gain is stored as linear gain. NIH-plug comes with useful conversion functions - // to treat these kinds of parameters as if we were dealing with decibels. Storing this - // as decibels is easier to work with, but requires a conversion for every sample. - gain: FloatParam::new( - "Gain", - util::db_to_gain(0.0), - FloatRange::Skewed { - min: util::db_to_gain(-30.0), - max: util::db_to_gain(30.0), - // This makes the range appear as if it was linear when displaying the values as - // decibels - factor: FloatRange::gain_skew_factor(-30.0, 30.0), - }, - ) - // Because the gain parameter is stored as linear gain instead of storing the value as - // decibels, we need logarithmic smoothing - .with_smoother(SmoothingStyle::Logarithmic(50.0)) - .with_unit(" dB") - // There are many predefined formatters we can use here. If the gain was stored as - // decibels instead of as a linear gain value, we could have also used the - // `.with_step_size(0.1)` function to get internal rounding. - .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) - .with_string_to_value(formatters::s2v_f32_gain_to_db()), + dist: FloatParam::new("Distortion", 0.1, FloatRange::Linear {min: 0.0, max: 1.0}) + .with_smoother(SmoothingStyle::Linear(50.0)) + .with_value_to_string(formatters::v2s_f32_percentage(2)) + .with_string_to_value(formatters::s2v_f32_percentage()), + tone: FloatParam::new("Tone", 0.5, FloatRange::Linear {min: 0.0, max: 1.0}) + .with_smoother(SmoothingStyle::Linear(50.0)) + .with_value_to_string(formatters::v2s_f32_percentage(2)) + .with_string_to_value(formatters::s2v_f32_percentage()) } } } @@ -104,32 +102,48 @@ impl Plugin for Ts404 { fn initialize( &mut self, _audio_io_layout: &AudioIOLayout, - _buffer_config: &BufferConfig, + buffer_config: &BufferConfig, _context: &mut impl InitContext, ) -> bool { - // Resize buffers and perform other potentially expensive initialization operations here. - // The `reset()` function is always called right after this function. You can remove this - // function if you do not need it. + let samplerate = Sample::splat(buffer_config.sample_rate as _); + self.dsp.left_mut().set_params(samplerate, Sample::splat(self.params.dist.value() as _)); + self.dsp.right_mut().update_params(samplerate, Sample::splat(self.params.tone.value() as _)); true } fn reset(&mut self) { - // Reset buffers and envelopes here. This can be called from the audio thread and may not - // allocate. You can remove this function if you do not need it. + DSP::reset(&mut self.dsp); } fn process( &mut self, buffer: &mut Buffer, _aux: &mut AuxiliaryBuffers, - _context: &mut impl ProcessContext, + context: &mut impl ProcessContext, ) -> ProcessStatus { - for channel_samples in buffer.iter_samples() { - // Smoothing is optionally built into the parameters themselves - let gain = self.params.gain.smoothed.next(); + let samplerate = Sample::splat(context.transport().sample_rate as _); + self.dsp.left_mut().set_params(samplerate, Sample::splat(self.params.dist.value() as _)); + self.dsp.right_mut().update_params(samplerate, Sample::splat(self.params.tone.value() as _)); + context.set_latency_samples(DSP::latency(&self.dsp) as _); + + let mut inner_buffer = [Sample::zero(); MAX_BLOCK_SIZE]; + let mut os_block_copy = [Sample::zero(); OVERSAMPLE * MAX_BLOCK_SIZE]; + for (_, mut block) in buffer.iter_blocks(MAX_BLOCK_SIZE) { + for (i, mut frame) in block.iter_samples().enumerate() { + let stereo = Sample::new(*frame.get_mut(0).unwrap() as _, *frame.get_mut(1).unwrap() as _); + inner_buffer[i] = stereo; + } + + let inner_buffer = &mut inner_buffer[..block.samples()]; + let os_block_copy = &mut os_block_copy[..block.samples() * OVERSAMPLE]; + let mut os_block = self.oversample.oversample(inner_buffer); + os_block_copy.copy_from_slice(&*os_block); + self.dsp.process_block(slice_to_mono_block(os_block_copy), slice_to_mono_block_mut(&mut *os_block)); + os_block.finish(inner_buffer); - for sample in channel_samples { - *sample *= gain; + for (i, s) in inner_buffer.iter().copied().enumerate() { + *block.get_mut(0).unwrap().get_mut(i).unwrap() = s.extract(0) as _; + *block.get_mut(1).unwrap().get_mut(i).unwrap() = s.extract(1) as _; } } From f8c46e513201c3daaf7c32240b9a0d98d284a85d Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 1 Jan 2024 23:56:09 +0100 Subject: [PATCH 05/51] feat: impl input/output stages --- plugins/ts404/gen_statespace.py | 28 ++++++++++-- plugins/ts404/src/dsp.rs | 77 ++++++++++++++++++++++++++++++++- plugins/ts404/src/lib.rs | 44 +++++++++++++++---- 3 files changed, 135 insertions(+), 14 deletions(-) diff --git a/plugins/ts404/gen_statespace.py b/plugins/ts404/gen_statespace.py index 234d766..39315ba 100644 --- a/plugins/ts404/gen_statespace.py +++ b/plugins/ts404/gen_statespace.py @@ -16,6 +16,13 @@ def create_discrete_statespace(hs: LaplaceDomainImpedance) -> DTStateSpace: return hz.ss +def statespace_input(): + pre = LSection(C(0.02e-6) + R(1e3), R(510e3) + V(4.5)) + post = Shunt(R(10e3)).chain(Series(C(1e-6))) + h = (pre.Vtransfer.as_expr() * post.Vtransfer.as_expr()).simplify() + return create_discrete_statespace(h) + + def statespace_clipper(): dist = symbol("pdist", real=True, positive=True) ff = LSection(C(1e-6), R(10e3)).Vtransfer.as_expr().simplify() @@ -49,6 +56,13 @@ def statespace_tone(): return create_discrete_statespace(hs) +def statespace_output(): + pre = LSection(C(0.1e-6), R(510e3) + V(4.5)) + post = Shunt(R(10e3)).chain(Series(R(100) + C(1e-6))).chain(Shunt(R(10e3))) + h = (pre.Vtransfer.as_expr() * post.Vtransfer.as_expr()).simplify() + return create_discrete_statespace(h) + + class MyRustPrinter(RustCodePrinter): def __init__(self): RustCodePrinter.__init__(self, {'user_functions': {'recip': 'simd_recip'}}) @@ -99,6 +113,11 @@ def codegen_header() -> Iterable[str]: def codegen_statespace(name: str, state_space: DTStateSpace, public="pub(crate)") -> Iterable[str]: from sympy.codegen import Assignment + def postprocess_codegen(s: str) -> str: + # Replacing in string after printing because there's no easy way of doing it from the printer + return s.replace('.recip(', '.simd_recip(').replace('.powi(', '.simd_powf(').replace('.powf(', '.simd_powf(') + + nin = state_space.u.rows nstate = state_space.x.rows nout = state_space.y.rows @@ -110,10 +129,12 @@ def codegen_statespace(name: str, state_space: DTStateSpace, public="pub(crate)" yield f"{public} fn {name}({args}) -> StateSpace {{" for var, e in sub: # Replacing in string after printing because there's no easy way of doing it from the printer - yield f" let {printer.doprint(Assignment(var, e)).replace('.recip(', '.simd_recip(').replace('.powi(', '.simd_powf(').replace('.powf(', '.simd_powf(')}" + pp = printer.doprint(Assignment(var, e)) + yield f" let {postprocess_codegen(pp)};" yield " StateSpace::new(" for e in simpl[0]: - yield f" {printer.doprint(e)}," + pp = printer.doprint(e) + yield f" {postprocess_codegen(pp)}," yield " )" yield "}" @@ -128,4 +149,5 @@ def codegen_full(*names: tuple[str, DTStateSpace], public="pub(crate)") -> Itera if __name__ == "__main__": OUT_FILE = Path("src/gen.rs") - OUT_FILE.write_text("\n".join(codegen_full(("clipper", statespace_clipper()), ("tone", statespace_tone())))) + OUT_FILE.write_text("\n".join(codegen_full(("input", statespace_input()), ("clipper", statespace_clipper()), + ("tone", statespace_tone()), ("output", statespace_output())))) diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index 3130200..4d3faa8 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -1,7 +1,45 @@ +use valib::dsp::blocks::Series; use valib::dsp::DSP; +use valib::filters::biquad::Biquad; use valib::filters::statespace::StateSpace; -use valib::saturators::Slew; +use valib::saturators::{Linear, Slew}; use valib::Scalar; +use valib::simd::AutoSimd; + +#[derive(Debug, Copy, Clone)] +pub struct InputStage { + pub gain: T, + state_space: StateSpace, +} + +impl DSP<1, 1> for InputStage { + type Sample = T; + + fn process(&mut self, [x]: [Self::Sample; 1]) -> [Self::Sample; 1] { + self.state_space.process([x*self.gain]) + } + + fn latency(&self) -> usize { + self.state_space.latency() + } + + fn reset(&mut self) { + self.state_space.reset() + } +} + +impl InputStage { + pub fn new(samplerate: T, gain: T) -> Self { + Self { + gain, + state_space: crate::gen::input(samplerate.simd_recip()), + } + } + + pub fn set_samplerate(&mut self, samplerate: T) { + self.state_space.update_matrices(&crate::gen::input(samplerate.simd_recip())); + } +} #[derive(Debug, Copy, Clone)] pub struct ClipperStage(StateSpace, Slew); @@ -27,7 +65,7 @@ impl DSP<1, 1> for ClipperStage { impl ClipperStage { pub fn new(samplerate: T, dist: T) -> Self { let dt = samplerate.simd_recip(); - Self(crate::gen::clipper(dist, dt), Slew::new(T::from_f64(1e5) * dt)) + Self(crate::gen::clipper(dist, dt), Slew::new(T::from_f64(1e4) * dt)) } pub fn set_params(&mut self, samplerate: T, dist: T) { @@ -64,4 +102,39 @@ impl ToneStage { pub fn update_params(&mut self, samplerate: T, tone: T) { self.0.update_matrices(&crate::gen::tone(tone, samplerate.simd_recip())); } +} + +#[derive(Debug, Copy, Clone)] +pub struct OutputStage { + pub inner: StateSpace, + pub gain: T, +} + +impl OutputStage { + pub fn new(samplerate: T, gain: T) -> Self { + Self { + inner: crate::gen::output(samplerate.simd_recip()), + gain, + } + } + pub fn set_samplerate(&mut self, samplerate: T) { + self.inner.update_matrices(&crate::gen::output(samplerate.simd_recip())); + } +} + +impl DSP<1, 1> for OutputStage { + type Sample = T; + + fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { + let [y] = self.inner.process(x); + [y*self.gain] + } + + fn latency(&self) -> usize { + DSP::latency(&self.inner) + } + + fn reset(&mut self) { + DSP::reset(&mut self.inner) + } } \ No newline at end of file diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index 30b0289..21685a9 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -1,19 +1,21 @@ mod gen; mod dsp; +use std::process::Output; use nih_plug::prelude::*; use std::sync::Arc; use nih_plug::prelude::SmoothingStyle::OversamplingAware; +use nih_plug::util::{gain_to_db, MINUS_INFINITY_DB, MINUS_INFINITY_GAIN}; use num_traits::Zero; -use valib::dsp::blocks::Series2; +use valib::dsp::blocks::{Series, Series2}; use valib::dsp::{DSP, DSPBlock}; use valib::dsp::utils::{slice_to_mono_block, slice_to_mono_block_mut}; use valib::oversample::Oversample; use valib::simd::{AutoF64x2, SimdValue}; -use crate::dsp::{ClipperStage, ToneStage}; +use crate::dsp::{ClipperStage, InputStage, OutputStage, ToneStage}; type Sample = AutoF64x2; -type Dsp = Series2, ToneStage, 1>; +type Dsp = Series<(InputStage, ClipperStage, ToneStage, OutputStage)>; const OVERSAMPLE: usize = 4; const MAX_BLOCK_SIZE: usize = 512; @@ -25,10 +27,14 @@ struct Ts404 { #[derive(Params)] struct Ts404Params { + #[id = "drive"] + drive: FloatParam, #[id = "dist"] dist: FloatParam, #[id = "tone"] tone: FloatParam, + #[id = "level"] + out_level: FloatParam, } impl Default for Ts404 { @@ -36,7 +42,7 @@ impl Default for Ts404 { let samplerate = Sample::splat(OVERSAMPLE as f64 * 44100.0); Self { params: Arc::new(Ts404Params::default()), - dsp: Series2::new(ClipperStage::new(samplerate, Sample::splat(0.1)), ToneStage::new(samplerate, Sample::splat(0.5))), + dsp: Series((InputStage::new(samplerate, Sample::splat(1.0)), ClipperStage::new(samplerate, Sample::splat(0.1)), ToneStage::new(samplerate, Sample::splat(0.5)), OutputStage::new(samplerate, Sample::splat(1.0)))), oversample: Oversample::new(OVERSAMPLE, MAX_BLOCK_SIZE), } } @@ -45,14 +51,27 @@ impl Default for Ts404 { impl Default for Ts404Params { fn default() -> Self { Self { + drive: FloatParam::new("Drive", 1.0, FloatRange::Skewed { min: 0.5, max: 100.0, factor: FloatRange::gain_skew_factor(gain_to_db(0.5), gain_to_db(100.0))}) + .with_unit("dB") + .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) + .with_string_to_value(formatters::s2v_f32_gain_to_db()) + .with_smoother(SmoothingStyle::Linear(50.0)), dist: FloatParam::new("Distortion", 0.1, FloatRange::Linear {min: 0.0, max: 1.0}) + .with_unit("%") .with_smoother(SmoothingStyle::Linear(50.0)) .with_value_to_string(formatters::v2s_f32_percentage(2)) .with_string_to_value(formatters::s2v_f32_percentage()), tone: FloatParam::new("Tone", 0.5, FloatRange::Linear {min: 0.0, max: 1.0}) + .with_unit("%") .with_smoother(SmoothingStyle::Linear(50.0)) .with_value_to_string(formatters::v2s_f32_percentage(2)) - .with_string_to_value(formatters::s2v_f32_percentage()) + .with_string_to_value(formatters::s2v_f32_percentage()), + out_level: FloatParam::new("Output Level", 1.0, FloatRange::Skewed {min: MINUS_INFINITY_GAIN, max: 2.0, factor: FloatRange::gain_skew_factor(MINUS_INFINITY_DB, gain_to_db(2.0))}) + .with_unit("dB") + .with_smoother(SmoothingStyle::Linear(50.0)) + .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) + .with_string_to_value(formatters::s2v_f32_gain_to_db()), + } } } @@ -106,8 +125,11 @@ impl Plugin for Ts404 { _context: &mut impl InitContext, ) -> bool { let samplerate = Sample::splat(buffer_config.sample_rate as _); - self.dsp.left_mut().set_params(samplerate, Sample::splat(self.params.dist.value() as _)); - self.dsp.right_mut().update_params(samplerate, Sample::splat(self.params.tone.value() as _)); + let Series((input, clipping, tone, output)) = &mut self.dsp; + input.set_samplerate(samplerate); + clipping.set_params(samplerate, Sample::splat(self.params.dist.value() as _)); + tone.update_params(samplerate, Sample::splat(self.params.tone.value() as _)); + output.set_samplerate(samplerate); true } @@ -122,8 +144,12 @@ impl Plugin for Ts404 { context: &mut impl ProcessContext, ) -> ProcessStatus { let samplerate = Sample::splat(context.transport().sample_rate as _); - self.dsp.left_mut().set_params(samplerate, Sample::splat(self.params.dist.value() as _)); - self.dsp.right_mut().update_params(samplerate, Sample::splat(self.params.tone.value() as _)); + let Series((input, clipping, tone, output)) = &mut self.dsp; + input.gain = Sample::splat(self.params.drive.value() as _); + clipping.set_params(samplerate, Sample::splat(self.params.dist.value() as _)); + tone.update_params(samplerate, Sample::splat(self.params.tone.value() as _)); + output.gain = Sample::splat(self.params.out_level.value() as _); + context.set_latency_samples(DSP::latency(&self.dsp) as _); let mut inner_buffer = [Sample::zero(); MAX_BLOCK_SIZE]; From 548d39e2137ffc10fcce110e5ee3cf43883f3f8b Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 1 Jan 2024 23:56:41 +0100 Subject: [PATCH 06/51] chore: linting --- plugins/ts404/src/dsp.rs | 8 ++++---- plugins/ts404/src/lib.rs | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index 4d3faa8..64a30d2 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -1,10 +1,10 @@ -use valib::dsp::blocks::Series; + use valib::dsp::DSP; -use valib::filters::biquad::Biquad; + use valib::filters::statespace::StateSpace; -use valib::saturators::{Linear, Slew}; +use valib::saturators::{Slew}; use valib::Scalar; -use valib::simd::AutoSimd; + #[derive(Debug, Copy, Clone)] pub struct InputStage { diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index 21685a9..ebac7d0 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -1,13 +1,13 @@ mod gen; mod dsp; -use std::process::Output; + use nih_plug::prelude::*; use std::sync::Arc; -use nih_plug::prelude::SmoothingStyle::OversamplingAware; + use nih_plug::util::{gain_to_db, MINUS_INFINITY_DB, MINUS_INFINITY_GAIN}; use num_traits::Zero; -use valib::dsp::blocks::{Series, Series2}; +use valib::dsp::blocks::{Series}; use valib::dsp::{DSP, DSPBlock}; use valib::dsp::utils::{slice_to_mono_block, slice_to_mono_block_mut}; use valib::oversample::Oversample; @@ -163,8 +163,8 @@ impl Plugin for Ts404 { let inner_buffer = &mut inner_buffer[..block.samples()]; let os_block_copy = &mut os_block_copy[..block.samples() * OVERSAMPLE]; let mut os_block = self.oversample.oversample(inner_buffer); - os_block_copy.copy_from_slice(&*os_block); - self.dsp.process_block(slice_to_mono_block(os_block_copy), slice_to_mono_block_mut(&mut *os_block)); + os_block_copy.copy_from_slice(&os_block); + self.dsp.process_block(slice_to_mono_block(os_block_copy), slice_to_mono_block_mut(&mut os_block)); os_block.finish(inner_buffer); for (i, s) in inner_buffer.iter().copied().enumerate() { From f2cbe21302eb033b3c34a6ab6c4d4d0de718c339 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Thu, 4 Jan 2024 00:10:14 +0100 Subject: [PATCH 07/51] fix: range of input parameters to prevent singularities + state state model generation --- plugins/ts404/.python-version | 1 - plugins/ts404/Cargo.lock | 1 + plugins/ts404/Cargo.toml | 1 + plugins/ts404/Makefile.toml | 11 +- plugins/ts404/README.md | 14 +- plugins/ts404/gen_statespace.py | 26 +- plugins/ts404/poetry.lock | 409 +++++++++++++++++++++++++++++++- plugins/ts404/pyproject.toml | 3 + plugins/ts404/src/dsp.rs | 28 ++- plugins/ts404/src/lib.rs | 98 +++++--- 10 files changed, 538 insertions(+), 54 deletions(-) delete mode 100644 plugins/ts404/.python-version diff --git a/plugins/ts404/.python-version b/plugins/ts404/.python-version deleted file mode 100644 index 92536a9..0000000 --- a/plugins/ts404/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.12.0 diff --git a/plugins/ts404/Cargo.lock b/plugins/ts404/Cargo.lock index f2e7897..40a7061 100644 --- a/plugins/ts404/Cargo.lock +++ b/plugins/ts404/Cargo.lock @@ -806,6 +806,7 @@ dependencies = [ "nalgebra", "nih_plug", "num-traits", + "numeric_literals", "valib", ] diff --git a/plugins/ts404/Cargo.toml b/plugins/ts404/Cargo.toml index 2bdceed..d352d1a 100644 --- a/plugins/ts404/Cargo.toml +++ b/plugins/ts404/Cargo.toml @@ -17,6 +17,7 @@ crate-type = ["cdylib"] nalgebra = "0.32.3" nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git" } num-traits = "0.2.17" +numeric_literals = "0.2.0" valib = { git = "https://github.com/SolarLiner/valib.git" } [profile.dev] diff --git a/plugins/ts404/Makefile.toml b/plugins/ts404/Makefile.toml index 9d6c763..1b56b72 100644 --- a/plugins/ts404/Makefile.toml +++ b/plugins/ts404/Makefile.toml @@ -1,3 +1,6 @@ +[env] +CARGO_MAKE_EXTEND_WORKSPACE_MAKEFILE = false + [tasks.default] alias = "bundle" @@ -7,7 +10,12 @@ script = """ poetry install --no-root """ +[tasks.xtask-build] +extend = "build" +args = ["build", "-p", "xtask"] + [tasks.generate] +dependencies = ["venv"] script_runner = "@shell" script = """ source .venv/bin/activate # shell2batch: call .\\.venv\\Scripts\\activate.bat @@ -16,10 +24,11 @@ python ./gen_statespace.py condition = { files_modified = { input = ["./gen_statespace.py"], output = ["./src/gen.rs"] } } [tasks.build] +args = ["build", "-p", "ts404"] dependencies = ["generate"] [tasks.bundle] -dependencies = ["build"] +dependencies = ["build", "xtask-build"] command = "cargo" args = ["xtask", "bundle", "ts404"] install_crate = false \ No newline at end of file diff --git a/plugins/ts404/README.md b/plugins/ts404/README.md index 01148cc..6ead32f 100644 --- a/plugins/ts404/README.md +++ b/plugins/ts404/README.md @@ -4,8 +4,18 @@ A guitar pedal plugin inspired by the most popular screamer pedal. ## Building -After installing [Rust](https://rustup.rs/), you can compile TS-404 as follows: +### Requirements + +- Python + - Poetry +- Rust (use rustup to get the correct version of the nightly, as defined in the `rust-toolchain` file) + - `cargo-make` + +### Compilation + +The following runs all steps of setting up the virtual environment, deriving generated Rust code, and building the +plugins. They will be made available in the `target/bundled` folder. ```shell -cargo xtask bundle ts404 --release +cargo make ``` diff --git a/plugins/ts404/gen_statespace.py b/plugins/ts404/gen_statespace.py index 39315ba..4302a80 100644 --- a/plugins/ts404/gen_statespace.py +++ b/plugins/ts404/gen_statespace.py @@ -7,8 +7,8 @@ from sympy.utilities.codegen import RustCodeGen -def opamp_neg(fb: LaplaceDomainImpedance, gnd: LaplaceDomainImpedance) -> LaplaceDomainImpedance: - return impedance(1 + fb / gnd) +def opamp_noninverting(zf, zg): + return 1 + zf / zg def create_discrete_statespace(hs: LaplaceDomainImpedance) -> DTStateSpace: @@ -31,28 +31,35 @@ def statespace_clipper(): fbg = C(0.047e-6) + R(4.7e3) fbg = fbg.Z.as_expr().simplify() - hs = (ff * opamp_neg(fb, fbg)).simplify() + # Explicitely applying gain (even through it should have been implicit in the complex impedances??) + hs = (ff * opamp_noninverting(fb, fbg)).simplify() * lerp(12, 118, dist) return create_discrete_statespace(hs) def tone_h_bass(): bass_pre = LSection(R(1e3), C(0.22e-6)).chain(Shunt(C(0.22e-6) + R(220))).chain(Shunt(R(10e3) + V(4.5))) - return bass_pre.Vtransfer.as_expr() * opamp_neg(impedance(1e3), impedance(1)).as_expr() + return bass_pre.Vtransfer.as_expr() * opamp_noninverting(1e3, sm.oo).as_expr() def tone_h_treble(): treble_pre = LSection(R(1e3), C(0.22e-6)).chain(Shunt(R(10e3) + V(4.5))) treble_gnd = C(0.22e-6) + R(220) - return treble_pre.Vtransfer.as_expr() * opamp_neg(impedance(1e3), treble_gnd.Z.as_expr()).as_expr() + return treble_pre.Vtransfer.as_expr() * opamp_noninverting(impedance(1e3), treble_gnd.Z.as_expr()).as_expr() def lerp(a, b, t): return a + (b - a) * t +def g_taper(x): + x = 2 * x - 1 + y = lerp(x, x ** 3, 0.75) + return (y + 1) / 2 + + def statespace_tone(): tone = symbol("ptone", real=True, positive=True) - hs = lerp(tone_h_treble().as_expr(), tone_h_bass().as_expr(), tone) + hs = lerp(tone_h_treble().as_expr(), tone_h_bass().as_expr(),g_taper(tone)) return create_discrete_statespace(hs) @@ -117,10 +124,9 @@ def postprocess_codegen(s: str) -> str: # Replacing in string after printing because there's no easy way of doing it from the printer return s.replace('.recip(', '.simd_recip(').replace('.powi(', '.simd_powf(').replace('.powf(', '.simd_powf(') - - nin = state_space.u.rows - nstate = state_space.x.rows - nout = state_space.y.rows + nin = state_space.Nu + nstate = state_space.Nx + nout = state_space.Ny printer = MyRustPrinter() e = sm.Tuple(state_space.A, state_space.B, state_space.C, state_space.D) diff --git a/plugins/ts404/poetry.lock b/plugins/ts404/poetry.lock index ae8bde6..6522fe1 100644 --- a/plugins/ts404/poetry.lock +++ b/plugins/ts404/poetry.lock @@ -1,5 +1,16 @@ # This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] + [[package]] name = "asttokens" version = "2.4.1" @@ -18,6 +29,70 @@ six = ">=1.12.0" astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + [[package]] name = "colorama" version = "0.4.6" @@ -29,6 +104,23 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "comm" +version = "0.2.1" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.1-py3-none-any.whl", hash = "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021"}, + {file = "comm-0.2.1.tar.gz", hash = "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + [[package]] name = "contourpy" version = "1.2.0" @@ -107,6 +199,33 @@ files = [ docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] tests = ["pytest", "pytest-cov", "pytest-xdist"] +[[package]] +name = "debugpy" +version = "1.8.0" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, + {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, + {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"}, + {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"}, + {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"}, + {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"}, + {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"}, + {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"}, + {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"}, + {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"}, + {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"}, + {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"}, + {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"}, + {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"}, + {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"}, + {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"}, + {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"}, + {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"}, +] + [[package]] name = "decorator" version = "5.1.1" @@ -197,6 +316,39 @@ ufo = ["fs (>=2.2.0,<3)"] unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +[[package]] +name = "ipykernel" +version = "6.28.0" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.28.0-py3-none-any.whl", hash = "sha256:c6e9a9c63a7f4095c0a22a79f765f079f9ec7be4f2430a898ddea889e8665661"}, + {file = "ipykernel-6.28.0.tar.gz", hash = "sha256:69c11403d26de69df02225916f916b37ea4b9af417da0a8c827f84328d88e5f3"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] + [[package]] name = "ipython" version = "8.19.0" @@ -251,6 +403,48 @@ docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alab qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +[[package]] +name = "jupyter-client" +version = "8.6.0" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, + {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, +] + +[package.dependencies] +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.7.0" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.0-py3-none-any.whl", hash = "sha256:16eea462f7dad23ba9f86542bdf17f830804e2028eb48d609b6134d91681e983"}, + {file = "jupyter_core-5.7.0.tar.gz", hash = "sha256:cb8d3ed92144d2463a3c5664fdd686a3f0c1442ea45df8babb1c1a9e6333fe03"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + [[package]] name = "kiwisolver" version = "1.4.5" @@ -470,6 +664,17 @@ docs = ["sphinx"] gmpy = ["gmpy2 (>=2.1.0a4)"] tests = ["pytest (>=4.6)"] +[[package]] +name = "nest-asyncio" +version = "1.5.8" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, + {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, +] + [[package]] name = "networkx" version = "3.2.1" @@ -640,6 +845,21 @@ files = [ docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +[[package]] +name = "platformdirs" +version = "4.1.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, + {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + [[package]] name = "prompt-toolkit" version = "3.0.43" @@ -665,6 +885,34 @@ files = [ {file = "property_cached-1.6.4-py2.py3-none-any.whl", hash = "sha256:135fc059ec969c1646424a0db15e7fbe1b5f8c36c0006d0b3c91ba568c11e7d8"}, ] +[[package]] +name = "psutil" +version = "5.9.7" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"}, + {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"}, + {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"}, + {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"}, + {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"}, + {file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"}, + {file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"}, + {file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"}, + {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"}, + {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"}, + {file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"}, + {file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"}, + {file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"}, + {file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"}, + {file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"}, + {file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + [[package]] name = "ptyprocess" version = "0.7.0" @@ -690,6 +938,17 @@ files = [ [package.extras] tests = ["pytest"] +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + [[package]] name = "pygments" version = "2.17.2" @@ -733,6 +992,134 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyzmq" +version = "25.1.2" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08"}, + {file = "pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886"}, + {file = "pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3"}, + {file = "pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097"}, + {file = "pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737"}, + {file = "pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d"}, + {file = "pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7b6d09a8962a91151f0976008eb7b29b433a560fde056ec7a3db9ec8f1075438"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967668420f36878a3c9ecb5ab33c9d0ff8d054f9c0233d995a6d25b0e95e1b6b"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5edac3f57c7ddaacdb4d40f6ef2f9e299471fc38d112f4bc6d60ab9365445fb0"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0dabfb10ef897f3b7e101cacba1437bd3a5032ee667b7ead32bbcdd1a8422fe7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c6441e0398c2baacfe5ba30c937d274cfc2dc5b55e82e3749e333aabffde561"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:16b726c1f6c2e7625706549f9dbe9b06004dfbec30dbed4bf50cbdfc73e5b32a"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a86c2dd76ef71a773e70551a07318b8e52379f58dafa7ae1e0a4be78efd1ff16"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win32.whl", hash = "sha256:359f7f74b5d3c65dae137f33eb2bcfa7ad9ebefd1cab85c935f063f1dbb245cc"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:55875492f820d0eb3417b51d96fea549cde77893ae3790fd25491c5754ea2f68"}, + {file = "pyzmq-25.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8c8a419dfb02e91b453615c69568442e897aaf77561ee0064d789705ff37a92"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8807c87fa893527ae8a524c15fc505d9950d5e856f03dae5921b5e9aa3b8783b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e319ed7d6b8f5fad9b76daa0a68497bc6f129858ad956331a5835785761e003"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3c53687dde4d9d473c587ae80cc328e5b102b517447456184b485587ebd18b62"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9add2e5b33d2cd765ad96d5eb734a5e795a0755f7fc49aa04f76d7ddda73fd70"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e690145a8c0c273c28d3b89d6fb32c45e0d9605b2293c10e650265bf5c11cfec"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:00a06faa7165634f0cac1abb27e54d7a0b3b44eb9994530b8ec73cf52e15353b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win32.whl", hash = "sha256:0f97bc2f1f13cb16905a5f3e1fbdf100e712d841482b2237484360f8bc4cb3d7"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6cc0020b74b2e410287e5942e1e10886ff81ac77789eb20bec13f7ae681f0fdd"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:bef02cfcbded83473bdd86dd8d3729cd82b2e569b75844fb4ea08fee3c26ae41"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e10a4b5a4b1192d74853cc71a5e9fd022594573926c2a3a4802020360aa719d8"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8c5f80e578427d4695adac6fdf4370c14a2feafdc8cb35549c219b90652536ae"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5dde6751e857910c1339890f3524de74007958557593b9e7e8c5f01cd919f8a7"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea1608dd169da230a0ad602d5b1ebd39807ac96cae1845c3ceed39af08a5c6df"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0f513130c4c361201da9bc69df25a086487250e16b5571ead521b31ff6b02220"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:019744b99da30330798bb37df33549d59d380c78e516e3bab9c9b84f87a9592f"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e2713ef44be5d52dd8b8e2023d706bf66cb22072e97fc71b168e01d25192755"}, + {file = "pyzmq-25.1.2-cp38-cp38-win32.whl", hash = "sha256:07cd61a20a535524906595e09344505a9bd46f1da7a07e504b315d41cd42eb07"}, + {file = "pyzmq-25.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb7e49a17fb8c77d3119d41a4523e432eb0c6932187c37deb6fbb00cc3028088"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:94504ff66f278ab4b7e03e4cba7e7e400cb73bfa9d3d71f58d8972a8dc67e7a6"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd0d50bbf9dca1d0bdea219ae6b40f713a3fb477c06ca3714f208fd69e16fd8"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:004ff469d21e86f0ef0369717351073e0e577428e514c47c8480770d5e24a565"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c0b5ca88a8928147b7b1e2dfa09f3b6c256bc1135a1338536cbc9ea13d3b7add"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9a79f1d2495b167119d02be7448bfba57fad2a4207c4f68abc0bab4b92925b"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:518efd91c3d8ac9f9b4f7dd0e2b7b8bf1a4fe82a308009016b07eaa48681af82"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1ec23bd7b3a893ae676d0e54ad47d18064e6c5ae1fadc2f195143fb27373f7f6"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db36c27baed588a5a8346b971477b718fdc66cf5b80cbfbd914b4d6d355e44e2"}, + {file = "pyzmq-25.1.2-cp39-cp39-win32.whl", hash = "sha256:39b1067f13aba39d794a24761e385e2eddc26295826530a8c7b6c6c341584289"}, + {file = "pyzmq-25.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:8e9f3fabc445d0ce320ea2c59a75fe3ea591fdbdeebec5db6de530dd4b09412e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:df0c7a16ebb94452d2909b9a7b3337940e9a87a824c4fc1c7c36bb4404cb0cde"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45999e7f7ed5c390f2e87ece7f6c56bf979fb213550229e711e45ecc7d42ccb8"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac170e9e048b40c605358667aca3d94e98f604a18c44bdb4c102e67070f3ac9b"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b604734bec94f05f81b360a272fc824334267426ae9905ff32dc2be433ab96"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a793ac733e3d895d96f865f1806f160696422554e46d30105807fdc9841b9f7d"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0806175f2ae5ad4b835ecd87f5f85583316b69f17e97786f7443baaf54b9bb98"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef12e259e7bc317c7597d4f6ef59b97b913e162d83b421dd0db3d6410f17a244"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea253b368eb41116011add00f8d5726762320b1bda892f744c91997b65754d73"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b9b1f2ad6498445a941d9a4fee096d387fee436e45cc660e72e768d3d8ee611"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8b14c75979ce932c53b79976a395cb2a8cd3aaf14aef75e8c2cb55a330b9b49d"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:889370d5174a741a62566c003ee8ddba4b04c3f09a97b8000092b7ca83ec9c49"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18fff090441a40ffda8a7f4f18f03dc56ae73f148f1832e109f9bffa85df15"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a6b36f95c98839ad98f8c553d8507644c880cf1e0a57fe5e3a3f3969040882"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4345c9a27f4310afbb9c01750e9461ff33d6fb74cd2456b107525bbeebcb5be3"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3516e0b6224cf6e43e341d56da15fd33bdc37fa0c06af4f029f7d7dfceceabbc"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:146b9b1f29ead41255387fb07be56dc29639262c0f7344f570eecdcd8d683314"}, + {file = "pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + [[package]] name = "scipy" version = "1.11.4" @@ -835,6 +1222,26 @@ files = [ [package.dependencies] mpmath = ">=0.19" +[[package]] +name = "tornado" +version = "6.4" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, +] + [[package]] name = "traitlets" version = "5.14.0" @@ -878,4 +1285,4 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "2012e5628d12ed7e06d9d99f4225365ce6d93069331b8618a7d00bffa6d4dbfe" +content-hash = "280383d2d9820190487cbf278f7adc077e31b93f4afe6c243ebf06d13cc091fc" diff --git a/plugins/ts404/pyproject.toml b/plugins/ts404/pyproject.toml index be8e23d..5e9ff9c 100644 --- a/plugins/ts404/pyproject.toml +++ b/plugins/ts404/pyproject.toml @@ -11,6 +11,9 @@ sympy = "^1.12" lcapy = "^1.20" +[tool.poetry.group.dev.dependencies] +ipykernel = "^6.28.0" + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index 64a30d2..595149d 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -1,11 +1,9 @@ - +use numeric_literals::replace_float_literals; use valib::dsp::DSP; - use valib::filters::statespace::StateSpace; -use valib::saturators::{Slew}; +use valib::saturators::Slew; use valib::Scalar; - #[derive(Debug, Copy, Clone)] pub struct InputStage { pub gain: T, @@ -16,7 +14,7 @@ impl DSP<1, 1> for InputStage { type Sample = T; fn process(&mut self, [x]: [Self::Sample; 1]) -> [Self::Sample; 1] { - self.state_space.process([x*self.gain]) + self.state_space.process([x * self.gain]) } fn latency(&self) -> usize { @@ -37,7 +35,8 @@ impl InputStage { } pub fn set_samplerate(&mut self, samplerate: T) { - self.state_space.update_matrices(&crate::gen::input(samplerate.simd_recip())); + self.state_space + .update_matrices(&crate::gen::input(samplerate.simd_recip())); } } @@ -63,9 +62,10 @@ impl DSP<1, 1> for ClipperStage { } impl ClipperStage { + #[replace_float_literals(T::from_f64(literal))] pub fn new(samplerate: T, dist: T) -> Self { let dt = samplerate.simd_recip(); - Self(crate::gen::clipper(dist, dt), Slew::new(T::from_f64(1e4) * dt)) + Self(crate::gen::clipper(dist + 1e-3, dt), Slew::new(1e4 * dt)) } pub fn set_params(&mut self, samplerate: T, dist: T) { @@ -95,12 +95,15 @@ impl DSP<1, 1> for ToneStage { } impl ToneStage { + #[replace_float_literals(T::from_f64(literal))] pub fn new(samplerate: T, tone: T) -> Self { - Self(crate::gen::tone(tone, samplerate.simd_recip())) + Self(crate::gen::tone(tone + 1e-3, samplerate.simd_recip())) } + #[replace_float_literals(T::from_f64(literal))] pub fn update_params(&mut self, samplerate: T, tone: T) { - self.0.update_matrices(&crate::gen::tone(tone, samplerate.simd_recip())); + self.0 + .update_matrices(&crate::gen::tone(tone + 1e-3, samplerate.simd_recip())); } } @@ -118,7 +121,8 @@ impl OutputStage { } } pub fn set_samplerate(&mut self, samplerate: T) { - self.inner.update_matrices(&crate::gen::output(samplerate.simd_recip())); + self.inner + .update_matrices(&crate::gen::output(samplerate.simd_recip())); } } @@ -127,7 +131,7 @@ impl DSP<1, 1> for OutputStage { fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { let [y] = self.inner.process(x); - [y*self.gain] + [y * self.gain] } fn latency(&self) -> usize { @@ -137,4 +141,4 @@ impl DSP<1, 1> for OutputStage { fn reset(&mut self) { DSP::reset(&mut self.inner) } -} \ No newline at end of file +} diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index ebac7d0..6f48b57 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -1,21 +1,26 @@ -mod gen; -mod dsp; - - -use nih_plug::prelude::*; use std::sync::Arc; -use nih_plug::util::{gain_to_db, MINUS_INFINITY_DB, MINUS_INFINITY_GAIN}; +use nih_plug::prelude::*; +use nih_plug::util::{db_to_gain_fast, gain_to_db, MINUS_INFINITY_DB, MINUS_INFINITY_GAIN}; use num_traits::Zero; -use valib::dsp::blocks::{Series}; -use valib::dsp::{DSP, DSPBlock}; +use valib::dsp::blocks::Series; use valib::dsp::utils::{slice_to_mono_block, slice_to_mono_block_mut}; +use valib::dsp::{DSPBlock, DSP}; use valib::oversample::Oversample; use valib::simd::{AutoF64x2, SimdValue}; + use crate::dsp::{ClipperStage, InputStage, OutputStage, ToneStage}; +mod dsp; +mod gen; + type Sample = AutoF64x2; -type Dsp = Series<(InputStage, ClipperStage, ToneStage, OutputStage)>; +type Dsp = Series<( + InputStage, + ClipperStage, + ToneStage, + OutputStage, +)>; const OVERSAMPLE: usize = 4; const MAX_BLOCK_SIZE: usize = 512; @@ -42,7 +47,12 @@ impl Default for Ts404 { let samplerate = Sample::splat(OVERSAMPLE as f64 * 44100.0); Self { params: Arc::new(Ts404Params::default()), - dsp: Series((InputStage::new(samplerate, Sample::splat(1.0)), ClipperStage::new(samplerate, Sample::splat(0.1)), ToneStage::new(samplerate, Sample::splat(0.5)), OutputStage::new(samplerate, Sample::splat(1.0)))), + dsp: Series(( + InputStage::new(samplerate, Sample::splat(1.0)), + ClipperStage::new(samplerate, Sample::splat(0.1)), + ToneStage::new(samplerate, Sample::splat(0.5)), + OutputStage::new(samplerate, Sample::splat(1.0)), + )), oversample: Oversample::new(OVERSAMPLE, MAX_BLOCK_SIZE), } } @@ -51,27 +61,42 @@ impl Default for Ts404 { impl Default for Ts404Params { fn default() -> Self { Self { - drive: FloatParam::new("Drive", 1.0, FloatRange::Skewed { min: 0.5, max: 100.0, factor: FloatRange::gain_skew_factor(gain_to_db(0.5), gain_to_db(100.0))}) - .with_unit("dB") - .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) - .with_string_to_value(formatters::s2v_f32_gain_to_db()) - .with_smoother(SmoothingStyle::Linear(50.0)), - dist: FloatParam::new("Distortion", 0.1, FloatRange::Linear {min: 0.0, max: 1.0}) + drive: FloatParam::new( + "Drive", + 1.0, + FloatRange::Skewed { + min: 0.5, + max: 100.0, + factor: FloatRange::gain_skew_factor(gain_to_db(0.5), gain_to_db(100.0)), + }, + ) + .with_unit("dB") + .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) + .with_string_to_value(formatters::s2v_f32_gain_to_db()) + .with_smoother(SmoothingStyle::Linear(50.0)), + dist: FloatParam::new("Distortion", 0.1, FloatRange::Linear { min: 0.0, max: 1.0 }) .with_unit("%") .with_smoother(SmoothingStyle::Linear(50.0)) .with_value_to_string(formatters::v2s_f32_percentage(2)) .with_string_to_value(formatters::s2v_f32_percentage()), - tone: FloatParam::new("Tone", 0.5, FloatRange::Linear {min: 0.0, max: 1.0}) + tone: FloatParam::new("Tone", 0.5, FloatRange::Linear { min: 0.0, max: 1.0 }) .with_unit("%") .with_smoother(SmoothingStyle::Linear(50.0)) .with_value_to_string(formatters::v2s_f32_percentage(2)) .with_string_to_value(formatters::s2v_f32_percentage()), - out_level: FloatParam::new("Output Level", 1.0, FloatRange::Skewed {min: MINUS_INFINITY_GAIN, max: 2.0, factor: FloatRange::gain_skew_factor(MINUS_INFINITY_DB, gain_to_db(2.0))}) - .with_unit("dB") - .with_smoother(SmoothingStyle::Linear(50.0)) - .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) - .with_string_to_value(formatters::s2v_f32_gain_to_db()), - + out_level: FloatParam::new( + "Output Level", + 0.158, + FloatRange::Skewed { + min: MINUS_INFINITY_GAIN, + max: 1.0, + factor: FloatRange::gain_skew_factor(MINUS_INFINITY_DB, gain_to_db(1.0)), + }, + ) + .with_unit("dB") + .with_smoother(SmoothingStyle::Linear(50.0)) + .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) + .with_string_to_value(formatters::s2v_f32_gain_to_db()), } } } @@ -99,7 +124,6 @@ impl Plugin for Ts404 { names: PortNames::const_default(), }]; - const MIDI_INPUT: MidiConfig = MidiConfig::None; const MIDI_OUTPUT: MidiConfig = MidiConfig::None; @@ -156,7 +180,10 @@ impl Plugin for Ts404 { let mut os_block_copy = [Sample::zero(); OVERSAMPLE * MAX_BLOCK_SIZE]; for (_, mut block) in buffer.iter_blocks(MAX_BLOCK_SIZE) { for (i, mut frame) in block.iter_samples().enumerate() { - let stereo = Sample::new(*frame.get_mut(0).unwrap() as _, *frame.get_mut(1).unwrap() as _); + let stereo = Sample::new( + *frame.get_mut(0).unwrap() as _, + *frame.get_mut(1).unwrap() as _, + ); inner_buffer[i] = stereo; } @@ -164,7 +191,10 @@ impl Plugin for Ts404 { let os_block_copy = &mut os_block_copy[..block.samples() * OVERSAMPLE]; let mut os_block = self.oversample.oversample(inner_buffer); os_block_copy.copy_from_slice(&os_block); - self.dsp.process_block(slice_to_mono_block(os_block_copy), slice_to_mono_block_mut(&mut os_block)); + self.dsp.process_block( + slice_to_mono_block(os_block_copy), + slice_to_mono_block_mut(&mut os_block), + ); os_block.finish(inner_buffer); for (i, s) in inner_buffer.iter().copied().enumerate() { @@ -173,13 +203,27 @@ impl Plugin for Ts404 { } } + safety_clipper(buffer); + ProcessStatus::Normal } } +fn safety_clipper(buffer: &mut Buffer) { + let max_ampl = db_to_gain_fast(8.0); + for sample in buffer.iter_samples() { + for s in sample.into_iter() { + if !s.is_finite() || s.abs() > max_ampl { + nih_debug_assert_failure!("Safety clip triggered"); + s.set_zero(); + } + } + } +} impl ClapPlugin for Ts404 { const CLAP_ID: &'static str = "dev.solarliner.ts404"; - const CLAP_DESCRIPTION: Option<&'static str> = Some("An inspired but fantasy screamer guitar pedal emulation"); + const CLAP_DESCRIPTION: Option<&'static str> = + Some("An inspired but fantasy screamer guitar pedal emulation"); const CLAP_MANUAL_URL: Option<&'static str> = Some(Self::URL); const CLAP_SUPPORT_URL: Option<&'static str> = None; From 00ae2a61a54b995e4e32213f913c5c1c327c868b Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Thu, 4 Jan 2024 13:41:27 +0100 Subject: [PATCH 08/51] chore: disable workspace support in cargo-make + set poetry to use venv in project --- plugins/ts404/Makefile.toml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/ts404/Makefile.toml b/plugins/ts404/Makefile.toml index 1b56b72..ac3d4f9 100644 --- a/plugins/ts404/Makefile.toml +++ b/plugins/ts404/Makefile.toml @@ -1,10 +1,11 @@ -[env] -CARGO_MAKE_EXTEND_WORKSPACE_MAKEFILE = false +[config] +default_to_workspace = false [tasks.default] alias = "bundle" [tasks.venv] +env = { POETRY_VIRTUALENVS_IN_PROJECT = true } script_runner = "@shell" script = """ poetry install --no-root @@ -31,4 +32,4 @@ dependencies = ["generate"] dependencies = ["build", "xtask-build"] command = "cargo" args = ["xtask", "bundle", "ts404"] -install_crate = false \ No newline at end of file +install_crate = false From a2231e9b3b5a4c14155eb8e59736491b6479c3d1 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Thu, 4 Jan 2024 14:01:16 +0100 Subject: [PATCH 09/51] fix: sort codegen function params --- plugins/ts404/gen_statespace.py | 2 +- plugins/ts404/src/dsp.rs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/ts404/gen_statespace.py b/plugins/ts404/gen_statespace.py index 4302a80..b2b3bde 100644 --- a/plugins/ts404/gen_statespace.py +++ b/plugins/ts404/gen_statespace.py @@ -131,7 +131,7 @@ def postprocess_codegen(s: str) -> str: printer = MyRustPrinter() e = sm.Tuple(state_space.A, state_space.B, state_space.C, state_space.D) sub, simpl = sm.cse(e) - args = ", ".join(f"{name}: T" for name in e.atoms(sm.Symbol)) + args = ", ".join(f"{name}: T" for name in sorted(e.atoms(sm.Symbol), key=lambda v: str(v))) yield f"{public} fn {name}({args}) -> StateSpace {{" for var, e in sub: # Replacing in string after printing because there's no easy way of doing it from the printer diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index 595149d..091edd8 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -65,13 +65,13 @@ impl ClipperStage { #[replace_float_literals(T::from_f64(literal))] pub fn new(samplerate: T, dist: T) -> Self { let dt = samplerate.simd_recip(); - Self(crate::gen::clipper(dist + 1e-3, dt), Slew::new(1e4 * dt)) + Self(crate::gen::clipper(dt, dist), Slew::new(1e4 * dt)) } pub fn set_params(&mut self, samplerate: T, dist: T) { let dt = samplerate.simd_recip(); - self.0.update_matrices(&crate::gen::clipper(dist, dt)); - self.1.set_max_diff(T::from_f64(1e5), dt); + self.0.update_matrices(&crate::gen::clipper(dt, dist)); + self.1.set_max_diff(T::from_f64(1e5), samplerate); } } @@ -97,13 +97,13 @@ impl DSP<1, 1> for ToneStage { impl ToneStage { #[replace_float_literals(T::from_f64(literal))] pub fn new(samplerate: T, tone: T) -> Self { - Self(crate::gen::tone(tone + 1e-3, samplerate.simd_recip())) + Self(crate::gen::tone(samplerate.simd_recip(), tone)) } #[replace_float_literals(T::from_f64(literal))] pub fn update_params(&mut self, samplerate: T, tone: T) { self.0 - .update_matrices(&crate::gen::tone(tone + 1e-3, samplerate.simd_recip())); + .update_matrices(&crate::gen::tone(samplerate.simd_recip(), tone)); } } From b8e90882ef4cf99c56c71d39fbc34016b6e39076 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 8 Jan 2024 20:14:32 +0100 Subject: [PATCH 10/51] ci: create build job + adapt Makefile.toml to be used there --- plugins/ts404/.github/workflows/build.yml | 88 +++++++++++++++++++++++ plugins/ts404/Makefile.toml | 13 ++-- 2 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 plugins/ts404/.github/workflows/build.yml diff --git a/plugins/ts404/.github/workflows/build.yml b/plugins/ts404/.github/workflows/build.yml new file mode 100644 index 0000000..31eac63 --- /dev/null +++ b/plugins/ts404/.github/workflows/build.yml @@ -0,0 +1,88 @@ +name: Automated Builds + +on: + push: + branches: + - main + tags: + # Run when pushing version tags, since otherwise it's impossible to + # restart a successful build after pushing a tag + - '*.*.*' + pull_request: + branches: + - main + +defaults: + run: + # This otherwise gets run under dash which does not support brace expansion + shell: bash + +jobs: + # We'll only package the plugins with an entry in bundler.toml + package: + strategy: + matrix: + include: + - { name: ubuntu-22.04, os: ubuntu-22.04, cross-target: '' } + - { name: macos-universal, os: macos-11, cross-target: aarch64-apple-darwin } + - { name: windows, os: windows-latest, cross-target: '' } + name: Package plugin binaries + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + - name: Fetch all git history + run: git fetch --force --prune --tags --unshallow + + - name: Install dependencies + if: startsWith(matrix.os, 'ubuntu') + run: | + sudo apt-get update + sudo apt-get install -y libasound2-dev libgl-dev libjack-dev libx11-xcb-dev libxcb1-dev libxcb-dri2-0-dev libxcb-icccm4-dev libxcursor-dev libxkbcommon-dev libxcb-shape0-dev libxcb-xfixes0-dev + - uses: actions/cache@v2 + # FIXME: Caching `target/` causes the Windows runner to blow up after some time + if: startsWith(matrix.os, 'windows') + with: + path: | + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + key: ${{ matrix.name }}-${{ matrix.cross-target }} + - uses: actions/cache@v2 + if: "!startsWith(matrix.os, 'windows')" + with: + path: | + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ matrix.name }}-${{ matrix.cross-target }} + + - name: Set up Rust toolchain + uses: actions-rs/toolchain@v1 + with: + # The macOS AArch64/universal build is done from an x86_64 macOS CI + # runner, so it needs to be cross compiled + target: ${{ matrix.cross-target }} + - name: Setup Python + uses: actions/setup-python@v5.0.0 + with: + # Version range or exact version of Python or PyPy to use, using SemVer's version range syntax. Reads from .python-version if unset. + python-version: 3.12 + - name: Install poetry + run: pip install poetry + - name: Build and bundle plugin + run: cargo make bundle --release + - name: Determine build archive name + run: | + echo "ARCHIVE_NAME=ts404-$(git describe --always)-${{ matrix.name }}" >> "$GITHUB_ENV" + - name: Move all packaged plugin into a directory + run: | + # GitHub Action strips the top level directory, great, have another one + mkdir -p "$ARCHIVE_NAME/$ARCHIVE_NAME" + mv target/bundled/* "$ARCHIVE_NAME/$ARCHIVE_NAME" + - name: Add an OS-specific readme file with installation instructions + run: cp ".github/workflows/readme-${{ runner.os }}.txt" "$ARCHIVE_NAME/$ARCHIVE_NAME/README.txt" + - uses: actions/upload-artifact@v2 + with: + name: ${{ env.ARCHIVE_NAME }} + path: ${{ env.ARCHIVE_NAME }} \ No newline at end of file diff --git a/plugins/ts404/Makefile.toml b/plugins/ts404/Makefile.toml index ac3d4f9..12e6ecb 100644 --- a/plugins/ts404/Makefile.toml +++ b/plugins/ts404/Makefile.toml @@ -5,7 +5,6 @@ default_to_workspace = false alias = "bundle" [tasks.venv] -env = { POETRY_VIRTUALENVS_IN_PROJECT = true } script_runner = "@shell" script = """ poetry install --no-root @@ -13,23 +12,25 @@ poetry install --no-root [tasks.xtask-build] extend = "build" -args = ["build", "-p", "xtask"] +args = ["build", "-p", "xtask", "--release"] [tasks.generate] dependencies = ["venv"] script_runner = "@shell" script = """ -source .venv/bin/activate # shell2batch: call .\\.venv\\Scripts\\activate.bat -python ./gen_statespace.py +poetry run python ./gen_statespace.py """ condition = { files_modified = { input = ["./gen_statespace.py"], output = ["./src/gen.rs"] } } [tasks.build] -args = ["build", "-p", "ts404"] +args = ["build", "-p", "ts404", "${@}"] dependencies = ["generate"] [tasks.bundle] dependencies = ["build", "xtask-build"] command = "cargo" -args = ["xtask", "bundle", "ts404"] +args = ["xtask", "bundle", "ts404", "${@}"] install_crate = false + +[tasks.bundle.macos] +args = ["xtask", "bundle-universal", "ts404", "${@}"] From c65cec62acd971ae36dd30e2c96f23373a547f88 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 8 Jan 2024 20:20:51 +0100 Subject: [PATCH 11/51] Update build.yml --- plugins/ts404/.github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/ts404/.github/workflows/build.yml b/plugins/ts404/.github/workflows/build.yml index 31eac63..1887258 100644 --- a/plugins/ts404/.github/workflows/build.yml +++ b/plugins/ts404/.github/workflows/build.yml @@ -3,14 +3,14 @@ name: Automated Builds on: push: branches: - - main + - master tags: # Run when pushing version tags, since otherwise it's impossible to # restart a successful build after pushing a tag - '*.*.*' pull_request: branches: - - main + - master defaults: run: @@ -85,4 +85,4 @@ jobs: - uses: actions/upload-artifact@v2 with: name: ${{ env.ARCHIVE_NAME }} - path: ${{ env.ARCHIVE_NAME }} \ No newline at end of file + path: ${{ env.ARCHIVE_NAME }} From 7a8f39e94e52b53cbb6b03ede12b2a6fb41d05e2 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 8 Jan 2024 20:22:45 +0100 Subject: [PATCH 12/51] Update build.yml --- plugins/ts404/.github/workflows/build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/ts404/.github/workflows/build.yml b/plugins/ts404/.github/workflows/build.yml index 1887258..f4d9c9b 100644 --- a/plugins/ts404/.github/workflows/build.yml +++ b/plugins/ts404/.github/workflows/build.yml @@ -63,6 +63,8 @@ jobs: # The macOS AArch64/universal build is done from an x86_64 macOS CI # runner, so it needs to be cross compiled target: ${{ matrix.cross-target }} + - name: Install cargo-make + run: cargo install --force cargo-make - name: Setup Python uses: actions/setup-python@v5.0.0 with: From 49c2c4b7e5c901db4417bb820736e33e4f929926 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 8 Jan 2024 20:29:41 +0100 Subject: [PATCH 13/51] ci: add readme files for packages --- plugins/ts404/.github/workflows/readme-Linux.txt | 10 ++++++++++ plugins/ts404/.github/workflows/readme-Windows.txt | 10 ++++++++++ plugins/ts404/.github/workflows/readme-macOS.txt | 10 ++++++++++ plugins/ts404/.idea/ts404.iml | 4 ++-- 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 plugins/ts404/.github/workflows/readme-Linux.txt create mode 100644 plugins/ts404/.github/workflows/readme-Windows.txt create mode 100644 plugins/ts404/.github/workflows/readme-macOS.txt diff --git a/plugins/ts404/.github/workflows/readme-Linux.txt b/plugins/ts404/.github/workflows/readme-Linux.txt new file mode 100644 index 0000000..1a2f474 --- /dev/null +++ b/plugins/ts404/.github/workflows/readme-Linux.txt @@ -0,0 +1,10 @@ +To install the VST3 plugins, copy the .vst3 _directories_ to: +~/.vst3 + +To install the CLAP plugins, copy the .clap files to: +~/.clap + +You will need to create these directories yourself it they do not yet exist. + +See https://github.com/free-audio/clap#hosts for instructions on how to enable +CLAP support in your DAW. diff --git a/plugins/ts404/.github/workflows/readme-Windows.txt b/plugins/ts404/.github/workflows/readme-Windows.txt new file mode 100644 index 0000000..611fdb3 --- /dev/null +++ b/plugins/ts404/.github/workflows/readme-Windows.txt @@ -0,0 +1,10 @@ +To install the VST3 plugins, copy the .vst3 _directories_ to: +C:/Program Files/Common Files/VST3/ + +To install the CLAP plugins, copy the .clap files to: +C:/Program Files/Common Files/CLAP/ + +You will need to create these directories yourself it they do not yet exist. + +See https://github.com/free-audio/clap#hosts for instructions on how to enable +CLAP support in your DAW. diff --git a/plugins/ts404/.github/workflows/readme-macOS.txt b/plugins/ts404/.github/workflows/readme-macOS.txt new file mode 100644 index 0000000..ebee0d7 --- /dev/null +++ b/plugins/ts404/.github/workflows/readme-macOS.txt @@ -0,0 +1,10 @@ +To install the VST3 plugins, copy the .vst3 bundles to: +~/Library/Audio/Plug-Ins/VST3 + +To install the CLAP plugins, copy the .clap bundles to: +~/Library/Audio/Plug-Ins/CLAP + +You will need to create these directories yourself it they do not yet exist. + +See https://github.com/free-audio/clap#hosts for instructions on how to enable +CLAP support in your DAW. diff --git a/plugins/ts404/.idea/ts404.iml b/plugins/ts404/.idea/ts404.iml index 3571d02..71fbd98 100644 --- a/plugins/ts404/.idea/ts404.iml +++ b/plugins/ts404/.idea/ts404.iml @@ -2,7 +2,7 @@ - + @@ -13,6 +13,6 @@ - + \ No newline at end of file From 56cd885a3d26e7e7b444f872755c992cf9008eb5 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 8 Jan 2024 21:25:56 +0100 Subject: [PATCH 14/51] doc: add link to download the latest master bundles --- plugins/ts404/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/ts404/README.md b/plugins/ts404/README.md index 6ead32f..f4f3718 100644 --- a/plugins/ts404/README.md +++ b/plugins/ts404/README.md @@ -1,5 +1,7 @@ # Error 404: Screamer not found +[Download (latest master, unstable)](https://nightly.link/SolarLiner/ts404/workflows/build/master) + A guitar pedal plugin inspired by the most popular screamer pedal. ## Building From e80b748dcc8cd3f7ce972a631f4b3bb52cefaba6 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 8 Jan 2024 21:28:02 +0100 Subject: [PATCH 15/51] Create LICENSE --- plugins/ts404/LICENSE | 674 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 plugins/ts404/LICENSE diff --git a/plugins/ts404/LICENSE b/plugins/ts404/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/plugins/ts404/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. From 68ec09c02dd070eacbc1cf96029b80d3737db453 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Thu, 18 Jan 2024 22:56:24 +0100 Subject: [PATCH 16/51] feat: component matching + bypass (original + buffers) --- plugins/ts404/src/dsp.rs | 86 ++++++++++++++++++++++++++++---- plugins/ts404/src/lib.rs | 105 +++++++++++++++++++++++++++++++++------ 2 files changed, 164 insertions(+), 27 deletions(-) diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index 091edd8..9be2b43 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -4,6 +4,48 @@ use valib::filters::statespace::StateSpace; use valib::saturators::Slew; use valib::Scalar; +#[derive(Debug, Copy, Clone)] +pub struct Bypass { + pub inner: T, + pub active: bool, +} + +impl DSP for Bypass +where + T: DSP, +{ + type Sample = T::Sample; + + fn process(&mut self, x: [Self::Sample; N]) -> [Self::Sample; N] { + if self.active { + self.inner.process(x) + } else { + x + } + } + + fn latency(&self) -> usize { + if self.active { + self.inner.latency() + } else { + 0 + } + } + + fn reset(&mut self) { + self.inner.reset(); + } +} + +impl Bypass { + pub fn new(inner: T) -> Self { + Self { + inner, + active: true, + } + } +} + #[derive(Debug, Copy, Clone)] pub struct InputStage { pub gain: T, @@ -40,24 +82,40 @@ impl InputStage { } } +fn crossover_half(x: T, a: T, b: T) -> T { + T::simd_ln(T::simd_exp(b * x) + T::from_f64(10.0).simd_powf(a)) / b +} + +fn crossover(x: T, a: T, b: T) -> T { + crossover_half(x, a, b) - crossover_half(-x, a, b) +} + #[derive(Debug, Copy, Clone)] -pub struct ClipperStage(StateSpace, Slew); +pub struct ClipperStage { + state_space: StateSpace, + pub crossover: (T, T), + pub(crate) slew: Slew, +} impl DSP<1, 1> for ClipperStage { type Sample = T; + #[replace_float_literals(Self::Sample::from_f64(literal))] fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { - let [y] = self.0.process(x); - self.1.process([y.simd_asinh()]) + let [y] = self.state_space.process(x); + let y = y.simd_asinh().simd_clamp(-4.5, 4.5); + let [y] = self.slew.process([y]); + let y = crossover(y, self.crossover.0, self.crossover.1); + [y] } fn latency(&self) -> usize { - self.0.latency() + self.1.latency() + self.state_space.latency() + self.slew.latency() } fn reset(&mut self) { - self.0.reset(); - self.1.reset(); + self.state_space.reset(); + self.slew.reset(); } } @@ -65,13 +123,18 @@ impl ClipperStage { #[replace_float_literals(T::from_f64(literal))] pub fn new(samplerate: T, dist: T) -> Self { let dt = samplerate.simd_recip(); - Self(crate::gen::clipper(dt, dist), Slew::new(1e4 * dt)) + Self { + state_space: crate::gen::clipper(dt, dist), + crossover: (0.0, 30.0), + slew: Slew::new(1e4 * dt), + } } pub fn set_params(&mut self, samplerate: T, dist: T) { let dt = samplerate.simd_recip(); - self.0.update_matrices(&crate::gen::clipper(dt, dist)); - self.1.set_max_diff(T::from_f64(1e5), samplerate); + self.state_space + .update_matrices(&crate::gen::clipper(dt, dist)); + self.slew.set_max_diff(T::from_f64(1e5), samplerate); } } @@ -109,19 +172,20 @@ impl ToneStage { #[derive(Debug, Copy, Clone)] pub struct OutputStage { - pub inner: StateSpace, + pub inner: Bypass>, pub gain: T, } impl OutputStage { pub fn new(samplerate: T, gain: T) -> Self { Self { - inner: crate::gen::output(samplerate.simd_recip()), + inner: Bypass::new(crate::gen::output(samplerate.simd_recip())), gain, } } pub fn set_samplerate(&mut self, samplerate: T) { self.inner + .inner .update_matrices(&crate::gen::output(samplerate.simd_recip())); } } diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index 6f48b57..b30de82 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -8,19 +8,21 @@ use valib::dsp::utils::{slice_to_mono_block, slice_to_mono_block_mut}; use valib::dsp::{DSPBlock, DSP}; use valib::oversample::Oversample; use valib::simd::{AutoF64x2, SimdValue}; +use valib::util::lerp; +use valib::Scalar; -use crate::dsp::{ClipperStage, InputStage, OutputStage, ToneStage}; +use crate::dsp::{Bypass, ClipperStage, InputStage, OutputStage, ToneStage}; mod dsp; mod gen; type Sample = AutoF64x2; type Dsp = Series<( - InputStage, - ClipperStage, - ToneStage, + Bypass>, + Bypass, ToneStage)>>, OutputStage, )>; + const OVERSAMPLE: usize = 4; const MAX_BLOCK_SIZE: usize = 512; @@ -40,6 +42,12 @@ struct Ts404Params { tone: FloatParam, #[id = "level"] out_level: FloatParam, + #[id = "cmpmat"] + component_matching: FloatParam, + #[id = "bypass"] + bypass: BoolParam, + #[id = "byp_io"] + io_bypass: BoolParam, } impl Default for Ts404 { @@ -48,9 +56,11 @@ impl Default for Ts404 { Self { params: Arc::new(Ts404Params::default()), dsp: Series(( - InputStage::new(samplerate, Sample::splat(1.0)), - ClipperStage::new(samplerate, Sample::splat(0.1)), - ToneStage::new(samplerate, Sample::splat(0.5)), + Bypass::new(InputStage::new(samplerate, Sample::splat(1.0))), + Bypass::new(Series(( + ClipperStage::new(samplerate, Sample::splat(0.1)), + ToneStage::new(samplerate, Sample::splat(0.5)), + ))), OutputStage::new(samplerate, Sample::splat(1.0)), )), oversample: Oversample::new(OVERSAMPLE, MAX_BLOCK_SIZE), @@ -72,16 +82,16 @@ impl Default for Ts404Params { ) .with_unit("dB") .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) - .with_string_to_value(formatters::s2v_f32_gain_to_db()) - .with_smoother(SmoothingStyle::Linear(50.0)), + .with_string_to_value(formatters::s2v_f32_gain_to_db()), + // .with_smoother(SmoothingStyle::Linear(50.0)), dist: FloatParam::new("Distortion", 0.1, FloatRange::Linear { min: 0.0, max: 1.0 }) .with_unit("%") - .with_smoother(SmoothingStyle::Linear(50.0)) + // .with_smoother(SmoothingStyle::Linear(50.0)) .with_value_to_string(formatters::v2s_f32_percentage(2)) .with_string_to_value(formatters::s2v_f32_percentage()), tone: FloatParam::new("Tone", 0.5, FloatRange::Linear { min: 0.0, max: 1.0 }) .with_unit("%") - .with_smoother(SmoothingStyle::Linear(50.0)) + // .with_smoother(SmoothingStyle::Linear(50.0)) .with_value_to_string(formatters::v2s_f32_percentage(2)) .with_string_to_value(formatters::s2v_f32_percentage()), out_level: FloatParam::new( @@ -94,13 +104,38 @@ impl Default for Ts404Params { }, ) .with_unit("dB") - .with_smoother(SmoothingStyle::Linear(50.0)) + // .with_smoother(SmoothingStyle::Linear(50.0)) .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) .with_string_to_value(formatters::s2v_f32_gain_to_db()), + component_matching: FloatParam::new( + "Component Matching", + 1., + FloatRange::Linear { min: 0.0, max: 1.0 }, + ) + .with_unit("%") + // .with_smoother(SmoothingStyle::Linear(10.0)) + .with_string_to_value(formatters::s2v_f32_percentage()) + .with_value_to_string(formatters::v2s_f32_percentage(0)), + bypass: BoolParam::new("Bypass", false), + io_bypass: BoolParam::new("I/O Buffers Bypass", false), } } } +fn component_matching_slew_rate(samplerate: Sample, normalized: Sample) -> Sample { + let min = Sample::splat(db_to_gain_fast(30.0) as _); + let max = Sample::splat(db_to_gain_fast(100.0) as _); + lerp(normalized, min, max) / samplerate +} + +fn component_matching_crossover(normalized: Sample) -> (Sample, Sample) { + let min = Sample::splat(10.0); + let max = Sample::splat(0.5); + let a = lerp(normalized, min, max); + let b = Sample::from_f64(10.0); + (a, b) +} + impl Plugin for Ts404 { const NAME: &'static str = "TS-404"; const VENDOR: &'static str = "SolarLiner"; @@ -149,11 +184,30 @@ impl Plugin for Ts404 { _context: &mut impl InitContext, ) -> bool { let samplerate = Sample::splat(buffer_config.sample_rate as _); - let Series((input, clipping, tone, output)) = &mut self.dsp; - input.set_samplerate(samplerate); + let Series(( + Bypass { + inner: input, + active: input_active, + }, + Bypass { + inner: Series((clipping, tone)), + active: main_active, + }, + output, + )) = &mut self.dsp; + + let component_matching = Sample::from_f64(self.params.component_matching.value() as _); + + let io_active = !self.params.io_bypass.value(); + *main_active = !self.params.bypass.value(); + *input_active = io_active; + output.inner.active = io_active; + input.gain = Sample::splat(self.params.drive.value() as _); clipping.set_params(samplerate, Sample::splat(self.params.dist.value() as _)); + clipping.crossover = component_matching_crossover(component_matching); + clipping.slew.max_diff = component_matching_slew_rate(samplerate, component_matching); tone.update_params(samplerate, Sample::splat(self.params.tone.value() as _)); - output.set_samplerate(samplerate); + output.gain = Sample::splat(self.params.out_level.value() as _); true } @@ -168,9 +222,27 @@ impl Plugin for Ts404 { context: &mut impl ProcessContext, ) -> ProcessStatus { let samplerate = Sample::splat(context.transport().sample_rate as _); - let Series((input, clipping, tone, output)) = &mut self.dsp; + let Series(( + Bypass { + inner: input, + active: input_active, + }, + Bypass { + inner: Series((clipping, tone)), + active: main_active, + }, + output, + )) = &mut self.dsp; + + let component_matching = Sample::from_f64(self.params.component_matching.value() as _); + let io_active = !self.params.io_bypass.value(); + *main_active = !self.params.bypass.value(); + *input_active = io_active; + output.inner.active = io_active; input.gain = Sample::splat(self.params.drive.value() as _); clipping.set_params(samplerate, Sample::splat(self.params.dist.value() as _)); + clipping.crossover = component_matching_crossover(component_matching); + clipping.slew.max_diff = component_matching_slew_rate(samplerate, component_matching); tone.update_params(samplerate, Sample::splat(self.params.tone.value() as _)); output.gain = Sample::splat(self.params.out_level.value() as _); @@ -220,6 +292,7 @@ fn safety_clipper(buffer: &mut Buffer) { } } } + impl ClapPlugin for Ts404 { const CLAP_ID: &'static str = "dev.solarliner.ts404"; const CLAP_DESCRIPTION: Option<&'static str> = From 30f66792ba6db9faf96b75f6383eb7038685ef13 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Sun, 2 Jun 2024 15:12:04 +0200 Subject: [PATCH 17/51] chore: update to latest valib --- plugins/ts404/Cargo.lock | 118 +++++++++-- plugins/ts404/Cargo.toml | 4 +- plugins/ts404/src/dsp.rs | 424 ++++++++++++++++++++++++++++++--------- plugins/ts404/src/lib.rs | 228 +++++++-------------- 4 files changed, 510 insertions(+), 264 deletions(-) diff --git a/plugins/ts404/Cargo.lock b/plugins/ts404/Cargo.lock index 40a7061..94cef05 100644 --- a/plugins/ts404/Cargo.lock +++ b/plugins/ts404/Cargo.lock @@ -201,6 +201,41 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "darling" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.66", +] + +[[package]] +name = "darling_macro" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.66", +] + [[package]] name = "deranged" version = "0.3.11" @@ -210,12 +245,38 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "gimli" version = "0.28.1" @@ -248,6 +309,12 @@ dependencies = [ "libc", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "indexmap" version = "2.1.0" @@ -458,9 +525,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -533,9 +600,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "plain" @@ -543,6 +610,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + [[package]] name = "powerfmt" version = "0.2.0" @@ -551,18 +624,18 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "proc-macro2" -version = "1.0.73" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dd5e8a1f1029c43224ad5898e50140c2aebb1705f19e67c918ebf5b9e797fe1" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.34" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a37c9326af5ed140c86a46655b5278de879853be5573c01df185b6f49a580a" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -641,7 +714,7 @@ checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ "proc-macro2", "quote", - "syn 2.0.45", + "syn 2.0.66", ] [[package]] @@ -661,7 +734,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.45", + "syn 2.0.66", ] [[package]] @@ -703,6 +776,12 @@ version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "syn" version = "1.0.109" @@ -716,9 +795,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.45" +version = "2.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eae3c679c56dc214320b67a1bc04ef3dfbd6411f6443974b5e4893231298e66" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" dependencies = [ "proc-macro2", "quote", @@ -803,6 +882,7 @@ dependencies = [ name = "ts404" version = "0.1.0" dependencies = [ + "enum-map", "nalgebra", "nih_plug", "num-traits", @@ -825,13 +905,25 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "valib" version = "0.1.0" -source = "git+https://github.com/SolarLiner/valib.git#efdae667d020d62cbce4da2be38b3bd1f6850f60" dependencies = [ "az", "nalgebra", + "nih_plug", "num-traits", "numeric_literals", + "portable-atomic", "simba", + "valib_derive", +] + +[[package]] +name = "valib_derive" +version = "0.1.0" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.66", ] [[package]] diff --git a/plugins/ts404/Cargo.toml b/plugins/ts404/Cargo.toml index d352d1a..957650b 100644 --- a/plugins/ts404/Cargo.toml +++ b/plugins/ts404/Cargo.toml @@ -14,11 +14,13 @@ members = ["xtask"] crate-type = ["cdylib"] [dependencies] +enum-map = "2.7.3" nalgebra = "0.32.3" nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git" } num-traits = "0.2.17" numeric_literals = "0.2.0" -valib = { git = "https://github.com/SolarLiner/valib.git" } +#valib = { git = "https://github.com/SolarLiner/valib.git" } +valib = { path = "../valib", features = ["nih-plug"] } [profile.dev] opt-level = 1 diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index 9be2b43..717b077 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -1,31 +1,86 @@ +use nalgebra::Complex; +use nih_plug::nih_log; +use nih_plug::util::db_to_gain_fast; use numeric_literals::replace_float_literals; -use valib::dsp::DSP; +use valib::dsp::{BlockAdapter, DSPMeta, DSPProcess, DSPProcessBlock}; +use valib::dsp::blocks::Series; +use valib::dsp::buffer::{AudioBufferMut, AudioBufferRef}; +use valib::dsp::parameter::{HasParameters, ParamId, ParamName, RemoteControlled, SmoothedParam}; use valib::filters::statespace::StateSpace; -use valib::saturators::Slew; +use valib::oversample::{Oversample, Oversampled}; +use valib::saturators::{Clipper, Saturator, Slew}; use valib::Scalar; +use valib::simd::{AutoF32x2, AutoF64x2, AutoSimd, SimdBool, SimdComplexField, SimdPartialOrd}; +use valib::util::lerp; + +#[replace_float_literals(T::from_f64(literal))] +fn smooth_min(t: T, a: T, b: T) -> T { + // Polynomial + //let h = (0.5 + 0.5 * (a - b) / t).simd_clamp(0.0, 1.0); + //lerp(h, a, b) - t * h * (1.0 - h) + + // Exponential + let r = (-a / t).simd_exp2() + (-b / t).simd_exp2(); + -t * r.simd_log2() +} -#[derive(Debug, Copy, Clone)] -pub struct Bypass { - pub inner: T, - pub active: bool, +fn smooth_max(t: T, a: T, b: T) -> T { + -smooth_min(t, -a, -b) } -impl DSP for Bypass -where - T: DSP, -{ - type Sample = T::Sample; +fn smooth_clamp(t: T, x: T, min: T, max: T) -> T { + smooth_max(t, min, smooth_min(t, x, max)) +} - fn process(&mut self, x: [Self::Sample; N]) -> [Self::Sample; N] { - if self.active { - self.inner.process(x) - } else { - x +#[derive(Debug, Copy, Clone)] +struct Bjt { + pub vcc: T, + pub vee: T, +} + +impl Default for Bjt { + fn default() -> Self { + Self { + vcc: T::from_f64(4.5), + vee: T::from_f64(-4.5), } } +} + +impl Saturator for Bjt { + #[replace_float_literals(T::from_f64(literal))] + fn saturate(&self, x: T) -> T { + smooth_clamp(0.1, x - 0.770, self.vee, self.vcc) + 0.770 + } +} + +impl DSPMeta for Bjt { + type Sample = T; +} + +impl DSPProcess<1, 1> for Bjt { + fn process(&mut self, [x]: [Self::Sample; 1]) -> [Self::Sample; 1] { + [self.saturate(x)] + } +} + +#[derive(Debug, Clone)] +pub struct Bypass

{ + pub inner: P, + pub active: SmoothedParam, +} + +impl DSPMeta for Bypass

{ + type Sample = P::Sample; + + fn set_samplerate(&mut self, samplerate: f32) { + self.active.set_samplerate(samplerate); + self.inner.set_samplerate(samplerate); + } fn latency(&self) -> usize { - if self.active { + let active = self.active.param > 0.5; + if active { self.inner.latency() } else { 0 @@ -33,80 +88,99 @@ where } fn reset(&mut self) { + self.active.reset(); self.inner.reset(); } } +impl DSPProcess for Bypass

+where + P: DSPProcess, +{ + fn process(&mut self, x: [Self::Sample; N]) -> [Self::Sample; N] { + let active = P::Sample::from_f64(self.active.next_sample() as _); + let processed = self.inner.process(x); + std::array::from_fn(|i| { + let processed = active + .simd_gt(P::Sample::from_f64(1e-6)) + .if_else(|| processed[i], || x[i]); + lerp(active, x[i], processed) + }) + } +} + impl Bypass { - pub fn new(inner: T) -> Self { + pub fn new(samplerate: f32, inner: T) -> Self { Self { inner, - active: true, + active: SmoothedParam::linear(1., samplerate, 15.0), } } } -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Clone)] pub struct InputStage { - pub gain: T, + pub gain: SmoothedParam, state_space: StateSpace, + clip: Bjt, } -impl DSP<1, 1> for InputStage { +impl DSPMeta for InputStage { type Sample = T; - fn process(&mut self, [x]: [Self::Sample; 1]) -> [Self::Sample; 1] { - self.state_space.process([x * self.gain]) + fn set_samplerate(&mut self, samplerate: f32) { + self.gain.set_samplerate(samplerate); + self.state_space.set_samplerate(samplerate); + self.clip.set_samplerate(samplerate); } fn latency(&self) -> usize { - self.state_space.latency() + self.state_space.latency() + self.clip.latency() } fn reset(&mut self) { - self.state_space.reset() + self.gain.reset(); + self.state_space.reset(); + self.clip.reset(); + } +} + +impl DSPProcess<1, 1> for InputStage { + fn process(&mut self, [x]: [Self::Sample; 1]) -> [Self::Sample; 1] { + let gain = T::from_f64(self.gain.next_sample() as _); + let y = self.state_space.process([x * gain]); + self.clip.process(y) } } impl InputStage { - pub fn new(samplerate: T, gain: T) -> Self { + pub fn new(samplerate: f32, gain: f32) -> Self { Self { - gain, - state_space: crate::gen::input(samplerate.simd_recip()), + gain: SmoothedParam::exponential(gain, samplerate, 10.0), + state_space: crate::gen::input(T::from_f64(samplerate as _).simd_recip()), + clip: Bjt::default(), } } - - pub fn set_samplerate(&mut self, samplerate: T) { - self.state_space - .update_matrices(&crate::gen::input(samplerate.simd_recip())); - } } -fn crossover_half(x: T, a: T, b: T) -> T { - T::simd_ln(T::simd_exp(b * x) + T::from_f64(10.0).simd_powf(a)) / b -} - -fn crossover(x: T, a: T, b: T) -> T { - crossover_half(x, a, b) - crossover_half(-x, a, b) -} - -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Clone)] pub struct ClipperStage { + dt: T, + dist: SmoothedParam, state_space: StateSpace, - pub crossover: (T, T), - pub(crate) slew: Slew, + feedback_gain: SmoothedParam, + feedback_sample: T, + slew: Slew, } -impl DSP<1, 1> for ClipperStage { +impl DSPMeta for ClipperStage { type Sample = T; - #[replace_float_literals(Self::Sample::from_f64(literal))] - fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { - let [y] = self.state_space.process(x); - let y = y.simd_asinh().simd_clamp(-4.5, 4.5); - let [y] = self.slew.process([y]); - let y = crossover(y, self.crossover.0, self.crossover.1); - [y] + fn set_samplerate(&mut self, samplerate: f32) { + self.dt = T::from_f64(samplerate.recip() as _); + self.feedback_gain.set_samplerate(samplerate); + self.state_space.set_samplerate(samplerate); + self.slew.set_samplerate(samplerate); } fn latency(&self) -> usize { @@ -116,93 +190,261 @@ impl DSP<1, 1> for ClipperStage { fn reset(&mut self) { self.state_space.reset(); self.slew.reset(); + self.feedback_sample = T::zero(); + } +} + +impl DSPProcess<1, 1> for ClipperStage { + #[replace_float_literals(Self::Sample::from_f64(literal))] + fn process(&mut self, [x]: [Self::Sample; 1]) -> [Self::Sample; 1] { + let dist = self.dist.next_sample_as(); + self.update_state_matrices(self.dt, dist); + let [y] = self.state_space.process([ + x - T::from_f64(self.feedback_gain.next_sample() as _) * self.feedback_sample + ]); + let y = y.simd_asinh().simd_clamp(-4.5, 4.5); + let [y] = self.slew.process([y]); + self.feedback_sample = y; + [y] } } impl ClipperStage { - #[replace_float_literals(T::from_f64(literal))] - pub fn new(samplerate: T, dist: T) -> Self { - let dt = samplerate.simd_recip(); + pub fn new(samplerate: f32, dist: T) -> Self { + let dt = T::from_f64(samplerate as _).simd_recip(); Self { + dt, + dist: SmoothedParam::exponential(1.0, samplerate, 50.0), state_space: crate::gen::clipper(dt, dist), - crossover: (0.0, 30.0), - slew: Slew::new(1e4 * dt), + feedback_gain: SmoothedParam::exponential(0.0, samplerate, 50.0), + feedback_sample: T::zero(), + slew: Slew::new(T::from_f64(samplerate as _), T::from_f64(1e4) * dt), } } - pub fn set_params(&mut self, samplerate: T, dist: T) { - let dt = samplerate.simd_recip(); + fn update_state_matrices(&mut self, dt: T, dist: T) { self.state_space .update_matrices(&crate::gen::clipper(dt, dist)); - self.slew.set_max_diff(T::from_f64(1e5), samplerate); } } #[derive(Debug, Copy, Clone)] -pub struct ToneStage(StateSpace); +pub struct ToneStage { + tone: SmoothedParam, + state_space: StateSpace, + out_gain: SmoothedParam, + dt: T, +} -impl DSP<1, 1> for ToneStage { +impl DSPMeta for ToneStage { type Sample = T; - fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { - self.0.process(x) + fn set_samplerate(&mut self, samplerate: f32) { + self.dt = T::from_f64(samplerate.recip() as _); + self.state_space.set_samplerate(samplerate); } fn latency(&self) -> usize { - self.0.latency() + self.state_space.latency() } fn reset(&mut self) { - self.0.reset(); + self.state_space.reset(); + } +} + +impl DSPProcess<1, 1> for ToneStage { + fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { + let tone = self.tone.next_sample_as(); + self.update_state_matrices(self.dt, tone); + let y = self.state_space.process(x); + let vcc = T::from_f64(4.5); + std::array::from_fn(|i| { + y[i].simd_clamp(-vcc, vcc) * self.out_gain.next_sample_as::() * T::from_f64(0.25) + }) } } impl ToneStage { - #[replace_float_literals(T::from_f64(literal))] - pub fn new(samplerate: T, tone: T) -> Self { - Self(crate::gen::tone(samplerate.simd_recip(), tone)) + pub fn new(samplerate: f32, tone: T) -> Self { + let dt = T::from_f64(samplerate.recip() as _); + Self { + dt, + tone: SmoothedParam::linear(0.0, samplerate, 15.0), + state_space: crate::gen::tone(dt, tone), + out_gain: SmoothedParam::exponential(1., samplerate, 15.0), + } } - #[replace_float_literals(T::from_f64(literal))] - pub fn update_params(&mut self, samplerate: T, tone: T) { - self.0 - .update_matrices(&crate::gen::tone(samplerate.simd_recip(), tone)); + pub fn update_state_matrices(&mut self, dt: T, tone: T) { + self.state_space + .update_matrices(&crate::gen::tone(dt, tone)); } } -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Clone)] pub struct OutputStage { - pub inner: Bypass>, - pub gain: T, + inner: Bypass>, + clip: Bjt, } impl OutputStage { - pub fn new(samplerate: T, gain: T) -> Self { + pub fn new(samplerate: f32) -> Self { + let dt = T::from_f64(samplerate as _).simd_recip(); Self { - inner: Bypass::new(crate::gen::output(samplerate.simd_recip())), - gain, + inner: Bypass::new(samplerate, crate::gen::output(dt)), + clip: Bjt::default(), } } - pub fn set_samplerate(&mut self, samplerate: T) { - self.inner - .inner - .update_matrices(&crate::gen::output(samplerate.simd_recip())); - } } -impl DSP<1, 1> for OutputStage { +impl DSPMeta for OutputStage { type Sample = T; - fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { - let [y] = self.inner.process(x); - [y * self.gain] + fn set_samplerate(&mut self, samplerate: f32) { + self.inner.set_samplerate(samplerate); + self.clip.set_samplerate(samplerate); } fn latency(&self) -> usize { - DSP::latency(&self.inner) + self.inner.latency() + self.clip.latency() } fn reset(&mut self) { - DSP::reset(&mut self.inner) + self.inner.reset(); + self.clip.reset(); } } + +impl DSPProcess<1, 1> for OutputStage { + fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { + let y = self.inner.process(x); + self.clip.process(y) + } +} + +#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, ParamName)] +pub enum DspParams { + Bypass, + InputGain, + Distortion, + Tone, + OutputGain, + ComponentMismatch, + BufferBypass, +} + +type DspInner = Bypass< + Series<( + Bypass>, + ClipperStage, + ToneStage, + Bypass>, + )>, +>; + +pub struct Dsp { + inner: Oversampled>>, + dt: T, +} + +impl DSPMeta for Dsp { + type Sample = T; +} + +impl DSPProcessBlock<1, 1> for Dsp { + fn process_block( + &mut self, + inputs: AudioBufferRef, + outputs: AudioBufferMut, + ) { + self.inner.process_block(inputs, outputs); + } +} + +impl HasParameters for Dsp { + type Name = DspParams; + + fn set_parameter(&mut self, param: Self::Name, value: f32) { + nih_log!("Set parameter {param:?} {value}"); + let Bypass { + active, + inner: + Series(( + Bypass { + active: input_active, + inner: input, + }, + clipper, + tone, + Bypass { + active: output_active, + .. + }, + )), + } = &mut self.inner.inner.0; + match param { + DspParams::Bypass => { + active.param = 1. - value; + } + DspParams::InputGain => { + input.gain.param = value; + } + DspParams::Distortion => { + clipper.dist.param = value; + } + DspParams::Tone => { + tone.tone.param = value; + } + DspParams::OutputGain => { + tone.out_gain.param = value; + } + DspParams::ComponentMismatch => { + clipper.slew.max_diff = + component_matching_slew_rate(self.dt.simd_recip(), T::from_f64(value as _)); + clipper.feedback_gain.param = lerp(value, -0.5, 0.0); + } + DspParams::BufferBypass => { + input_active.param = 1. - value; + output_active.param = 1. - value; + } + } + } +} + +impl Dsp +where + Complex: SimdComplexField, +{ + pub fn new(base_samplerate: f32, target_samplerate: f32) -> RemoteControlled { + let oversample = target_samplerate / base_samplerate; + let oversample = oversample.ceil() as usize; + let samplerate = base_samplerate * oversample as f32; + + let inner = Series(( + Bypass::new(samplerate, InputStage::new(samplerate, 1.0)), + ClipperStage::new(samplerate, T::zero()), + ToneStage::new(samplerate, T::zero()), + Bypass::new(samplerate, OutputStage::new(samplerate)), + )); + let inner = DspInner::new(samplerate, inner); + let inner = Oversample::new(oversample, MAX_BLOCK_SIZE) + .with_dsp(base_samplerate, BlockAdapter(inner)); + RemoteControlled::new( + base_samplerate, + 1e3, + Dsp { + inner, + dt: T::from_f64(samplerate as _).simd_recip(), + }, + ) + } +} + +pub const MAX_BLOCK_SIZE: usize = 512; + +fn component_matching_slew_rate(samplerate: T, normalized: T) -> T { + let min = T::from_f64(db_to_gain_fast(30.0) as _); + let max = T::from_f64(db_to_gain_fast(100.0) as _); + lerp(normalized, min, max) / samplerate +} diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index b30de82..c097347 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -1,36 +1,23 @@ use std::sync::Arc; use nih_plug::prelude::*; -use nih_plug::util::{db_to_gain_fast, gain_to_db, MINUS_INFINITY_DB, MINUS_INFINITY_GAIN}; -use num_traits::Zero; -use valib::dsp::blocks::Series; -use valib::dsp::utils::{slice_to_mono_block, slice_to_mono_block_mut}; -use valib::dsp::{DSPBlock, DSP}; -use valib::oversample::Oversample; -use valib::simd::{AutoF64x2, SimdValue}; -use valib::util::lerp; -use valib::Scalar; +use nih_plug::util::{gain_to_db, MINUS_INFINITY_DB, MINUS_INFINITY_GAIN}; +use valib::contrib::nih_plug::{BindToParameter, process_buffer_simd64}; +use valib::dsp::DSPMeta; +use valib::dsp::parameter::{RemoteControl, RemoteControlled}; +use valib::simd::{AutoF32x2, AutoF64x2}; -use crate::dsp::{Bypass, ClipperStage, InputStage, OutputStage, ToneStage}; +use dsp::MAX_BLOCK_SIZE; + +use crate::dsp::{Dsp, DspParams}; mod dsp; mod gen; -type Sample = AutoF64x2; -type Dsp = Series<( - Bypass>, - Bypass, ToneStage)>>, - OutputStage, -)>; - -const OVERSAMPLE: usize = 4; -const MAX_BLOCK_SIZE: usize = 512; +const TARGET_SAMPLERATE: f32 = 96000.; -struct Ts404 { - params: Arc, - dsp: Dsp, - oversample: Oversample, -} +type Sample = AutoF64x2; +type Sample32 = AutoF32x2; #[derive(Params)] struct Ts404Params { @@ -50,27 +37,9 @@ struct Ts404Params { io_bypass: BoolParam, } -impl Default for Ts404 { - fn default() -> Self { - let samplerate = Sample::splat(OVERSAMPLE as f64 * 44100.0); - Self { - params: Arc::new(Ts404Params::default()), - dsp: Series(( - Bypass::new(InputStage::new(samplerate, Sample::splat(1.0))), - Bypass::new(Series(( - ClipperStage::new(samplerate, Sample::splat(0.1)), - ToneStage::new(samplerate, Sample::splat(0.5)), - ))), - OutputStage::new(samplerate, Sample::splat(1.0)), - )), - oversample: Oversample::new(OVERSAMPLE, MAX_BLOCK_SIZE), - } - } -} - -impl Default for Ts404Params { - fn default() -> Self { - Self { +impl Ts404Params { + fn new(remote: &RemoteControl) -> Arc { + Arc::new(Self { drive: FloatParam::new( "Drive", 1.0, @@ -82,18 +51,18 @@ impl Default for Ts404Params { ) .with_unit("dB") .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) - .with_string_to_value(formatters::s2v_f32_gain_to_db()), - // .with_smoother(SmoothingStyle::Linear(50.0)), + .with_string_to_value(formatters::s2v_f32_gain_to_db()) + .bind_to_parameter(remote, DspParams::InputGain), dist: FloatParam::new("Distortion", 0.1, FloatRange::Linear { min: 0.0, max: 1.0 }) .with_unit("%") - // .with_smoother(SmoothingStyle::Linear(50.0)) .with_value_to_string(formatters::v2s_f32_percentage(2)) - .with_string_to_value(formatters::s2v_f32_percentage()), + .with_string_to_value(formatters::s2v_f32_percentage()) + .bind_to_parameter(remote, DspParams::Distortion), tone: FloatParam::new("Tone", 0.5, FloatRange::Linear { min: 0.0, max: 1.0 }) .with_unit("%") - // .with_smoother(SmoothingStyle::Linear(50.0)) .with_value_to_string(formatters::v2s_f32_percentage(2)) - .with_string_to_value(formatters::s2v_f32_percentage()), + .with_string_to_value(formatters::s2v_f32_percentage()) + .bind_to_parameter(remote, DspParams::Tone), out_level: FloatParam::new( "Output Level", 0.158, @@ -104,36 +73,37 @@ impl Default for Ts404Params { }, ) .with_unit("dB") - // .with_smoother(SmoothingStyle::Linear(50.0)) .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) - .with_string_to_value(formatters::s2v_f32_gain_to_db()), + .with_string_to_value(formatters::s2v_f32_gain_to_db()) + .bind_to_parameter(remote, DspParams::OutputGain), component_matching: FloatParam::new( "Component Matching", 1., FloatRange::Linear { min: 0.0, max: 1.0 }, ) .with_unit("%") - // .with_smoother(SmoothingStyle::Linear(10.0)) .with_string_to_value(formatters::s2v_f32_percentage()) - .with_value_to_string(formatters::v2s_f32_percentage(0)), - bypass: BoolParam::new("Bypass", false), - io_bypass: BoolParam::new("I/O Buffers Bypass", false), - } + .with_value_to_string(formatters::v2s_f32_percentage(0)) + .bind_to_parameter(remote, DspParams::ComponentMismatch), + bypass: BoolParam::new("Bypass", false).bind_to_parameter(remote, DspParams::Bypass), + io_bypass: BoolParam::new("I/O Buffers Bypass", false) + .bind_to_parameter(remote, DspParams::BufferBypass), + }) } } -fn component_matching_slew_rate(samplerate: Sample, normalized: Sample) -> Sample { - let min = Sample::splat(db_to_gain_fast(30.0) as _); - let max = Sample::splat(db_to_gain_fast(100.0) as _); - lerp(normalized, min, max) / samplerate +struct Ts404 { + params: Arc, + dsp: RemoteControlled>, } -fn component_matching_crossover(normalized: Sample) -> (Sample, Sample) { - let min = Sample::splat(10.0); - let max = Sample::splat(0.5); - let a = lerp(normalized, min, max); - let b = Sample::from_f64(10.0); - (a, b) +impl Default for Ts404 { + fn default() -> Self { + let default_samplerate = 44100.0; + let dsp = Dsp::new(default_samplerate, TARGET_SAMPLERATE); + let params = Ts404Params::new(&dsp.proxy); + Self { dsp, params } + } } impl Plugin for Ts404 { @@ -183,36 +153,40 @@ impl Plugin for Ts404 { buffer_config: &BufferConfig, _context: &mut impl InitContext, ) -> bool { - let samplerate = Sample::splat(buffer_config.sample_rate as _); - let Series(( - Bypass { - inner: input, - active: input_active, + let dsp = Dsp::new(buffer_config.sample_rate, TARGET_SAMPLERATE); + self.dsp.inner = dsp.inner; + + let dsp = &self.dsp; + dsp.proxy + .set_parameter(DspParams::InputGain, self.params.drive.value()); + dsp.proxy + .set_parameter(DspParams::Distortion, self.params.dist.value()); + dsp.proxy + .set_parameter(DspParams::Tone, self.params.tone.value()); + dsp.proxy + .set_parameter(DspParams::OutputGain, self.params.out_level.value()); + dsp.proxy.set_parameter( + DspParams::ComponentMismatch, + self.params.component_matching.value(), + ); + dsp.proxy.set_parameter( + DspParams::Bypass, + if self.params.bypass.value() { 1.0 } else { 0.0 }, + ); + dsp.proxy.set_parameter( + DspParams::BufferBypass, + if self.params.io_bypass.value() { + 1.0 + } else { + 0.0 }, - Bypass { - inner: Series((clipping, tone)), - active: main_active, - }, - output, - )) = &mut self.dsp; - - let component_matching = Sample::from_f64(self.params.component_matching.value() as _); + ); - let io_active = !self.params.io_bypass.value(); - *main_active = !self.params.bypass.value(); - *input_active = io_active; - output.inner.active = io_active; - input.gain = Sample::splat(self.params.drive.value() as _); - clipping.set_params(samplerate, Sample::splat(self.params.dist.value() as _)); - clipping.crossover = component_matching_crossover(component_matching); - clipping.slew.max_diff = component_matching_slew_rate(samplerate, component_matching); - tone.update_params(samplerate, Sample::splat(self.params.tone.value() as _)); - output.gain = Sample::splat(self.params.out_level.value() as _); true } fn reset(&mut self) { - DSP::reset(&mut self.dsp); + self.dsp.reset(); } fn process( @@ -221,78 +195,14 @@ impl Plugin for Ts404 { _aux: &mut AuxiliaryBuffers, context: &mut impl ProcessContext, ) -> ProcessStatus { - let samplerate = Sample::splat(context.transport().sample_rate as _); - let Series(( - Bypass { - inner: input, - active: input_active, - }, - Bypass { - inner: Series((clipping, tone)), - active: main_active, - }, - output, - )) = &mut self.dsp; - - let component_matching = Sample::from_f64(self.params.component_matching.value() as _); - let io_active = !self.params.io_bypass.value(); - *main_active = !self.params.bypass.value(); - *input_active = io_active; - output.inner.active = io_active; - input.gain = Sample::splat(self.params.drive.value() as _); - clipping.set_params(samplerate, Sample::splat(self.params.dist.value() as _)); - clipping.crossover = component_matching_crossover(component_matching); - clipping.slew.max_diff = component_matching_slew_rate(samplerate, component_matching); - tone.update_params(samplerate, Sample::splat(self.params.tone.value() as _)); - output.gain = Sample::splat(self.params.out_level.value() as _); - - context.set_latency_samples(DSP::latency(&self.dsp) as _); - - let mut inner_buffer = [Sample::zero(); MAX_BLOCK_SIZE]; - let mut os_block_copy = [Sample::zero(); OVERSAMPLE * MAX_BLOCK_SIZE]; - for (_, mut block) in buffer.iter_blocks(MAX_BLOCK_SIZE) { - for (i, mut frame) in block.iter_samples().enumerate() { - let stereo = Sample::new( - *frame.get_mut(0).unwrap() as _, - *frame.get_mut(1).unwrap() as _, - ); - inner_buffer[i] = stereo; - } - - let inner_buffer = &mut inner_buffer[..block.samples()]; - let os_block_copy = &mut os_block_copy[..block.samples() * OVERSAMPLE]; - let mut os_block = self.oversample.oversample(inner_buffer); - os_block_copy.copy_from_slice(&os_block); - self.dsp.process_block( - slice_to_mono_block(os_block_copy), - slice_to_mono_block_mut(&mut os_block), - ); - os_block.finish(inner_buffer); - - for (i, s) in inner_buffer.iter().copied().enumerate() { - *block.get_mut(0).unwrap().get_mut(i).unwrap() = s.extract(0) as _; - *block.get_mut(1).unwrap().get_mut(i).unwrap() = s.extract(1) as _; - } - } - - safety_clipper(buffer); + context.set_latency_samples(self.dsp.latency() as _); + process_buffer_simd64::<_, _, MAX_BLOCK_SIZE>(&mut self.dsp, buffer); + //safety_clipper(buffer); ProcessStatus::Normal } } -fn safety_clipper(buffer: &mut Buffer) { - let max_ampl = db_to_gain_fast(8.0); - for sample in buffer.iter_samples() { - for s in sample.into_iter() { - if !s.is_finite() || s.abs() > max_ampl { - nih_debug_assert_failure!("Safety clip triggered"); - s.set_zero(); - } - } - } -} - impl ClapPlugin for Ts404 { const CLAP_ID: &'static str = "dev.solarliner.ts404"; const CLAP_DESCRIPTION: Option<&'static str> = From f2650801fada726ca12df950b77543955ac5b2cf Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Sun, 2 Jun 2024 16:59:08 +0200 Subject: [PATCH 18/51] feat: remove feedback saturation in clipper stage --- plugins/ts404/src/dsp.rs | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index 717b077..5c60690 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -8,7 +8,7 @@ use valib::dsp::buffer::{AudioBufferMut, AudioBufferRef}; use valib::dsp::parameter::{HasParameters, ParamId, ParamName, RemoteControlled, SmoothedParam}; use valib::filters::statespace::StateSpace; use valib::oversample::{Oversample, Oversampled}; -use valib::saturators::{Clipper, Saturator, Slew}; +use valib::saturators::{Saturator, Slew}; use valib::Scalar; use valib::simd::{AutoF32x2, AutoF64x2, AutoSimd, SimdBool, SimdComplexField, SimdPartialOrd}; use valib::util::lerp; @@ -168,8 +168,6 @@ pub struct ClipperStage { dt: T, dist: SmoothedParam, state_space: StateSpace, - feedback_gain: SmoothedParam, - feedback_sample: T, slew: Slew, } @@ -178,7 +176,6 @@ impl DSPMeta for ClipperStage { fn set_samplerate(&mut self, samplerate: f32) { self.dt = T::from_f64(samplerate.recip() as _); - self.feedback_gain.set_samplerate(samplerate); self.state_space.set_samplerate(samplerate); self.slew.set_samplerate(samplerate); } @@ -190,22 +187,18 @@ impl DSPMeta for ClipperStage { fn reset(&mut self) { self.state_space.reset(); self.slew.reset(); - self.feedback_sample = T::zero(); } } impl DSPProcess<1, 1> for ClipperStage { #[replace_float_literals(Self::Sample::from_f64(literal))] - fn process(&mut self, [x]: [Self::Sample; 1]) -> [Self::Sample; 1] { + fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { let dist = self.dist.next_sample_as(); self.update_state_matrices(self.dt, dist); - let [y] = self.state_space.process([ - x - T::from_f64(self.feedback_gain.next_sample() as _) * self.feedback_sample - ]); + let [y] = self.state_space.process(x); let y = y.simd_asinh().simd_clamp(-4.5, 4.5); - let [y] = self.slew.process([y]); - self.feedback_sample = y; - [y] + let y = self.slew.process([y]); + y } } @@ -216,8 +209,6 @@ impl ClipperStage { dt, dist: SmoothedParam::exponential(1.0, samplerate, 50.0), state_space: crate::gen::clipper(dt, dist), - feedback_gain: SmoothedParam::exponential(0.0, samplerate, 50.0), - feedback_sample: T::zero(), slew: Slew::new(T::from_f64(samplerate as _), T::from_f64(1e4) * dt), } } @@ -402,7 +393,6 @@ impl HasParameters for Dsp { DspParams::ComponentMismatch => { clipper.slew.max_diff = component_matching_slew_rate(self.dt.simd_recip(), T::from_f64(value as _)); - clipper.feedback_gain.param = lerp(value, -0.5, 0.0); } DspParams::BufferBypass => { input_active.param = 1. - value; From 092a8858636898af3726e29515a817470d563bb2 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Sun, 9 Jun 2024 22:57:44 +0200 Subject: [PATCH 19/51] wip: plugin -> ui communication for led driver --- plugins/ts404/.idea/ts404.iml | 1 - plugins/ts404/Cargo.lock | 1195 ++++++++++++++++++++++++++++++- plugins/ts404/Cargo.toml | 1 + plugins/ts404/src/dsp.rs | 40 +- plugins/ts404/src/editor/led.rs | 78 ++ plugins/ts404/src/editor/mod.rs | 89 +++ plugins/ts404/src/lib.rs | 90 +-- plugins/ts404/src/params.rs | 86 +++ plugins/ts404/src/util.rs | 33 + 9 files changed, 1507 insertions(+), 106 deletions(-) create mode 100644 plugins/ts404/src/editor/led.rs create mode 100644 plugins/ts404/src/editor/mod.rs create mode 100644 plugins/ts404/src/params.rs create mode 100644 plugins/ts404/src/util.rs diff --git a/plugins/ts404/.idea/ts404.iml b/plugins/ts404/.idea/ts404.iml index 71fbd98..bf203bd 100644 --- a/plugins/ts404/.idea/ts404.iml +++ b/plugins/ts404/.idea/ts404.iml @@ -13,6 +13,5 @@ - \ No newline at end of file diff --git a/plugins/ts404/Cargo.lock b/plugins/ts404/Cargo.lock index 94cef05..1d1f00b 100644 --- a/plugins/ts404/Cargo.lock +++ b/plugins/ts404/Cargo.lock @@ -2,6 +2,22 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "ab_glyph" +version = "0.2.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e53b0a3d5760cd2ba9b787ae0c6440ad18ee294ff71b05e3381c900a7d16cfd" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" + [[package]] name = "addr2line" version = "0.21.0" @@ -56,7 +72,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] @@ -88,17 +104,93 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "baseview" +version = "0.1.0" +source = "git+https://github.com/RustAudio/baseview.git?rev=1d9806d5bd92275d0d8142d9c9c90198757b9b25#1d9806d5bd92275d0d8142d9c9c90198757b9b25" +dependencies = [ + "cocoa", + "core-foundation", + "keyboard-types", + "nix 0.22.3", + "objc", + "raw-window-handle 0.4.3", + "uuid", + "winapi", + "x11", + "xcb 0.9.0", + "xcb-util", +] + [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + [[package]] name = "bytemuck" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "camino" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] [[package]] name = "cc" @@ -120,6 +212,60 @@ name = "clap-sys" version = "0.3.0" source = "git+https://github.com/robbert-vdh/clap-sys.git?branch=feature/cstr-macro#523a5f8a8dd021ec99e7d6e0c0ebe7741a3da9d4" +[[package]] +name = "clipboard-win" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fdf5e01086b6be750428ba4a40619f847eb2e95756eee84b18e06e5f0b50342" +dependencies = [ + "lazy-bytes-cast", + "winapi", +] + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags", + "block", + "core-foundation", + "core-graphics-types", + "libc", + "objc", +] + +[[package]] +name = "copypasta" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4423d79fed83ebd9ab81ec21fa97144300a961782158287dc9bf7eddac37ff0b" +dependencies = [ + "clipboard-win", + "objc", + "objc-foundation", + "objc_id", + "smithay-clipboard", + "x11-clipboard", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -136,6 +282,30 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags", + "core-foundation", + "libc", +] + [[package]] name = "crossbeam" version = "0.8.3" @@ -201,6 +371,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "cty" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" + [[package]] name = "darling" version = "0.20.9" @@ -245,6 +421,27 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "either" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" + [[package]] name = "enum-map" version = "2.7.3" @@ -271,18 +468,214 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "euclid" +version = "0.22.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f0eb73b934648cd7a4a61f1b15391cd95dab0b4da6e2e66c2a072c144b4a20" +dependencies = [ + "num-traits", +] + [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "gimli" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "glam" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579160312273c954cc51bd440f059dde741029ac8daf8c84fece76cb77f62c15" +dependencies = [ + "version_check", +] + +[[package]] +name = "glow" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bd5877156a19b8ac83a29b2306fe20537429d318f3ff0a1a2119f8d9c61919" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glow_glyph" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f4e62c64947b9a24fe20e2bba9ad819ecb506ef5c8df7ffc4737464c6df9510" +dependencies = [ + "bytemuck", + "glow", + "glyph_brush", + "log", +] + +[[package]] +name = "glyph_brush" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3676f482c536a985fca36ce320a5e5b8fafd7b260806742af1963b71c5dc38c" +dependencies = [ + "glyph_brush_draw_cache", + "glyph_brush_layout", + "ordered-float", + "rustc-hash", + "twox-hash", +] + +[[package]] +name = "glyph_brush_draw_cache" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6010675390f6889e09a21e2c8b575b3ee25667ea8237a8d59423f73cb8c28610" +dependencies = [ + "ab_glyph", + "crossbeam-channel", + "crossbeam-deque", + "linked-hash-map", + "rayon", + "rustc-hash", +] + +[[package]] +name = "glyph_brush_layout" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc32c2334f00ca5ac3695c5009ae35da21da8c62d255b5b96d56e2597a637a38" +dependencies = [ + "ab_glyph", + "approx", + "xi-unicode", +] + [[package]] name = "goblin" version = "0.6.1" @@ -309,6 +702,97 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "iced_baseview" +version = "0.0.3" +source = "git+https://github.com/robbert-vdh/iced_baseview.git?branch=feature/update-baseview#df3a852a15cf0e9fcc8d2b32f5718e56780beaf3" +dependencies = [ + "baseview", + "copypasta", + "iced_core", + "iced_futures", + "iced_glow", + "iced_graphics", + "iced_native", + "keyboard-types", + "raw-window-handle 0.4.3", +] + +[[package]] +name = "iced_core" +version = "0.4.0" +source = "git+https://github.com/iced-rs/iced.git?rev=a53fa91e0ddf374bbeb66d5e831b79127ed47a9d#a53fa91e0ddf374bbeb66d5e831b79127ed47a9d" +dependencies = [ + "bitflags", + "wasm-timer", +] + +[[package]] +name = "iced_futures" +version = "0.3.0" +source = "git+https://github.com/iced-rs/iced.git?rev=a53fa91e0ddf374bbeb66d5e831b79127ed47a9d#a53fa91e0ddf374bbeb66d5e831b79127ed47a9d" +dependencies = [ + "futures", + "log", + "wasm-bindgen-futures", + "wasm-timer", +] + +[[package]] +name = "iced_glow" +version = "0.2.0" +source = "git+https://github.com/iced-rs/iced.git?rev=a53fa91e0ddf374bbeb66d5e831b79127ed47a9d#a53fa91e0ddf374bbeb66d5e831b79127ed47a9d" +dependencies = [ + "bytemuck", + "euclid", + "glow", + "glow_glyph", + "glyph_brush", + "iced_graphics", + "iced_native", + "log", +] + +[[package]] +name = "iced_graphics" +version = "0.2.0" +source = "git+https://github.com/iced-rs/iced.git?rev=a53fa91e0ddf374bbeb66d5e831b79127ed47a9d#a53fa91e0ddf374bbeb66d5e831b79127ed47a9d" +dependencies = [ + "bytemuck", + "glam", + "iced_native", + "iced_style", + "raw-window-handle 0.4.3", + "thiserror", +] + +[[package]] +name = "iced_native" +version = "0.4.0" +source = "git+https://github.com/iced-rs/iced.git?rev=a53fa91e0ddf374bbeb66d5e831b79127ed47a9d#a53fa91e0ddf374bbeb66d5e831b79127ed47a9d" +dependencies = [ + "iced_core", + "iced_futures", + "iced_style", + "num-traits", + "twox-hash", + "unicode-segmentation", +] + +[[package]] +name = "iced_style" +version = "0.3.0" +source = "git+https://github.com/iced-rs/iced.git?rev=a53fa91e0ddf374bbeb66d5e831b79127ed47a9d#a53fa91e0ddf374bbeb66d5e831b79127ed47a9d" +dependencies = [ + "iced_core", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -325,12 +809,45 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + [[package]] name = "itoa" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "keyboard-types" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7668b7cff6a51fe61cdde64cd27c8a220786f399501b57ebe36f7d8112fd68" +dependencies = [ + "bitflags", +] + +[[package]] +name = "lazy-bytes-cast" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10257499f089cd156ad82d0a9cd57d9501fa2c989068992a97eb3c27836f206b" + [[package]] name = "lazy_static" version = "1.4.0" @@ -343,6 +860,22 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "libloading" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +dependencies = [ + "cfg-if", + "windows-targets 0.48.5", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "lock_api" version = "0.4.11" @@ -384,6 +917,24 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + [[package]] name = "midi-consts" version = "0.1.0" @@ -443,7 +994,7 @@ dependencies = [ [[package]] name = "nih_plug" version = "0.0.0" -source = "git+https://github.com/robbert-vdh/nih-plug.git#4e8beb1098749e55df1774b49ad854f6a33a9130" +source = "git+https://github.com/robbert-vdh/nih-plug.git#cd9b589d23e5ee63bf194cdd99d6bc612c1a4863" dependencies = [ "anyhow", "anymap", @@ -462,8 +1013,8 @@ dependencies = [ "nih_log", "nih_plug_derive", "objc", - "parking_lot", - "raw-window-handle", + "parking_lot 0.12.1", + "raw-window-handle 0.5.2", "serde", "serde_json", "vst3-sys", @@ -471,28 +1022,74 @@ dependencies = [ "windows", ] +[[package]] +name = "nih_plug_assets" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/nih_plug_assets.git#a04e327923e120bfaba864098c906d7444e40d6b" + [[package]] name = "nih_plug_derive" version = "0.1.0" -source = "git+https://github.com/robbert-vdh/nih-plug.git#4e8beb1098749e55df1774b49ad854f6a33a9130" +source = "git+https://github.com/robbert-vdh/nih-plug.git#cd9b589d23e5ee63bf194cdd99d6bc612c1a4863" dependencies = [ "proc-macro2", "quote", "syn 1.0.109", ] +[[package]] +name = "nih_plug_iced" +version = "0.0.0" +source = "git+https://github.com/robbert-vdh/nih-plug.git#cd9b589d23e5ee63bf194cdd99d6bc612c1a4863" +dependencies = [ + "atomic_refcell", + "baseview", + "crossbeam", + "iced_baseview", + "nih_plug", + "nih_plug_assets", + "raw-window-handle 0.4.3", + "serde", +] + [[package]] name = "nih_plug_xtask" version = "0.1.0" -source = "git+https://github.com/robbert-vdh/nih-plug.git#4e8beb1098749e55df1774b49ad854f6a33a9130" +source = "git+https://github.com/robbert-vdh/nih-plug.git#cd9b589d23e5ee63bf194cdd99d6bc612c1a4863" dependencies = [ "anyhow", + "cargo_metadata", "goblin", "reflink", "serde", "toml", ] +[[package]] +name = "nix" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "memoffset", +] + [[package]] name = "num-complex" version = "0.4.4" @@ -532,6 +1129,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + [[package]] name = "num_threads" version = "0.1.6" @@ -560,6 +1167,26 @@ dependencies = [ "malloc_buf", ] +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + [[package]] name = "object" version = "0.32.2" @@ -575,6 +1202,35 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "ordered-float" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76df7075c7d4d01fdcb46c912dd17fba5b60c78ea480b475f2b6ab6f666584e" +dependencies = [ + "num-traits", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b41438d2fc63c46c74a2203bf5ccd82c41ba04347b2fcf5754f230b167067d5" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -582,7 +1238,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core", + "parking_lot_core 0.9.9", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", ] [[package]] @@ -593,7 +1263,7 @@ checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.4.1", "smallvec", "windows-targets 0.48.5", ] @@ -604,6 +1274,24 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + [[package]] name = "plain" version = "0.2.3" @@ -611,33 +1299,87 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] -name = "portable-atomic" -version = "1.6.0" +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8533f14c8382aaad0d592c812ac3b826162128b65662331e1127b45c3d18536b" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] [[package]] -name = "powerfmt" -version = "0.2.0" +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] [[package]] -name = "proc-macro2" -version = "1.0.85" +name = "rand_core" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "unicode-ident", + "getrandom", ] [[package]] -name = "quote" -version = "1.0.36" +name = "raw-window-handle" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" dependencies = [ - "proc-macro2", + "cty", ] [[package]] @@ -652,6 +1394,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -676,6 +1447,12 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "ryu" version = "1.0.16" @@ -691,6 +1468,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -717,20 +1500,29 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] + [[package]] name = "serde" -version = "1.0.193" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", @@ -770,12 +1562,64 @@ dependencies = [ "wide", ] +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + [[package]] name = "smallvec" version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +[[package]] +name = "smithay-client-toolkit" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" +dependencies = [ + "bitflags", + "dlib", + "lazy_static", + "log", + "memmap2", + "nix 0.24.3", + "pkg-config", + "wayland-client", + "wayland-cursor", + "wayland-protocols", +] + +[[package]] +name = "smithay-clipboard" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" +dependencies = [ + "smithay-client-toolkit", + "wayland-client", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.11.1" @@ -813,6 +1657,26 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "thiserror" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "time" version = "0.3.31" @@ -885,11 +1749,29 @@ dependencies = [ "enum-map", "nalgebra", "nih_plug", + "nih_plug_iced", "num-traits", "numeric_literals", "valib", ] +[[package]] +name = "ttf-parser" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "rand", + "static_assertions", +] + [[package]] name = "typenum" version = "1.17.0" @@ -902,6 +1784,21 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", +] + [[package]] name = "valib" version = "0.1.0" @@ -911,6 +1808,7 @@ dependencies = [ "nih_plug", "num-traits", "numeric_literals", + "paste", "portable-atomic", "simba", "valib_derive", @@ -926,6 +1824,12 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + [[package]] name = "vst3-com" version = "0.1.0" @@ -963,6 +1867,176 @@ dependencies = [ "vst3-com", ] +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.66", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "wasm-timer" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.11.2", + "pin-utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wayland-client" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" +dependencies = [ + "bitflags", + "downcast-rs", + "libc", + "nix 0.24.3", + "scoped-tls", + "wayland-commons", + "wayland-scanner", + "wayland-sys", +] + +[[package]] +name = "wayland-commons" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" +dependencies = [ + "nix 0.24.3", + "once_cell", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-cursor" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" +dependencies = [ + "nix 0.24.3", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" +dependencies = [ + "bitflags", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" +dependencies = [ + "dlib", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "wide" version = "0.7.13" @@ -1142,6 +2216,75 @@ dependencies = [ "memchr", ] +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-clipboard" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473068b7b80ac86a18328824f1054e5e007898c47b5bbc281bd7abe32bc3653c" +dependencies = [ + "xcb 0.10.1", +] + +[[package]] +name = "xcb" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62056f63138b39116f82a540c983cc11f1c90cd70b3d492a70c25eaa50bd22a6" +dependencies = [ + "libc", + "log", + "x11", +] + +[[package]] +name = "xcb" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771e2b996df720cd1c6dd9ff90f62d91698fd3610cc078388d0564bdd6622a9c" +dependencies = [ + "libc", + "log", + "quick-xml", +] + +[[package]] +name = "xcb-util" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43893e47f27bf7d81d489feef3a0e34a457e90bc314b7e74ad9bb3980e4c1c48" +dependencies = [ + "libc", + "xcb 0.9.0", +] + +[[package]] +name = "xcursor" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911" + +[[package]] +name = "xi-unicode" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" + +[[package]] +name = "xml-rs" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" + [[package]] name = "xtask" version = "0.1.0" diff --git a/plugins/ts404/Cargo.toml b/plugins/ts404/Cargo.toml index 957650b..5107ddf 100644 --- a/plugins/ts404/Cargo.toml +++ b/plugins/ts404/Cargo.toml @@ -17,6 +17,7 @@ crate-type = ["cdylib"] enum-map = "2.7.3" nalgebra = "0.32.3" nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git" } +nih_plug_iced = { git = "https://github.com/robbert-vdh/nih-plug.git" } num-traits = "0.2.17" numeric_literals = "0.2.0" #valib = { git = "https://github.com/SolarLiner/valib.git" } diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index 5c60690..401f7ad 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -1,6 +1,11 @@ +use std::sync::Arc; +use std::sync::atomic::Ordering; + use nalgebra::Complex; use nih_plug::nih_log; +use nih_plug::prelude::AtomicF32; use nih_plug::util::db_to_gain_fast; +use num_traits::ToPrimitive; use numeric_literals::replace_float_literals; use valib::dsp::{BlockAdapter, DSPMeta, DSPProcess, DSPProcessBlock}; use valib::dsp::blocks::Series; @@ -10,9 +15,14 @@ use valib::filters::statespace::StateSpace; use valib::oversample::{Oversample, Oversampled}; use valib::saturators::{Saturator, Slew}; use valib::Scalar; -use valib::simd::{AutoF32x2, AutoF64x2, AutoSimd, SimdBool, SimdComplexField, SimdPartialOrd}; +use valib::simd::{ + AutoF32x2, AutoF64x2, AutoSimd, SimdBool, SimdComplexField, SimdPartialOrd, SimdValue, +}; use valib::util::lerp; +use crate::TARGET_SAMPLERATE; +use crate::util::Rms; + #[replace_float_literals(T::from_f64(literal))] fn smooth_min(t: T, a: T, b: T) -> T { // Polynomial @@ -169,6 +179,8 @@ pub struct ClipperStage { dist: SmoothedParam, state_space: StateSpace, slew: Slew, + led_rms: Rms, + led_display: Arc, } impl DSPMeta for ClipperStage { @@ -190,7 +202,10 @@ impl DSPMeta for ClipperStage { } } -impl DSPProcess<1, 1> for ClipperStage { +impl DSPProcess<1, 1> for ClipperStage +where + ::Element: ToPrimitive, +{ #[replace_float_literals(Self::Sample::from_f64(literal))] fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { let dist = self.dist.next_sample_as(); @@ -198,6 +213,13 @@ impl DSPProcess<1, 1> for ClipperStage { let [y] = self.state_space.process(x); let y = y.simd_asinh().simd_clamp(-4.5, 4.5); let y = self.slew.process([y]); + let delta = (y[0] - x[0]) + .simd_abs() + .simd_horizontal_sum() + .to_f32() + .unwrap_or_default(); + let rms = self.led_rms.add_element(delta); + self.led_display.store(rms, Ordering::SeqCst); y } } @@ -205,11 +227,14 @@ impl DSPProcess<1, 1> for ClipperStage { impl ClipperStage { pub fn new(samplerate: f32, dist: T) -> Self { let dt = T::from_f64(samplerate as _).simd_recip(); + let rms_samples = (1e-3 * TARGET_SAMPLERATE) as usize; Self { dt, dist: SmoothedParam::exponential(1.0, samplerate, 50.0), state_space: crate::gen::clipper(dt, dist), slew: Slew::new(T::from_f64(samplerate as _), T::from_f64(1e4) * dt), + led_rms: Rms::new(rms_samples), + led_display: Arc::new(AtomicF32::new(0.0)), } } @@ -343,7 +368,10 @@ impl DSPMeta for Dsp { type Sample = T; } -impl DSPProcessBlock<1, 1> for Dsp { +impl DSPProcessBlock<1, 1> for Dsp +where + ::Element: ToPrimitive, +{ fn process_block( &mut self, inputs: AudioBufferRef, @@ -405,6 +433,7 @@ impl HasParameters for Dsp { impl Dsp where Complex: SimdComplexField, + ::Element: ToPrimitive, { pub fn new(base_samplerate: f32, target_samplerate: f32) -> RemoteControlled { let oversample = target_samplerate / base_samplerate; @@ -429,6 +458,11 @@ where }, ) } + + pub fn get_led_display(&self) -> Arc { + // Funny nested access because of semi-structured DSP blocks + self.inner.inner.0.inner.0.1.led_display.clone() + } } pub const MAX_BLOCK_SIZE: usize = 512; diff --git a/plugins/ts404/src/editor/led.rs b/plugins/ts404/src/editor/led.rs new file mode 100644 index 0000000..f383bc2 --- /dev/null +++ b/plugins/ts404/src/editor/led.rs @@ -0,0 +1,78 @@ +use nih_plug_iced::{Color, Element, Layout, Length, Point, Rectangle, renderer, Size, Widget}; +use nih_plug_iced::layout::{Limits, Node}; +use nih_plug_iced::renderer::{Quad, Style}; + +pub(crate) struct Led { + size: Length, + brightness: f32, + color: Color, +} + +impl Led { + pub(crate) fn new(vin: f32) -> Self { + Self { + size: Length::Units(20), + brightness: 1.0 - f32::exp(-vin), + color: Color::from_rgb(1.0, 0.0, 0.0), + } + } + + pub(crate) fn size(mut self, size: Length) -> Self { + self.size = size; + self + } + + pub(crate) fn color(mut self, color: Color) -> Self { + self.color = color; + self + } +} + +impl Widget for Led { + fn width(&self) -> Length { + self.size + } + + fn height(&self) -> Length { + self.size + } + + fn layout(&self, _renderer: &Renderer, limits: &Limits) -> Node { + Node::new( + limits + .width(self.size) + .height(self.size) + .resolve(Size::ZERO), + ) + } + + fn draw( + &self, + renderer: &mut Renderer, + _style: &Style, + layout: Layout<'_>, + _cursor_position: Point, + _viewport: &Rectangle, + ) { + let bounds = layout.bounds(); + let radius = bounds.width; + let color = scale_color(self.color, self.brightness); + renderer.fill_quad(Quad { + bounds, + border_radius: radius, + border_width: 0.0, + border_color: Color::TRANSPARENT, + }, color); + } +} + +impl<'a, Message: 'a + Clone> From for Element<'a, Message> { + fn from(value: Led) -> Self { + Element::new(value) + } +} + +fn scale_color(col: Color, amt: f32) -> Color { + let [r,g,b] = [col.r, col.g, col.b].map(|x| x * amt); + Color::from_rgba(r, g, b, col.a) +} diff --git a/plugins/ts404/src/editor/mod.rs b/plugins/ts404/src/editor/mod.rs new file mode 100644 index 0000000..cb7cc20 --- /dev/null +++ b/plugins/ts404/src/editor/mod.rs @@ -0,0 +1,89 @@ +use std::sync::Arc; +use std::sync::atomic::Ordering; + +use nih_plug::prelude::*; +use nih_plug_iced::{ + Alignment, Column, Command, create_iced_editor, Element, executor, IcedEditor, IcedState, + Length, Text, widgets, WindowQueue, +}; +use nih_plug_iced::futures::channel::mpsc::Receiver; +use widgets::generic_ui::{GenericSlider, GenericUi}; + +use crate::editor::led::Led; +use crate::params::Ts404Params; + +mod led; + +pub(crate) fn default_state() -> Arc { + IcedState::from_size(120, 300) +} + +pub(crate) fn create( + params: Arc, + driver_led_receiver: Receiver>, +) -> Option> { + create_iced_editor::(params.editor_state.clone(), (params, driver_led_receiver)) +} + +struct Ts404Editor { + params: Arc, + context: Arc, + generic_ui: widgets::generic_ui::State, + drive_led: Arc, + driver_led_receiver: Receiver>, +} + +#[derive(Debug, Copy, Clone)] +enum EditorMessage { + ParamUpdate(widgets::ParamMessage), +} + +impl IcedEditor for Ts404Editor { + type Executor = executor::Default; + type Message = EditorMessage; + type InitializationFlags = (Arc, Receiver>); + + fn new( + (params, driver_led_receiver): Self::InitializationFlags, + context: Arc, + ) -> (Self, Command) { + let editor = Self { + params, + context, + driver_led_receiver, + generic_ui: Default::default(), + }; + (editor, Command::none()) + } + + fn context(&self) -> &dyn GuiContext { + self.context.as_ref() + } + + fn update( + &mut self, + _window: &mut WindowQueue, + message: Self::Message, + ) -> Command { + match message { + EditorMessage::ParamUpdate(msg) => self.handle_param_message(msg), + } + Command::none() + } + + fn view(&mut self) -> Element<'_, Self::Message> { + let led = self.drive_led.load(Ordering::SeqCst); + nih_log!("Editor view: {led}"); + Column::new() + .align_items(Alignment::Fill) + .push( + GenericUi::new(&mut self.generic_ui, self.params.clone()) + .width(Length::Fill) + .height(Length::Fill) + .map(EditorMessage::ParamUpdate), + ) + .push(Text::new(format!("LED value: {led}"))) + .push(Led::new(led)) + .into() + } +} diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index c097347..3845726 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -1,100 +1,32 @@ use std::sync::Arc; +use std::sync::mpsc::{channel, Sender}; use nih_plug::prelude::*; -use nih_plug::util::{gain_to_db, MINUS_INFINITY_DB, MINUS_INFINITY_GAIN}; use valib::contrib::nih_plug::{BindToParameter, process_buffer_simd64}; use valib::dsp::DSPMeta; -use valib::dsp::parameter::{RemoteControl, RemoteControlled}; +use valib::dsp::parameter::RemoteControlled; use valib::simd::{AutoF32x2, AutoF64x2}; use dsp::MAX_BLOCK_SIZE; +use params::Ts404Params; use crate::dsp::{Dsp, DspParams}; mod dsp; mod gen; +mod util; +mod editor; +mod params; const TARGET_SAMPLERATE: f32 = 96000.; type Sample = AutoF64x2; type Sample32 = AutoF32x2; -#[derive(Params)] -struct Ts404Params { - #[id = "drive"] - drive: FloatParam, - #[id = "dist"] - dist: FloatParam, - #[id = "tone"] - tone: FloatParam, - #[id = "level"] - out_level: FloatParam, - #[id = "cmpmat"] - component_matching: FloatParam, - #[id = "bypass"] - bypass: BoolParam, - #[id = "byp_io"] - io_bypass: BoolParam, -} - -impl Ts404Params { - fn new(remote: &RemoteControl) -> Arc { - Arc::new(Self { - drive: FloatParam::new( - "Drive", - 1.0, - FloatRange::Skewed { - min: 0.5, - max: 100.0, - factor: FloatRange::gain_skew_factor(gain_to_db(0.5), gain_to_db(100.0)), - }, - ) - .with_unit("dB") - .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) - .with_string_to_value(formatters::s2v_f32_gain_to_db()) - .bind_to_parameter(remote, DspParams::InputGain), - dist: FloatParam::new("Distortion", 0.1, FloatRange::Linear { min: 0.0, max: 1.0 }) - .with_unit("%") - .with_value_to_string(formatters::v2s_f32_percentage(2)) - .with_string_to_value(formatters::s2v_f32_percentage()) - .bind_to_parameter(remote, DspParams::Distortion), - tone: FloatParam::new("Tone", 0.5, FloatRange::Linear { min: 0.0, max: 1.0 }) - .with_unit("%") - .with_value_to_string(formatters::v2s_f32_percentage(2)) - .with_string_to_value(formatters::s2v_f32_percentage()) - .bind_to_parameter(remote, DspParams::Tone), - out_level: FloatParam::new( - "Output Level", - 0.158, - FloatRange::Skewed { - min: MINUS_INFINITY_GAIN, - max: 1.0, - factor: FloatRange::gain_skew_factor(MINUS_INFINITY_DB, gain_to_db(1.0)), - }, - ) - .with_unit("dB") - .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) - .with_string_to_value(formatters::s2v_f32_gain_to_db()) - .bind_to_parameter(remote, DspParams::OutputGain), - component_matching: FloatParam::new( - "Component Matching", - 1., - FloatRange::Linear { min: 0.0, max: 1.0 }, - ) - .with_unit("%") - .with_string_to_value(formatters::s2v_f32_percentage()) - .with_value_to_string(formatters::v2s_f32_percentage(0)) - .bind_to_parameter(remote, DspParams::ComponentMismatch), - bypass: BoolParam::new("Bypass", false).bind_to_parameter(remote, DspParams::Bypass), - io_bypass: BoolParam::new("I/O Buffers Bypass", false) - .bind_to_parameter(remote, DspParams::BufferBypass), - }) - } -} - struct Ts404 { params: Arc, dsp: RemoteControlled>, + driver_led_tx: Option>>, } impl Default for Ts404 { @@ -102,7 +34,7 @@ impl Default for Ts404 { let default_samplerate = 44100.0; let dsp = Dsp::new(default_samplerate, TARGET_SAMPLERATE); let params = Ts404Params::new(&dsp.proxy); - Self { dsp, params } + Self { dsp, params, driver_led_tx: None,} } } @@ -147,6 +79,12 @@ impl Plugin for Ts404 { self.params.clone() } + fn editor(&mut self, _: AsyncExecutor) -> Option> { + let (tx, rx) = channel(); + self.driver_led_tx.replace(tx); + editor::create(self.params.clone(), rx) + } + fn initialize( &mut self, _audio_io_layout: &AudioIOLayout, diff --git a/plugins/ts404/src/params.rs b/plugins/ts404/src/params.rs new file mode 100644 index 0000000..a07ae17 --- /dev/null +++ b/plugins/ts404/src/params.rs @@ -0,0 +1,86 @@ +use valib::dsp::parameter::RemoteControl; +use std::sync::Arc; +use std::sync::mpsc::{channel, Receiver, Sender}; +use nih_plug::params::{BoolParam, FloatParam, Params}; +use nih_plug::prelude::{AtomicF32, FloatRange}; +use nih_plug::util::{gain_to_db, MINUS_INFINITY_DB, MINUS_INFINITY_GAIN}; +use nih_plug::formatters; +use nih_plug_iced::IcedState; +use valib::contrib::nih_plug::BindToParameter; +use crate::dsp::DspParams; + +#[derive(Params)] +pub(crate) struct Ts404Params { + #[id = "drive"] + pub(crate) drive: FloatParam, + #[id = "dist"] + pub(crate) dist: FloatParam, + #[id = "tone"] + pub(crate) tone: FloatParam, + #[id = "level"] + pub(crate) out_level: FloatParam, + #[id = "cmpmat"] + pub(crate) component_matching: FloatParam, + #[id = "bypass"] + pub(crate) bypass: BoolParam, + #[id = "byp_io"] + pub(crate) io_bypass: BoolParam, + #[persist="editor_state"] + pub(crate) editor_state: Arc, +} + +impl Ts404Params { + pub(crate) fn new(remote: &RemoteControl) -> Arc { + Arc::new(Self { + drive: FloatParam::new( + "Drive", + 1.0, + FloatRange::Skewed { + min: 0.5, + max: 100.0, + factor: FloatRange::gain_skew_factor(gain_to_db(0.5), gain_to_db(100.0)), + }, + ) + .with_unit("dB") + .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) + .with_string_to_value(formatters::s2v_f32_gain_to_db()) + .bind_to_parameter(remote, DspParams::InputGain), + dist: FloatParam::new("Distortion", 0.1, FloatRange::Linear { min: 0.0, max: 1.0 }) + .with_unit("%") + .with_value_to_string(formatters::v2s_f32_percentage(2)) + .with_string_to_value(formatters::s2v_f32_percentage()) + .bind_to_parameter(remote, DspParams::Distortion), + tone: FloatParam::new("Tone", 0.5, FloatRange::Linear { min: 0.0, max: 1.0 }) + .with_unit("%") + .with_value_to_string(formatters::v2s_f32_percentage(2)) + .with_string_to_value(formatters::s2v_f32_percentage()) + .bind_to_parameter(remote, DspParams::Tone), + out_level: FloatParam::new( + "Output Level", + 0.158, + FloatRange::Skewed { + min: MINUS_INFINITY_GAIN, + max: 1.0, + factor: FloatRange::gain_skew_factor(MINUS_INFINITY_DB, gain_to_db(1.0)), + }, + ) + .with_unit("dB") + .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) + .with_string_to_value(formatters::s2v_f32_gain_to_db()) + .bind_to_parameter(remote, DspParams::OutputGain), + component_matching: FloatParam::new( + "Component Matching", + 1., + FloatRange::Linear { min: 0.0, max: 1.0 }, + ) + .with_unit("%") + .with_string_to_value(formatters::s2v_f32_percentage()) + .with_value_to_string(formatters::v2s_f32_percentage(0)) + .bind_to_parameter(remote, DspParams::ComponentMismatch), + bypass: BoolParam::new("Bypass", false).bind_to_parameter(remote, DspParams::Bypass), + io_bypass: BoolParam::new("I/O Buffers Bypass", false) + .bind_to_parameter(remote, DspParams::BufferBypass), + editor_state: crate::editor::default_state(), + }) + } +} diff --git a/plugins/ts404/src/util.rs b/plugins/ts404/src/util.rs new file mode 100644 index 0000000..53f5654 --- /dev/null +++ b/plugins/ts404/src/util.rs @@ -0,0 +1,33 @@ +use std::collections::VecDeque; +use nih_plug::nih_log; +use num_traits::Zero; +use valib::Scalar; + +#[derive(Debug, Clone)] +pub struct Rms { + data: VecDeque, + summed_squared: T, +} + +impl Rms { + pub fn new(size: usize) -> Self { + Self { + data: (0..size).map(|_| T::zero()).collect(), + summed_squared: T::zero(), + } + } +} + +impl Rms { + pub fn add_element(&mut self, value: T) -> T { + let v2 = value.simd_powi(2); + self.summed_squared -= self.data.pop_front().unwrap(); + self.summed_squared += v2; + self.data.push_back(v2); + self.get_rms() + } + + pub fn get_rms(&self) -> T { + self.summed_squared.simd_sqrt() + } +} \ No newline at end of file From f54edccc5d26f83172313236b81e32f4ae99593f Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Wed, 12 Jun 2024 22:12:46 +0200 Subject: [PATCH 20/51] Initial plugin UI --- plugins/ts404/src/dsp.rs | 16 +++++++++------ plugins/ts404/src/editor/led.rs | 24 +++++++++++++--------- plugins/ts404/src/editor/mod.rs | 29 +++++++++++++------------- plugins/ts404/src/lib.rs | 20 +++++++++--------- plugins/ts404/src/params.rs | 36 ++++++++++++++++----------------- plugins/ts404/src/util.rs | 6 +++--- 6 files changed, 70 insertions(+), 61 deletions(-) diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index 401f7ad..8d2e79e 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -1,5 +1,5 @@ -use std::sync::Arc; use std::sync::atomic::Ordering; +use std::sync::Arc; use nalgebra::Complex; use nih_plug::nih_log; @@ -7,21 +7,21 @@ use nih_plug::prelude::AtomicF32; use nih_plug::util::db_to_gain_fast; use num_traits::ToPrimitive; use numeric_literals::replace_float_literals; -use valib::dsp::{BlockAdapter, DSPMeta, DSPProcess, DSPProcessBlock}; use valib::dsp::blocks::Series; use valib::dsp::buffer::{AudioBufferMut, AudioBufferRef}; use valib::dsp::parameter::{HasParameters, ParamId, ParamName, RemoteControlled, SmoothedParam}; +use valib::dsp::{BlockAdapter, DSPMeta, DSPProcess, DSPProcessBlock}; use valib::filters::statespace::StateSpace; use valib::oversample::{Oversample, Oversampled}; use valib::saturators::{Saturator, Slew}; -use valib::Scalar; use valib::simd::{ AutoF32x2, AutoF64x2, AutoSimd, SimdBool, SimdComplexField, SimdPartialOrd, SimdValue, }; use valib::util::lerp; +use valib::Scalar; -use crate::TARGET_SAMPLERATE; use crate::util::Rms; +use crate::TARGET_SAMPLERATE; #[replace_float_literals(T::from_f64(literal))] fn smooth_min(t: T, a: T, b: T) -> T { @@ -227,7 +227,7 @@ where impl ClipperStage { pub fn new(samplerate: f32, dist: T) -> Self { let dt = T::from_f64(samplerate as _).simd_recip(); - let rms_samples = (1e-3 * TARGET_SAMPLERATE) as usize; + let rms_samples = (16e-3 * TARGET_SAMPLERATE) as usize; Self { dt, dist: SmoothedParam::exponential(1.0, samplerate, 50.0), @@ -461,7 +461,11 @@ where pub fn get_led_display(&self) -> Arc { // Funny nested access because of semi-structured DSP blocks - self.inner.inner.0.inner.0.1.led_display.clone() + self.inner.inner.0.inner.0 .1.led_display.clone() + } + + pub fn set_led_display(&mut self, value: &Arc) { + self.inner.inner.0.inner.0 .1.led_display.clone_from(value); } } diff --git a/plugins/ts404/src/editor/led.rs b/plugins/ts404/src/editor/led.rs index f383bc2..eec66d6 100644 --- a/plugins/ts404/src/editor/led.rs +++ b/plugins/ts404/src/editor/led.rs @@ -1,6 +1,6 @@ -use nih_plug_iced::{Color, Element, Layout, Length, Point, Rectangle, renderer, Size, Widget}; use nih_plug_iced::layout::{Limits, Node}; use nih_plug_iced::renderer::{Quad, Style}; +use nih_plug_iced::{renderer, Color, Element, Layout, Length, Point, Rectangle, Size, Widget}; pub(crate) struct Led { size: Length, @@ -56,13 +56,19 @@ impl Widget for Led { ) { let bounds = layout.bounds(); let radius = bounds.width; - let color = scale_color(self.color, self.brightness); - renderer.fill_quad(Quad { - bounds, - border_radius: radius, - border_width: 0.0, - border_color: Color::TRANSPARENT, - }, color); + let color = Color { + a: self.brightness, + ..self.color + }; + renderer.fill_quad( + Quad { + bounds, + border_radius: radius, + border_width: 0.0, + border_color: Color::TRANSPARENT, + }, + color, + ); } } @@ -73,6 +79,6 @@ impl<'a, Message: 'a + Clone> From for Element<'a, Message> { } fn scale_color(col: Color, amt: f32) -> Color { - let [r,g,b] = [col.r, col.g, col.b].map(|x| x * amt); + let [r, g, b] = [col.r, col.g, col.b].map(|x| x * amt); Color::from_rgba(r, g, b, col.a) } diff --git a/plugins/ts404/src/editor/mod.rs b/plugins/ts404/src/editor/mod.rs index cb7cc20..4206bde 100644 --- a/plugins/ts404/src/editor/mod.rs +++ b/plugins/ts404/src/editor/mod.rs @@ -1,12 +1,12 @@ -use std::sync::Arc; use std::sync::atomic::Ordering; +use std::sync::Arc; use nih_plug::prelude::*; use nih_plug_iced::{ - Alignment, Column, Command, create_iced_editor, Element, executor, IcedEditor, IcedState, - Length, Text, widgets, WindowQueue, + create_iced_editor, executor, widgets, Alignment, Column, Command, Element, IcedEditor, + IcedState, Length, Text, WindowQueue, }; -use nih_plug_iced::futures::channel::mpsc::Receiver; + use widgets::generic_ui::{GenericSlider, GenericUi}; use crate::editor::led::Led; @@ -15,14 +15,14 @@ use crate::params::Ts404Params; mod led; pub(crate) fn default_state() -> Arc { - IcedState::from_size(120, 300) + IcedState::from_size(200, 300) } pub(crate) fn create( params: Arc, - driver_led_receiver: Receiver>, + drive_led: Arc, ) -> Option> { - create_iced_editor::(params.editor_state.clone(), (params, driver_led_receiver)) + create_iced_editor::(params.editor_state.clone(), (params, drive_led)) } struct Ts404Editor { @@ -30,7 +30,6 @@ struct Ts404Editor { context: Arc, generic_ui: widgets::generic_ui::State, drive_led: Arc, - driver_led_receiver: Receiver>, } #[derive(Debug, Copy, Clone)] @@ -41,16 +40,16 @@ enum EditorMessage { impl IcedEditor for Ts404Editor { type Executor = executor::Default; type Message = EditorMessage; - type InitializationFlags = (Arc, Receiver>); + type InitializationFlags = (Arc, Arc); fn new( - (params, driver_led_receiver): Self::InitializationFlags, + (params, drive_led): Self::InitializationFlags, context: Arc, ) -> (Self, Command) { let editor = Self { params, context, - driver_led_receiver, + drive_led, generic_ui: Default::default(), }; (editor, Command::none()) @@ -75,15 +74,15 @@ impl IcedEditor for Ts404Editor { let led = self.drive_led.load(Ordering::SeqCst); nih_log!("Editor view: {led}"); Column::new() - .align_items(Alignment::Fill) .push( GenericUi::new(&mut self.generic_ui, self.params.clone()) - .width(Length::Fill) + .width(Length::Units(200)) .height(Length::Fill) .map(EditorMessage::ParamUpdate), ) - .push(Text::new(format!("LED value: {led}"))) - .push(Led::new(led)) + .push(Led::new(led / 20.0)) + .width(Length::Fill) + .height(Length::Fill) .into() } } diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index 3845726..3a5f562 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -1,10 +1,10 @@ -use std::sync::Arc; use std::sync::mpsc::{channel, Sender}; +use std::sync::Arc; use nih_plug::prelude::*; -use valib::contrib::nih_plug::{BindToParameter, process_buffer_simd64}; -use valib::dsp::DSPMeta; +use valib::contrib::nih_plug::{process_buffer_simd64, BindToParameter}; use valib::dsp::parameter::RemoteControlled; +use valib::dsp::DSPMeta; use valib::simd::{AutoF32x2, AutoF64x2}; use dsp::MAX_BLOCK_SIZE; @@ -13,10 +13,10 @@ use params::Ts404Params; use crate::dsp::{Dsp, DspParams}; mod dsp; -mod gen; -mod util; mod editor; +mod gen; mod params; +mod util; const TARGET_SAMPLERATE: f32 = 96000.; @@ -26,7 +26,6 @@ type Sample32 = AutoF32x2; struct Ts404 { params: Arc, dsp: RemoteControlled>, - driver_led_tx: Option>>, } impl Default for Ts404 { @@ -34,7 +33,7 @@ impl Default for Ts404 { let default_samplerate = 44100.0; let dsp = Dsp::new(default_samplerate, TARGET_SAMPLERATE); let params = Ts404Params::new(&dsp.proxy); - Self { dsp, params, driver_led_tx: None,} + Self { dsp, params } } } @@ -80,9 +79,7 @@ impl Plugin for Ts404 { } fn editor(&mut self, _: AsyncExecutor) -> Option> { - let (tx, rx) = channel(); - self.driver_led_tx.replace(tx); - editor::create(self.params.clone(), rx) + editor::create(self.params.clone(), self.dsp.inner.get_led_display()) } fn initialize( @@ -91,8 +88,11 @@ impl Plugin for Ts404 { buffer_config: &BufferConfig, _context: &mut impl InitContext, ) -> bool { + let drive_led = self.dsp.inner.get_led_display(); let dsp = Dsp::new(buffer_config.sample_rate, TARGET_SAMPLERATE); self.dsp.inner = dsp.inner; + // Reuse the shared atomic + self.dsp.inner.set_led_display(&drive_led); let dsp = &self.dsp; dsp.proxy diff --git a/plugins/ts404/src/params.rs b/plugins/ts404/src/params.rs index a07ae17..8a633ea 100644 --- a/plugins/ts404/src/params.rs +++ b/plugins/ts404/src/params.rs @@ -1,13 +1,13 @@ -use valib::dsp::parameter::RemoteControl; -use std::sync::Arc; -use std::sync::mpsc::{channel, Receiver, Sender}; +use crate::dsp::DspParams; +use nih_plug::formatters; use nih_plug::params::{BoolParam, FloatParam, Params}; use nih_plug::prelude::{AtomicF32, FloatRange}; use nih_plug::util::{gain_to_db, MINUS_INFINITY_DB, MINUS_INFINITY_GAIN}; -use nih_plug::formatters; use nih_plug_iced::IcedState; +use std::sync::mpsc::{channel, Receiver, Sender}; +use std::sync::Arc; use valib::contrib::nih_plug::BindToParameter; -use crate::dsp::DspParams; +use valib::dsp::parameter::RemoteControl; #[derive(Params)] pub(crate) struct Ts404Params { @@ -25,7 +25,7 @@ pub(crate) struct Ts404Params { pub(crate) bypass: BoolParam, #[id = "byp_io"] pub(crate) io_bypass: BoolParam, - #[persist="editor_state"] + #[persist = "editor_state"] pub(crate) editor_state: Arc, } @@ -41,10 +41,10 @@ impl Ts404Params { factor: FloatRange::gain_skew_factor(gain_to_db(0.5), gain_to_db(100.0)), }, ) - .with_unit("dB") - .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) - .with_string_to_value(formatters::s2v_f32_gain_to_db()) - .bind_to_parameter(remote, DspParams::InputGain), + .with_unit("dB") + .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) + .with_string_to_value(formatters::s2v_f32_gain_to_db()) + .bind_to_parameter(remote, DspParams::InputGain), dist: FloatParam::new("Distortion", 0.1, FloatRange::Linear { min: 0.0, max: 1.0 }) .with_unit("%") .with_value_to_string(formatters::v2s_f32_percentage(2)) @@ -64,19 +64,19 @@ impl Ts404Params { factor: FloatRange::gain_skew_factor(MINUS_INFINITY_DB, gain_to_db(1.0)), }, ) - .with_unit("dB") - .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) - .with_string_to_value(formatters::s2v_f32_gain_to_db()) - .bind_to_parameter(remote, DspParams::OutputGain), + .with_unit("dB") + .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) + .with_string_to_value(formatters::s2v_f32_gain_to_db()) + .bind_to_parameter(remote, DspParams::OutputGain), component_matching: FloatParam::new( "Component Matching", 1., FloatRange::Linear { min: 0.0, max: 1.0 }, ) - .with_unit("%") - .with_string_to_value(formatters::s2v_f32_percentage()) - .with_value_to_string(formatters::v2s_f32_percentage(0)) - .bind_to_parameter(remote, DspParams::ComponentMismatch), + .with_unit("%") + .with_string_to_value(formatters::s2v_f32_percentage()) + .with_value_to_string(formatters::v2s_f32_percentage(0)) + .bind_to_parameter(remote, DspParams::ComponentMismatch), bypass: BoolParam::new("Bypass", false).bind_to_parameter(remote, DspParams::Bypass), io_bypass: BoolParam::new("I/O Buffers Bypass", false) .bind_to_parameter(remote, DspParams::BufferBypass), diff --git a/plugins/ts404/src/util.rs b/plugins/ts404/src/util.rs index 53f5654..0e10379 100644 --- a/plugins/ts404/src/util.rs +++ b/plugins/ts404/src/util.rs @@ -1,5 +1,5 @@ use std::collections::VecDeque; -use nih_plug::nih_log; + use num_traits::Zero; use valib::Scalar; @@ -26,8 +26,8 @@ impl Rms { self.data.push_back(v2); self.get_rms() } - + pub fn get_rms(&self) -> T { self.summed_squared.simd_sqrt() } -} \ No newline at end of file +} From 650de24935aafd8b4d6880cd1279dfe1119fdb43 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Thu, 13 Jun 2024 22:05:21 +0200 Subject: [PATCH 21/51] wip(editor): switch to vizia --- plugins/ts404/Cargo.lock | 2733 +++++++++++++++---- plugins/ts404/Cargo.toml | 2 +- plugins/ts404/src/dsp.rs | 2 +- plugins/ts404/src/editor/components/knob.rs | 281 ++ plugins/ts404/src/editor/components/led.rs | 44 + plugins/ts404/src/editor/components/mod.rs | 2 + plugins/ts404/src/editor/led.rs | 84 - plugins/ts404/src/editor/mod.rs | 159 +- plugins/ts404/src/editor/style.css | 46 + plugins/ts404/src/params.rs | 12 +- 10 files changed, 2751 insertions(+), 614 deletions(-) create mode 100644 plugins/ts404/src/editor/components/knob.rs create mode 100644 plugins/ts404/src/editor/components/led.rs create mode 100644 plugins/ts404/src/editor/components/mod.rs delete mode 100644 plugins/ts404/src/editor/led.rs create mode 100644 plugins/ts404/src/editor/style.css diff --git a/plugins/ts404/Cargo.lock b/plugins/ts404/Cargo.lock index 1d1f00b..3f6eb4d 100644 --- a/plugins/ts404/Cargo.lock +++ b/plugins/ts404/Cargo.lock @@ -3,20 +3,73 @@ version = 3 [[package]] -name = "ab_glyph" -version = "0.2.26" +name = "accesskit" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76eb1adf08c5bcaa8490b9851fd53cca27fa9880076f178ea9d29f05196728a8" + +[[package]] +name = "accesskit_consumer" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e53b0a3d5760cd2ba9b787ae0c6440ad18ee294ff71b05e3381c900a7d16cfd" +checksum = "04bb4d9e4772fe0d47df57d0d5dbe5d85dd05e2f37ae1ddb6b105e76be58fb00" dependencies = [ - "ab_glyph_rasterizer", - "owned_ttf_parser", + "accesskit", ] [[package]] -name = "ab_glyph_rasterizer" -version = "0.1.8" +name = "accesskit_macos" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134d0acf6acb667c89d3332999b1a5df4edbc8d6113910f392ebb73f2b03bb56" +dependencies = [ + "accesskit", + "accesskit_consumer", + "objc2", + "once_cell", +] + +[[package]] +name = "accesskit_unix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e084cb5168790c0c112626175412dc5ad127083441a8248ae49ddf6725519e83" +dependencies = [ + "accesskit", + "accesskit_consumer", + "async-channel 1.9.0", + "atspi", + "futures-lite 1.13.0", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eac0a7f2d7cd7a93b938af401d3d8e8b7094217989a7c25c55a953023436e31" +dependencies = [ + "accesskit", + "accesskit_consumer", + "arrayvec", + "once_cell", + "paste", + "windows 0.48.0", +] + +[[package]] +name = "accesskit_winit" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" +checksum = "825d23acee1bd6d25cbaa3ca6ed6e73faf24122a774ec33d52c5c86c6ab423c0" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_unix", + "accesskit_windows", + "winit", +] [[package]] name = "addr2line" @@ -33,6 +86,60 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + +[[package]] +name = "android-activity" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0" +dependencies = [ + "android-properties", + "bitflags 1.3.2", + "cc", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum 0.6.1", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" version = "1.0.78" @@ -54,6 +161,198 @@ dependencies = [ "num-traits", ] +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "async-broadcast" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +dependencies = [ + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.1.0", + "futures-lite 2.3.0", + "slab", +] + +[[package]] +name = "async-fs" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "blocking", + "futures-lite 1.13.0", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.27", + "slab", + "socket2", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" +dependencies = [ + "async-lock 3.4.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.3.0", + "parking", + "polling 3.4.0", + "rustix 0.38.28", + "slab", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.3.1", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +dependencies = [ + "async-io 1.13.0", + "async-lock 2.8.0", + "async-signal", + "blocking", + "cfg-if", + "event-listener 3.1.0", + "futures-lite 1.13.0", + "rustix 0.38.28", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "async-signal" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d" +dependencies = [ + "async-io 2.3.3", + "async-lock 3.4.0", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 0.38.28", + "signal-hook-registry", + "slab", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "atomic_float" version = "0.1.0" @@ -66,6 +365,33 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" +[[package]] +name = "atspi" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "674e7a3376837b2e7d12d34d58ac47073c491dc3bf6f71a7adaf687d4d817faa" +dependencies = [ + "async-recursion", + "async-trait", + "atspi-macros", + "enumflags2", + "futures-lite 1.13.0", + "serde", + "tracing", + "zbus", + "zbus_names", +] + +[[package]] +name = "atspi-macros" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb4870a32c0eaa17e35bca0e6b16020635157121fb7d45593d242c295bc768" +dependencies = [ + "quote", + "syn 1.0.109", +] + [[package]] name = "atty" version = "0.2.14" @@ -107,18 +433,18 @@ dependencies = [ [[package]] name = "baseview" version = "0.1.0" -source = "git+https://github.com/RustAudio/baseview.git?rev=1d9806d5bd92275d0d8142d9c9c90198757b9b25#1d9806d5bd92275d0d8142d9c9c90198757b9b25" +source = "git+https://github.com/RustAudio/baseview.git?rev=2c1b1a7b0fef1a29a5150a6a8f6fef6a0cbab8c4#2c1b1a7b0fef1a29a5150a6a8f6fef6a0cbab8c4" dependencies = [ "cocoa", "core-foundation", "keyboard-types", "nix 0.22.3", "objc", - "raw-window-handle 0.4.3", + "raw-window-handle", "uuid", "winapi", "x11", - "xcb 0.9.0", + "xcb", "xcb-util", ] @@ -128,12 +454,59 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + [[package]] name = "block" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-sys" +version = "0.1.0-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" +dependencies = [ + "objc-sys", +] + +[[package]] +name = "block2" +version = "0.2.0-alpha.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" +dependencies = [ + "block-sys", + "objc2-encode", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite 2.3.0", + "piper", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -160,6 +533,12 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "camino" version = "1.1.7" @@ -198,6 +577,7 @@ version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ + "jobserver", "libc", ] @@ -207,6 +587,35 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets 0.52.5", +] + [[package]] name = "clap-sys" version = "0.3.0" @@ -228,7 +637,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" dependencies = [ - "bitflags", + "bitflags 1.3.2", "block", "cocoa-foundation", "core-foundation", @@ -244,7 +653,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ - "bitflags", + "bitflags 1.3.2", "block", "core-foundation", "core-graphics-types", @@ -252,17 +661,47 @@ dependencies = [ "objc", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "copypasta" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4423d79fed83ebd9ab81ec21fa97144300a961782158287dc9bf7eddac37ff0b" +checksum = "133fc8675ee3a4ec9aa513584deda9aa0faeda3586b87f7f0f2ba082c66fb172" dependencies = [ "clipboard-win", "objc", "objc-foundation", "objc_id", - "smithay-clipboard", "x11-clipboard", ] @@ -288,7 +727,7 @@ version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-graphics-types", "foreign-types", @@ -301,19 +740,56 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "libc", ] [[package]] -name = "crossbeam" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eb9105919ca8e40d437fc9cbb8f1975d916f1bd28afe795a48aae32a2cc8920" +name = "cosmic-text" +version = "0.8.0" +source = "git+https://github.com/pop-os/cosmic-text?rev=79275d15e857428e9b8874f28413197e878f3788#79275d15e857428e9b8874f28413197e878f3788" dependencies = [ - "cfg-if", - "crossbeam-channel", + "aliasable", + "fontdb", + "libm", + "log", + "rangemap", + "rustybuzz", + "swash", + "sys-locale", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eb9105919ca8e40d437fc9cbb8f1975d916f1bd28afe795a48aae32a2cc8920" +dependencies = [ + "cfg-if", + "crossbeam-channel", "crossbeam-deque", "crossbeam-epoch", "crossbeam-queue", @@ -372,10 +848,41 @@ dependencies = [ ] [[package]] -name = "cty" -version = "0.2.2" +name = "crypto-common" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.29.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.10.1", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.66", +] [[package]] name = "darling" @@ -422,25 +929,70 @@ dependencies = [ ] [[package]] -name = "dlib" -version = "0.5.2" +name = "derivative" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "libloading", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "downcast-rs" -version = "1.2.1" +name = "derive_more" +version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", +] [[package]] -name = "either" -version = "1.12.0" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] [[package]] name = "enum-map" @@ -462,6 +1014,27 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "enumflags2" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -469,78 +1042,191 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "euclid" -version = "0.22.10" +name = "errno" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f0eb73b934648cd7a4a61f1b15391cd95dab0b4da6e2e66c2a072c144b4a20" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ - "num-traits", + "libc", + "windows-sys 0.52.0", ] [[package]] -name = "fnv" -version = "1.0.7" +name = "event-listener" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] -name = "foreign-types" -version = "0.3.2" +name = "event-listener" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" dependencies = [ - "foreign-types-shared", + "concurrent-queue", + "parking", + "pin-project-lite", ] [[package]] -name = "foreign-types-shared" -version = "0.1.1" +name = "event-listener" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] [[package]] -name = "futures" -version = "0.3.30" +name = "event-listener-strategy" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", + "event-listener 5.3.1", + "pin-project-lite", ] [[package]] -name = "futures-channel" -version = "0.3.30" +name = "fastrand" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" dependencies = [ - "futures-core", - "futures-sink", + "instant", ] [[package]] -name = "futures-core" -version = "0.3.30" +name = "fastrand" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] -name = "futures-executor" -version = "0.3.30" +name = "fdeflate" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ - "futures-core", - "futures-task", - "futures-util", - "num_cpus", + "simd-adler32", ] +[[package]] +name = "femtovg" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3a2d0ff0df09856a5c1c89cc83863a1f0f994c55452186621bb57a01f270b3" +dependencies = [ + "bitflags 2.5.0", + "fnv", + "generational-arena", + "glow", + "image", + "imgref", + "lru", + "rgb", + "rustybuzz", + "unicode-bidi", + "unicode-segmentation", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fluent-bundle" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe0a21ee80050c678013f82edf4b705fe2f26f1f9877593d13198612503f493" +dependencies = [ + "fluent-langneg", + "fluent-syntax", + "intl-memoizer", + "intl_pluralrules", + "rustc-hash", + "self_cell 0.10.3", + "smallvec", + "unic-langid", +] + +[[package]] +name = "fluent-langneg" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94" +dependencies = [ + "unic-langid", +] + +[[package]] +name = "fluent-syntax" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a530c4694a6a8d528794ee9bbd8ba0122e779629ac908d15ad5a7ae7763a33d" +dependencies = [ + "thiserror", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "font-types" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34fd7136aca682873d859ef34494ab1a7d3f57ecd485ed40eb6437ee8c85aa29" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "fontdb" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af8d8cbea8f21307d7e84bca254772981296f058a1d36b461bf4d83a7499fc9e" +dependencies = [ + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser 0.19.2", +] + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + [[package]] name = "futures-io" version = "0.3.30" @@ -548,14 +1234,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] -name = "futures-macro" -version = "0.3.30" +name = "futures-lite" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand 2.1.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", ] [[package]] @@ -576,10 +1279,8 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ - "futures-channel", "futures-core", "futures-io", - "futures-macro", "futures-sink", "futures-task", "memchr", @@ -588,6 +1289,55 @@ dependencies = [ "slab", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generational-arena" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877e94aff08e743b651baaea359664321055749b398adff8740a7399af7796e7" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.2.14" @@ -596,7 +1346,7 @@ checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] @@ -606,19 +1356,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] -name = "glam" -version = "0.10.2" +name = "gl_generator" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579160312273c954cc51bd440f059dde741029ac8daf8c84fece76cb77f62c15" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" dependencies = [ - "version_check", + "khronos_api", + "log", + "xml-rs", ] [[package]] name = "glow" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8bd5877156a19b8ac83a29b2306fe20537429d318f3ff0a1a2119f8d9c61919" +checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728" dependencies = [ "js-sys", "slotmap", @@ -627,53 +1379,66 @@ dependencies = [ ] [[package]] -name = "glow_glyph" -version = "0.5.1" +name = "glutin" +version = "0.30.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4e62c64947b9a24fe20e2bba9ad819ecb506ef5c8df7ffc4737464c6df9510" +checksum = "8fc93b03242719b8ad39fb26ed2b01737144ce7bd4bfc7adadcef806596760fe" dependencies = [ - "bytemuck", - "glow", - "glyph_brush", - "log", + "bitflags 1.3.2", + "cfg_aliases", + "cgl", + "core-foundation", + "dispatch", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "libloading", + "objc2", + "once_cell", + "raw-window-handle", + "windows-sys 0.45.0", + "x11-dl", ] [[package]] -name = "glyph_brush" -version = "0.7.8" +name = "glutin-winit" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3676f482c536a985fca36ce320a5e5b8fafd7b260806742af1963b71c5dc38c" +checksum = "629a873fc04062830bfe8f97c03773bcd7b371e23bcc465d0a61448cd1588fa4" dependencies = [ - "glyph_brush_draw_cache", - "glyph_brush_layout", - "ordered-float", - "rustc-hash", - "twox-hash", + "cfg_aliases", + "glutin", + "raw-window-handle", + "winit", ] [[package]] -name = "glyph_brush_draw_cache" -version = "0.1.5" +name = "glutin_egl_sys" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6010675390f6889e09a21e2c8b575b3ee25667ea8237a8d59423f73cb8c28610" +checksum = "af784eb26c5a68ec85391268e074f0aa618c096eadb5d6330b0911cf34fe57c5" dependencies = [ - "ab_glyph", - "crossbeam-channel", - "crossbeam-deque", - "linked-hash-map", - "rayon", - "rustc-hash", + "gl_generator", + "windows-sys 0.45.0", ] [[package]] -name = "glyph_brush_layout" -version = "0.2.3" +name = "glutin_glx_sys" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc32c2334f00ca5ac3695c5009ae35da21da8c62d255b5b96d56e2597a637a38" +checksum = "1b53cb5fe568964aa066a3ba91eac5ecbac869fb0842cd0dc9e412434f1a1494" dependencies = [ - "ab_glyph", - "approx", - "xi-unicode", + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef89398e90033fc6bc65e9bd42fd29bbbfd483bda5b56dc5562f455550618165" +dependencies = [ + "gl_generator", ] [[package]] @@ -709,95 +1474,58 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] -name = "iced_baseview" -version = "0.0.3" -source = "git+https://github.com/robbert-vdh/iced_baseview.git?branch=feature/update-baseview#df3a852a15cf0e9fcc8d2b32f5718e56780beaf3" -dependencies = [ - "baseview", - "copypasta", - "iced_core", - "iced_futures", - "iced_glow", - "iced_graphics", - "iced_native", - "keyboard-types", - "raw-window-handle 0.4.3", -] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] -name = "iced_core" -version = "0.4.0" -source = "git+https://github.com/iced-rs/iced.git?rev=a53fa91e0ddf374bbeb66d5e831b79127ed47a9d#a53fa91e0ddf374bbeb66d5e831b79127ed47a9d" +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ - "bitflags", - "wasm-timer", + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", ] [[package]] -name = "iced_futures" -version = "0.3.0" -source = "git+https://github.com/iced-rs/iced.git?rev=a53fa91e0ddf374bbeb66d5e831b79127ed47a9d#a53fa91e0ddf374bbeb66d5e831b79127ed47a9d" +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "futures", - "log", - "wasm-bindgen-futures", - "wasm-timer", + "cc", ] [[package]] -name = "iced_glow" -version = "0.2.0" -source = "git+https://github.com/iced-rs/iced.git?rev=a53fa91e0ddf374bbeb66d5e831b79127ed47a9d#a53fa91e0ddf374bbeb66d5e831b79127ed47a9d" -dependencies = [ - "bytemuck", - "euclid", - "glow", - "glow_glyph", - "glyph_brush", - "iced_graphics", - "iced_native", - "log", -] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] -name = "iced_graphics" -version = "0.2.0" -source = "git+https://github.com/iced-rs/iced.git?rev=a53fa91e0ddf374bbeb66d5e831b79127ed47a9d#a53fa91e0ddf374bbeb66d5e831b79127ed47a9d" +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" dependencies = [ "bytemuck", - "glam", - "iced_native", - "iced_style", - "raw-window-handle 0.4.3", - "thiserror", -] - -[[package]] -name = "iced_native" -version = "0.4.0" -source = "git+https://github.com/iced-rs/iced.git?rev=a53fa91e0ddf374bbeb66d5e831b79127ed47a9d#a53fa91e0ddf374bbeb66d5e831b79127ed47a9d" -dependencies = [ - "iced_core", - "iced_futures", - "iced_style", + "byteorder", + "color_quant", "num-traits", - "twox-hash", - "unicode-segmentation", -] - -[[package]] -name = "iced_style" -version = "0.3.0" -source = "git+https://github.com/iced-rs/iced.git?rev=a53fa91e0ddf374bbeb66d5e831b79127ed47a9d#a53fa91e0ddf374bbeb66d5e831b79127ed47a9d" -dependencies = [ - "iced_core", + "png", ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "imgref" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" [[package]] name = "indexmap" @@ -816,6 +1544,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "intl-memoizer" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe22e020fce238ae18a6d5d8c502ee76a52a6e880d99477657e6acc30ec57bda" +dependencies = [ + "type-map", + "unic-langid", +] + +[[package]] +name = "intl_pluralrules" +version = "7.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972" +dependencies = [ + "unic-langid", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", ] [[package]] @@ -824,6 +1585,21 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.69" @@ -839,9 +1615,15 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7668b7cff6a51fe61cdde64cd27c8a220786f399501b57ebe36f7d8112fd68" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + [[package]] name = "lazy-bytes-cast" version = "5.0.1" @@ -862,19 +1644,42 @@ checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" [[package]] name = "libloading" -version = "0.8.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "winapi", ] [[package]] -name = "linked-hash-map" -version = "0.5.6" +name = "libm" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.5.0", + "libc", + "redox_syscall 0.4.1", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" @@ -892,6 +1697,12 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "lru" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "718e8fae447df0c7e1ba7f5189829e63fd536945c8988d61444c19039f16b670" + [[package]] name = "malloc_buf" version = "0.0.6" @@ -901,6 +1712,12 @@ dependencies = [ "libc", ] +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + [[package]] name = "matrixmultiply" version = "0.3.8" @@ -919,9 +1736,9 @@ checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memmap2" -version = "0.5.10" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" dependencies = [ "libc", ] @@ -935,6 +1752,24 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "midi-consts" version = "0.1.0" @@ -948,6 +1783,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "morphorm" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "618fb979b26c8898ae0ed4677ca01385b0588bd4a27a8b2d3d9795f468e33366" +dependencies = [ + "smallvec", ] [[package]] @@ -977,6 +1834,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ndk" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum 0.5.11", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.4.1+23.1.7779620" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" +dependencies = [ + "jni-sys", +] + [[package]] name = "nih_log" version = "0.3.1" @@ -988,20 +1874,20 @@ dependencies = [ "once_cell", "termcolor", "time", - "windows", + "windows 0.44.0", ] [[package]] name = "nih_plug" version = "0.0.0" -source = "git+https://github.com/robbert-vdh/nih-plug.git#cd9b589d23e5ee63bf194cdd99d6bc612c1a4863" +source = "git+https://github.com/robbert-vdh/nih-plug.git#ffe9b61fcb0441c9d33f4413f5ebe7394637b21f" dependencies = [ "anyhow", "anymap", "atomic_float", "atomic_refcell", "backtrace", - "bitflags", + "bitflags 1.3.2", "cfg-if", "clap-sys", "core-foundation", @@ -1013,13 +1899,13 @@ dependencies = [ "nih_log", "nih_plug_derive", "objc", - "parking_lot 0.12.1", - "raw-window-handle 0.5.2", + "parking_lot", + "raw-window-handle", "serde", "serde_json", "vst3-sys", "widestring", - "windows", + "windows 0.44.0", ] [[package]] @@ -1030,7 +1916,7 @@ source = "git+https://github.com/robbert-vdh/nih_plug_assets.git#a04e327923e120b [[package]] name = "nih_plug_derive" version = "0.1.0" -source = "git+https://github.com/robbert-vdh/nih-plug.git#cd9b589d23e5ee63bf194cdd99d6bc612c1a4863" +source = "git+https://github.com/robbert-vdh/nih-plug.git#ffe9b61fcb0441c9d33f4413f5ebe7394637b21f" dependencies = [ "proc-macro2", "quote", @@ -1038,24 +1924,22 @@ dependencies = [ ] [[package]] -name = "nih_plug_iced" +name = "nih_plug_vizia" version = "0.0.0" -source = "git+https://github.com/robbert-vdh/nih-plug.git#cd9b589d23e5ee63bf194cdd99d6bc612c1a4863" +source = "git+https://github.com/robbert-vdh/nih-plug.git#ffe9b61fcb0441c9d33f4413f5ebe7394637b21f" dependencies = [ - "atomic_refcell", "baseview", "crossbeam", - "iced_baseview", "nih_plug", "nih_plug_assets", - "raw-window-handle 0.4.3", "serde", + "vizia", ] [[package]] name = "nih_plug_xtask" version = "0.1.0" -source = "git+https://github.com/robbert-vdh/nih-plug.git#cd9b589d23e5ee63bf194cdd99d6bc612c1a4863" +source = "git+https://github.com/robbert-vdh/nih-plug.git#ffe9b61fcb0441c9d33f4413f5ebe7394637b21f" dependencies = [ "anyhow", "cargo_metadata", @@ -1071,11 +1955,11 @@ version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cc", "cfg-if", "libc", - "memoffset", + "memoffset 0.6.5", ] [[package]] @@ -1084,10 +1968,22 @@ version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "libc", - "memoffset", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", ] [[package]] @@ -1130,13 +2026,45 @@ dependencies = [ ] [[package]] -name = "num_cpus" -version = "1.16.0" +name = "num_enum" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" dependencies = [ - "hermit-abi 0.3.9", - "libc", + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.66", ] [[package]] @@ -1178,6 +2106,32 @@ dependencies = [ "objc_id", ] +[[package]] +name = "objc-sys" +version = "0.2.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" + +[[package]] +name = "objc2" +version = "0.3.0-beta.3.patch-leaks.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" +dependencies = [ + "block2", + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-encode" +version = "2.0.0-pre.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" +dependencies = [ + "objc-sys", +] + [[package]] name = "objc_id" version = "0.1.1" @@ -1203,33 +2157,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] -name = "ordered-float" -version = "4.2.0" +name = "orbclient" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76df7075c7d4d01fdcb46c912dd17fba5b60c78ea480b475f2b6ab6f666584e" +checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" dependencies = [ - "num-traits", + "libredox", ] [[package]] -name = "owned_ttf_parser" -version = "0.21.0" +name = "ordered-stream" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b41438d2fc63c46c74a2203bf5ccd82c41ba04347b2fcf5754f230b167067d5" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" dependencies = [ - "ttf-parser", + "futures-core", + "pin-project-lite", ] [[package]] -name = "parking_lot" -version = "0.11.2" +name = "parking" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" @@ -1238,21 +2188,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.9", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", + "parking_lot_core", ] [[package]] @@ -1274,6 +2210,94 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project-lite" version = "0.2.14" @@ -1286,6 +2310,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" +dependencies = [ + "atomic-waker", + "fastrand 2.1.0", + "futures-io", +] + [[package]] name = "pkg-config" version = "0.3.30" @@ -1298,6 +2333,49 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" +[[package]] +name = "png" +version = "0.17.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14" +dependencies = [ + "cfg-if", + "concurrent-queue", + "pin-project-lite", + "rustix 0.38.28", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -1317,21 +2395,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] -name = "proc-macro2" -version = "1.0.85" +name = "precomputed-hash" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ - "unicode-ident", + "once_cell", + "toml_edit", ] [[package]] -name = "quick-xml" -version = "0.22.0" +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8533f14c8382aaad0d592c812ac3b826162128b65662331e1127b45c3d18536b" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" dependencies = [ - "memchr", + "unicode-ident", ] [[package]] @@ -1343,6 +2434,20 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + [[package]] name = "rand" version = "0.8.5" @@ -1350,8 +2455,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", ] [[package]] @@ -1361,7 +2476,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", ] [[package]] @@ -1370,18 +2494,33 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.14", ] [[package]] -name = "raw-window-handle" -version = "0.4.3" +name = "rand_hc" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "cty", + "rand_core 0.5.1", ] +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rangemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" + [[package]] name = "raw-window-handle" version = "0.5.2" @@ -1395,32 +2534,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" +name = "read-fonts" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "e8b8af39d1f23869711ad4cea5e7835a20daa987f80232f7f2a2374d648ca64d" dependencies = [ - "crossbeam-deque", - "crossbeam-utils", + "bytemuck", + "font-types", ] [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -1429,7 +2558,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -1441,6 +2570,44 @@ dependencies = [ "winapi", ] +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "rgb" +version = "0.8.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" +dependencies = [ + "bytemuck", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -1453,6 +2620,59 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys 0.4.14", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustybuzz" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162bdf42e261bee271b3957691018634488084ef577dddeb6420a9684cab2a6a" +dependencies = [ + "bitflags 1.3.2", + "bytemuck", + "libm", + "smallvec", + "ttf-parser 0.18.1", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-general-category", + "unicode-script", +] + [[package]] name = "ryu" version = "1.0.16" @@ -1468,12 +2688,6 @@ dependencies = [ "bytemuck", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" version = "1.2.0" @@ -1481,24 +2695,55 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "scroll" -version = "0.11.0" +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "selectors" +version = "0.23.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "phf 0.8.0", + "phf_codegen", + "precomputed-hash", + "smallvec", +] + +[[package]] +name = "self_cell" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d" dependencies = [ - "scroll_derive", + "self_cell 1.0.4", ] [[package]] -name = "scroll_derive" -version = "0.11.1" +name = "self_cell" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] +checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a" [[package]] name = "semver" @@ -1540,6 +2785,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "serde_spanned" version = "0.6.5" @@ -1549,6 +2805,26 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "simba" version = "0.8.1" @@ -1562,6 +2838,18 @@ dependencies = [ "wide", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + [[package]] name = "slab" version = "0.4.9" @@ -1587,31 +2875,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] -name = "smithay-client-toolkit" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" -dependencies = [ - "bitflags", - "dlib", - "lazy_static", - "log", - "memmap2", - "nix 0.24.3", - "pkg-config", - "wayland-client", - "wayland-cursor", - "wayland-protocols", -] - -[[package]] -name = "smithay-clipboard" -version = "0.6.6" +name = "socket2" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ - "smithay-client-toolkit", - "wayland-client", + "libc", + "winapi", ] [[package]] @@ -1626,6 +2896,17 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "swash" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "682a612b50baf09e8a039547ecf49e6c155690dcb751b1bcb19c93cdeb3d42d4" +dependencies = [ + "read-fonts", + "yazi", + "zeno", +] + [[package]] name = "syn" version = "1.0.109" @@ -1648,6 +2929,28 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sys-locale" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e801cf239ecd6ccd71f03d270d67dd53d13e90aab208bf4b8fe4ad957ea949b0" +dependencies = [ + "libc", +] + +[[package]] +name = "tempfile" +version = "3.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +dependencies = [ + "cfg-if", + "fastrand 2.1.0", + "redox_syscall 0.4.1", + "rustix 0.38.28", + "windows-sys 0.52.0", +] + [[package]] name = "termcolor" version = "1.4.0" @@ -1708,6 +3011,30 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "toml" version = "0.7.8" @@ -1742,6 +3069,37 @@ dependencies = [ "winnow", ] +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + [[package]] name = "ts404" version = "0.1.0" @@ -1749,7 +3107,7 @@ dependencies = [ "enum-map", "nalgebra", "nih_plug", - "nih_plug_iced", + "nih_plug_vizia", "num-traits", "numeric_literals", "valib", @@ -1757,19 +3115,23 @@ dependencies = [ [[package]] name = "ttf-parser" -version = "0.21.1" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0609f771ad9c6155384897e1df4d948e692667cc0588548b68eb44d052b27633" + +[[package]] +name = "ttf-parser" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" +checksum = "49d64318d8311fc2668e48b63969f4343e0a85c4a109aa8460d6672e364b8bd1" [[package]] -name = "twox-hash" -version = "1.6.3" +name = "type-map" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +checksum = "deb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9f" dependencies = [ - "cfg-if", - "rand", - "static_assertions", + "rustc-hash", ] [[package]] @@ -1778,12 +3140,102 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset 0.9.1", + "tempfile", + "winapi", +] + +[[package]] +name = "unic-langid" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dd9d1e72a73b25e07123a80776aae3e7b0ec461ef94f9151eed6ec88005a44" +dependencies = [ + "unic-langid-impl", + "unic-langid-macros", +] + +[[package]] +name = "unic-langid-impl" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5422c1f65949306c99240b81de9f3f15929f5a8bfe05bb44b034cc8bf593e5" +dependencies = [ + "tinystr", +] + +[[package]] +name = "unic-langid-macros" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da1cd2c042d3c7569a1008806b02039e7a4a2bdf8f8e96bd3c792434a0e275e" +dependencies = [ + "proc-macro-hack", + "tinystr", + "unic-langid-impl", + "unic-langid-macros-impl", +] + +[[package]] +name = "unic-langid-macros-impl" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ed7f4237ba393424195053097c1516bd4590dc82b84f2f97c5c69e12704555b" +dependencies = [ + "proc-macro-hack", + "quote", + "syn 2.0.66", + "unic-langid-impl", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56d12260fb92d52f9008be7e4bca09f584780eb2266dc8fecc6a192bec561694" + +[[package]] +name = "unicode-ccc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1" + +[[package]] +name = "unicode-general-category" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2281c8c1d221438e373249e065ca4989c4c36952c211ff21a0ee91c44a3869e7" + [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-script" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8d71f5726e5f285a935e9fe8edfd53f0491eb6e9a5774097fdabee7cd8c9cd" + [[package]] name = "unicode-segmentation" version = "1.11.0" @@ -1796,7 +3248,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom", + "getrandom 0.2.14", ] [[package]] @@ -1830,6 +3282,142 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "vizia" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "vizia_baseview", + "vizia_core", + "vizia_winit", +] + +[[package]] +name = "vizia_baseview" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "baseview", + "femtovg", + "lazy_static", + "raw-window-handle", + "vizia_core", + "vizia_id", + "vizia_input", +] + +[[package]] +name = "vizia_core" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "accesskit", + "bitflags 2.5.0", + "chrono", + "copypasta", + "cosmic-text", + "femtovg", + "fluent-bundle", + "fluent-langneg", + "fnv", + "image", + "instant", + "log", + "morphorm", + "swash", + "sys-locale", + "unic-langid", + "unicode-segmentation", + "vizia_derive", + "vizia_id", + "vizia_input", + "vizia_storage", + "vizia_style", + "vizia_window", + "web-sys", +] + +[[package]] +name = "vizia_derive" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "vizia_id" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" + +[[package]] +name = "vizia_input" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "bitflags 1.3.2", + "keyboard-types", + "vizia_id", +] + +[[package]] +name = "vizia_storage" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "morphorm", + "vizia_id", +] + +[[package]] +name = "vizia_style" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "bitflags 2.5.0", + "cssparser", + "femtovg", + "morphorm", + "selectors", + "smallvec", +] + +[[package]] +name = "vizia_window" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "accesskit", + "morphorm", + "vizia_input", + "vizia_style", +] + +[[package]] +name = "vizia_winit" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "accesskit", + "accesskit_winit", + "console_error_panic_hook", + "copypasta", + "femtovg", + "glutin", + "glutin-winit", + "raw-window-handle", + "vizia_core", + "vizia_id", + "vizia_input", + "vizia_window", + "wasm-bindgen", + "web-sys", + "winapi", + "winit", +] + [[package]] name = "vst3-com" version = "0.1.0" @@ -1867,6 +3455,18 @@ dependencies = [ "vst3-com", ] +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1888,26 +3488,14 @@ name = "wasm-bindgen-backend" version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.66", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.66", + "wasm-bindgen-shared", ] [[package]] @@ -1939,72 +3527,6 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" -[[package]] -name = "wasm-timer" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" -dependencies = [ - "futures", - "js-sys", - "parking_lot 0.11.2", - "pin-utils", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wayland-client" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" -dependencies = [ - "bitflags", - "downcast-rs", - "libc", - "nix 0.24.3", - "scoped-tls", - "wayland-commons", - "wayland-scanner", - "wayland-sys", -] - -[[package]] -name = "wayland-commons" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" -dependencies = [ - "nix 0.24.3", - "once_cell", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-cursor" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" -dependencies = [ - "nix 0.24.3", - "wayland-client", - "xcursor", -] - -[[package]] -name = "wayland-protocols" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" -dependencies = [ - "bitflags", - "wayland-client", - "wayland-commons", - "wayland-scanner", -] - [[package]] name = "wayland-scanner" version = "0.29.5" @@ -2016,17 +3538,6 @@ dependencies = [ "xml-rs", ] -[[package]] -name = "wayland-sys" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" -dependencies = [ - "dlib", - "lazy_static", - "pkg-config", -] - [[package]] name = "web-sys" version = "0.3.69" @@ -2078,6 +3589,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "winapi-wsapoll" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1eafc5f679c576995526e81635d0cf9695841736712b4e892f87abbe6fed3f28" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -2093,6 +3613,75 @@ dependencies = [ "windows-targets 0.42.2", ] +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-implement" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2ee588991b9e7e6c8338edf3333fbe4da35dc72092643958ebb43f0ab2c49c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "windows-interface" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6fb8df20c9bcaa8ad6ab513f7b40104840c8867d5751126e4df3b08388d0cc7" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.5", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -2123,6 +3712,22 @@ dependencies = [ "windows_x86_64_msvc 0.48.5", ] +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -2135,6 +3740,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -2147,6 +3758,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -2159,6 +3776,18 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -2171,6 +3800,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -2183,6 +3818,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -2195,6 +3836,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -2207,6 +3854,42 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "winit" +version = "0.28.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9596d90b45384f5281384ab204224876e8e8bf7d58366d9b795ad99aa9894b94" +dependencies = [ + "android-activity", + "bitflags 1.3.2", + "cfg_aliases", + "core-foundation", + "core-graphics", + "dispatch", + "instant", + "libc", + "log", + "mio", + "ndk", + "objc2", + "once_cell", + "orbclient", + "percent-encoding", + "raw-window-handle", + "redox_syscall 0.3.5", + "wasm-bindgen", + "wayland-scanner", + "web-sys", + "windows-sys 0.45.0", + "x11-dl", +] + [[package]] name = "winnow" version = "0.5.31" @@ -2228,33 +3911,55 @@ dependencies = [ [[package]] name = "x11-clipboard" -version = "0.5.3" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473068b7b80ac86a18328824f1054e5e007898c47b5bbc281bd7abe32bc3653c" +checksum = "980b9aa9226c3b7de8e2adb11bf20124327c054e0e5812d2aac0b5b5a87e7464" dependencies = [ - "xcb 0.10.1", + "x11rb", ] [[package]] -name = "xcb" -version = "0.9.0" +name = "x11-dl" +version = "2.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62056f63138b39116f82a540c983cc11f1c90cd70b3d492a70c25eaa50bd22a6" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" dependencies = [ "libc", - "log", - "x11", + "once_cell", + "pkg-config", ] [[package]] -name = "xcb" +name = "x11rb" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771e2b996df720cd1c6dd9ff90f62d91698fd3610cc078388d0564bdd6622a9c" +checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507" +dependencies = [ + "gethostname", + "nix 0.24.3", + "winapi", + "winapi-wsapoll", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56b245751c0ac9db0e006dc812031482784e434630205a93c73cfefcaabeac67" +dependencies = [ + "nix 0.24.3", +] + +[[package]] +name = "xcb" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62056f63138b39116f82a540c983cc11f1c90cd70b3d492a70c25eaa50bd22a6" dependencies = [ "libc", "log", - "quick-xml", + "x11", ] [[package]] @@ -2264,20 +3969,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43893e47f27bf7d81d489feef3a0e34a457e90bc314b7e74ad9bb3980e4c1c48" dependencies = [ "libc", - "xcb 0.9.0", + "xcb", ] [[package]] -name = "xcursor" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911" - -[[package]] -name = "xi-unicode" -version = "0.3.0" +name = "xdg-home" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" +checksum = "ca91dcf8f93db085f3a0a29358cd0b9d670915468f4290e8b85d118a34211ab8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] [[package]] name = "xml-rs" @@ -2291,3 +3994,119 @@ version = "0.1.0" dependencies = [ "nih_plug_xtask", ] + +[[package]] +name = "yazi" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" + +[[package]] +name = "zbus" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io 1.13.0", + "async-lock 2.8.0", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "byteorder", + "derivative", + "enumflags2", + "event-listener 2.5.3", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.26.4", + "once_cell", + "ordered-stream", + "rand 0.8.5", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "winapi", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "regex", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zeno" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" + +[[package]] +name = "zvariant" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" +dependencies = [ + "byteorder", + "enumflags2", + "libc", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] diff --git a/plugins/ts404/Cargo.toml b/plugins/ts404/Cargo.toml index 5107ddf..f074ca8 100644 --- a/plugins/ts404/Cargo.toml +++ b/plugins/ts404/Cargo.toml @@ -17,7 +17,7 @@ crate-type = ["cdylib"] enum-map = "2.7.3" nalgebra = "0.32.3" nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git" } -nih_plug_iced = { git = "https://github.com/robbert-vdh/nih-plug.git" } +nih_plug_vizia = { git = "https://github.com/robbert-vdh/nih-plug.git" } num-traits = "0.2.17" numeric_literals = "0.2.0" #valib = { git = "https://github.com/SolarLiner/valib.git" } diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index 8d2e79e..2a1b60e 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -219,7 +219,7 @@ where .to_f32() .unwrap_or_default(); let rms = self.led_rms.add_element(delta); - self.led_display.store(rms, Ordering::SeqCst); + self.led_display.store(rms, Ordering::Relaxed); y } } diff --git a/plugins/ts404/src/editor/components/knob.rs b/plugins/ts404/src/editor/components/knob.rs new file mode 100644 index 0000000..f6785b8 --- /dev/null +++ b/plugins/ts404/src/editor/components/knob.rs @@ -0,0 +1,281 @@ +use std::f32::consts::{FRAC_PI_2, TAU}; + +use nih_plug::{nih_log, prelude::Param}; +use nih_plug_vizia::{ + vizia::{prelude::*, vg}, + widgets::param_base::ParamWidgetBase, +}; + +enum KnobEvents { + SetValueNormalized(f32), + EnterValuePlain(String), +} + +struct Arc { + widget_base: ParamWidgetBase, + get_normalized_value: Box f32>, + bipolar: bool, +} + +impl Arc { + pub fn new( + cx: &mut Context, + bipolar: bool, + params: impl Lens, + get_param: impl 'static + Copy + Fn(&Params) -> &P, + get_normalized_value: impl 'static + Fn(&ParamWidgetBase) -> f32, + ) -> Handle { + Self { + widget_base: ParamWidgetBase::new(cx, params, get_param), + bipolar, + get_normalized_value: Box::new(get_normalized_value), + } + .build(cx, |_| ()) + } +} + +fn get_element_radius(bounds: BoundingBox) -> f32 { + bounds.w.min(bounds.h) / 2. - 3. +} + +impl View for Arc { + fn element(&self) -> Option<&'static str> { + Some("arc") + } + + fn draw(&self, cx: &mut DrawContext, canvas: &mut Canvas) { + let bounds = cx.bounds(); + + let mut path = vg::Path::new(); + let (ctx, cty) = bounds.center(); + let radius = get_element_radius(bounds); + let start = if self.bipolar { + 3. * FRAC_PI_2 + } else { + 135f32.to_radians() + }; + let value = (self.get_normalized_value)(&self.widget_base); + let end = get_angle(value); + let solidity = if self.bipolar && value < 0.5 { + vg::Solidity::Solid + } else { + vg::Solidity::Hole + }; + path.arc(ctx, cty, radius, start, end, solidity); + let (s, c) = (-end + FRAC_PI_2).sin_cos(); + path.move_to(ctx, cty); + path.line_to(ctx + radius * s, cty + radius * c); + canvas.stroke_path(&path, &get_stroke(cx)); + } +} + +fn get_stroke(cx: &mut DrawContext) -> vg::Paint { + vg::Paint::color(cx.font_color().into()).with_line_width(cx.border_width()) +} + +fn get_angle(t: f32) -> f32 { + let deg = 135f32 + t * 270f32; + deg.to_radians() % TAU +} + +struct Ring { + widget_base: ParamWidgetBase, +} + +impl Ring { + pub fn new( + cx: &mut Context, + params: impl Lens, + get_param: impl 'static + Copy + Fn(&Params) -> &P, + ) -> Handle { + Self { + widget_base: ParamWidgetBase::new(cx, params, get_param), + } + .build(cx, |_| ()) + } +} + +impl View for Ring { + fn element(&self) -> Option<&'static str> { + Some("ring") + } + + fn draw(&self, ctx: &mut DrawContext, canvas: &mut Canvas) { + let bounds = ctx.bounds(); + let unmodulated = get_angle(self.widget_base.unmodulated_normalized_value()); + let modulated = get_angle(self.widget_base.modulated_normalized_value()); + let mut path = vg::Path::new(); + let (cx, cy) = bounds.center(); + path.arc( + cx, + cy, + get_element_radius(bounds), + unmodulated.min(modulated), + unmodulated.max(modulated), + if (unmodulated - modulated).abs() < 0.5 { + vg::Solidity::Solid + } else { + vg::Solidity::Hole + }, + ); + canvas.stroke_path(&path, &get_stroke(ctx)); + } +} + +#[derive(Debug, Clone, Lens)] +struct KnobModel { + display_textbox: bool, + text: String, +} + +enum KnobModelEvent { + SetDisplayTextbox(bool), +} + +impl Model for KnobModel { + fn event(&mut self, _cx: &mut EventContext, event: &mut Event) { + event.map(|ev, _| match ev { + &KnobModelEvent::SetDisplayTextbox(disp) => { + self.display_textbox = disp; + if !disp { + self.text.clear(); + } + } + }); + } +} + +pub struct Knob { + widget_base: ParamWidgetBase, + drag_start: Option<(f32, f32)>, +} + +impl Knob { + pub fn new( + cx: &mut Context, + bipolar: bool, + params: impl Lens, + get_param: impl 'static + Copy + Fn(&Params) -> &P, + ) -> Handle { + Self { + widget_base: ParamWidgetBase::new(cx, params, get_param), + drag_start: None, + } + .build(cx, |cx| { + KnobModel { + display_textbox: false, + text: String::new(), + } + .build(cx); + ZStack::new(cx, |cx| { + Arc::new(cx, bipolar, params, get_param, |w| { + w.unmodulated_normalized_value() + }) + .class("unmodulated"); + Arc::new(cx, bipolar, params, get_param, |w| { + w.modulated_normalized_value() + }) + .class("modulated"); + Ring::new(cx, params, get_param).z_index(2); + //Textbox::new(cx, KnobModel::text) + // .class("textbox") + // .display(KnobModel::display_textbox.map(|display| { + // if *display { + // Display::Flex + // } else { + // Display::None + // } + // })) + // .on_submit(|cx, data, _| { + // cx.emit(KnobModelEvent::SetDisplayTextbox(false)); + // cx.emit(KnobEvents::EnterValuePlain(data)); + // }) + // .on_blur(|cx| cx.emit(KnobModelEvent::SetDisplayTextbox(false))); + }) + .z_index(1); + }) + } +} + +impl View for Knob { + fn element(&self) -> Option<&'static str> { + Some("knob") + } + + fn event(&mut self, cx: &mut EventContext, event: &mut Event) { + event.map(|event, _| match event { + WindowEvent::MouseDown(MouseButton::Left) + if !cx.modifiers().contains(Modifiers::CTRL) => + { + self.drag_start = Some(( + cx.mouse().cursory, + self.widget_base.unmodulated_normalized_value(), + )); + self.widget_base.begin_set_parameter(cx); + cx.capture(); + cx.set_active(true); + } + WindowEvent::MouseUp(MouseButton::Left) => { + self.drag_start = None; + cx.release(); + self.widget_base.end_set_parameter(cx); + } + &WindowEvent::MouseMove(_, y) => { + if let Some((start_y, start_normalized_value)) = self.drag_start { + let speed = if cx.modifiers().contains(Modifiers::SHIFT) { + 5e-4 + } else { + 5e-3 + }; + let normalized_value = start_normalized_value - speed * (y - start_y); + nih_log!("Normalized value: {normalized_value}"); + self.widget_base.set_normalized_value(cx, normalized_value); + } + } + &WindowEvent::MouseScroll(_, y) => { + let step = if cx.modifiers().contains(Modifiers::SHIFT) { + 0.01 + } else { + 0.1 + }; + let normalized_value = self.widget_base.unmodulated_normalized_value() + y * step; + self.widget_base.begin_set_parameter(cx); + self.widget_base.set_normalized_value(cx, normalized_value); + self.widget_base.end_set_parameter(cx); + } + WindowEvent::MouseDown(MouseButton::Left) + if cx.modifiers().contains(Modifiers::CTRL) => + { + cx.emit(KnobModelEvent::SetDisplayTextbox(true)); + } + WindowEvent::MouseDoubleClick(MouseButton::Left) => { + self.widget_base.begin_set_parameter(cx); + self.widget_base + .set_normalized_value(cx, self.widget_base.default_normalized_value()); + self.widget_base.end_set_parameter(cx); + } + WindowEvent::KeyUp(Code::Escape, _) => { + cx.emit(KnobModelEvent::SetDisplayTextbox(false)); + cx.release(); + } + _ => {} + }); + event.map(|event, _| { + self.widget_base.begin_set_parameter(cx); + match event { + KnobEvents::EnterValuePlain(value) => { + if let Some(normalized) = self.widget_base.string_to_normalized_value(value) { + cx.emit(KnobEvents::SetValueNormalized(normalized)); + cx.emit(KnobModelEvent::SetDisplayTextbox(false)); + } + } + &KnobEvents::SetValueNormalized(value) => { + self.widget_base.begin_set_parameter(cx); + self.widget_base.set_normalized_value(cx, value); + self.widget_base.end_set_parameter(cx); + } + } + self.widget_base.end_set_parameter(cx); + }); + } +} \ No newline at end of file diff --git a/plugins/ts404/src/editor/components/led.rs b/plugins/ts404/src/editor/components/led.rs new file mode 100644 index 0000000..af1209b --- /dev/null +++ b/plugins/ts404/src/editor/components/led.rs @@ -0,0 +1,44 @@ +use std::sync::Arc; +use std::sync::atomic::Ordering; + +use nih_plug::prelude::AtomicF32; +use nih_plug_vizia::vizia::prelude::*; +use nih_plug_vizia::vizia::vg; + +pub(crate) struct Led { + drive_led: Arc, +} + +impl Led { + pub(crate) fn new(cx: &mut Context, drive_led: Arc) -> Handle { + Self { drive_led }.build(cx, |_| ()) + } +} + +impl View for Led { + fn element(&self) -> Option<&'static str> { + Some("led") + } + + fn draw(&self, cx: &mut DrawContext, canvas: &mut Canvas) { + let bounds = cx.bounds(); + let (x, y) = bounds.center(); + let size = bounds.w.min(bounds.h) / 2.; + + let color = cx.background_color(); + let drive_led = self.drive_led.load(Ordering::Relaxed); + let brightness = 1. - f32::exp(-drive_led / 50.); + let paint = vg::Paint::color(vg::Color::rgba( + color.r(), + color.g(), + color.b(), + (brightness * 255.) as _, + )); + + let mut path = vg::Path::new(); + path.circle(x, y, size); + + canvas.scissor(bounds.x, bounds.y, bounds.w, bounds.h); + canvas.fill_path(&path, &paint); + } +} diff --git a/plugins/ts404/src/editor/components/mod.rs b/plugins/ts404/src/editor/components/mod.rs new file mode 100644 index 0000000..a815ebc --- /dev/null +++ b/plugins/ts404/src/editor/components/mod.rs @@ -0,0 +1,2 @@ +pub(super) mod knob; +pub(super) mod led; \ No newline at end of file diff --git a/plugins/ts404/src/editor/led.rs b/plugins/ts404/src/editor/led.rs deleted file mode 100644 index eec66d6..0000000 --- a/plugins/ts404/src/editor/led.rs +++ /dev/null @@ -1,84 +0,0 @@ -use nih_plug_iced::layout::{Limits, Node}; -use nih_plug_iced::renderer::{Quad, Style}; -use nih_plug_iced::{renderer, Color, Element, Layout, Length, Point, Rectangle, Size, Widget}; - -pub(crate) struct Led { - size: Length, - brightness: f32, - color: Color, -} - -impl Led { - pub(crate) fn new(vin: f32) -> Self { - Self { - size: Length::Units(20), - brightness: 1.0 - f32::exp(-vin), - color: Color::from_rgb(1.0, 0.0, 0.0), - } - } - - pub(crate) fn size(mut self, size: Length) -> Self { - self.size = size; - self - } - - pub(crate) fn color(mut self, color: Color) -> Self { - self.color = color; - self - } -} - -impl Widget for Led { - fn width(&self) -> Length { - self.size - } - - fn height(&self) -> Length { - self.size - } - - fn layout(&self, _renderer: &Renderer, limits: &Limits) -> Node { - Node::new( - limits - .width(self.size) - .height(self.size) - .resolve(Size::ZERO), - ) - } - - fn draw( - &self, - renderer: &mut Renderer, - _style: &Style, - layout: Layout<'_>, - _cursor_position: Point, - _viewport: &Rectangle, - ) { - let bounds = layout.bounds(); - let radius = bounds.width; - let color = Color { - a: self.brightness, - ..self.color - }; - renderer.fill_quad( - Quad { - bounds, - border_radius: radius, - border_width: 0.0, - border_color: Color::TRANSPARENT, - }, - color, - ); - } -} - -impl<'a, Message: 'a + Clone> From for Element<'a, Message> { - fn from(value: Led) -> Self { - Element::new(value) - } -} - -fn scale_color(col: Color, amt: f32) -> Color { - let [r, g, b] = [col.r, col.g, col.b].map(|x| x * amt); - Color::from_rgba(r, g, b, col.a) -} diff --git a/plugins/ts404/src/editor/mod.rs b/plugins/ts404/src/editor/mod.rs index 4206bde..ab95dcb 100644 --- a/plugins/ts404/src/editor/mod.rs +++ b/plugins/ts404/src/editor/mod.rs @@ -1,88 +1,117 @@ -use std::sync::atomic::Ordering; use std::sync::Arc; use nih_plug::prelude::*; -use nih_plug_iced::{ - create_iced_editor, executor, widgets, Alignment, Column, Command, Element, IcedEditor, - IcedState, Length, Text, WindowQueue, -}; +use nih_plug_vizia::{create_vizia_editor, ViziaState, ViziaTheming}; +use nih_plug_vizia::vizia::prelude::*; +use nih_plug_vizia::vizia::views::VStack; -use widgets::generic_ui::{GenericSlider, GenericUi}; +use components::{knob::Knob, led::Led}; -use crate::editor::led::Led; use crate::params::Ts404Params; -mod led; +mod components; -pub(crate) fn default_state() -> Arc { - IcedState::from_size(200, 300) +pub(crate) fn default_state() -> Arc { + ViziaState::new(|| (200, 350)) } pub(crate) fn create( params: Arc, drive_led: Arc, ) -> Option> { - create_iced_editor::(params.editor_state.clone(), (params, drive_led)) + create_vizia_editor( + params.editor_state.clone(), + ViziaTheming::Builtin, + move |cx, _gui_cx| { + cx.add_stylesheet(include_style!("src/editor/style.css")) + .expect("Failed to load stylesheet"); + AppData { + params: params.clone(), + drive_led: drive_led.clone(), + } + .build(cx); + Binding::new(cx, AppData::params, |cx, params| { + VStack::new(cx, |cx| { + HStack::new(cx, |cx| { + labelled_node_float(cx, false, params, |params| ¶ms.dist); + labelled_node_float(cx, false, params, |params| ¶ms.tone); + labelled_node_float(cx, false, params, |params| ¶ms.out_level); + }); + HStack::new(cx, |cx| { + labelled_node_float_generic( + cx, + params, + |params| ¶ms.drive, + |cx| { + ZStack::new(cx, |cx| { + Knob::new(cx, false, params, |params| ¶ms.drive); + Binding::new(cx, AppData::drive_led, |cx, drive_led| { + Led::new(cx, drive_led.get(cx)); + }); + }) + .child_space(Pixels(0.)); + }, + ); + labelled_node_float(cx, false, params, |params| ¶ms.component_matching); + }) + .class("small"); + }) + .id("ui"); + }) + }, + ) } -struct Ts404Editor { +#[derive(Lens)] +struct AppData { params: Arc, - context: Arc, - generic_ui: widgets::generic_ui::State, drive_led: Arc, } -#[derive(Debug, Copy, Clone)] -enum EditorMessage { - ParamUpdate(widgets::ParamMessage), -} - -impl IcedEditor for Ts404Editor { - type Executor = executor::Default; - type Message = EditorMessage; - type InitializationFlags = (Arc, Arc); - - fn new( - (params, drive_led): Self::InitializationFlags, - context: Arc, - ) -> (Self, Command) { - let editor = Self { - params, - context, - drive_led, - generic_ui: Default::default(), - }; - (editor, Command::none()) - } +impl Model for AppData {} - fn context(&self) -> &dyn GuiContext { - self.context.as_ref() - } - - fn update( - &mut self, - _window: &mut WindowQueue, - message: Self::Message, - ) -> Command { - match message { - EditorMessage::ParamUpdate(msg) => self.handle_param_message(msg), - } - Command::none() - } +fn labelled_node_float( + cx: &mut Context, + bipolar: bool, + params: impl Lens>, + get_param: impl 'static + Copy + Fn(&Arc) -> &P, +) -> Handle<'_, impl View> +where + P::Plain: Data + ToString, +{ + labelled_node_float_generic(cx, params, get_param, move |cx| { + Knob::new(cx, bipolar, params, get_param); + }) +} - fn view(&mut self) -> Element<'_, Self::Message> { - let led = self.drive_led.load(Ordering::SeqCst); - nih_log!("Editor view: {led}"); - Column::new() - .push( - GenericUi::new(&mut self.generic_ui, self.params.clone()) - .width(Length::Units(200)) - .height(Length::Fill) - .map(EditorMessage::ParamUpdate), - ) - .push(Led::new(led / 20.0)) - .width(Length::Fill) - .height(Length::Fill) - .into() - } +fn labelled_node_float_generic( + cx: &mut Context, + params: impl Lens>, + get_param: impl 'static + Copy + Fn(&Arc) -> &P, + knob_impl: impl Fn(&mut Context), +) -> Handle<'_, impl View> +where + P::Plain: Data + ToString, +{ + VStack::new(cx, move |cx| { + knob_impl(cx); + Label::new( + cx, + params.map(move |params| get_param(params).name().to_string()), + ) + .text_align(TextAlign::Center) + .max_width(Pixels(60.)); + }) + .class("param") + .child_space(Stretch(1.0)) + .col_between(Pixels(8.0)) + .text_align(TextAlign::Center) + .tooltip(|cx| { + Tooltip::new(cx, |cx| { + Label::new( + cx, + params.map(move |p| get_param(p).unmodulated_plain_value()), + ); + }); + }) } diff --git a/plugins/ts404/src/editor/style.css b/plugins/ts404/src/editor/style.css new file mode 100644 index 0000000..00e7fdf --- /dev/null +++ b/plugins/ts404/src/editor/style.css @@ -0,0 +1,46 @@ +#ui { + background-color: #207242; + color: #fff; +} + +knob { + border-radius: 100%; + width: 35px; + height: 35px; + border-width: 1px; + background-image: linear-gradient(to bottom, #404040 0%, #262626 100%); + box-shadow: 0 4px 4px rgba(0, 0, 0, 0.25); +} + +knob arc { + width: 51px; + height: 51px; +} + +arc.unmodulated { + color: #F2C94C; +} + +.small knob { + width: 21px; + height: 21px; +} + +.param label { + width: 100%; + font-size: 12pt; + color: #ffffff; +} + +.param.small label { + font-size: 10pt; +} + +led { + position: relative; + top: 2px; + left: 2px; + width: 16px; + height: 16px; + color: red; +} diff --git a/plugins/ts404/src/params.rs b/plugins/ts404/src/params.rs index 8a633ea..2754ec7 100644 --- a/plugins/ts404/src/params.rs +++ b/plugins/ts404/src/params.rs @@ -3,9 +3,9 @@ use nih_plug::formatters; use nih_plug::params::{BoolParam, FloatParam, Params}; use nih_plug::prelude::{AtomicF32, FloatRange}; use nih_plug::util::{gain_to_db, MINUS_INFINITY_DB, MINUS_INFINITY_GAIN}; -use nih_plug_iced::IcedState; use std::sync::mpsc::{channel, Receiver, Sender}; use std::sync::Arc; +use nih_plug_vizia::ViziaState; use valib::contrib::nih_plug::BindToParameter; use valib::dsp::parameter::RemoteControl; @@ -26,7 +26,7 @@ pub(crate) struct Ts404Params { #[id = "byp_io"] pub(crate) io_bypass: BoolParam, #[persist = "editor_state"] - pub(crate) editor_state: Arc, + pub(crate) editor_state: Arc, } impl Ts404Params { @@ -56,7 +56,7 @@ impl Ts404Params { .with_string_to_value(formatters::s2v_f32_percentage()) .bind_to_parameter(remote, DspParams::Tone), out_level: FloatParam::new( - "Output Level", + "Output", 0.158, FloatRange::Skewed { min: MINUS_INFINITY_GAIN, @@ -64,16 +64,16 @@ impl Ts404Params { factor: FloatRange::gain_skew_factor(MINUS_INFINITY_DB, gain_to_db(1.0)), }, ) - .with_unit("dB") + .with_unit(" dB") .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) .with_string_to_value(formatters::s2v_f32_gain_to_db()) .bind_to_parameter(remote, DspParams::OutputGain), component_matching: FloatParam::new( - "Component Matching", + "Age", 1., FloatRange::Linear { min: 0.0, max: 1.0 }, ) - .with_unit("%") + .with_unit(" %") .with_string_to_value(formatters::s2v_f32_percentage()) .with_value_to_string(formatters::v2s_f32_percentage(0)) .bind_to_parameter(remote, DspParams::ComponentMismatch), From a9cf1e41bb6225bf48533d50d57248f6204fd708 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Sat, 15 Jun 2024 00:45:19 +0200 Subject: [PATCH 22/51] wip(editor): alternative layout and knob display --- plugins/ts404/src/editor/components/knob.rs | 146 ++++++++++++-------- plugins/ts404/src/editor/components/led.rs | 10 +- plugins/ts404/src/editor/mod.rs | 16 +-- plugins/ts404/src/editor/style.css | 18 ++- 4 files changed, 115 insertions(+), 75 deletions(-) diff --git a/plugins/ts404/src/editor/components/knob.rs b/plugins/ts404/src/editor/components/knob.rs index f6785b8..bc848f9 100644 --- a/plugins/ts404/src/editor/components/knob.rs +++ b/plugins/ts404/src/editor/components/knob.rs @@ -8,7 +8,7 @@ use nih_plug_vizia::{ enum KnobEvents { SetValueNormalized(f32), - EnterValuePlain(String), + //EnterValuePlain(String), } struct Arc { @@ -21,7 +21,7 @@ impl Arc { pub fn new( cx: &mut Context, bipolar: bool, - params: impl Lens, + params: impl Lens, get_param: impl 'static + Copy + Fn(&Params) -> &P, get_normalized_value: impl 'static + Fn(&ParamWidgetBase) -> f32, ) -> Handle { @@ -30,7 +30,7 @@ impl Arc { bipolar, get_normalized_value: Box::new(get_normalized_value), } - .build(cx, |_| ()) + .build(cx, |_| ()) } } @@ -85,13 +85,13 @@ struct Ring { impl Ring { pub fn new( cx: &mut Context, - params: impl Lens, + params: impl Lens, get_param: impl 'static + Copy + Fn(&Params) -> &P, ) -> Handle { Self { widget_base: ParamWidgetBase::new(cx, params, get_param), } - .build(cx, |_| ()) + .build(cx, |_| ()) } } @@ -145,6 +145,31 @@ impl Model for KnobModel { } } +struct Dot { + widget_base: ParamWidgetBase, +} + +impl View for Dot { + fn element(&self) -> Option<&'static str> { + Some("dot") + } + fn draw(&self, cx: &mut DrawContext, canvas: &mut Canvas) { + let bounds = cx.bounds(); + let (x, y) = bounds.center(); + let r = bounds.w.min(bounds.h) * 0.35; + let value = self.widget_base.unmodulated_normalized_value(); + let angle = get_angle(0.7 - value); + let (x, y) = (x + r * angle.sin(), y + r * angle.cos()); + + let color = cx.font_color(); + let paint = vg::Paint::color(color.into()); + let mut path = vg::Path::new(); + path.circle(x, y, 3.3); + + canvas.fill_path(&path, &paint); + } +} + pub struct Knob { widget_base: ParamWidgetBase, drag_start: Option<(f32, f32)>, @@ -154,46 +179,51 @@ impl Knob { pub fn new( cx: &mut Context, bipolar: bool, - params: impl Lens, + params: impl Lens, get_param: impl 'static + Copy + Fn(&Params) -> &P, ) -> Handle { Self { widget_base: ParamWidgetBase::new(cx, params, get_param), drag_start: None, } - .build(cx, |cx| { - KnobModel { - display_textbox: false, - text: String::new(), - } - .build(cx); - ZStack::new(cx, |cx| { - Arc::new(cx, bipolar, params, get_param, |w| { - w.unmodulated_normalized_value() - }) - .class("unmodulated"); - Arc::new(cx, bipolar, params, get_param, |w| { - w.modulated_normalized_value() - }) - .class("modulated"); - Ring::new(cx, params, get_param).z_index(2); - //Textbox::new(cx, KnobModel::text) - // .class("textbox") - // .display(KnobModel::display_textbox.map(|display| { - // if *display { - // Display::Flex - // } else { - // Display::None - // } - // })) - // .on_submit(|cx, data, _| { - // cx.emit(KnobModelEvent::SetDisplayTextbox(false)); - // cx.emit(KnobEvents::EnterValuePlain(data)); - // }) - // .on_blur(|cx| cx.emit(KnobModelEvent::SetDisplayTextbox(false))); + .build(cx, |cx| { + KnobModel { + display_textbox: false, + text: String::new(), + } + .build(cx); + ZStack::new(cx, |cx| { + Arc::new(cx, bipolar, params, get_param, |w| { + w.unmodulated_normalized_value() + }) + .class("unmodulated"); + Arc::new(cx, bipolar, params, get_param, |w| { + w.modulated_normalized_value() }) - .z_index(1); + .class("modulated"); + Ring::new(cx, params, get_param).z_index(2); + Dot { + widget_base: ParamWidgetBase::new(cx, params, get_param), + } + .build(cx, |_| ()) + .z_index(3); + //Textbox::new(cx, KnobModel::text) + // .class("textbox") + // .display(KnobModel::display_textbox.map(|display| { + // if *display { + // Display::Flex + // } else { + // Display::None + // } + // })) + // .on_submit(|cx, data, _| { + // cx.emit(KnobModelEvent::SetDisplayTextbox(false)); + // cx.emit(KnobEvents::EnterValuePlain(data)); + // }) + // .on_blur(|cx| cx.emit(KnobModelEvent::SetDisplayTextbox(false))); }) + .z_index(1); + }) } } @@ -205,16 +235,16 @@ impl View for Knob { fn event(&mut self, cx: &mut EventContext, event: &mut Event) { event.map(|event, _| match event { WindowEvent::MouseDown(MouseButton::Left) - if !cx.modifiers().contains(Modifiers::CTRL) => - { - self.drag_start = Some(( - cx.mouse().cursory, - self.widget_base.unmodulated_normalized_value(), - )); - self.widget_base.begin_set_parameter(cx); - cx.capture(); - cx.set_active(true); - } + if !cx.modifiers().contains(Modifiers::CTRL) => + { + self.drag_start = Some(( + cx.mouse().cursory, + self.widget_base.unmodulated_normalized_value(), + )); + self.widget_base.begin_set_parameter(cx); + cx.capture(); + cx.set_active(true); + } WindowEvent::MouseUp(MouseButton::Left) => { self.drag_start = None; cx.release(); @@ -244,10 +274,10 @@ impl View for Knob { self.widget_base.end_set_parameter(cx); } WindowEvent::MouseDown(MouseButton::Left) - if cx.modifiers().contains(Modifiers::CTRL) => - { - cx.emit(KnobModelEvent::SetDisplayTextbox(true)); - } + if cx.modifiers().contains(Modifiers::CTRL) => + { + cx.emit(KnobModelEvent::SetDisplayTextbox(true)); + } WindowEvent::MouseDoubleClick(MouseButton::Left) => { self.widget_base.begin_set_parameter(cx); self.widget_base @@ -263,12 +293,12 @@ impl View for Knob { event.map(|event, _| { self.widget_base.begin_set_parameter(cx); match event { - KnobEvents::EnterValuePlain(value) => { - if let Some(normalized) = self.widget_base.string_to_normalized_value(value) { - cx.emit(KnobEvents::SetValueNormalized(normalized)); - cx.emit(KnobModelEvent::SetDisplayTextbox(false)); - } - } + //KnobEvents::EnterValuePlain(value) => { + // if let Some(normalized) = self.widget_base.string_to_normalized_value(value) { + // cx.emit(KnobEvents::SetValueNormalized(normalized)); + // cx.emit(KnobModelEvent::SetDisplayTextbox(false)); + // } + //} &KnobEvents::SetValueNormalized(value) => { self.widget_base.begin_set_parameter(cx); self.widget_base.set_normalized_value(cx, value); @@ -278,4 +308,4 @@ impl View for Knob { self.widget_base.end_set_parameter(cx); }); } -} \ No newline at end of file +} diff --git a/plugins/ts404/src/editor/components/led.rs b/plugins/ts404/src/editor/components/led.rs index af1209b..bb48ec5 100644 --- a/plugins/ts404/src/editor/components/led.rs +++ b/plugins/ts404/src/editor/components/led.rs @@ -25,13 +25,13 @@ impl View for Led { let (x, y) = bounds.center(); let size = bounds.w.min(bounds.h) / 2.; - let color = cx.background_color(); + let color = cx.font_color(); let drive_led = self.drive_led.load(Ordering::Relaxed); - let brightness = 1. - f32::exp(-drive_led / 50.); + let brightness = 1. - f32::exp(-drive_led / 150.); let paint = vg::Paint::color(vg::Color::rgba( - color.r(), - color.g(), - color.b(), + (color.r() as f32 * (1. + brightness)) as u8, + (color.g() as f32 * (1. + brightness)) as u8, + (color.b() as f32 * (1. + brightness)) as u8, (brightness * 255.) as _, )); diff --git a/plugins/ts404/src/editor/mod.rs b/plugins/ts404/src/editor/mod.rs index ab95dcb..5d443f0 100644 --- a/plugins/ts404/src/editor/mod.rs +++ b/plugins/ts404/src/editor/mod.rs @@ -32,26 +32,26 @@ pub(crate) fn create( .build(cx); Binding::new(cx, AppData::params, |cx, params| { VStack::new(cx, |cx| { - HStack::new(cx, |cx| { - labelled_node_float(cx, false, params, |params| ¶ms.dist); - labelled_node_float(cx, false, params, |params| ¶ms.tone); - labelled_node_float(cx, false, params, |params| ¶ms.out_level); - }); HStack::new(cx, |cx| { labelled_node_float_generic( cx, params, - |params| ¶ms.drive, + |params| ¶ms.dist, |cx| { ZStack::new(cx, |cx| { - Knob::new(cx, false, params, |params| ¶ms.drive); + Knob::new(cx, false, params, |params| ¶ms.dist); Binding::new(cx, AppData::drive_led, |cx, drive_led| { Led::new(cx, drive_led.get(cx)); }); }) - .child_space(Pixels(0.)); + .child_space(Pixels(0.)); }, ); + labelled_node_float(cx, false, params, |params| ¶ms.tone); + labelled_node_float(cx, false, params, |params| ¶ms.out_level); + }); + HStack::new(cx, |cx| { + labelled_node_float(cx, false, params, |params| ¶ms.drive); labelled_node_float(cx, false, params, |params| ¶ms.component_matching); }) .class("small"); diff --git a/plugins/ts404/src/editor/style.css b/plugins/ts404/src/editor/style.css index 00e7fdf..3f21da7 100644 --- a/plugins/ts404/src/editor/style.css +++ b/plugins/ts404/src/editor/style.css @@ -3,6 +3,12 @@ color: #fff; } +zstack { + position: relative; + top: 0; + left: 0; +} + knob { border-radius: 100%; width: 35px; @@ -17,6 +23,10 @@ knob arc { height: 51px; } +knob dot { + color: #797979; +} + arc.unmodulated { color: #F2C94C; } @@ -38,9 +48,9 @@ arc.unmodulated { led { position: relative; - top: 2px; - left: 2px; - width: 16px; - height: 16px; + top: 9px; + left: 9px; + width: 17px; + height: 17px; color: red; } From 3c1276b412c564615a97186d18d9ca450093a845 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Sun, 30 Jun 2024 23:08:22 +0200 Subject: [PATCH 23/51] wip: vizia gui --- plugins/ts404/.python-version | 1 + plugins/ts404/Cargo.lock | 984 ++++++++++++++++---- plugins/ts404/Cargo.toml | 4 +- plugins/ts404/Makefile.toml | 5 + plugins/ts404/rust-toolchain | 2 +- plugins/ts404/src/dsp.rs | 53 +- plugins/ts404/src/editor/components/knob.rs | 20 +- plugins/ts404/src/editor/mod.rs | 23 +- plugins/ts404/src/editor/style.css | 28 +- plugins/ts404/src/lib.rs | 2 +- plugins/ts404/src/main.rs | 6 + 11 files changed, 855 insertions(+), 273 deletions(-) create mode 100644 plugins/ts404/.python-version create mode 100644 plugins/ts404/src/main.rs diff --git a/plugins/ts404/.python-version b/plugins/ts404/.python-version new file mode 100644 index 0000000..92536a9 --- /dev/null +++ b/plugins/ts404/.python-version @@ -0,0 +1 @@ +3.12.0 diff --git a/plugins/ts404/Cargo.lock b/plugins/ts404/Cargo.lock index 3f6eb4d..b7f3e15 100644 --- a/plugins/ts404/Cargo.lock +++ b/plugins/ts404/Cargo.lock @@ -73,9 +73,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -101,6 +101,39 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" +[[package]] +name = "alsa" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2562ad8dcf0f789f65c6fdaad8a8a9708ed6b488e649da28c01656ad66b8b47" +dependencies = [ + "alsa-sys", + "bitflags 1.3.2", + "libc", + "nix 0.24.3", +] + +[[package]] +name = "alsa" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37fe60779335388a88c01ac6c3be40304d1e349de3ada3b15f7808bb90fa9dce" +dependencies = [ + "alsa-sys", + "bitflags 2.6.0", + "libc", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + [[package]] name = "android-activity" version = "0.4.3" @@ -113,9 +146,9 @@ dependencies = [ "jni-sys", "libc", "log", - "ndk", + "ndk 0.7.0", "ndk-context", - "ndk-sys", + "ndk-sys 0.4.1+23.1.7779620", "num_enum 0.6.1", ] @@ -140,11 +173,60 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" + +[[package]] +name = "anstyle-parse" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + [[package]] name = "anyhow" -version = "1.0.78" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca87830a3e3fb156dc96cfbd31cb620265dd053be734723f22b760d6cc3c3051" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "anymap" @@ -257,8 +339,8 @@ dependencies = [ "futures-io", "futures-lite 2.3.0", "parking", - "polling 3.4.0", - "rustix 0.38.28", + "polling 3.7.2", + "rustix 0.38.34", "slab", "tracing", "windows-sys 0.52.0", @@ -297,7 +379,7 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.28", + "rustix 0.38.34", "windows-sys 0.48.0", ] @@ -309,7 +391,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -324,7 +406,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.28", + "rustix 0.38.34", "signal-hook-registry", "slab", "windows-sys 0.52.0", @@ -344,7 +426,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -405,9 +487,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "az" @@ -417,9 +499,9 @@ checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -448,6 +530,26 @@ dependencies = [ "xcb-util", ] +[[package]] +name = "bindgen" +version = "0.69.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools", + "lazy_static", + "lazycell", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.68", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -456,9 +558,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "block" @@ -515,9 +617,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" dependencies = [ "bytemuck_derive", ] @@ -530,7 +632,7 @@ checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -539,6 +641,18 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + +[[package]] +name = "cache-padded" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "981520c98f422fcc584dc1a95c334e6953900b9106bc47a9839b81790009eb21" + [[package]] name = "camino" version = "1.1.7" @@ -573,12 +687,28 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "2755ff20a1d93490d26ba33a6f092a38a508398a5320df5d4b3014fcccce9410" dependencies = [ "jobserver", "libc", + "once_cell", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", ] [[package]] @@ -616,11 +746,63 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading 0.8.4", +] + +[[package]] +name = "clap" +version = "4.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" +dependencies = [ + "clap_builder", + "clap_derive", +] + [[package]] name = "clap-sys" version = "0.3.0" source = "git+https://github.com/robbert-vdh/clap-sys.git?branch=feature/cstr-macro#523a5f8a8dd021ec99e7d6e0c0ebe7741a3da9d4" +[[package]] +name = "clap_builder" +version = "4.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", + "terminal_size", +] + +[[package]] +name = "clap_derive" +version = "4.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "clap_lex" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" + [[package]] name = "clipboard-win" version = "3.1.1" @@ -667,6 +849,22 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "colorchoice" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -745,6 +943,46 @@ dependencies = [ "libc", ] +[[package]] +name = "coreaudio-rs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f01585027057ff5f0a5bf276174ae4c1594a2c5bde93d5f46a016d76270f5a9" +dependencies = [ + "bindgen", +] + +[[package]] +name = "coremidi" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a7847ca018a67204508b77cb9e6de670125075f7464fff5f673023378fa34f5" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "coremidi-sys", +] + +[[package]] +name = "coremidi-sys" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709d142e542467e028d5dc5f0374392339ab7dead0c48c129504de2ccd667e1b" +dependencies = [ + "core-foundation-sys", +] + [[package]] name = "cosmic-text" version = "0.8.0" @@ -764,6 +1002,29 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "cpal" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" +dependencies = [ + "alsa 0.9.0", + "core-foundation-sys", + "coreaudio-rs", + "dasp_sample", + "jni", + "js-sys", + "libc", + "mach2", + "ndk 0.8.0", + "ndk-context", + "oboe", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.54.0", +] + [[package]] name = "cpufeatures" version = "0.2.12" @@ -784,11 +1045,10 @@ dependencies = [ [[package]] name = "crossbeam" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eb9105919ca8e40d437fc9cbb8f1975d916f1bd28afe795a48aae32a2cc8920" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" dependencies = [ - "cfg-if", "crossbeam-channel", "crossbeam-deque", "crossbeam-epoch", @@ -798,54 +1058,46 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.10" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a9b73a36529d9c47029b9fb3a6f0ea3cc916a261195352ba19e770fc1748b2" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.17" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc6598521bb5a83d491e8c1fe51db7296019d2ca3cb93cc6c2a20369a4d78a2" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.18" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" -dependencies = [ - "cfg-if", -] +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crypto-common" @@ -881,7 +1133,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -905,7 +1157,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -916,9 +1168,15 @@ checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.66", + "syn 2.0.68", ] +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + [[package]] name = "deranged" version = "0.3.11" @@ -941,15 +1199,15 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 1.0.109", + "syn 2.0.68", ] [[package]] @@ -970,13 +1228,13 @@ checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" [[package]] name = "displaydoc" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -994,6 +1252,12 @@ dependencies = [ "dtoa", ] +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "enum-map" version = "2.7.3" @@ -1011,7 +1275,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1032,7 +1296,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1119,7 +1383,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3a2d0ff0df09856a5c1c89cc83863a1f0f994c55452186621bb57a01f270b3" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "fnv", "generational-arena", "glow", @@ -1340,9 +1604,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -1351,9 +1615,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "gl_generator" @@ -1366,6 +1630,12 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "glow" version = "0.12.3" @@ -1392,7 +1662,7 @@ dependencies = [ "glutin_egl_sys", "glutin_glx_sys", "glutin_wgl_sys", - "libloading", + "libloading 0.7.4", "objc2", "once_cell", "raw-window-handle", @@ -1454,9 +1724,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -1473,6 +1749,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -1490,7 +1772,7 @@ dependencies = [ "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.52.0", ] [[package]] @@ -1529,9 +1811,9 @@ checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown", @@ -1579,11 +1861,69 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jack" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e5a18a3c2aefb354fb77111ade228b20267bdc779de84e7a4ccf7ea96b9a6cd" +dependencies = [ + "bitflags 1.3.2", + "jack-sys", + "lazy_static", + "libc", + "log", +] + +[[package]] +name = "jack-sys" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6013b7619b95a22b576dfb43296faa4ecbe40abbdb97dfd22ead520775fc86ab" +dependencies = [ + "bitflags 1.3.2", + "lazy_static", + "libc", + "libloading 0.7.4", + "log", + "pkg-config", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] [[package]] name = "jni-sys" @@ -1632,15 +1972,21 @@ checksum = "10257499f089cd156ad82d0a9cd57d9501fa2c989068992a97eb3c27836f206b" [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.151" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libloading" @@ -1652,6 +1998,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "libloading" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" +dependencies = [ + "cfg-if", + "windows-targets 0.52.5", +] + [[package]] name = "libm" version = "0.2.8" @@ -1664,7 +2020,7 @@ version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "libc", "redox_syscall 0.4.1", ] @@ -1683,9 +2039,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -1693,9 +2049,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" @@ -1703,6 +2059,15 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "718e8fae447df0c7e1ba7f5189829e63fd536945c8988d61444c19039f16b670" +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -1730,9 +2095,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" @@ -1776,11 +2141,33 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f2dd5c7f8aaf48a76e389068ab25ed80bdbc226b887f9013844c415698c9952" +[[package]] +name = "midir" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a456444d83e7ead06ae6a5c0a215ed70282947ff3897fb45fcb052b757284731" +dependencies = [ + "alsa 0.7.1", + "bitflags 1.3.2", + "coremidi", + "js-sys", + "libc", + "wasm-bindgen", + "web-sys", + "windows 0.43.0", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", "simd-adler32", @@ -1809,9 +2196,9 @@ dependencies = [ [[package]] name = "nalgebra" -version = "0.32.3" +version = "0.32.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307ed9b18cc2423f29e83f84fd23a8e73628727990181f18641a8b5dc2ab1caa" +checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" dependencies = [ "approx", "matrixmultiply", @@ -1825,13 +2212,13 @@ dependencies = [ [[package]] name = "nalgebra-macros" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998" +checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.68", ] [[package]] @@ -1842,12 +2229,26 @@ checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" dependencies = [ "bitflags 1.3.2", "jni-sys", - "ndk-sys", + "ndk-sys 0.4.1+23.1.7779620", "num_enum 0.5.11", "raw-window-handle", "thiserror", ] +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.6.0", + "jni-sys", + "log", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum 0.7.2", + "thiserror", +] + [[package]] name = "ndk-context" version = "0.1.1" @@ -1863,6 +2264,15 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + [[package]] name = "nih_log" version = "0.3.1" @@ -1887,20 +2297,26 @@ dependencies = [ "atomic_float", "atomic_refcell", "backtrace", + "baseview", "bitflags 1.3.2", "cfg-if", + "clap", "clap-sys", "core-foundation", + "cpal", "crossbeam", + "jack", "lazy_static", "libc", "log", "midi-consts", + "midir", "nih_log", "nih_plug_derive", "objc", "parking_lot", "raw-window-handle", + "rtrb", "serde", "serde_json", "vst3-sys", @@ -1986,32 +2402,57 @@ dependencies = [ "memoffset 0.7.1", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-complex" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -2043,13 +2484,22 @@ dependencies = [ "num_enum_derive 0.6.1", ] +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive 0.7.2", +] + [[package]] name = "num_enum_derive" version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -2061,17 +2511,29 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.68", ] [[package]] name = "num_threads" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ "libc", ] @@ -2143,13 +2605,36 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" dependencies = [ "memchr", ] +[[package]] +name = "oboe" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" +dependencies = [ + "jni", + "ndk 0.8.0", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", +] + +[[package]] +name = "oboe-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" +dependencies = [ + "cc", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -2183,9 +2668,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -2193,15 +2678,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.2", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -2364,14 +2849,15 @@ dependencies = [ [[package]] name = "polling" -version = "3.4.0" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14" +checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" dependencies = [ "cfg-if", "concurrent-queue", + "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.28", + "rustix 0.38.34", "tracing", "windows-sys 0.52.0", ] @@ -2407,7 +2893,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", ] [[package]] @@ -2418,9 +2913,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.85" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -2494,7 +2989,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.15", ] [[package]] @@ -2561,6 +3056,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "reflink" version = "0.1.3" @@ -2601,18 +3105,27 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "rgb" -version = "0.8.37" +version = "0.8.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" +checksum = "a7439be6844e40133eda024efd85bf07f59d0dd2f59b10c00dd6cfb92cc5c741" dependencies = [ "bytemuck", ] +[[package]] +name = "rtrb" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99e704dd104faf2326a320140f70f0b736d607c1caa1b1748a6c568a79819109" +dependencies = [ + "cache-padded", +] + [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -2645,11 +3158,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.28" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys 0.4.14", @@ -2675,19 +3188,28 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "safe_arch" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" +checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" dependencies = [ "bytemuck", ] +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -2711,7 +3233,7 @@ checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -2771,14 +3293,14 @@ checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] name = "serde_json" -version = "1.0.109" +version = "1.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0652c533506ad7a2e353cce269330d6afd8bdfb6d75e0ace5b35aacbd7b9e9" +checksum = "e8eddb61f0697cc3989c5d64b452f5488e2b8a60fd7d5076a3045076ffef8cb0" dependencies = [ "itoa", "ryu", @@ -2793,14 +3315,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ "serde", ] @@ -2816,6 +3338,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -2850,6 +3378,16 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "skrifa" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab45fb68b53576a43d4fc0e9ec8ea64e29a4d2cc7f44506964cb75f288222e9" +dependencies = [ + "bytemuck", + "read-fonts", +] + [[package]] name = "slab" version = "0.4.9" @@ -2870,9 +3408,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" @@ -2898,11 +3436,11 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "swash" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "682a612b50baf09e8a039547ecf49e6c155690dcb751b1bcb19c93cdeb3d42d4" +checksum = "4d7773d67fe3373048cf840bfcc54ec3207cfc1e95c526b287ef2eb5eff9faf6" dependencies = [ - "read-fonts", + "skrifa", "yazi", "zeno", ] @@ -2920,9 +3458,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.66" +version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", @@ -2940,26 +3478,35 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.9.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand 2.1.0", - "redox_syscall 0.4.1", - "rustix 0.38.28", + "rustix 0.38.34", "windows-sys 0.52.0", ] [[package]] name = "termcolor" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] +[[package]] +name = "terminal_size" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" +dependencies = [ + "rustix 0.38.34", + "windows-sys 0.48.0", +] + [[package]] name = "thiserror" version = "1.0.61" @@ -2977,18 +3524,19 @@ checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] name = "time" -version = "0.3.31" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", "libc", + "num-conv", "num_threads", "powerfmt", "serde", @@ -3004,10 +3552,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] @@ -3022,9 +3571,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" dependencies = [ "tinyvec_macros", ] @@ -3044,14 +3593,14 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.19.15", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" dependencies = [ "serde", ] @@ -3069,6 +3618,17 @@ dependencies = [ "winnow", ] +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + [[package]] name = "tracing" version = "0.1.40" @@ -3088,7 +3648,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -3190,7 +3750,7 @@ checksum = "1ed7f4237ba393424195053097c1516bd4590dc82b84f2f97c5c69e12704555b" dependencies = [ "proc-macro-hack", "quote", - "syn 2.0.66", + "syn 2.0.68", "unic-langid-impl", ] @@ -3242,13 +3802,19 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "uuid" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.15", ] [[package]] @@ -3273,7 +3839,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -3312,7 +3878,7 @@ version = "0.1.0" source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" dependencies = [ "accesskit", - "bitflags 2.5.0", + "bitflags 2.6.0", "chrono", "copypasta", "cosmic-text", @@ -3376,7 +3942,7 @@ name = "vizia_style" version = "0.1.0" source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cssparser", "femtovg", "morphorm", @@ -3461,6 +4027,16 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" @@ -3494,10 +4070,22 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.92" @@ -3516,7 +4104,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3550,9 +4138,9 @@ dependencies = [ [[package]] name = "wide" -version = "0.7.13" +version = "0.7.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" +checksum = "2caba658a80831539b30698ae9862a72db6697dfdd7151e46920f5f2755c3ce2" dependencies = [ "bytemuck", "safe_arch", @@ -3560,9 +4148,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "winapi" @@ -3582,11 +4170,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -3604,6 +4192,21 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04662ed0e3e5630dfa9b26e4cb823b817f1a9addda855d973a9458c236556244" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows" version = "0.44.0" @@ -3624,6 +4227,16 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", + "windows-targets 0.52.5", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -3633,6 +4246,16 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result", + "windows-targets 0.52.5", +] + [[package]] name = "windows-implement" version = "0.48.0" @@ -3655,6 +4278,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.5", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -3876,7 +4508,7 @@ dependencies = [ "libc", "log", "mio", - "ndk", + "ndk 0.7.0", "objc2", "once_cell", "orbclient", @@ -3892,9 +4524,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.5.31" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a4882e6b134d6c28953a387571f1acdd3496830d5e36c5e3a1075580ea641c" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] @@ -4048,7 +4680,7 @@ version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "regex", @@ -4093,7 +4725,7 @@ version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", diff --git a/plugins/ts404/Cargo.toml b/plugins/ts404/Cargo.toml index f074ca8..6937eb4 100644 --- a/plugins/ts404/Cargo.toml +++ b/plugins/ts404/Cargo.toml @@ -11,12 +11,12 @@ description = "An inspired but fantasy screamer guitar pedal emulation" members = ["xtask"] [lib] -crate-type = ["cdylib"] +crate-type = ["lib", "cdylib"] [dependencies] enum-map = "2.7.3" nalgebra = "0.32.3" -nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git" } +nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git", features = ["standalone"] } nih_plug_vizia = { git = "https://github.com/robbert-vdh/nih-plug.git" } num-traits = "0.2.17" numeric_literals = "0.2.0" diff --git a/plugins/ts404/Makefile.toml b/plugins/ts404/Makefile.toml index 12e6ecb..c5fba50 100644 --- a/plugins/ts404/Makefile.toml +++ b/plugins/ts404/Makefile.toml @@ -26,6 +26,11 @@ condition = { files_modified = { input = ["./gen_statespace.py"], output = ["./s args = ["build", "-p", "ts404", "${@}"] dependencies = ["generate"] +[tasks.run] +command = "cargo" +args = ["run" ,"-p", "ts404", "${@}"] +dependencies = ["generate"] + [tasks.bundle] dependencies = ["build", "xtask-build"] command = "cargo" diff --git a/plugins/ts404/rust-toolchain b/plugins/ts404/rust-toolchain index 1d77724..f2358d1 100644 --- a/plugins/ts404/rust-toolchain +++ b/plugins/ts404/rust-toolchain @@ -1 +1 @@ -nightly-2023-11-16 +nightly-2024-06-30 diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index 2a1b60e..ac1489d 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -13,7 +13,7 @@ use valib::dsp::parameter::{HasParameters, ParamId, ParamName, RemoteControlled, use valib::dsp::{BlockAdapter, DSPMeta, DSPProcess, DSPProcessBlock}; use valib::filters::statespace::StateSpace; use valib::oversample::{Oversample, Oversampled}; -use valib::saturators::{Saturator, Slew}; +use valib::saturators::{Bjt, Saturator, Slew}; use valib::simd::{ AutoF32x2, AutoF64x2, AutoSimd, SimdBool, SimdComplexField, SimdPartialOrd, SimdValue, }; @@ -23,57 +23,6 @@ use valib::Scalar; use crate::util::Rms; use crate::TARGET_SAMPLERATE; -#[replace_float_literals(T::from_f64(literal))] -fn smooth_min(t: T, a: T, b: T) -> T { - // Polynomial - //let h = (0.5 + 0.5 * (a - b) / t).simd_clamp(0.0, 1.0); - //lerp(h, a, b) - t * h * (1.0 - h) - - // Exponential - let r = (-a / t).simd_exp2() + (-b / t).simd_exp2(); - -t * r.simd_log2() -} - -fn smooth_max(t: T, a: T, b: T) -> T { - -smooth_min(t, -a, -b) -} - -fn smooth_clamp(t: T, x: T, min: T, max: T) -> T { - smooth_max(t, min, smooth_min(t, x, max)) -} - -#[derive(Debug, Copy, Clone)] -struct Bjt { - pub vcc: T, - pub vee: T, -} - -impl Default for Bjt { - fn default() -> Self { - Self { - vcc: T::from_f64(4.5), - vee: T::from_f64(-4.5), - } - } -} - -impl Saturator for Bjt { - #[replace_float_literals(T::from_f64(literal))] - fn saturate(&self, x: T) -> T { - smooth_clamp(0.1, x - 0.770, self.vee, self.vcc) + 0.770 - } -} - -impl DSPMeta for Bjt { - type Sample = T; -} - -impl DSPProcess<1, 1> for Bjt { - fn process(&mut self, [x]: [Self::Sample; 1]) -> [Self::Sample; 1] { - [self.saturate(x)] - } -} - #[derive(Debug, Clone)] pub struct Bypass

{ pub inner: P, diff --git a/plugins/ts404/src/editor/components/knob.rs b/plugins/ts404/src/editor/components/knob.rs index bc848f9..6d0b928 100644 --- a/plugins/ts404/src/editor/components/knob.rs +++ b/plugins/ts404/src/editor/components/knob.rs @@ -172,7 +172,7 @@ impl View for Dot { pub struct Knob { widget_base: ParamWidgetBase, - drag_start: Option<(f32, f32)>, + dragging: bool, } impl Knob { @@ -184,7 +184,7 @@ impl Knob { ) -> Handle { Self { widget_base: ParamWidgetBase::new(cx, params, get_param), - drag_start: None, + dragging: false, } .build(cx, |cx| { KnobModel { @@ -237,28 +237,26 @@ impl View for Knob { WindowEvent::MouseDown(MouseButton::Left) if !cx.modifiers().contains(Modifiers::CTRL) => { - self.drag_start = Some(( - cx.mouse().cursory, - self.widget_base.unmodulated_normalized_value(), - )); + self.dragging = true; self.widget_base.begin_set_parameter(cx); cx.capture(); cx.set_active(true); } WindowEvent::MouseUp(MouseButton::Left) => { - self.drag_start = None; + self.dragging = false; cx.release(); self.widget_base.end_set_parameter(cx); } - &WindowEvent::MouseMove(_, y) => { - if let Some((start_y, start_normalized_value)) = self.drag_start { + &WindowEvent::MouseMove(..) => { + if self.dragging { let speed = if cx.modifiers().contains(Modifiers::SHIFT) { 5e-4 } else { 5e-3 }; - let normalized_value = start_normalized_value - speed * (y - start_y); - nih_log!("Normalized value: {normalized_value}"); + let normalized_value = self.widget_base.unmodulated_normalized_value() - + speed * cx.mouse().frame_delta().1; + nih_log!("[{}] Normalized value: {normalized_value}", self.widget_base.name()); self.widget_base.set_normalized_value(cx, normalized_value); } } diff --git a/plugins/ts404/src/editor/mod.rs b/plugins/ts404/src/editor/mod.rs index 5d443f0..6ea3378 100644 --- a/plugins/ts404/src/editor/mod.rs +++ b/plugins/ts404/src/editor/mod.rs @@ -33,20 +33,12 @@ pub(crate) fn create( Binding::new(cx, AppData::params, |cx, params| { VStack::new(cx, |cx| { HStack::new(cx, |cx| { - labelled_node_float_generic( - cx, - params, - |params| ¶ms.dist, - |cx| { - ZStack::new(cx, |cx| { - Knob::new(cx, false, params, |params| ¶ms.dist); - Binding::new(cx, AppData::drive_led, |cx, drive_led| { - Led::new(cx, drive_led.get(cx)); - }); - }) - .child_space(Pixels(0.)); - }, - ); + ZStack::new(cx, |cx| { + labelled_node_float(cx, false, params, |p| &p.dist); + Binding::new(cx, AppData::drive_led, |cx, drive_led| { + Led::new(cx, drive_led.get(cx)); + }); + }); labelled_node_float(cx, false, params, |params| ¶ms.tone); labelled_node_float(cx, false, params, |params| ¶ms.out_level); }); @@ -56,8 +48,9 @@ pub(crate) fn create( }) .class("small"); }) + .max_height(Pixels(150.)) .id("ui"); - }) + }); }, ) } diff --git a/plugins/ts404/src/editor/style.css b/plugins/ts404/src/editor/style.css index 3f21da7..8c3ca41 100644 --- a/plugins/ts404/src/editor/style.css +++ b/plugins/ts404/src/editor/style.css @@ -3,24 +3,19 @@ color: #fff; } -zstack { - position: relative; - top: 0; - left: 0; -} - knob { border-radius: 100%; - width: 35px; - height: 35px; + width: 51px; + height: 51px; border-width: 1px; background-image: linear-gradient(to bottom, #404040 0%, #262626 100%); box-shadow: 0 4px 4px rgba(0, 0, 0, 0.25); } knob arc { - width: 51px; - height: 51px; + width: 61px; + height: 61px; + color: #F2C94C; } knob dot { @@ -31,9 +26,13 @@ arc.unmodulated { color: #F2C94C; } +arc.modulated { + color: crimson; +} + .small knob { - width: 21px; - height: 21px; + width: 37px; + height: 37px; } .param label { @@ -47,9 +46,8 @@ arc.unmodulated { } led { - position: relative; - top: 9px; - left: 9px; + top: 68px; + left: 25px; width: 17px; height: 17px; color: red; diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index 3a5f562..d9ea57e 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -23,7 +23,7 @@ const TARGET_SAMPLERATE: f32 = 96000.; type Sample = AutoF64x2; type Sample32 = AutoF32x2; -struct Ts404 { +pub struct Ts404 { params: Arc, dsp: RemoteControlled>, } diff --git a/plugins/ts404/src/main.rs b/plugins/ts404/src/main.rs new file mode 100644 index 0000000..267ca74 --- /dev/null +++ b/plugins/ts404/src/main.rs @@ -0,0 +1,6 @@ +use nih_plug::nih_export_standalone; +use ts404::Ts404; + +fn main() { + nih_export_standalone::(); +} \ No newline at end of file From 8882d2df8a489ae6df0c3bac3ce0e4c4c527fcf6 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Thu, 4 Jul 2024 16:00:32 +0200 Subject: [PATCH 24/51] feat: profiling --- plugins/ts404/Cargo.lock | 256 ++++++++++++++++++++++++++++++++------ plugins/ts404/Cargo.toml | 4 + plugins/ts404/src/dsp.rs | 5 + plugins/ts404/src/lib.rs | 7 ++ plugins/ts404/src/main.rs | 1 + 5 files changed, 233 insertions(+), 40 deletions(-) diff --git a/plugins/ts404/Cargo.lock b/plugins/ts404/Cargo.lock index b7f3e15..afbeab2 100644 --- a/plugins/ts404/Cargo.lock +++ b/plugins/ts404/Cargo.lock @@ -687,9 +687,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2755ff20a1d93490d26ba33a6f092a38a508398a5320df5d4b3014fcccce9410" +checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490" dependencies = [ "jobserver", "libc", @@ -743,7 +743,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -1571,6 +1571,20 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "generator" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186014d53bc231d0090ef8d6f03e0920c54d85a5ed22f4f2f74315ec56cf83fb" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows 0.54.0", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -2005,7 +2019,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -2053,6 +2067,19 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + [[package]] name = "lru" version = "0.10.1" @@ -2077,6 +2104,15 @@ dependencies = [ "libc", ] +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "matches" version = "0.1.10" @@ -2412,6 +2448,16 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-complex" version = "0.4.6" @@ -2660,6 +2706,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking" version = "2.2.0" @@ -2686,7 +2738,7 @@ dependencies = [ "libc", "redox_syscall 0.5.2", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -2920,6 +2972,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +dependencies = [ + "profiling-procmacros", + "tracy-client", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" +dependencies = [ + "quote", + "syn 2.0.68", +] + [[package]] name = "quote" version = "1.0.36" @@ -3082,8 +3154,17 @@ checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -3094,9 +3175,15 @@ checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.4", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.4" @@ -3169,6 +3256,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + [[package]] name = "rustybuzz" version = "0.7.0" @@ -3210,6 +3303,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -3298,9 +3397,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.119" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8eddb61f0697cc3989c5d64b452f5488e2b8a60fd7d5076a3045076ffef8cb0" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", "ryu", @@ -3338,6 +3437,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" @@ -3527,6 +3635,16 @@ dependencies = [ "syn 2.0.68", ] +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "time" version = "0.3.36" @@ -3658,6 +3776,56 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tracy-client" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fb931a64ff88984f86d3e9bcd1ae8843aa7fe44dd0f8097527bc172351741d" +dependencies = [ + "loom", + "once_cell", + "tracy-client-sys", +] + +[[package]] +name = "tracy-client-sys" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d104d610dfa9dd154535102cc9c6164ae1fa37842bc2d9e83f9ac82b0ae0882" +dependencies = [ + "cc", ] [[package]] @@ -3670,6 +3838,7 @@ dependencies = [ "nih_plug_vizia", "num-traits", "numeric_literals", + "profiling", "valib", ] @@ -3828,6 +3997,7 @@ dependencies = [ "numeric_literals", "paste", "portable-atomic", + "profiling", "simba", "valib_derive", ] @@ -3842,6 +4012,12 @@ dependencies = [ "syn 2.0.68", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "version_check" version = "0.9.4" @@ -4234,7 +4410,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" dependencies = [ "windows-core 0.54.0", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -4243,7 +4419,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -4253,7 +4429,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" dependencies = [ "windows-result", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -4284,7 +4460,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -4311,7 +4487,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -4346,18 +4522,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -4374,9 +4550,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -4392,9 +4568,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -4410,15 +4586,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -4434,9 +4610,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -4452,9 +4628,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -4470,9 +4646,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -4488,9 +4664,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winit" diff --git a/plugins/ts404/Cargo.toml b/plugins/ts404/Cargo.toml index 6937eb4..21fd8b2 100644 --- a/plugins/ts404/Cargo.toml +++ b/plugins/ts404/Cargo.toml @@ -20,9 +20,13 @@ nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git", features = ["s nih_plug_vizia = { git = "https://github.com/robbert-vdh/nih-plug.git" } num-traits = "0.2.17" numeric_literals = "0.2.0" +profiling = { version = "1.0.15", features = ["profile-with-tracy"], optional = true } #valib = { git = "https://github.com/SolarLiner/valib.git" } valib = { path = "../valib", features = ["nih-plug"] } +[features] +profiling = ["dep:profiling"] + [profile.dev] opt-level = 1 diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index ac1489d..b069f47 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -104,6 +104,7 @@ impl DSPMeta for InputStage { } } +#[profiling::all_functions] impl DSPProcess<1, 1> for InputStage { fn process(&mut self, [x]: [Self::Sample; 1]) -> [Self::Sample; 1] { let gain = T::from_f64(self.gain.next_sample() as _); @@ -151,6 +152,7 @@ impl DSPMeta for ClipperStage { } } +#[profiling::all_functions] impl DSPProcess<1, 1> for ClipperStage where ::Element: ToPrimitive, @@ -218,6 +220,7 @@ impl DSPMeta for ToneStage { } } +#[profiling::all_functions] impl DSPProcess<1, 1> for ToneStage { fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { let tone = self.tone.next_sample_as(); @@ -281,6 +284,7 @@ impl DSPMeta for OutputStage { } } +#[profiling::all_functions] impl DSPProcess<1, 1> for OutputStage { fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { let y = self.inner.process(x); @@ -317,6 +321,7 @@ impl DSPMeta for Dsp { type Sample = T; } +#[profiling::all_functions] impl DSPProcessBlock<1, 1> for Dsp where ::Element: ToPrimitive, diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index d9ea57e..71e9cc9 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -88,6 +88,11 @@ impl Plugin for Ts404 { buffer_config: &BufferConfig, _context: &mut impl InitContext, ) -> bool { + #[cfg(feature = "profiling")] + { + profiling::tracy_client::Client::start(); + } + profiling::scope!("Ts404::initialize"); let drive_led = self.dsp.inner.get_led_display(); let dsp = Dsp::new(buffer_config.sample_rate, TARGET_SAMPLERATE); self.dsp.inner = dsp.inner; @@ -133,10 +138,12 @@ impl Plugin for Ts404 { _aux: &mut AuxiliaryBuffers, context: &mut impl ProcessContext, ) -> ProcessStatus { + profiling::register_thread!("Plugin audio thread"); context.set_latency_samples(self.dsp.latency() as _); process_buffer_simd64::<_, _, MAX_BLOCK_SIZE>(&mut self.dsp, buffer); //safety_clipper(buffer); + profiling::finish_frame!(); ProcessStatus::Normal } } diff --git a/plugins/ts404/src/main.rs b/plugins/ts404/src/main.rs index 267ca74..b8aabd7 100644 --- a/plugins/ts404/src/main.rs +++ b/plugins/ts404/src/main.rs @@ -2,5 +2,6 @@ use nih_plug::nih_export_standalone; use ts404::Ts404; fn main() { + profiling::register_thread!("Main thread"); nih_export_standalone::(); } \ No newline at end of file From 232d01f63df75f670ab9bf313197019fd0ff7d4a Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Sat, 31 Aug 2024 23:16:19 +0200 Subject: [PATCH 25/51] feat: clipper stage using WDF --- plugins/ts404/src/dsp.rs | 361 +- plugins/ts404/src/dsp/clipping.rs | 273 ++ ...404__dsp__clipping__tests__drive_test.snap | 4100 +++++++++++++++++ plugins/ts404/src/editor/mod.rs | 3 +- plugins/ts404/src/lib.rs | 12 +- plugins/ts404/src/params.rs | 53 +- 6 files changed, 4542 insertions(+), 260 deletions(-) create mode 100644 plugins/ts404/src/dsp/clipping.rs create mode 100644 plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__drive_test.snap diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index b069f47..51066ba 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -1,78 +1,105 @@ -use std::sync::atomic::Ordering; +use std::fmt; +use std::fmt::Formatter; use std::sync::Arc; use nalgebra::Complex; use nih_plug::nih_log; -use nih_plug::prelude::AtomicF32; -use nih_plug::util::db_to_gain_fast; -use num_traits::ToPrimitive; +use nih_plug::prelude::{AtomicF32, Enum}; +use nih_plug_vizia::vizia::prelude::Data; +use num_traits::{Float, ToPrimitive}; use numeric_literals::replace_float_literals; -use valib::dsp::blocks::Series; +use valib::{dsp::blocks::{Series, SwitchAB}, math::{smooth_max, smooth_min}}; use valib::dsp::buffer::{AudioBufferMut, AudioBufferRef}; use valib::dsp::parameter::{HasParameters, ParamId, ParamName, RemoteControlled, SmoothedParam}; -use valib::dsp::{BlockAdapter, DSPMeta, DSPProcess, DSPProcessBlock}; +use valib::dsp::{blocks::Bypass, BlockAdapter, DSPMeta, DSPProcess, DSPProcessBlock}; use valib::filters::statespace::StateSpace; +use valib::math::smooth_clamp; use valib::oversample::{Oversample, Oversampled}; use valib::saturators::{Bjt, Saturator, Slew}; use valib::simd::{ - AutoF32x2, AutoF64x2, AutoSimd, SimdBool, SimdComplexField, SimdPartialOrd, SimdValue, + AutoF64x2, AutoSimd, SimdBool, SimdComplexField, SimdPartialOrd, SimdValue, }; -use valib::util::lerp; use valib::Scalar; -use crate::util::Rms; -use crate::TARGET_SAMPLERATE; +use clipping::ClippingStage; +use crate::params::MAX_AGE; -#[derive(Debug, Clone)] -pub struct Bypass

{ - pub inner: P, - pub active: SmoothedParam, -} - -impl DSPMeta for Bypass

{ - type Sample = P::Sample; +mod clipping; - fn set_samplerate(&mut self, samplerate: f32) { - self.active.set_samplerate(samplerate); - self.inner.set_samplerate(samplerate); +fn emitter_follower_input() -> Bjt { + Bjt { + vee: T::zero(), + vcc: T::from_f64(9.), + xbias: T::from_f64(3.75041272), + ybias: T::zero(), } +} - fn latency(&self) -> usize { - let active = self.active.param > 0.5; - if active { - self.inner.latency() - } else { - 0 +#[derive(Debug, Copy, Clone)] +struct OutputEmitterFollower { + pub t: T, + pub xbias: T, + pub kbias: T, + pub ksat: T, +} + +impl Default for OutputEmitterFollower { + #[replace_float_literals(T::from_f64(literal))] + fn default() -> Self { + Self { + t: 0.04416026, + xbias: -0.74491909, + kbias: 8.43027281, + ksat: 0.48964627, } } +} - fn reset(&mut self) { - self.active.reset(); - self.inner.reset(); +impl Saturator for OutputEmitterFollower { + fn saturate(&self, x: T) -> T { + smooth_max(self.t, T::zero(), smooth_min(self.t, x + self.xbias, (x + self.kbias) * self.ksat)) } } -impl DSPProcess for Bypass

-where - P: DSPProcess, -{ - fn process(&mut self, x: [Self::Sample; N]) -> [Self::Sample; N] { - let active = P::Sample::from_f64(self.active.next_sample() as _); - let processed = self.inner.process(x); - std::array::from_fn(|i| { - let processed = active - .simd_gt(P::Sample::from_f64(1e-6)) - .if_else(|| processed[i], || x[i]); - lerp(active, x[i], processed) - }) +#[derive(Debug, Copy, Clone, PartialEq, Enum, Data)] +pub enum InputLevelMatching { + Instrument, + #[name="Instrument (Hot)"] + InstrumentHot, + Line, + Eurorack, +} + +impl fmt::Display for InputLevelMatching { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + let scale: f32 = self.input_scale(); + match self { + Self::Instrument => write!(f, "Instrument ({} x)", scale), + Self::InstrumentHot => write!(f, "Instrument, Hot ({} x)", scale), + Self::Line => write!(f, "Line ({} x)", scale), + Self::Eurorack => write!(f, "Eurorack ({} x)", scale), + } } } -impl Bypass { - pub fn new(samplerate: f32, inner: T) -> Self { - Self { - inner, - active: SmoothedParam::linear(1., samplerate, 15.0), +impl InputLevelMatching { + #[replace_float_literals(T::from_f64(literal))] + fn input_scale(&self) -> T { + match self { + Self::Instrument => 0.1833, + Self::InstrumentHot => 0.55, + Self::Line => 1.1, + Self::Eurorack => 10., + } + } + + #[replace_float_literals(T::from_f64(literal))] + fn output_scale(&self) -> T { + match self { + Self::Instrument => 3., + Self::InstrumentHot => 1., + Self::Line => 0.5, + Self::Eurorack => 0.25, } } } @@ -105,101 +132,28 @@ impl DSPMeta for InputStage { } #[profiling::all_functions] -impl DSPProcess<1, 1> for InputStage { +impl DSPProcess<1, 1> for InputStage { fn process(&mut self, [x]: [Self::Sample; 1]) -> [Self::Sample; 1] { - let gain = T::from_f64(self.gain.next_sample() as _); - let y = self.state_space.process([x * gain]); - self.clip.process(y) + let gain = self.gain.next_sample_as(); + let [y] = self.state_space.process([x * gain]); + self.clip.process([y + T::from_f64(4.5)]) } } impl InputStage { pub fn new(samplerate: f32, gain: f32) -> Self { Self { - gain: SmoothedParam::exponential(gain, samplerate, 10.0), + gain: SmoothedParam::exponential(gain, samplerate, 100.0), state_space: crate::gen::input(T::from_f64(samplerate as _).simd_recip()), - clip: Bjt::default(), + clip: emitter_follower_input(), } } } -#[derive(Debug, Clone)] -pub struct ClipperStage { - dt: T, - dist: SmoothedParam, - state_space: StateSpace, - slew: Slew, - led_rms: Rms, - led_display: Arc, -} - -impl DSPMeta for ClipperStage { - type Sample = T; - - fn set_samplerate(&mut self, samplerate: f32) { - self.dt = T::from_f64(samplerate.recip() as _); - self.state_space.set_samplerate(samplerate); - self.slew.set_samplerate(samplerate); - } - - fn latency(&self) -> usize { - self.state_space.latency() + self.slew.latency() - } - - fn reset(&mut self) { - self.state_space.reset(); - self.slew.reset(); - } -} - -#[profiling::all_functions] -impl DSPProcess<1, 1> for ClipperStage -where - ::Element: ToPrimitive, -{ - #[replace_float_literals(Self::Sample::from_f64(literal))] - fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { - let dist = self.dist.next_sample_as(); - self.update_state_matrices(self.dt, dist); - let [y] = self.state_space.process(x); - let y = y.simd_asinh().simd_clamp(-4.5, 4.5); - let y = self.slew.process([y]); - let delta = (y[0] - x[0]) - .simd_abs() - .simd_horizontal_sum() - .to_f32() - .unwrap_or_default(); - let rms = self.led_rms.add_element(delta); - self.led_display.store(rms, Ordering::Relaxed); - y - } -} - -impl ClipperStage { - pub fn new(samplerate: f32, dist: T) -> Self { - let dt = T::from_f64(samplerate as _).simd_recip(); - let rms_samples = (16e-3 * TARGET_SAMPLERATE) as usize; - Self { - dt, - dist: SmoothedParam::exponential(1.0, samplerate, 50.0), - state_space: crate::gen::clipper(dt, dist), - slew: Slew::new(T::from_f64(samplerate as _), T::from_f64(1e4) * dt), - led_rms: Rms::new(rms_samples), - led_display: Arc::new(AtomicF32::new(0.0)), - } - } - - fn update_state_matrices(&mut self, dt: T, dist: T) { - self.state_space - .update_matrices(&crate::gen::clipper(dt, dist)); - } -} - #[derive(Debug, Copy, Clone)] pub struct ToneStage { tone: SmoothedParam, state_space: StateSpace, - out_gain: SmoothedParam, dt: T, } @@ -225,11 +179,8 @@ impl DSPProcess<1, 1> for ToneStage { fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { let tone = self.tone.next_sample_as(); self.update_state_matrices(self.dt, tone); - let y = self.state_space.process(x); - let vcc = T::from_f64(4.5); - std::array::from_fn(|i| { - y[i].simd_clamp(-vcc, vcc) * self.out_gain.next_sample_as::() * T::from_f64(0.25) - }) + let [y] = self.state_space.process(x); + [smooth_clamp(T::from_f64(0.1), y, T::zero(), T::from_f64(9.))] } } @@ -240,7 +191,6 @@ impl ToneStage { dt, tone: SmoothedParam::linear(0.0, samplerate, 15.0), state_space: crate::gen::tone(dt, tone), - out_gain: SmoothedParam::exponential(1., samplerate, 15.0), } } @@ -252,16 +202,18 @@ impl ToneStage { #[derive(Debug, Clone)] pub struct OutputStage { - inner: Bypass>, - clip: Bjt, + inner: StateSpace, + clip: OutputEmitterFollower, + out_gain: SmoothedParam, } impl OutputStage { pub fn new(samplerate: f32) -> Self { let dt = T::from_f64(samplerate as _).simd_recip(); Self { - inner: Bypass::new(samplerate, crate::gen::output(dt)), - clip: Bjt::default(), + inner: crate::gen::output(dt), + clip: OutputEmitterFollower::default(), + out_gain: SmoothedParam::exponential(1., samplerate, 100.0), } } } @@ -270,59 +222,60 @@ impl DSPMeta for OutputStage { type Sample = T; fn set_samplerate(&mut self, samplerate: f32) { - self.inner.set_samplerate(samplerate); - self.clip.set_samplerate(samplerate); + self.inner.update_matrices(&crate::gen::output(T::from_f64( + (samplerate as f64).recip(), + ))); } fn latency(&self) -> usize { - self.inner.latency() + self.clip.latency() + self.inner.latency() } fn reset(&mut self) { self.inner.reset(); - self.clip.reset(); } } #[profiling::all_functions] -impl DSPProcess<1, 1> for OutputStage { - fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { - let y = self.inner.process(x); - self.clip.process(y) +impl DSPProcess<1, 1> for OutputStage { + fn process(&mut self, [x]: [Self::Sample; 1]) -> [Self::Sample; 1] { + let [y] = self.inner.process([self.clip.saturate(x)]); + let out_gain = self.out_gain.next_sample_as::(); + let out = y * out_gain; + [out] } } #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, ParamName)] pub enum DspParams { Bypass, - InputGain, + InputMode, Distortion, Tone, - OutputGain, ComponentMismatch, - BufferBypass, } -type DspInner = Bypass< +type DspInner = SwitchAB< + Bypass, Series<( - Bypass>, - ClipperStage, + InputStage, + ClippingStage, ToneStage, - Bypass>, + OutputStage, )>, >; -pub struct Dsp { +pub struct Dsp> { inner: Oversampled>>, - dt: T, + samplerate: T, } -impl DSPMeta for Dsp { +impl> DSPMeta for Dsp { type Sample = T; } #[profiling::all_functions] -impl DSPProcessBlock<1, 1> for Dsp +impl> DSPProcessBlock<1, 1> for Dsp where ::Element: ToPrimitive, { @@ -335,98 +288,92 @@ where } } -impl HasParameters for Dsp { +impl> HasParameters for Dsp { type Name = DspParams; fn set_parameter(&mut self, param: Self::Name, value: f32) { nih_log!("Set parameter {param:?} {value}"); - let Bypass { - active, - inner: - Series(( - Bypass { - active: input_active, - inner: input, - }, - clipper, - tone, - Bypass { - active: output_active, - .. - }, - )), + let SwitchAB { + b: Series((input, clipping, tone, output)), + .. } = &mut self.inner.inner.0; + let mut bypass = None; match param { DspParams::Bypass => { - active.param = 1. - value; + let b_active = value < 0.5; + bypass = Some(b_active); } - DspParams::InputGain => { - input.gain.param = value; + DspParams::InputMode => { + let level_matching = InputLevelMatching::from_index(value as _); + input.gain.param = level_matching.input_scale(); + output.out_gain.param = level_matching.output_scale(); } DspParams::Distortion => { - clipper.dist.param = value; + clipping.set_dist(T::from_f64(value as _)); } DspParams::Tone => { tone.tone.param = value; } - DspParams::OutputGain => { - tone.out_gain.param = value; - } DspParams::ComponentMismatch => { - clipper.slew.max_diff = - component_matching_slew_rate(self.dt.simd_recip(), T::from_f64(value as _)); - } - DspParams::BufferBypass => { - input_active.param = 1. - value; - output_active.param = 1. - value; + clipping.set_age(T::from_f64(value as _)); } } + if let Some(b_active) = bypass { + self.inner.inner.0.should_switch_to_b(b_active); + } } } -impl Dsp +impl> Dsp where Complex: SimdComplexField, ::Element: ToPrimitive, { - pub fn new(base_samplerate: f32, target_samplerate: f32) -> RemoteControlled { - let oversample = target_samplerate / base_samplerate; - let oversample = oversample.ceil() as usize; - let samplerate = base_samplerate * oversample as f32; + pub fn new(base_samplerate: f32, _target_samplerate: f32) -> RemoteControlled { + //let oversample = target_samplerate / base_samplerate; + //let oversample = oversample.ceil() as usize; + let oversample = 1; + nih_log!("Requested oversample: {oversample}x"); + let oversample = Oversample::new(oversample, MAX_BLOCK_SIZE); + let samplerate = base_samplerate * oversample.oversampling_amount() as f32; + nih_log!( + "Inner samplerate: {samplerate} Hz\n\t\tEffective oversample: {}", + oversample.oversampling_amount() + ); let inner = Series(( - Bypass::new(samplerate, InputStage::new(samplerate, 1.0)), - ClipperStage::new(samplerate, T::zero()), + InputStage::new(samplerate, 1.0), + ClippingStage::new(T::from_f64(samplerate as _)), ToneStage::new(samplerate, T::zero()), - Bypass::new(samplerate, OutputStage::new(samplerate)), + OutputStage::new(samplerate), )); - let inner = DspInner::new(samplerate, inner); - let inner = Oversample::new(oversample, MAX_BLOCK_SIZE) - .with_dsp(base_samplerate, BlockAdapter(inner)); + let inner = DspInner::new(samplerate, Bypass::default(), inner, true); + let inner = oversample.with_dsp(base_samplerate, BlockAdapter(inner)); RemoteControlled::new( base_samplerate, 1e3, Dsp { inner, - dt: T::from_f64(samplerate as _).simd_recip(), + samplerate: T::from_f64(samplerate as _), }, ) } pub fn get_led_display(&self) -> Arc { - // Funny nested access because of semi-structured DSP blocks - self.inner.inner.0.inner.0 .1.led_display.clone() + let SwitchAB { + b: Series((_, clipping, ..)), + .. + } = &self.inner.inner.0; + clipping.led_display.clone() } pub fn set_led_display(&mut self, value: &Arc) { - self.inner.inner.0.inner.0 .1.led_display.clone_from(value); + let SwitchAB { + b: Series((_, clipping, ..)), + .. + } = &mut self.inner.inner.0; + clipping.led_display = value.clone(); } } -pub const MAX_BLOCK_SIZE: usize = 512; - -fn component_matching_slew_rate(samplerate: T, normalized: T) -> T { - let min = T::from_f64(db_to_gain_fast(30.0) as _); - let max = T::from_f64(db_to_gain_fast(100.0) as _); - lerp(normalized, min, max) / samplerate -} +pub const MAX_BLOCK_SIZE: usize = 64; diff --git a/plugins/ts404/src/dsp/clipping.rs b/plugins/ts404/src/dsp/clipping.rs new file mode 100644 index 0000000..f7c9cf7 --- /dev/null +++ b/plugins/ts404/src/dsp/clipping.rs @@ -0,0 +1,273 @@ +use crate::params::MAX_AGE; +use crate::{util::Rms, TARGET_SAMPLERATE}; +use nih_plug::prelude::AtomicF32; +use nih_plug::util::db_to_gain_fast; +use num_traits::{Float, ToPrimitive}; +use std::sync::{atomic::Ordering, Arc}; +use valib::math::smooth_clamp; +use valib::saturators::clippers::DiodeClipper; +use valib::saturators::Slew; +use valib::simd::SimdComplexField; +use valib::util::lerp; +use valib::wdf::dsl::*; +use valib::{ + dsp::{DSPMeta, DSPProcess}, + wdf::*, + Scalar, +}; + +type Stage1Module = WdfModule< + ResistiveVoltageSource, + Series, Series, ResistiveVoltageSource>>, +>; + +struct Stage1 { + module: Stage1Module, + vin: Node>, + vout: Node>, +} + +impl Stage1 { + pub fn new(samplerate: T) -> Self { + let vin = rvsource(T::from_f64(4.5), T::one()); + let vout = rvsource(T::from_f64(10e3), T::from_f64(4.5)); + let module = module( + vin.clone(), + series( + capacitor(samplerate, T::from_f64(1e-6)), + series(resistor(T::from_f64(220.)), vout.clone()), + ), + ); + Self { module, vin, vout } + } +} + +impl DSPMeta for Stage1 { + type Sample = T; + + fn set_samplerate(&mut self, samplerate: f32) { + self.module.set_samplerate(samplerate as _); + } + + fn latency(&self) -> usize { + 1 + } + + fn reset(&mut self) { + self.module.reset(); + } +} + +impl DSPProcess<1, 1> for Stage1 { + fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { + node_mut(&self.vin).vs = x[0]; + self.module.process_sample(); + let y = voltage(&self.vout); + [y] + } +} + +type Stage2Module = WdfModule, Series, Resistor>>; + +struct Stage2 { + module: Stage2Module, + vin: Node>, + iout: Node>, +} + +impl Stage2 { + pub fn new(samplerate: T) -> Self { + let vin = ivsource(T::from_f64(0.)); + let iout = resistor(T::from_f64(4.7e3)); + let module = module( + vin.clone(), + series(capacitor(samplerate, T::from_f64(0.047e-6)), iout.clone()), + ); + Self { module, vin, iout } + } +} + +impl DSPMeta for Stage2 { + type Sample = T; + + fn set_samplerate(&mut self, samplerate: f32) { + self.module.set_samplerate(samplerate as _); + } + + fn latency(&self) -> usize { + 1 + } + + fn reset(&mut self) { + self.module.reset(); + } +} + +impl DSPProcess<1, 1> for Stage2 { + fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { + node_mut(&self.vin).vs = x[0]; + self.module.process_sample(); + let y = current(&self.iout); + [y] + } +} + +type Stage3Module = WdfModule, Parallel, Capacitor>>; + +struct Stage3> { + module: Stage3Module, + iin: Node>, +} + +impl> Stage3 { + pub fn new(samplerate: T) -> Self { + let iin = rcsource(T::from_f64(51e3), T::from_f64(0.)); + let module = module( + diode_nr(DiodeClipper::new_silicon(1, 1, T::zero())), + parallel(iin.clone(), capacitor(samplerate, T::from_f64(51e-12))), + ); + Self { module, iin } + } + + pub fn set_dist(&mut self, amt: T) { + node_mut(&self.iin).r = T::from_f64(51e3) + amt * T::from_f64(500e3); + } +} + +impl> DSPMeta for Stage3 { + type Sample = T; + + fn set_samplerate(&mut self, samplerate: f32) { + self.module.set_samplerate(samplerate as _); + } + + fn latency(&self) -> usize { + 1 + } + + fn reset(&mut self) { + self.module.reset(); + } +} + +impl> DSPProcess<1, 1> for Stage3 { + fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { + node_mut(&self.iin).j = x[0]; + self.module.process_sample(); + let y = voltage(&self.module.root); + [y] + } +} + +pub struct ClippingStage> { + out_slew: Slew, + stage1: Stage1, + stage2: Stage2, + stage3: Stage3, + pub(crate) led_rms: Rms, + pub(crate) led_display: Arc, + samplerate: T, +} + +impl> ClippingStage { + pub fn new(samplerate: T) -> Self { + let rms_samples = (16e-3 * TARGET_SAMPLERATE) as usize; + Self { + out_slew: Slew::new( + samplerate, + component_matching_slew_rate(samplerate, T::zero()), + ), + stage1: Stage1::new(samplerate), + stage2: Stage2::new(samplerate), + stage3: Stage3::new(samplerate), + led_rms: Rms::new(rms_samples), + led_display: Arc::new(AtomicF32::new(0.0)), + samplerate, + } + } + + pub fn set_age(&mut self, age: T) { + self.out_slew.max_diff = + component_matching_slew_rate(self.samplerate, age); + } + + pub fn set_dist(&mut self, amt: T) { + self.stage3.set_dist(amt); + } +} + +impl> DSPMeta for ClippingStage { + type Sample = T; + + fn set_samplerate(&mut self, samplerate: f32) { + self.out_slew.set_samplerate(samplerate); + self.stage1.set_samplerate(samplerate); + self.stage2.set_samplerate(samplerate); + self.stage3.set_samplerate(samplerate); + } + + fn latency(&self) -> usize { + self.out_slew.latency() + + self.stage1.latency() + + self.stage2.latency() + + self.stage3.latency() + } + + fn reset(&mut self) { + self.stage1.reset(); + self.stage2.reset(); + self.stage3.reset(); + } +} + +impl> DSPProcess<1, 1> for ClippingStage { + fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { + let [vplus] = self.stage1.process(x); + let [vf] = self.stage3.process(self.stage2.process([vplus])); + let led_value = (vf.simd_abs() - T::from_f64(0.7)) + .simd_max(T::from_f64(0.)) + .simd_horizontal_sum() + .to_f32() + .unwrap_or_default() + * 0.5; + let led_value = self.led_rms.add_element(led_value); + self.led_display.store(led_value, Ordering::Relaxed); + self.out_slew.process([smooth_clamp( + T::from_f64(0.1), + vplus + vf, + T::zero(), + T::from_f64(9.), + )]) + } +} + +fn component_matching_slew_rate(samplerate: T, age: T) -> T { + let new = T::from_f64(db_to_gain_fast(80.0) as _); + let rate = T::from_f64(0.05); + new * (-age * rate).simd_exp() / samplerate +} + +#[cfg(test)] +mod tests { + use super::*; + use valib::dsp::buffer::{AudioBufferMut, AudioBufferRef}; + use valib::dsp::{BlockAdapter, DSPProcessBlock}; + + #[test] + fn drive_test() { + const SAMPLERATE: f64 = 1024.; + const N: usize = 4096; + let mut dsp = BlockAdapter(ClippingStage::new(SAMPLERATE)); + let input = (0..N) + .map(|i| 100. * i as f64 / SAMPLERATE) + .map(|x| 4.5 + x.sin() * 10.) + .collect::>(); + let mut output = vec![0.; N]; + dsp.process_block( + AudioBufferRef::new([&input]).unwrap(), + AudioBufferMut::new([&mut output]).unwrap(), + ); + let assert: [_; N] = std::array::from_fn(|i| (input[i], output[i])); + insta::assert_csv_snapshot!(&assert as &[_], { "[][]" => insta::rounded_redaction(4) }); + } +} diff --git a/plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__drive_test.snap b/plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__drive_test.snap new file mode 100644 index 0000000..0eaf27d --- /dev/null +++ b/plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__drive_test.snap @@ -0,0 +1,4100 @@ +--- +source: src/dsp/clipping.rs +expression: "&assert as &[_]" +--- +4.5,0.0095 +5.475,0.0191 +6.4407,0.0286 +7.388,0.0381 +8.3077,0.0477 +9.1911,0.0572 +10.0298,0.0668 +10.8158,0.0763 +11.5417,0.0858 +12.2004,0.0954 +12.7858,0.1049 +13.2922,0.1144 +13.7148,0.124 +14.0496,0.1335 +14.2934,0.1431 +14.4439,0.1526 +14.4997,0.1621 +14.4601,0.1717 +14.3256,0.1812 +14.0975,0.1907 +13.778,0.2003 +13.37,0.2098 +12.8775,0.2193 +12.3052,0.2289 +11.6585,0.2384 +10.9436,0.248 +10.1673,0.2575 +9.337,0.267 +8.4606,0.2766 +7.5464,0.2861 +6.6032,0.2956 +5.64,0.3052 +4.6659,0.3147 +3.6903,0.3242 +2.7223,0.3338 +1.7713,0.3433 +0.8463,0.3529 +-0.0439,0.3624 +-0.8908,0.3719 +-1.6863,0.3815 +-2.4229,0.391 +-3.0935,0.3815 +-3.6917,0.3719 +-4.2119,0.3624 +-4.6491,0.3529 +-4.9991,0.3433 +-5.2585,0.3338 +-5.425,0.3242 +-5.4969,0.3147 +-5.4735,0.3052 +-5.3551,0.3147 +-5.1428,0.3242 +-4.8386,0.3338 +-4.4454,0.3433 +-3.967,0.3529 +-3.4079,0.3624 +-2.7734,0.3719 +-2.0696,0.3815 +-1.3032,0.391 +-0.4815,0.4005 +0.3876,0.4101 +1.296,0.4196 +2.2349,0.4292 +3.1953,0.4387 +4.1682,0.4482 +5.1443,0.4578 +6.1142,0.4673 +7.0687,0.4768 +7.9988,0.4864 +8.8955,0.4959 +9.7503,0.5054 +10.5551,0.515 +11.3022,0.5245 +11.9845,0.5341 +12.5955,0.5436 +13.1293,0.5531 +13.5809,0.5627 +13.9459,0.5722 +14.221,0.5817 +14.4034,0.5913 +14.4914,0.6008 +14.4842,0.6104 +14.3819,0.6199 +14.1854,0.6294 +13.8967,0.639 +13.5183,0.6485 +13.0541,0.658 +12.5083,0.6676 +11.8862,0.6771 +11.1938,0.6866 +10.4375,0.6962 +9.6247,0.7057 +8.763,0.7153 +7.8608,0.7248 +6.9264,0.7343 +5.969,0.7439 +4.9976,0.7534 +4.0214,0.7629 +3.0498,0.7725 +2.092,0.782 +1.1571,0.7915 +0.2542,0.8011 +-0.6084,0.8106 +-1.4222,0.8202 +-2.1797,0.8297 +-2.8734,0.8202 +-3.4969,0.8106 +-4.0442,0.8011 +-4.5101,0.7915 +-4.8901,0.782 +-5.1807,0.7725 +-5.379,0.7629 +-5.4831,0.7534 +-5.4922,0.7439 +-5.406,0.7343 +-5.2254,0.7439 +-4.9521,0.7534 +-4.5888,0.7629 +-4.1389,0.7725 +-3.6066,0.782 +-2.9971,0.7915 +-2.3161,0.8011 +-1.5702,0.8106 +-0.7665,0.8202 +0.0875,0.8297 +0.9834,0.8392 +1.9129,0.8488 +2.8671,0.8583 +3.8368,0.8678 +4.8128,0.8774 +5.7858,0.8869 +6.7466,0.8965 +7.686,0.906 +8.595,0.9155 +9.465,0.9251 +10.2877,0.9346 +11.0553,0.9441 +11.7603,0.9537 +12.3962,0.9632 +12.9569,0.9727 +13.4369,0.9823 +13.8318,0.9918 +14.1378,1.0014 +14.3519,1.0109 +14.4721,1.0204 +14.4974,1.03 +14.4273,1.0395 +14.2627,1.049 +14.005,1.0586 +13.6567,1.0681 +13.2212,1.0777 +12.7026,1.0872 +12.1058,1.0967 +11.4366,1.1063 +10.7012,1.1158 +9.9068,1.1253 +9.0608,1.1349 +8.1714,1.1444 +7.247,1.1539 +6.2964,1.1635 +5.3287,1.173 +4.3531,1.1826 +3.3789,1.1921 +2.4153,1.2016 +1.4717,1.2112 +0.5569,1.2207 +-0.3203,1.2302 +-1.1516,1.2207 +-1.9291,1.2112 +-2.6452,1.2016 +-3.2933,1.1921 +-3.8671,1.1826 +-4.3612,1.173 +-4.7709,1.1635 +-5.0922,1.1539 +-5.3221,1.1444 +-5.4584,1.1349 +-5.4998,1.1253 +-5.4459,1.1158 +-5.2973,1.1063 +-5.0552,1.0967 +-4.7222,1.1063 +-4.3012,1.1158 +-3.7964,1.1253 +-3.2125,1.1349 +-2.5552,1.1444 +-1.8306,1.1539 +-1.0456,1.1635 +-0.2079,1.173 +0.6748,1.1826 +1.5939,1.1921 +2.5406,1.2016 +3.5061,1.2112 +4.481,1.2207 +5.4561,1.2302 +6.4221,1.2398 +7.3698,1.2493 +8.2901,1.2589 +9.1743,1.2684 +10.014,1.2779 +10.8011,1.2875 +11.5282,1.297 +12.1883,1.3065 +12.7751,1.3161 +13.2831,1.3256 +13.7074,1.3351 +14.044,1.3447 +14.2896,1.3542 +14.4419,1.3638 +14.4995,1.3733 +14.4618,1.3828 +14.3291,1.3924 +14.1029,1.4019 +13.7851,1.4114 +13.3788,1.421 +12.8879,1.4305 +12.3171,1.44 +11.6718,1.4496 +10.9581,1.4591 +10.1829,1.4687 +9.3536,1.4782 +8.478,1.4877 +7.5645,1.4973 +6.6218,1.5068 +5.6589,1.5163 +4.6849,1.5259 +3.7092,1.5354 +2.741,1.545 +1.7896,1.5545 +0.864,1.564 +-0.027,1.5545 +-0.8748,1.545 +-1.6714,1.5354 +-2.4092,1.5259 +-3.0811,1.5163 +-3.6808,1.5068 +-4.2026,1.4973 +-4.6414,1.4877 +-4.9931,1.4782 +-5.2544,1.4687 +-5.4227,1.4591 +-5.4964,1.4496 +-5.4749,1.44 +-5.3583,1.4305 +-5.1478,1.421 +-4.8454,1.4114 +-4.4539,1.421 +-3.9771,1.4305 +-3.4195,1.44 +-2.7864,1.4496 +-2.0839,1.4591 +-1.3187,1.4687 +-0.498,1.4782 +0.3703,1.4877 +1.278,1.4973 +2.2164,1.5068 +3.1765,1.5163 +4.1492,1.5259 +5.1253,1.5354 +6.0954,1.545 +7.0503,1.5545 +7.981,1.564 +8.8784,1.5736 +9.7341,1.5831 +10.54,1.5926 +11.2883,1.6022 +11.9719,1.6117 +12.5843,1.6212 +13.1197,1.6308 +13.5729,1.6403 +13.9397,1.6499 +14.2165,1.6594 +14.4007,1.6689 +14.4906,1.6785 +14.4853,1.688 +14.3848,1.6975 +14.1901,1.7071 +13.9031,1.7166 +13.5265,1.7262 +13.0639,1.7357 +12.5197,1.7452 +11.899,1.7548 +11.2079,1.7643 +10.4528,1.7738 +9.641,1.7834 +8.7802,1.7929 +7.8786,1.8024 +6.9449,1.812 +5.9878,1.8215 +5.0165,1.8311 +4.0404,1.8406 +3.0686,1.8501 +2.1104,1.8597 +1.1751,1.8501 +0.2714,1.8406 +-0.592,1.8311 +-1.4069,1.8215 +-2.1655,1.812 +-2.8606,1.8024 +-3.4855,1.7929 +-4.0344,1.7834 +-4.5019,1.7738 +-4.8836,1.7643 +-5.1759,1.7548 +-5.376,1.7452 +-5.482,1.7357 +-5.4929,1.7262 +-5.4086,1.7166 +-5.2298,1.7071 +-4.9583,1.6975 +-4.5967,1.688 +-4.1484,1.6868 +-3.6177,1.6963 +-3.0096,1.7059 +-2.33,1.7154 +-1.5853,1.7249 +-0.7826,1.7345 +0.0704,1.744 +0.9657,1.7535 +1.8946,1.7631 +2.8483,1.7726 +3.8178,1.7822 +4.7938,1.7917 +5.767,1.8012 +6.7281,1.8108 +7.668,1.8203 +8.5777,1.8298 +9.4485,1.8394 +10.2722,1.8489 +11.0409,1.8584 +11.7473,1.868 +12.3845,1.8775 +12.9467,1.8871 +13.4284,1.8966 +13.825,1.9061 +14.1327,1.9157 +14.3486,1.9252 +14.4707,1.9347 +14.4978,1.9443 +14.4296,1.9538 +14.2668,1.9633 +14.0109,1.9729 +13.6644,1.9824 +13.2305,1.992 +12.7135,2.0015 +12.1182,2.011 +11.4503,2.0206 +10.7161,2.0301 +9.9228,2.0396 +9.0777,2.0492 +8.1891,2.0587 +7.2652,2.0683 +6.3151,2.0778 +5.3476,2.0873 +4.3721,2.0969 +3.3977,2.1064 +2.4339,2.1159 +1.4898,2.1064 +0.5744,2.0969 +-0.3037,2.0873 +-1.1359,2.0778 +-1.9145,2.0683 +-2.6319,2.0587 +-3.2814,2.0492 +-3.8567,2.0396 +-4.3524,2.0301 +-4.7637,2.0206 +-5.0868,2.011 +-5.3185,2.0015 +-5.4566,1.992 +-5.4999,1.9824 +-5.4479,1.9729 +-5.301,1.9633 +-5.0608,1.9538 +-4.7295,1.9443 +-4.3102,1.9347 +-3.807,1.9252 +-3.2246,1.9347 +-2.5686,1.9443 +-1.8452,1.9538 +-1.0614,1.9633 +-0.2246,1.9729 +0.6572,1.9824 +1.5757,1.992 +2.522,2.0015 +3.4872,2.011 +4.462,2.0206 +5.4372,2.0301 +6.4034,2.0396 +7.3516,2.0492 +8.2725,2.0587 +9.1575,2.0683 +9.9981,2.0778 +10.7863,2.0873 +11.5146,2.0969 +12.1761,2.1064 +12.7644,2.1159 +13.274,2.1255 +13.7,2.135 +14.0383,2.1445 +14.2857,2.1541 +14.4398,2.1636 +14.4993,2.1732 +14.4634,2.1827 +14.3326,2.1922 +14.1081,2.2018 +13.7921,2.2113 +13.3875,2.2208 +12.8982,2.2304 +12.3289,2.2399 +11.685,2.2495 +10.9726,2.259 +10.1986,2.2685 +9.3702,2.2781 +8.4954,2.2876 +7.5826,2.2971 +6.6404,2.3067 +5.6777,2.3162 +4.7039,2.3257 +3.7281,2.3353 +2.7597,2.3448 +1.8079,2.3353 +0.8817,2.3257 +-0.01,2.3162 +-0.8588,2.3067 +-1.6564,2.2971 +-2.3954,2.2876 +-3.0687,2.2781 +-3.6699,2.2685 +-4.1932,2.259 +-4.6337,2.2495 +-4.9871,2.2399 +-5.2502,2.2304 +-5.4203,2.2208 +-5.4959,2.2113 +-5.4762,2.2018 +-5.3615,2.1922 +-5.1528,2.1827 +-4.8521,2.1732 +-4.4623,2.1636 +-3.9871,2.1541 +-3.4311,2.1605 +-2.7994,2.17 +-2.0982,2.1795 +-1.3341,2.1891 +-0.5144,2.1986 +0.353,2.2082 +1.26,2.2177 +2.1979,2.2272 +3.1577,2.2368 +4.1302,2.2463 +5.1063,2.2558 +6.0767,2.2654 +7.032,2.2749 +7.9632,2.2844 +8.8613,2.294 +9.7179,2.3035 +10.5248,2.3131 +11.2743,2.3226 +11.9592,2.3321 +12.5731,2.3417 +13.11,2.3512 +13.5649,2.3607 +13.9334,2.3703 +14.212,2.3798 +14.398,2.3894 +14.4897,2.3989 +14.4863,2.4084 +14.3877,2.418 +14.1948,2.4275 +13.9096,2.437 +13.5347,2.4466 +13.0737,2.4561 +12.531,2.4656 +11.9118,2.4752 +11.222,2.4847 +10.4681,2.4943 +9.6573,2.5038 +8.7974,2.5133 +7.8965,2.5229 +6.9633,2.5324 +6.0066,2.5419 +5.0355,2.5515 +4.0594,2.561 +3.0874,2.5515 +2.1289,2.5419 +1.193,2.5324 +0.2886,2.5229 +-0.5757,2.5133 +-1.3916,2.5038 +-2.1513,2.4943 +-2.8477,2.4847 +-3.4741,2.4752 +-4.0244,2.4656 +-4.4936,2.4561 +-4.877,2.4466 +-5.1711,2.437 +-5.373,2.4275 +-5.4809,2.418 +-5.4936,2.4084 +-5.4111,2.3989 +-5.2342,2.3894 +-4.9645,2.3798 +-4.6046,2.3703 +-4.1579,2.3607 +-3.6288,2.3512 +-3.0222,2.3607 +-2.3439,2.3703 +-1.6004,2.3798 +-0.7987,2.3894 +0.0534,2.3989 +0.9479,2.4084 +1.8763,2.418 +2.8296,2.4275 +3.7989,2.437 +4.7748,2.4466 +5.7482,2.4561 +6.7096,2.4656 +7.65,2.4752 +8.5604,2.4847 +9.432,2.4943 +10.2567,2.5038 +11.0265,2.5133 +11.7342,2.5229 +12.3728,2.5324 +12.9365,2.5419 +13.4198,2.5515 +13.8181,2.561 +14.1276,2.5706 +14.3453,2.5801 +14.4692,2.5896 +14.4982,2.5992 +14.4318,2.6087 +14.2708,2.6182 +14.0167,2.6278 +13.6719,2.6373 +13.2398,2.6468 +12.7243,2.6564 +12.1305,2.6659 +11.4639,2.6755 +10.731,2.685 +9.9387,2.6945 +9.0946,2.7041 +8.2067,2.7136 +7.2835,2.7231 +6.3338,2.7327 +5.3665,2.7422 +4.3911,2.7518 +3.4166,2.7422 +2.4525,2.7327 +1.5079,2.7231 +0.5918,2.7136 +-0.287,2.7041 +-1.1202,2.6945 +-1.8999,2.685 +-2.6186,2.6755 +-3.2695,2.6659 +-3.8463,2.6564 +-4.3436,2.6468 +-4.7566,2.6373 +-5.0814,2.6278 +-5.3149,2.6182 +-5.4549,2.6087 +-5.5,2.5992 +-5.4498,2.5896 +-5.3048,2.5801 +-5.0664,2.5706 +-4.7368,2.561 +-4.3192,2.5515 +-3.8175,2.5419 +-3.2366,2.5324 +-2.582,2.5419 +-1.8599,2.5515 +-1.0772,2.561 +-0.2413,2.5706 +0.6397,2.5801 +1.5575,2.5896 +2.5034,2.5992 +3.4683,2.6087 +4.443,2.6182 +5.4183,2.6278 +6.3848,2.6373 +7.3333,2.6468 +8.2549,2.6564 +9.1407,2.6659 +9.9822,2.6755 +10.7715,2.685 +11.5011,2.6945 +12.1639,2.7041 +12.7537,2.7136 +13.2649,2.7231 +13.6925,2.7327 +14.0326,2.7422 +14.2817,2.7518 +14.4377,2.7613 +14.499,2.7708 +14.465,2.7804 +14.3361,2.7899 +14.1134,2.7994 +13.7991,2.809 +13.3962,2.8185 +12.9085,2.828 +12.3407,2.8376 +11.6982,2.8471 +10.9871,2.8567 +10.2142,2.8662 +9.3868,2.8757 +8.5128,2.8853 +7.6006,2.8948 +6.6589,2.9043 +5.6966,2.9139 +4.7229,2.9234 +3.7471,2.9139 +2.7784,2.9043 +1.8262,2.8948 +0.8994,2.8853 +0.0069,2.8757 +-0.8427,2.8662 +-1.6414,2.8567 +-2.3817,2.8471 +-3.0563,2.8376 +-3.6589,2.828 +-4.1838,2.8185 +-4.6259,2.809 +-4.9811,2.7994 +-5.2459,2.7899 +-5.4179,2.7804 +-5.4953,2.7708 +-5.4775,2.7613 +-5.3646,2.7518 +-5.1578,2.7422 +-4.8588,2.7327 +-4.4707,2.7231 +-3.9972,2.7136 +-3.4426,2.7041 +-2.8124,2.6945 +-2.1125,2.7041 +-1.3495,2.7136 +-0.5309,2.7231 +0.3358,2.7327 +1.242,2.7422 +2.1794,2.7518 +3.1388,2.7613 +4.1113,2.7708 +5.0874,2.7804 +6.0579,2.7899 +7.0136,2.7994 +7.9453,2.809 +8.8442,2.8185 +9.7017,2.828 +10.5097,2.8376 +11.2603,2.8471 +11.9466,2.8567 +12.5619,2.8662 +13.1003,2.8757 +13.5568,2.8853 +13.927,2.8948 +14.2074,2.9043 +14.3953,2.9139 +14.4889,2.9234 +14.4873,2.9329 +14.3905,2.9425 +14.1995,2.952 +13.916,2.9616 +13.5428,2.9711 +13.0835,2.9806 +12.5423,2.9902 +11.9245,2.9997 +11.236,3.0092 +10.4833,3.0188 +9.6736,3.0283 +8.8145,3.0379 +7.9144,3.0474 +6.9817,3.0569 +6.0254,3.0665 +5.0545,3.076 +4.0783,3.0665 +3.1062,3.0569 +2.1473,3.0474 +1.2109,3.0379 +0.3058,3.0283 +-0.5593,3.0188 +-1.3762,3.0092 +-2.1371,2.9997 +-2.8348,2.9902 +-3.4626,2.9806 +-4.0145,2.9711 +-4.4853,2.9616 +-4.8704,2.952 +-5.1662,2.9425 +-5.37,2.9329 +-5.4797,2.9234 +-5.4943,2.9139 +-5.4136,2.9043 +-5.2385,2.8948 +-4.9706,2.8853 +-4.6124,2.8757 +-4.1674,2.8662 +-3.6398,2.8567 +-3.0347,2.8471 +-2.3577,2.8376 +-1.6154,2.8471 +-0.8148,2.8567 +0.0364,2.8662 +0.9301,2.8757 +1.8579,2.8853 +2.8109,2.8948 +3.7799,2.9043 +4.7558,2.9139 +5.7293,2.9234 +6.6911,2.9329 +7.6319,2.9425 +8.543,2.952 +9.4155,2.9616 +10.2412,2.9711 +11.0121,2.9806 +11.721,2.9902 +12.3611,2.9997 +12.9263,3.0092 +13.4112,3.0188 +13.8112,3.0283 +14.1224,3.0379 +14.342,3.0474 +14.4677,3.0569 +14.4985,3.0665 +14.434,3.076 +14.2749,3.0855 +14.0225,3.0951 +13.6795,3.1046 +13.249,3.1141 +12.7351,3.1237 +12.1427,3.1332 +11.4775,3.1428 +10.7458,3.1523 +9.9546,3.1618 +9.1115,3.1714 +8.2243,3.1809 +7.3017,3.1904 +6.3524,3.2 +5.3855,3.2095 +4.4101,3.2 +3.4355,3.1904 +2.4711,3.1809 +1.5261,3.1714 +0.6093,3.1618 +-0.2703,3.1523 +-1.1045,3.1428 +-1.8853,3.1332 +-2.6052,3.1237 +-3.2575,3.1141 +-3.8358,3.1046 +-4.3347,3.0951 +-4.7494,3.0855 +-5.0759,3.076 +-5.3112,3.0665 +-5.453,3.0569 +-5.5,3.0474 +-5.4517,3.0379 +-5.3085,3.0283 +-5.0719,3.0188 +-4.7441,3.0092 +-4.3281,2.9997 +-3.8281,2.9902 +-3.2487,2.9806 +-2.5954,2.9711 +-1.8746,2.9806 +-1.093,2.9902 +-0.2581,2.9997 +0.6222,3.0092 +1.5394,3.0188 +2.4848,3.0283 +3.4494,3.0379 +4.424,3.0474 +5.3994,3.0569 +6.3661,3.0665 +7.3151,3.076 +8.2373,3.0855 +9.1238,3.0951 +9.9663,3.1046 +10.7567,3.1141 +11.4875,3.1237 +12.1517,3.1332 +12.743,3.1428 +13.2557,3.1523 +13.685,3.1618 +14.0268,3.1714 +14.2778,3.1809 +14.4356,3.1904 +14.4987,3.2 +14.4666,3.2095 +14.3395,3.2191 +14.1186,3.2286 +13.8061,3.2381 +13.4049,3.2477 +12.9188,3.2572 +12.3525,3.2667 +11.7114,3.2763 +11.0015,3.2858 +10.2297,3.2953 +9.4033,3.3049 +8.5302,3.3144 +7.6187,3.324 +6.6775,3.3335 +5.7155,3.343 +4.7419,3.3335 +3.766,3.324 +2.7971,3.3144 +1.8445,3.3049 +0.9171,3.2953 +0.0239,3.2858 +-0.8266,3.2763 +-1.6264,3.2667 +-2.3679,3.2572 +-3.0438,3.2477 +-3.6479,3.2381 +-4.1744,3.2286 +-4.6182,3.2191 +-4.975,3.2095 +-5.2417,3.2 +-5.4154,3.1904 +-5.4947,3.1809 +-5.4788,3.1714 +-5.3677,3.1618 +-5.1627,3.1523 +-4.8655,3.1428 +-4.4791,3.1332 +-4.0072,3.1237 +-3.4541,3.1141 +-2.8253,3.1046 +-2.1267,3.0951 +-1.3649,3.1046 +-0.5473,3.1141 +0.3185,3.1237 +1.2241,3.1332 +2.1609,3.1428 +3.12,3.1523 +4.0923,3.1618 +5.0684,3.1714 +6.0391,3.1809 +6.9952,3.1904 +7.9275,3.2 +8.8271,3.2095 +9.6855,3.2191 +10.4945,3.2286 +11.2463,3.2381 +11.9339,3.2477 +12.5506,3.2572 +13.0906,3.2667 +13.5488,3.2763 +13.9207,3.2858 +14.2028,3.2953 +14.3925,3.3049 +14.488,3.3144 +14.4882,3.324 +14.3933,3.3335 +14.2041,3.343 +13.9224,3.3526 +13.5509,3.3621 +13.0932,3.3716 +12.5536,3.3812 +11.9373,3.3907 +11.25,3.4002 +10.4985,3.4098 +9.6898,3.4193 +8.8317,3.4289 +7.9322,3.4384 +7.0001,3.4479 +6.0441,3.4575 +5.0735,3.4479 +4.0973,3.4384 +3.125,3.4289 +2.1658,3.4193 +1.2289,3.4098 +0.3231,3.4002 +-0.5429,3.3907 +-1.3608,3.3812 +-2.1229,3.3716 +-2.8219,3.3621 +-3.4511,3.3526 +-4.0045,3.343 +-4.4769,3.3335 +-4.8637,3.324 +-5.1614,3.3144 +-5.3669,3.3049 +-5.4784,3.2953 +-5.4949,3.2858 +-5.4161,3.2763 +-5.2428,3.2667 +-4.9767,3.2572 +-4.6202,3.2477 +-4.1769,3.2381 +-3.6508,3.2286 +-3.0471,3.2191 +-2.3715,3.2095 +-1.6304,3.2 +-0.8309,3.2095 +0.0194,3.2191 +0.9124,3.2286 +1.8396,3.2381 +2.7922,3.2477 +3.761,3.2572 +4.7368,3.2667 +5.7105,3.2763 +6.6725,3.2858 +7.6139,3.2953 +8.5256,3.3049 +9.3989,3.3144 +10.2256,3.324 +10.9977,3.3335 +11.7079,3.343 +12.3494,3.3526 +12.9161,3.3621 +13.4026,3.3716 +13.8042,3.3812 +14.1172,3.3907 +14.3386,3.4002 +14.4662,3.4098 +14.4988,3.4193 +14.4362,3.4289 +14.2788,3.4384 +14.0283,3.4479 +13.687,3.4575 +13.2582,3.467 +12.7458,3.4765 +12.155,3.4861 +11.4911,3.4956 +10.7607,3.5052 +9.9706,3.5147 +9.1283,3.5242 +8.242,3.5338 +7.32,3.5433 +6.3711,3.5528 +5.4044,3.5433 +4.4291,3.5338 +3.4544,3.5242 +2.4897,3.5147 +1.5442,3.5052 +0.6268,3.4956 +-0.2536,3.4861 +-1.0888,3.4765 +-1.8707,3.467 +-2.5919,3.4575 +-3.2455,3.4479 +-3.8253,3.4384 +-4.3258,3.4289 +-4.7421,3.4193 +-5.0704,3.4098 +-5.3075,3.4002 +-5.4512,3.3907 +-5.5,3.3812 +-5.4535,3.3716 +-5.3122,3.3621 +-5.0774,3.3526 +-4.7513,3.343 +-4.337,3.3335 +-3.8386,3.324 +-3.2607,3.3144 +-2.6088,3.3049 +-1.8892,3.2953 +-1.1087,3.3049 +-0.2748,3.3144 +0.6047,3.324 +1.5212,3.3335 +2.4662,3.343 +3.4305,3.3526 +4.405,3.3621 +5.3804,3.3716 +6.3475,3.3812 +7.2969,3.3907 +8.2197,3.4002 +9.107,3.4098 +9.9504,3.4193 +10.7419,3.4289 +11.4739,3.4384 +12.1395,3.4479 +12.7322,3.4575 +13.2465,3.467 +13.6775,3.4765 +14.021,3.4861 +14.2738,3.4956 +14.4334,3.5052 +14.4984,3.5147 +14.4681,3.5242 +14.3429,3.5338 +14.1238,3.5433 +13.813,3.5528 +13.4135,3.5624 +12.929,3.5719 +12.3642,3.5814 +11.7245,3.591 +11.0159,3.6005 +10.2453,3.6101 +9.4199,3.6196 +8.5476,3.6291 +7.6367,3.6387 +6.696,3.6482 +5.7343,3.6387 +4.7609,3.6291 +3.785,3.6196 +2.8158,3.6101 +1.8628,3.6005 +0.9349,3.591 +0.0409,3.5814 +-0.8106,3.5719 +-1.6114,3.5624 +-2.354,3.5528 +-3.0314,3.5433 +-3.6369,3.5338 +-4.1649,3.5242 +-4.6103,3.5147 +-4.969,3.5052 +-5.2373,3.4956 +-5.4129,3.4861 +-5.4941,3.4765 +-5.48,3.467 +-5.3708,3.4575 +-5.1675,3.4479 +-4.8722,3.4384 +-4.4875,3.4289 +-4.0171,3.4193 +-3.4656,3.4098 +-2.8382,3.4002 +-2.1409,3.3907 +-1.3803,3.3812 +-0.5637,3.3907 +0.3012,3.4002 +1.2061,3.4098 +2.1424,3.4193 +3.1012,3.4289 +4.0733,3.4384 +5.0494,3.4479 +6.0204,3.4575 +6.9768,3.467 +7.9096,3.4765 +8.81,3.4861 +9.6692,3.4956 +10.4793,3.5052 +11.2323,3.5147 +11.9212,3.5242 +12.5393,3.5338 +13.0809,3.5433 +13.5407,3.5528 +13.9143,3.5624 +14.1982,3.5719 +14.3897,3.5814 +14.487,3.591 +14.4891,3.6005 +14.396,3.6101 +14.2086,3.6196 +13.9287,3.6291 +13.559,3.6387 +13.1029,3.6482 +12.5648,3.6577 +11.9499,3.6673 +11.264,3.6768 +10.5137,3.6864 +9.706,3.6959 +8.8488,3.7054 +7.9501,3.715 +7.0185,3.7245 +6.0629,3.715 +5.0924,3.7054 +4.1163,3.6959 +3.1438,3.6864 +2.1843,3.6768 +1.2468,3.6673 +0.3403,3.6577 +-0.5265,3.6482 +-1.3454,3.6387 +-2.1087,3.6291 +-2.8089,3.6196 +-3.4395,3.6101 +-3.9945,3.6005 +-4.4685,3.591 +-4.8571,3.5814 +-5.1564,3.5719 +-5.3638,3.5624 +-5.4772,3.5528 +-5.4955,3.5433 +-5.4185,3.5338 +-5.2471,3.5242 +-4.9827,3.5147 +-4.628,3.5052 +-4.1863,3.4956 +-3.6618,3.4861 +-3.0596,3.4765 +-2.3853,3.467 +-1.6454,3.4575 +-0.847,3.467 +0.0024,3.4765 +0.8947,3.4861 +1.8213,3.4956 +2.7734,3.5052 +3.742,3.5147 +4.7179,3.5242 +5.6916,3.5338 +6.654,3.5433 +7.5958,3.5528 +8.5082,3.5624 +9.3824,3.5719 +10.21,3.5814 +10.9832,3.591 +11.6947,3.6005 +12.3376,3.6101 +12.9058,3.6196 +13.3939,3.6291 +13.7972,3.6387 +14.112,3.6482 +14.3352,3.6577 +14.4646,3.6673 +14.4991,3.6768 +14.4383,3.6864 +14.2828,3.6959 +14.0341,3.7054 +13.6945,3.715 +13.2673,3.7245 +12.7566,3.734 +12.1672,3.7436 +11.5047,3.7531 +10.7755,3.7626 +9.9865,3.7722 +9.1451,3.7817 +8.2596,3.7913 +7.3382,3.8008 +6.3897,3.8011 +5.4233,3.7916 +4.4481,3.782 +3.4733,3.7725 +2.5083,3.7629 +1.5623,3.7534 +0.6444,3.7439 +-0.2369,3.7343 +-1.073,3.7248 +-1.856,3.7153 +-2.5785,3.7057 +-3.2335,3.6962 +-3.8147,3.6867 +-4.3168,3.6771 +-4.7349,3.6676 +-5.0649,3.658 +-5.3038,3.6485 +-5.4493,3.639 +-5.5,3.6294 +-5.4553,3.6199 +-5.3158,3.6104 +-5.0828,3.6008 +-4.7585,3.5913 +-4.3459,3.5817 +-3.8491,3.5722 +-3.2726,3.5627 +-2.6221,3.5531 +-1.9038,3.5436 +-1.1244,3.5341 +-0.2914,3.5436 +0.5872,3.5531 +1.5031,3.5627 +2.4476,3.5722 +3.4116,3.5817 +4.386,3.5913 +5.3615,3.6008 +6.3288,3.6104 +7.2786,3.6199 +8.202,3.6294 +9.0901,3.639 +9.9345,3.6485 +10.7271,3.658 +11.4603,3.6676 +12.1272,3.6771 +12.7214,3.6867 +13.2373,3.6962 +13.6699,3.7057 +14.0152,3.7153 +14.2697,3.7248 +14.4312,3.7343 +14.4981,3.7439 +14.4696,3.7534 +14.3462,3.7629 +14.1289,3.7725 +13.8199,3.782 +13.4221,3.7916 +12.9392,3.8011 +12.376,3.8106 +11.7376,3.8202 +11.0303,3.8297 +10.2608,3.8392 +9.4364,3.8488 +8.565,3.8583 +7.6548,3.8679 +6.7145,3.8774 +5.7532,3.8679 +4.7799,3.8583 +3.8039,3.8488 +2.8346,3.8392 +1.8811,3.8297 +0.9526,3.8202 +0.0579,3.8106 +-0.7945,3.8011 +-1.5964,3.7916 +-2.3402,3.782 +-3.0188,3.7725 +-3.6258,3.7629 +-4.1554,3.7534 +-4.6025,3.7439 +-4.9628,3.7343 +-5.233,3.7248 +-5.4104,3.7153 +-5.4934,3.7057 +-5.4812,3.6962 +-5.3738,3.6867 +-5.1724,3.6771 +-4.8788,3.6676 +-4.4958,3.658 +-4.0271,3.6485 +-3.4771,3.639 +-2.8511,3.6294 +-2.1551,3.6199 +-1.3957,3.6104 +-0.58,3.6199 +0.284,3.6294 +1.1882,3.639 +2.124,3.6485 +3.0824,3.658 +4.0543,3.6676 +5.0305,3.6771 +6.0016,3.6867 +6.9584,3.6962 +7.8918,3.7057 +8.7928,3.7153 +9.653,3.7248 +10.464,3.7343 +11.2182,3.7439 +11.9084,3.7534 +12.528,3.7629 +13.0711,3.7725 +13.5325,3.782 +13.9079,3.7916 +14.1936,3.8011 +14.3869,3.8106 +14.486,3.8202 +14.49,3.8297 +14.3987,3.8392 +14.2132,3.8488 +13.935,3.8583 +13.567,3.8679 +13.1126,3.8774 +12.5761,3.8869 +11.9626,3.8965 +11.278,3.906 +10.5289,3.9155 +9.7222,3.9251 +8.8659,3.9346 +7.9679,3.9441 +7.0369,3.9537 +6.0817,3.9441 +5.1114,3.9346 +4.1353,3.9251 +3.1627,3.9155 +2.2028,3.906 +1.2648,3.8965 +0.3576,3.8869 +-0.5101,3.8774 +-1.33,3.8679 +-2.0944,3.8583 +-2.796,3.8488 +-3.428,3.8392 +-3.9845,3.8297 +-4.4601,3.8202 +-4.8503,3.8106 +-5.1515,3.8011 +-5.3607,3.7916 +-5.4759,3.782 +-5.496,3.7725 +-5.4209,3.7629 +-5.2513,3.7534 +-4.9887,3.7439 +-4.6357,3.7343 +-4.1957,3.7248 +-3.6728,3.7153 +-3.072,3.7057 +-2.3991,3.6962 +-1.6604,3.6867 +-0.863,3.6771 +-0.0145,3.6867 +0.877,3.6962 +1.803,3.7057 +2.7547,3.7153 +3.7231,3.7248 +4.6989,3.7343 +5.6727,3.7439 +6.6354,3.7534 +7.5778,3.7629 +8.4908,3.7725 +9.3658,3.782 +10.1944,3.7916 +10.9688,3.8011 +11.6815,3.8106 +12.3258,3.8202 +12.8955,3.8297 +13.3852,3.8392 +13.7902,3.8488 +14.1067,3.8583 +14.3317,3.8679 +14.463,3.8774 +14.4993,3.8869 +14.4404,3.8965 +14.2867,3.906 +14.0398,3.9155 +13.702,3.9251 +13.2764,3.9346 +12.7673,3.9441 +12.1794,3.9537 +11.5182,3.9632 +10.7903,3.9728 +10.0023,3.9823 +9.162,3.9918 +8.2772,4.0014 +7.3564,4.0109 +6.4084,4.0014 +5.4422,3.9918 +4.4671,3.9823 +3.4922,3.9728 +2.527,3.9632 +1.5805,3.9537 +0.6619,3.9441 +-0.2202,3.9346 +-1.0572,3.9251 +-1.8413,3.9155 +-2.565,3.906 +-3.2214,3.8965 +-3.8042,3.8869 +-4.3078,3.8774 +-4.7276,3.8679 +-5.0593,3.8583 +-5.3,3.8488 +-5.4474,3.8392 +-5.4999,3.8297 +-5.4571,3.8202 +-5.3195,3.8106 +-5.0882,3.8011 +-4.7656,3.7916 +-4.3548,3.782 +-3.8595,3.7725 +-3.2846,3.7629 +-2.6355,3.7534 +-1.9184,3.7439 +-1.1401,3.7343 +-0.3081,3.7439 +0.5697,3.7534 +1.485,3.7629 +2.429,3.7725 +3.3927,3.782 +4.367,3.7916 +5.3426,3.8011 +6.3101,3.8106 +7.2604,3.8202 +8.1844,3.8297 +9.0732,3.8392 +9.9185,3.8488 +10.7122,3.8583 +11.4466,3.8679 +12.1149,3.8774 +12.7106,3.8869 +13.2281,3.8965 +13.6623,3.906 +14.0093,3.9155 +14.2657,3.9251 +14.429,3.9346 +14.4977,3.9441 +14.4711,3.9537 +14.3495,3.9632 +14.134,3.9728 +13.8268,3.9823 +13.4306,3.9918 +12.9494,4.0014 +12.3876,4.0109 +11.7507,4.0204 +11.0447,4.03 +10.2763,4.0395 +9.4529,4.049 +8.5823,4.0586 +7.6728,4.0681 +6.733,4.0586 +5.772,4.049 +4.7989,4.0395 +3.8229,4.03 +2.8533,4.0204 +1.8995,4.0109 +0.9704,4.0014 +0.0749,3.9918 +-0.7783,3.9823 +-1.5813,3.9728 +-2.3263,3.9632 +-3.0063,3.9537 +-3.6148,3.9441 +-4.1459,3.9346 +-4.5946,3.9251 +-4.9567,3.9155 +-5.2286,3.906 +-5.4079,3.8965 +-5.4927,3.8869 +-5.4823,3.8774 +-5.3768,3.8679 +-5.1772,3.8583 +-4.8853,3.8488 +-4.5041,3.8392 +-4.037,3.8297 +-3.4885,3.8202 +-2.864,3.8106 +-2.1693,3.8011 +-1.411,3.7916 +-0.5964,3.782 +0.2668,3.7916 +1.1703,3.8011 +2.1055,3.8106 +3.0636,3.8202 +4.0353,3.8297 +5.0115,3.8392 +5.9828,3.8488 +6.94,3.8583 +7.8739,3.8679 +8.7757,3.8774 +9.6367,3.8869 +10.4488,3.8965 +11.2041,3.906 +11.8956,3.9155 +12.5167,3.9251 +13.0613,3.9346 +13.5244,3.9441 +13.9014,3.9537 +14.1889,3.9632 +14.384,3.9728 +14.485,3.9823 +14.4908,3.9918 +14.4014,4.0014 +14.2177,4.0109 +13.9413,4.0204 +13.575,4.03 +13.1222,4.0395 +12.5873,4.049 +11.9752,4.0586 +11.292,4.0681 +10.544,4.0777 +9.7384,4.0872 +8.8829,4.0967 +7.9857,4.1063 +7.0552,4.0967 +6.1004,4.0872 +5.1303,4.0777 +4.1543,4.0681 +3.1815,4.0586 +2.2213,4.049 +1.2828,4.0395 +0.3749,4.03 +-0.4936,4.0204 +-1.3146,4.0109 +-2.0801,4.0014 +-2.783,3.9918 +-3.4164,3.9823 +-3.9744,3.9728 +-4.4516,3.9632 +-4.8436,3.9537 +-5.1465,3.9441 +-5.3575,3.9346 +-5.4745,3.9251 +-5.4965,3.9155 +-5.4233,3.906 +-5.2555,3.8965 +-4.9947,3.8869 +-4.6434,3.8774 +-4.2051,3.8679 +-3.6837,3.8583 +-3.0844,3.8488 +-2.4128,3.8392 +-1.6754,3.8297 +-0.879,3.8202 +-0.0315,3.8297 +0.8593,3.8392 +1.7847,3.8488 +2.736,3.8583 +3.7042,3.8679 +4.6799,3.8774 +5.6539,3.8869 +6.6169,3.8965 +7.5597,3.906 +8.4734,3.9155 +9.3492,3.9251 +10.1788,3.9346 +10.9543,3.9441 +11.6682,3.9537 +12.3139,3.9632 +12.8851,3.9728 +13.3765,3.9823 +13.7832,3.9918 +14.1014,4.0014 +14.3282,4.0109 +14.4613,4.0204 +14.4995,4.03 +14.4424,4.0395 +14.2906,4.049 +14.0455,4.0586 +13.7094,4.0681 +13.2855,4.0777 +12.778,4.0872 +12.1915,4.0967 +11.5318,4.1063 +10.805,4.1158 +10.0182,4.1253 +9.1788,4.1349 +8.2948,4.1444 +7.3746,4.154 +6.427,4.1444 +5.4611,4.1349 +4.486,4.1253 +3.5111,4.1158 +2.5456,4.1063 +1.5987,4.0967 +0.6794,4.0872 +-0.2034,4.0777 +-1.0414,4.0681 +-1.8266,4.0586 +-2.5516,4.049 +-3.2093,4.0395 +-3.7936,4.03 +-4.2988,4.0204 +-4.7202,4.0109 +-5.0537,4.0014 +-5.2962,3.9918 +-5.4454,3.9823 +-5.4998,3.9728 +-5.4588,3.9632 +-5.323,3.9537 +-5.0936,3.9441 +-4.7728,3.9346 +-4.3636,3.9251 +-3.8699,3.9155 +-3.2965,3.906 +-2.6488,3.8965 +-1.9329,3.8869 +-1.1558,3.8774 +-0.3248,3.8679 +0.5523,3.8774 +1.4669,3.8869 +2.4104,3.8965 +3.3739,3.906 +4.348,3.9155 +5.3237,3.9251 +6.2914,3.9346 +7.2421,3.9441 +8.1667,3.9537 +9.0563,3.9632 +9.9026,3.9728 +10.6973,3.9823 +11.433,3.9918 +12.1026,4.0014 +12.6997,4.0109 +13.2188,4.0204 +13.6547,4.03 +14.0034,4.0395 +14.2616,4.049 +14.4267,4.0586 +14.4972,4.0681 +14.4725,4.0777 +14.3528,4.0872 +14.1391,4.0967 +13.8336,4.1063 +13.4392,4.1158 +12.9595,4.1253 +12.3993,4.1349 +11.7638,4.1444 +11.0591,4.154 +10.2918,4.1635 +9.4694,4.173 +8.5996,4.1826 +7.6908,4.1921 +6.7516,4.1826 +5.7909,4.173 +4.8178,4.1635 +3.8418,4.154 +2.8721,4.1444 +1.9178,4.1349 +0.9882,4.1253 +0.092,4.1158 +-0.7622,4.1063 +-1.5662,4.0967 +-2.3124,4.0872 +-2.9937,4.0777 +-3.6036,4.0681 +-4.1363,4.0586 +-4.5867,4.049 +-4.9505,4.0395 +-5.2242,4.03 +-5.4053,4.0204 +-5.492,4.0109 +-5.4834,4.0014 +-5.3798,3.9918 +-5.182,3.9823 +-4.8919,3.9728 +-4.5123,3.9632 +-4.0469,3.9537 +-3.5,3.9441 +-2.8768,3.9346 +-2.1834,3.9251 +-1.4263,3.9155 +-0.6127,3.906 +0.2496,3.9155 +1.1524,3.9251 +2.0871,3.9346 +3.0448,3.9441 +4.0164,3.9537 +4.9925,3.9632 +5.964,3.9728 +6.9215,3.9823 +7.856,3.9918 +8.7585,4.0014 +9.6204,4.0109 +10.4335,4.0204 +11.19,4.03 +11.8828,4.0395 +12.5053,4.049 +13.0515,4.0586 +13.5162,4.0681 +13.8949,4.0777 +14.1842,4.0872 +14.3811,4.0967 +14.4839,4.1063 +14.4916,4.1158 +14.4041,4.1253 +14.2221,4.1349 +13.9476,4.1444 +13.583,4.154 +13.1318,4.1635 +12.5984,4.173 +11.9878,4.1826 +11.3059,4.1921 +10.5591,4.2016 +9.7546,4.2112 +8.9,4.2207 +8.0035,4.2302 +7.0736,4.2207 +6.1192,4.2112 +5.1493,4.2016 +4.1732,4.1921 +3.2003,4.1826 +2.2398,4.173 +1.3008,4.1635 +0.3922,4.154 +-0.4771,4.1444 +-1.2991,4.1349 +-2.0658,4.1253 +-2.7699,4.1158 +-3.4048,4.1063 +-3.9643,4.0967 +-4.4432,4.0872 +-4.8368,4.0777 +-5.1415,4.0681 +-5.3543,4.0586 +-5.4732,4.049 +-5.497,4.0395 +-5.4256,4.03 +-5.2596,4.0204 +-5.0006,4.0109 +-4.6511,4.0014 +-4.2144,3.9918 +-3.6946,3.9823 +-3.0968,3.9728 +-2.4265,3.9632 +-1.6903,3.9537 +-0.8951,3.9441 +-0.0484,3.9537 +0.8416,3.9632 +1.7664,3.9728 +2.7173,3.9823 +3.6852,3.9918 +4.6609,4.0014 +5.635,4.0109 +6.5983,4.0204 +7.5416,4.03 +8.4559,4.0395 +9.3326,4.049 +10.1631,4.0586 +10.9397,4.0681 +11.655,4.0777 +12.3021,4.0872 +12.8748,4.0967 +13.3677,4.1063 +13.7761,4.1158 +14.0961,4.1253 +14.3247,4.1349 +14.4596,4.1444 +14.4997,4.154 +14.4445,4.1635 +14.2945,4.173 +14.0511,4.1826 +13.7168,4.1921 +13.2946,4.2016 +12.7886,4.2112 +12.2036,4.2207 +11.5453,4.2302 +10.8197,4.2398 +10.034,4.2493 +9.1955,4.2589 +8.3123,4.2684 +7.3928,4.2589 +6.4457,4.2493 +5.48,4.2398 +4.505,4.2302 +3.53,4.2207 +2.5642,4.2112 +1.6169,4.2016 +0.697,4.1921 +-0.1866,4.1826 +-1.0256,4.173 +-1.8119,4.1635 +-2.5381,4.154 +-3.1972,4.1444 +-3.783,4.1349 +-4.2898,4.1253 +-4.7128,4.1158 +-5.0481,4.1063 +-5.2924,4.0967 +-5.4434,4.0872 +-5.4996,4.0777 +-5.4605,4.0681 +-5.3266,4.0586 +-5.099,4.049 +-4.7799,4.0395 +-4.3723,4.03 +-3.8803,4.0204 +-3.3084,4.0109 +-2.662,4.0014 +-1.9475,3.9918 +-1.1714,3.9823 +-0.3414,3.9728 +0.5348,3.9823 +1.4488,3.9918 +2.3918,4.0014 +3.355,4.0109 +4.329,4.0204 +5.3047,4.03 +6.2727,4.0395 +7.2239,4.049 +8.149,4.0586 +9.0394,4.0681 +9.8866,4.0777 +10.6824,4.0872 +11.4193,4.0967 +12.0902,4.1063 +12.6888,4.1158 +13.2094,4.1253 +13.6471,4.1349 +13.9975,4.1444 +14.2574,4.154 +14.4244,4.1635 +14.4968,4.173 +14.4739,4.1826 +14.356,4.1921 +14.1441,4.2016 +13.8404,4.2112 +13.4477,4.2207 +12.9697,4.2302 +12.4109,4.2398 +11.7768,4.2493 +11.0734,4.2589 +10.3073,4.2684 +9.4859,4.2779 +8.617,4.2875 +7.7088,4.297 +6.7701,4.2875 +5.8097,4.2779 +4.8368,4.2684 +3.8608,4.2589 +2.8908,4.2493 +1.9362,4.2398 +1.006,4.2302 +0.109,4.2207 +-0.746,4.2112 +-1.5511,4.2016 +-2.2985,4.1921 +-2.9811,4.1826 +-3.5925,4.173 +-4.1267,4.1635 +-4.5787,4.154 +-4.9443,4.1444 +-5.2198,4.1349 +-5.4027,4.1253 +-5.4912,4.1158 +-5.4845,4.1063 +-5.3827,4.0967 +-5.1867,4.0872 +-4.8984,4.0777 +-4.5205,4.0681 +-4.0567,4.0586 +-3.5113,4.049 +-2.8896,4.0395 +-2.1975,4.03 +-1.4416,4.0204 +-0.629,4.0109 +0.2324,4.0204 +1.1345,4.03 +2.0687,4.0395 +3.026,4.049 +3.9974,4.0586 +4.9736,4.0681 +5.9452,4.0777 +6.9031,4.0872 +7.8381,4.0967 +8.7413,4.1063 +9.604,4.1158 +10.4182,4.1253 +11.1759,4.1349 +11.87,4.1444 +12.4939,4.154 +13.0416,4.1635 +13.5079,4.173 +13.8884,4.1826 +14.1794,4.1921 +14.3782,4.2016 +14.4828,4.2112 +14.4924,4.2207 +14.4067,4.2302 +14.2266,4.2398 +13.9538,4.2493 +13.5909,4.2589 +13.1414,4.2684 +12.6095,4.2779 +12.0004,4.2875 +11.3198,4.297 +10.5742,4.3065 +9.7708,4.3161 +8.9171,4.3256 +8.0213,4.3352 +7.0919,4.3256 +6.1379,4.3161 +5.1683,4.3065 +4.1922,4.297 +3.2192,4.2875 +2.2583,4.2779 +1.3188,4.2684 +0.4096,4.2589 +-0.4607,4.2493 +-1.2836,4.2398 +-2.0515,4.2302 +-2.7569,4.2207 +-3.3931,4.2112 +-3.9542,4.2016 +-4.4346,4.1921 +-4.83,4.1826 +-5.1364,4.173 +-5.351,4.1635 +-5.4718,4.154 +-5.4975,4.1444 +-5.4279,4.1349 +-5.2638,4.1253 +-5.0066,4.1158 +-4.6588,4.1063 +-4.2237,4.0967 +-3.7055,4.0872 +-3.1091,4.0777 +-2.4402,4.0681 +-1.7052,4.0586 +-0.911,4.049 +-0.0653,4.0395 +0.8239,4.049 +1.7482,4.0586 +2.6986,4.0681 +3.6663,4.0777 +4.6419,4.0872 +5.6161,4.0967 +6.5797,4.1063 +7.5235,4.1158 +8.4385,4.1253 +9.3159,4.1349 +10.1475,4.1444 +10.9252,4.154 +11.6417,4.1635 +12.2902,4.173 +12.8644,4.1826 +13.3589,4.1921 +13.769,4.2016 +14.0908,4.2112 +14.3211,4.2207 +14.4579,4.2302 +14.4998,4.2398 +14.4464,4.2493 +14.2983,4.2589 +14.0567,4.2684 +13.7241,4.2779 +13.3036,4.2875 +12.7992,4.297 +12.2157,4.3065 +11.5587,4.3161 +10.8345,4.3256 +10.0498,4.3352 +9.2123,4.3447 +8.3299,4.3542 +7.411,4.3447 +6.4643,4.3352 +5.4989,4.3256 +4.524,4.3161 +3.5489,4.3065 +2.5829,4.297 +1.6351,4.2875 +0.7146,4.2779 +-0.1698,4.2684 +-1.0098,4.2589 +-1.7972,4.2493 +-2.5246,4.2398 +-3.1851,4.2302 +-3.7723,4.2207 +-4.2807,4.2112 +-4.7054,4.2016 +-5.0425,4.1921 +-5.2885,4.1826 +-5.4414,4.173 +-5.4994,4.1635 +-5.4622,4.154 +-5.3301,4.1444 +-5.1043,4.1349 +-4.7869,4.1253 +-4.3811,4.1158 +-3.8906,4.1063 +-3.3202,4.0967 +-2.6753,4.0872 +-1.962,4.0777 +-1.1871,4.0681 +-0.358,4.0586 +0.5174,4.0681 +1.4307,4.0777 +2.3733,4.0872 +3.3361,4.0967 +4.31,4.1063 +5.2858,4.1158 +6.254,4.1253 +7.2056,4.1349 +8.1313,4.1444 +9.0225,4.154 +9.8705,4.1635 +10.6674,4.173 +11.4055,4.1826 +12.0778,4.1921 +12.6779,4.2016 +13.2001,4.2112 +13.6394,4.2207 +13.9915,4.2302 +14.2533,4.2398 +14.422,4.2493 +14.4963,4.2589 +14.4753,4.2684 +14.3592,4.2779 +14.1492,4.2875 +13.8472,4.297 +13.4561,4.3065 +12.9797,4.3161 +12.4225,4.3256 +11.7899,4.3352 +11.0877,4.3447 +10.3228,4.3542 +9.5024,4.3638 +8.6343,4.3733 +7.7268,4.3828 +6.7886,4.3733 +5.8285,4.3638 +4.8558,4.3542 +3.8797,4.3447 +2.9096,4.3352 +1.9545,4.3256 +1.0238,4.3161 +0.1261,4.3065 +-0.7298,4.297 +-1.536,4.2875 +-2.2846,4.2779 +-2.9685,4.2684 +-3.5813,4.2589 +-4.1171,4.2493 +-4.5708,4.2398 +-4.938,4.2302 +-5.2153,4.2207 +-5.4,4.2112 +-5.4904,4.2016 +-5.4855,4.1921 +-5.3856,4.1826 +-5.1914,4.173 +-4.9049,4.1635 +-4.5287,4.154 +-4.0665,4.1444 +-3.5227,4.1349 +-2.9024,4.1253 +-2.2116,4.1158 +-1.4569,4.1063 +-0.6453,4.0967 +0.2152,4.1063 +1.1166,4.1158 +2.0502,4.1253 +3.0072,4.1349 +3.9784,4.1444 +4.9546,4.154 +5.9264,4.1635 +6.8847,4.173 +7.8202,4.1826 +8.7241,4.1921 +9.5877,4.2016 +10.4028,4.2112 +11.1617,4.2207 +11.8572,4.2302 +12.4825,4.2398 +13.0317,4.2493 +13.4997,4.2589 +13.8819,4.2684 +14.1746,4.2779 +14.3752,4.2875 +14.4817,4.297 +14.4931,4.3065 +14.4092,4.3161 +14.231,4.3256 +13.9599,4.3352 +13.5988,4.3447 +13.1509,4.3542 +12.6206,4.3638 +12.013,4.3733 +11.3337,4.3828 +10.5893,4.3924 +9.7869,4.4019 +8.9341,4.4114 +8.0391,4.421 +7.1103,4.4114 +6.1566,4.4019 +5.1872,4.3924 +4.2112,4.3828 +3.238,4.3733 +2.2768,4.3638 +1.3368,4.3542 +0.4269,4.3447 +-0.4442,4.3352 +-1.2681,4.3256 +-2.0371,4.3161 +-2.7438,4.3065 +-3.3814,4.297 +-3.944,4.2875 +-4.4261,4.2779 +-4.8231,4.2684 +-5.1313,4.2589 +-5.3477,4.2493 +-5.4703,4.2398 +-5.4979,4.2302 +-5.4302,4.2207 +-5.2678,4.2112 +-5.0124,4.2016 +-4.6664,4.1921 +-4.233,4.1826 +-3.7164,4.173 +-3.1214,4.1635 +-2.4539,4.154 +-1.7201,4.1444 +-0.927,4.1349 +-0.0822,4.1253 +0.8063,4.1349 +1.7299,4.1444 +2.68,4.154 +3.6474,4.1635 +4.6229,4.173 +5.5972,4.1826 +6.5611,4.1921 +7.5054,4.2016 +8.421,4.2112 +9.2993,4.2207 +10.1318,4.2302 +10.9106,4.2398 +11.6284,4.2493 +12.2782,4.2589 +12.854,4.2684 +13.3501,4.2779 +13.7618,4.2875 +14.0854,4.297 +14.3175,4.3065 +14.4562,4.3161 +14.4999,4.3256 +14.4484,4.3352 +14.302,4.3447 +14.0623,4.3542 +13.7314,4.3638 +13.3126,4.3733 +12.8098,4.3828 +12.2278,4.3924 +11.5722,4.4019 +10.8491,4.4114 +10.0656,4.421 +9.2291,4.4305 +8.3474,4.4401 +7.4291,4.4305 +6.4829,4.421 +5.5178,4.4114 +4.543,4.4019 +3.5678,4.3924 +2.6015,4.3828 +1.6533,4.3733 +0.7322,4.3638 +-0.153,4.3542 +-0.9939,4.3447 +-1.7824,4.3352 +-2.5111,4.3256 +-3.1729,4.3161 +-3.7616,4.3065 +-4.2716,4.297 +-4.698,4.2875 +-5.0368,4.2779 +-5.2846,4.2684 +-5.4393,4.2589 +-5.4992,4.2493 +-5.4638,4.2398 +-5.3335,4.2302 +-5.1095,4.2207 +-4.794,4.2112 +-4.3898,4.2016 +-3.901,4.1921 +-3.332,4.1826 +-2.6885,4.173 +-1.9765,4.1635 +-1.2027,4.154 +-0.3746,4.1444 +0.5,4.154 +1.4126,4.1635 +2.3547,4.173 +3.3172,4.1826 +4.2911,4.1921 +5.2668,4.2016 +6.2353,4.2112 +7.1873,4.2207 +8.1136,4.2302 +9.0055,4.2398 +9.8545,4.2493 +10.6525,4.2589 +11.3918,4.2684 +12.0654,4.2779 +12.667,4.2875 +13.1907,4.297 +13.6316,4.3065 +13.9855,4.3161 +14.249,4.3256 +14.4197,4.3352 +14.4957,4.3447 +14.4766,4.3542 +14.3623,4.3638 +14.1541,4.3733 +13.8539,4.3828 +13.4646,4.3924 +12.9898,4.4019 +12.4341,4.4114 +11.8028,4.421 +11.102,4.4305 +10.3382,4.4401 +9.5188,4.4496 +8.6516,4.4591 +7.7448,4.4496 +6.807,4.4401 +5.8473,4.4305 +4.8748,4.421 +3.8987,4.4114 +2.9283,4.4019 +1.9729,4.3924 +1.0416,4.3828 +0.1432,4.3733 +-0.7136,4.3638 +-1.5208,4.3542 +-2.2706,4.3447 +-2.9559,4.3352 +-3.5701,4.3256 +-4.1074,4.3161 +-4.5627,4.3065 +-4.9317,4.297 +-5.2108,4.2875 +-5.3973,4.2779 +-5.4895,4.2684 +-5.4866,4.2589 +-5.3884,4.2493 +-5.1961,4.2398 +-4.9113,4.2302 +-4.5369,4.2207 +-4.0763,4.2112 +-3.534,4.2016 +-2.9152,4.1921 +-2.2257,4.1826 +-1.4721,4.173 +-0.6616,4.1635 +0.1981,4.154 +1.0987,4.1635 +2.0318,4.173 +2.9884,4.1826 +3.9594,4.1921 +4.9356,4.2016 +5.9076,4.2112 +6.8662,4.2207 +7.8023,4.2302 +8.7068,4.2398 +9.5713,4.2493 +10.3875,4.2589 +11.1476,4.2684 +11.8443,4.2779 +12.471,4.2875 +13.0218,4.297 +13.4914,4.3065 +13.8753,4.3161 +14.1698,4.3256 +14.3722,4.3352 +14.4806,4.3447 +14.4938,4.3542 +14.4118,4.3638 +14.2353,4.3733 +13.9661,4.3828 +13.6067,4.3924 +13.1605,4.4019 +12.6317,4.4114 +12.0255,4.421 +11.3476,4.4305 +10.6044,4.4401 +9.803,4.4496 +8.9511,4.4591 +8.0568,4.4687 +7.1286,4.4591 +6.1754,4.4496 +5.2062,4.4401 +4.2302,4.4305 +3.2568,4.421 +2.2953,4.4114 +1.3548,4.4019 +0.4443,4.3924 +-0.4276,4.3828 +-1.2526,4.3733 +-2.0227,4.3638 +-2.7307,4.3542 +-3.3697,4.3447 +-3.9338,4.3352 +-4.4175,4.3256 +-4.8162,4.3161 +-5.1262,4.3065 +-5.3444,4.297 +-5.4688,4.2875 +-5.4983,4.2779 +-5.4324,4.2684 +-5.2719,4.2589 +-5.0183,4.2493 +-4.674,4.2398 +-4.2422,4.2302 +-3.7272,4.2207 +-3.1337,4.2112 +-2.4675,4.2016 +-1.7349,4.1921 +-0.9429,4.1826 +-0.0991,4.173 +0.7886,4.1826 +1.7117,4.1921 +2.6613,4.2016 +3.6284,4.2112 +4.6039,4.2207 +5.5784,4.2302 +6.5425,4.2398 +7.4873,4.2493 +8.4035,4.2589 +9.2826,4.2684 +10.1161,4.2779 +10.896,4.2875 +11.6151,4.297 +12.2663,4.3065 +12.8435,4.3161 +13.3412,4.3256 +13.7547,4.3352 +14.0799,4.3447 +14.3139,4.3542 +14.4544,4.3638 +14.5,4.3733 +14.4503,4.3828 +14.3058,4.3924 +14.0678,4.4019 +13.7387,4.4114 +13.3216,4.421 +12.8203,4.4305 +12.2398,4.4401 +11.5856,4.4496 +10.8638,4.4591 +10.0814,4.4687 +9.2458,4.4782 +8.365,4.4877 +7.4473,4.4782 +6.5015,4.4687 +5.5367,4.4591 +4.562,4.4496 +3.5867,4.4401 +2.6202,4.4305 +1.6715,4.421 +0.7498,4.4114 +-0.1362,4.4019 +-0.978,4.3924 +-1.7676,4.3828 +-2.4975,4.3733 +-3.1607,4.3638 +-3.7509,4.3542 +-4.2625,4.3447 +-4.6905,4.3352 +-5.031,4.3256 +-5.2807,4.3161 +-5.4372,4.3065 +-5.4989,4.297 +-5.4654,4.2875 +-5.337,4.2779 +-5.1148,4.2684 +-4.8009,4.2589 +-4.3985,4.2493 +-3.9112,4.2398 +-3.3438,4.2302 +-2.7017,4.2207 +-1.9909,4.2112 +-1.2183,4.2016 +-0.3912,4.1921 +0.4826,4.2016 +1.3946,4.2112 +2.3362,4.2207 +3.2984,4.2302 +4.2721,4.2398 +5.2479,4.2493 +6.2166,4.2589 +7.169,4.2684 +8.0959,4.2779 +8.9886,4.2875 +9.8385,4.297 +10.6375,4.3065 +11.378,4.3161 +12.053,4.3256 +12.656,4.3352 +13.1813,4.3447 +13.6239,4.3542 +13.9795,4.3638 +14.2448,4.3733 +14.4172,4.3828 +14.4952,4.3924 +14.4779,4.4019 +14.3655,4.4114 +14.1591,4.421 +13.8606,4.4305 +13.473,4.4401 +12.9998,4.4496 +12.4457,4.4591 +11.8158,4.4687 +11.1162,4.4782 +10.3536,4.4877 +9.5352,4.4973 +8.6688,4.5068 +7.7627,4.4973 +6.8255,4.4877 +5.8662,4.4782 +4.8938,4.4687 +3.9177,4.4591 +2.9471,4.4496 +1.9913,4.4401 +1.0594,4.4305 +0.1603,4.421 +-0.6974,4.4114 +-1.5056,4.4019 +-2.2566,4.3924 +-2.9432,4.3828 +-3.5589,4.3733 +-4.0978,4.3638 +-4.5547,4.3542 +-4.9254,4.3447 +-5.2062,4.3352 +-5.3946,4.3256 +-5.4886,4.3161 +-5.4875,4.3065 +-5.3912,4.297 +-5.2007,4.2875 +-4.9177,4.2779 +-4.545,4.2684 +-4.0861,4.2589 +-3.5453,4.2493 +-2.9279,4.2398 +-2.2397,4.2302 +-1.4873,4.2207 +-0.6779,4.2112 +0.1809,4.2016 +1.0809,4.2112 +2.0134,4.2207 +2.9697,4.2302 +3.9405,4.2398 +4.9166,4.2493 +5.8888,4.2589 +6.8478,4.2684 +7.7843,4.2779 +8.6896,4.2875 +9.555,4.297 +10.3721,4.3065 +11.1334,4.3161 +11.8314,4.3256 +12.4595,4.3352 +13.0118,4.3447 +13.483,4.3542 +13.8686,4.3638 +14.165,4.3733 +14.3692,4.3828 +14.4793,4.3924 +14.4944,4.4019 +14.4143,4.4114 +14.2396,4.421 +13.9722,4.4305 +13.6145,4.4401 +13.1699,4.4496 +12.6428,4.4591 +12.038,4.4687 +11.3614,4.4782 +10.6194,4.4877 +9.8191,4.4973 +8.9681,4.5068 +8.0746,4.5164 +7.1469,4.5068 +6.1941,4.4973 +5.2251,4.4877 +4.2492,4.4782 +3.2757,4.4687 +2.3139,4.4591 +1.3728,4.4496 +0.4616,4.4401 +-0.4111,4.4305 +-1.237,4.421 +-2.0083,4.4114 +-2.7175,4.4019 +-3.358,4.3924 +-3.9236,4.3828 +-4.4089,4.3733 +-4.8093,4.3638 +-5.121,4.3542 +-5.3411,4.3447 +-5.4673,4.3352 +-5.4986,4.3256 +-5.4346,4.3161 +-5.2759,4.3065 +-5.0241,4.297 +-4.6815,4.2875 +-4.2514,4.2779 +-3.7379,4.2684 +-3.146,4.2589 +-2.4811,4.2493 +-1.7498,4.2398 +-0.9589,4.2302 +-0.1159,4.2207 +0.771,4.2302 +1.6934,4.2398 +2.6426,4.2493 +3.6095,4.2589 +4.5849,4.2684 +5.5595,4.2779 +6.5239,4.2875 +7.4691,4.297 +8.386,4.3065 +9.2659,4.3161 +10.1003,4.3256 +10.8814,4.3352 +11.6017,4.3447 +12.2543,4.3542 +12.833,4.3638 +13.3323,4.3733 +13.7474,4.3828 +14.0745,4.3924 +14.3102,4.4019 +14.4525,4.4114 +14.5,4.421 +14.4522,4.4305 +14.3095,4.4401 +14.0733,4.4496 +13.746,4.4591 +13.3305,4.4687 +12.8309,4.4782 +12.2519,4.4877 +11.599,4.4973 +10.8784,4.5068 +10.0971,4.5164 +9.2625,4.5259 +8.3825,4.5354 +7.4654,4.5259 +6.5202,4.5164 +5.5556,4.5068 +4.581,4.4973 +3.6057,4.4877 +2.6388,4.4782 +1.6897,4.4687 +0.7674,4.4591 +-0.1194,4.4496 +-0.9621,4.4401 +-1.7528,4.4305 +-2.4839,4.421 +-3.1485,4.4114 +-3.7401,4.4019 +-4.2533,4.3924 +-4.683,4.3828 +-5.0253,4.3733 +-5.2767,4.3638 +-5.435,4.3542 +-5.4987,4.3447 +-5.467,4.3352 +-5.3404,4.3256 +-5.12,4.3161 +-4.8079,4.3065 +-4.4071,4.297 +-3.9215,4.2875 +-3.3556,4.2779 +-2.7149,4.2684 +-2.0054,4.2589 +-1.2339,4.2493 +-0.4077,4.2398 +0.4652,4.2383 +1.3765,4.2479 +2.3176,4.2574 +3.2795,4.267 +4.2531,4.2765 +5.229,4.286 +6.1979,4.2956 +7.1507,4.3051 +8.0782,4.3146 +8.9716,4.3242 +9.8224,4.3337 +10.6225,4.3432 +11.3642,4.3528 +12.0405,4.3623 +12.645,4.3719 +13.1719,4.3814 +13.6161,4.3909 +13.9734,4.4005 +14.2405,4.41 +14.4148,4.4195 +14.4946,4.4291 +14.4791,4.4386 +14.3685,4.4481 +14.164,4.4577 +13.8673,4.4672 +13.4813,4.4768 +13.0098,4.4863 +12.4572,4.4958 +11.8288,4.5054 +11.1305,4.5149 +10.369,4.5244 +9.5516,4.534 +8.6861,4.5435 +7.7807,4.534 +6.844,4.5244 +5.885,4.5149 +4.9128,4.5054 +3.9366,4.4958 +2.9658,4.4863 +2.0097,4.4768 +1.0773,4.4672 +0.1774,4.4577 +-0.6812,4.4481 +-1.4904,4.4386 +-2.2426,4.4291 +-2.9305,4.4195 +-3.5476,4.41 +-4.088,4.4005 +-4.5466,4.3909 +-4.919,4.3814 +-5.2016,4.3719 +-5.3918,4.3623 +-5.4877,4.3528 +-5.4884,4.3432 +-5.394,4.3337 +-5.2053,4.3242 +-4.9241,4.3146 +-4.5531,4.3051 +-4.0958,4.2956 +-3.5566,4.286 +-2.9406,4.2765 +-2.2538,4.267 +-1.5025,4.2574 +-0.6941,4.2479 +0.1638,4.2383 +1.063,4.2479 +1.995,4.2574 +2.9509,4.267 +3.9215,4.2765 +4.8976,4.286 +5.87,4.2956 +6.8293,4.3051 +7.7664,4.3146 +8.6723,4.3242 +9.5386,4.3337 +10.3568,4.3432 +11.1191,4.3528 +11.8184,4.3623 +12.448,4.3719 +13.0019,4.3814 +13.4747,4.3909 +13.862,4.4005 +14.1601,4.41 +14.3661,4.4195 +14.4781,4.4291 +14.495,4.4386 +14.4167,4.4481 +14.2439,4.4577 +13.9783,4.4672 +13.6223,4.4768 +13.1794,4.4863 +12.6538,4.4958 +12.0505,4.5054 +11.3752,4.5149 +10.6344,4.5244 +9.8352,4.534 +8.9851,4.5435 +8.0923,4.5531 +7.1653,4.5435 +6.2128,4.534 +5.244,4.5244 +4.2682,4.5149 +3.2946,4.5054 +2.3324,4.4958 +1.3909,4.4863 +0.479,4.4768 +-0.3945,4.4672 +-1.2215,4.4577 +-1.9939,4.4481 +-2.7044,4.4386 +-3.3462,4.4291 +-3.9133,4.4195 +-4.4003,4.41 +-4.8024,4.4005 +-5.1158,4.3909 +-5.3377,4.3814 +-5.4658,4.3719 +-5.4989,4.3623 +-5.4367,4.3528 +-5.2799,4.3432 +-5.0299,4.3337 +-4.689,4.3242 +-4.2606,4.3146 +-3.7487,4.3051 +-3.1582,4.2956 +-2.4947,4.286 +-1.7646,4.2765 +-0.9748,4.267 +-0.1328,4.2574 +0.7534,4.267 +1.6752,4.2765 +2.624,4.286 +3.5906,4.2956 +4.5659,4.3051 +5.5406,4.3146 +6.5053,4.3242 +7.451,4.3337 +8.3685,4.3432 +9.2492,4.3528 +10.0846,4.3623 +10.8668,4.3719 +11.5883,4.3814 +12.2423,4.3909 +12.8225,4.4005 +13.3234,4.41 +13.7402,4.4195 +14.069,4.4291 +14.3065,4.4386 +14.4507,4.4481 +14.5,4.4577 +14.454,4.4672 +14.3132,4.4768 +14.0788,4.4863 +13.7532,4.4958 +13.3394,4.5054 +12.8414,4.5149 +12.2638,4.5244 +11.6123,4.534 +10.8931,4.5435 +10.1129,4.5531 +9.2792,4.5626 +8.4,4.5721 +7.4836,4.5626 +6.5388,4.5531 +5.5745,4.5435 +4.6,4.534 +3.6246,4.5244 +2.6575,4.5149 +1.708,4.5054 +0.785,4.4958 +-0.1025,4.4863 +-0.9462,4.4768 +-1.738,4.4672 +-2.4703,4.4577 +-3.1362,4.4481 +-3.7294,4.4386 +-4.2441,4.4291 +-4.6755,4.4195 +-5.0195,4.41 +-5.2727,4.4005 +-5.4328,4.3909 +-5.4983,4.3814 +-5.4685,4.3719 +-5.3437,4.3623 +-5.1251,4.3528 +-4.8148,4.3432 +-4.4158,4.3337 +-3.9317,4.3242 +-3.3673,4.3146 +-2.728,4.3051 +-2.0198,4.2956 +-1.2494,4.286 +-0.4243,4.2765 +0.4478,4.267 +1.3585,4.2765 +2.2991,4.286 +3.2607,4.2956 +4.2341,4.3051 +5.21,4.3146 +6.1792,4.3242 +7.1323,4.3337 +8.0604,4.3432 +8.9546,4.3528 +9.8063,4.3623 +10.6074,4.3719 +11.3504,4.3814 +12.028,4.3909 +12.634,4.4005 +13.1624,4.41 +13.6083,4.4195 +13.9673,4.4291 +14.2362,4.4386 +14.4123,4.4481 +14.4939,4.4577 +14.4803,4.4672 +14.3716,4.4768 +14.1688,4.4863 +13.8739,4.4958 +13.4897,4.5054 +13.0198,4.5149 +12.4687,4.5244 +11.8417,4.534 +11.1447,4.5435 +10.3844,4.5531 +9.568,4.5626 +8.7033,4.5721 +7.7986,4.5626 +6.8625,4.5531 +5.9038,4.5435 +4.9317,4.534 +3.9556,4.5244 +2.9846,4.5149 +2.0281,4.5054 +1.0951,4.4958 +0.1946,4.4863 +-0.6649,4.4768 +-1.4752,4.4672 +-2.2286,4.4577 +-2.9178,4.4481 +-3.5363,4.4386 +-4.0783,4.4291 +-4.5385,4.4195 +-4.9126,4.41 +-5.197,4.4005 +-5.389,4.3909 +-5.4867,4.3814 +-5.4893,4.3719 +-5.3967,4.3623 +-5.2098,4.3528 +-4.9304,4.3432 +-4.5611,4.3337 +-4.1055,4.3242 +-3.5678,4.3146 +-2.9533,4.3051 +-2.2678,4.2956 +-1.5177,4.286 +-0.7103,4.2765 +0.1467,4.267 +1.0452,4.2765 +1.9766,4.286 +2.9321,4.2956 +3.9025,4.3051 +4.8787,4.3146 +5.8512,4.3242 +6.8108,4.3337 +7.7484,4.3432 +8.6551,4.3528 +9.5221,4.3623 +10.3413,4.3719 +11.1049,4.3814 +11.8055,4.3909 +12.4365,4.4005 +12.9918,4.41 +13.4663,4.4195 +13.8553,4.4291 +14.1551,4.4386 +14.363,4.4481 +14.4768,4.4577 +14.4956,4.4672 +14.4192,4.4768 +14.2482,4.4863 +13.9843,4.4958 +13.6301,4.5054 +13.1888,4.5149 +12.6648,4.5244 +12.0629,4.534 +11.389,4.5435 +10.6494,4.5531 +9.8512,4.5626 +9.0021,4.5721 +8.11,4.5636 +7.1836,4.5541 +6.2315,4.5445 +5.263,4.535 +4.2872,4.5254 +3.3134,4.5159 +2.3509,4.5064 +1.409,4.4968 +0.4964,4.4873 +-0.378,4.4778 +-1.2059,4.4682 +-1.9794,4.4587 +-2.6912,4.4492 +-3.3344,4.4396 +-3.903,4.4301 +-4.3916,4.4205 +-4.7954,4.411 +-5.1106,4.4015 +-5.3342,4.3919 +-5.4642,4.3824 +-5.4992,4.3729 +-5.4389,4.3633 +-5.2838,4.3538 +-5.0356,4.3442 +-4.6965,4.3347 +-4.2697,4.3252 +-3.7594,4.3156 +-3.1704,4.3061 +-2.5083,4.2966 +-1.7794,4.287 +-0.9907,4.2775 +-0.1496,4.268 +0.7357,4.2775 +1.657,4.287 +2.6053,4.2966 +3.5717,4.3061 +4.5469,4.3156 +5.5217,4.3252 +6.4867,4.3347 +7.4328,4.3442 +8.351,4.3538 +9.2325,4.3633 +10.0688,4.3729 +10.8521,4.3824 +11.5749,4.3919 +12.2303,4.4015 +12.8119,4.411 +13.3144,4.4205 +13.7329,4.4301 +14.0634,4.4396 +14.3028,4.4492 +14.4488,4.4587 +14.4999,4.4682 +14.4558,4.4778 +14.3168,4.4873 +14.0843,4.4968 +13.7604,4.5064 +13.3483,4.5159 +12.8518,4.5254 +12.2758,4.535 +11.6257,4.5445 +10.9077,4.5541 +10.1286,4.5636 +9.2959,4.5731 +8.4175,4.5827 +7.5017,4.5731 +6.5574,4.5636 +5.5934,4.5541 +4.619,4.5445 +3.6435,4.535 +2.6762,4.5254 +1.7262,4.5159 +0.8027,4.5064 +-0.0856,4.4968 +-0.9302,4.4873 +-1.7231,4.4778 +-2.4567,4.4682 +-3.1239,4.4587 +-3.7186,4.4492 +-4.2349,4.4396 +-4.6679,4.4301 +-5.0136,4.4205 +-5.2687,4.411 +-5.4306,4.4015 +-5.498,4.3919 +-5.47,4.3824 +-5.3471,4.3729 +-5.1303,4.3633 +-4.8217,4.3538 +-4.4244,4.3442 +-3.9419,4.3347 +-3.3791,4.3252 +-2.7411,4.3156 +-2.0342,4.3061 +-1.2649,4.2966 +-0.4408,4.287 +0.4304,4.2775 +1.3404,4.287 +2.2806,4.2966 +3.2418,4.3061 +4.2151,4.3156 +5.1911,4.3252 +6.1604,4.3347 +7.114,4.3442 +8.0427,4.3538 +8.9376,4.3633 +9.7902,4.3729 +10.5924,4.3824 +11.3365,4.3919 +12.0155,4.4015 +12.6229,4.411 +13.1529,4.4205 +13.6004,4.4301 +13.9612,4.4396 +14.2318,4.4492 +14.4098,4.4587 +14.4932,4.4682 +14.4815,4.4778 +14.3746,4.4873 +14.1737,4.4968 +13.8805,4.5064 +13.498,4.5159 +13.0297,4.5254 +12.4801,4.535 +11.8545,4.5445 +11.1589,4.5541 +10.3997,4.5636 +9.5844,4.5731 +8.7206,4.5827 +7.8165,4.5731 +6.8809,4.5636 +5.9226,4.5541 +4.9507,4.5445 +3.9746,4.535 +3.0034,4.5254 +2.0465,4.5159 +1.113,4.5064 +0.2117,4.4968 +-0.6486,4.4873 +-1.46,4.4778 +-2.2145,4.4682 +-2.905,4.4587 +-3.525,4.4492 +-4.0685,4.4396 +-4.5304,4.4301 +-4.9062,4.4205 +-5.1923,4.411 +-5.3862,4.4015 +-5.4858,4.3919 +-5.4902,4.3824 +-5.3995,4.3729 +-5.2144,4.3633 +-4.9367,4.3538 +-4.5691,4.3442 +-4.1151,4.3347 +-3.579,4.3252 +-2.966,4.3156 +-2.2817,4.3061 +-1.5329,4.2966 +-0.7265,4.287 +0.1296,4.2775 +1.0274,4.287 +1.9583,4.2966 +2.9134,4.3061 +3.8836,4.3156 +4.8597,4.3252 +5.8323,4.3347 +6.7923,4.3442 +7.7304,4.3538 +8.6378,4.3633 +9.5057,4.3729 +10.3259,4.3824 +11.0906,4.3919 +11.7925,4.4015 +12.4249,4.411 +12.9818,4.4205 +13.4579,4.4301 +13.8486,4.4396 +14.1502,4.4492 +14.3598,4.4587 +14.4755,4.4682 +14.4962,4.4778 +14.4216,4.4873 +14.2524,4.4968 +13.9903,4.5064 +13.6378,4.5159 +13.1982,4.5254 +12.6757,4.535 +12.0753,4.5445 +11.4027,4.5541 +10.6644,4.5636 +9.8673,4.5731 +9.019,4.5827 +8.1277,4.5731 +7.2019,4.5636 +6.2502,4.5541 +5.2819,4.5445 +4.3062,4.535 +3.3323,4.5254 +2.3695,4.5159 +1.427,4.5064 +0.5138,4.4968 +-0.3614,4.4873 +-1.1903,4.4778 +-1.9649,4.4682 +-2.678,4.4587 +-3.3226,4.4492 +-3.8927,4.4396 +-4.3829,4.4301 +-4.7884,4.4205 +-5.1053,4.411 +-5.3308,4.4015 +-5.4626,4.3919 +-5.4994,4.3824 +-5.4409,4.3729 +-5.2878,4.3633 +-5.0413,4.3538 +-4.7039,4.3442 +-4.2789,4.3347 +-3.7701,4.3252 +-3.1826,4.3156 +-2.5218,4.3061 +-1.7942,4.2966 +-1.0065,4.287 +-0.1664,4.2775 +0.7182,4.287 +1.6388,4.2966 +2.5867,4.3061 +3.5528,4.3156 +4.5279,4.3252 +5.5028,4.3347 +6.4681,4.3442 +7.4147,4.3538 +8.3335,4.3633 +9.2157,4.3729 +10.053,4.3824 +10.8374,4.3919 +11.5615,4.4015 +12.2182,4.411 +12.8014,4.4205 +13.3054,4.4301 +13.7256,4.4396 +14.0579,4.4492 +14.299,4.4587 +14.4468,4.4682 +14.4998,4.4778 +14.4576,4.4873 +14.3204,4.4968 +14.0897,4.5064 +13.7675,4.5159 +13.3571,4.5254 +12.8623,4.535 +12.2877,4.5445 +11.639,4.5541 +10.9222,4.5636 +10.1443,4.5731 +9.3125,4.5827 +8.4349,4.5922 +7.5198,4.5827 +6.5759,4.5731 +5.6123,4.5636 +4.638,4.5541 +3.6624,4.5445 +2.6948,4.535 +1.7445,4.5254 +0.8203,4.5159 +-0.0688,4.5064 +-0.9143,4.4968 +-1.7082,4.4873 +-2.443,4.4778 +-3.1116,4.4682 +-3.7077,4.4587 +-4.2256,4.4492 +-4.6603,4.4396 +-5.0078,4.4301 +-5.2646,4.4205 +-5.4284,4.411 +-5.4976,4.4015 +-5.4715,4.3919 +-5.3504,4.3824 +-5.1354,4.3729 +-4.8286,4.3633 +-4.4329,4.3538 +-3.9521,4.3442 +-3.3907,4.3347 +-2.7542,4.3252 +-2.0485,4.3156 +-1.2805,4.3061 +-0.4573,4.2966 +0.4131,4.287 +1.3224,4.2966 +2.262,4.3061 +3.223,4.3156 +4.1961,4.3252 +5.1721,4.3347 +6.1417,4.3442 +7.0957,4.3538 +8.0249,4.3633 +8.9205,4.3729 +9.774,4.3824 +10.5773,4.3919 +11.3226,4.4015 +12.003,4.411 +12.6118,4.4205 +13.1433,4.4301 +13.5925,4.4396 +13.955,4.4492 +14.2275,4.4587 +14.4072,4.4682 +14.4925,4.4778 +14.4826,4.4873 +14.3776,4.4968 +14.1785,4.5064 +13.8871,4.5159 +13.5063,4.5254 +13.0396,4.535 +12.4916,4.5445 +11.8674,4.5541 +11.173,4.5636 +10.4151,4.5731 +9.6007,4.5827 +8.7378,4.5922 +7.8345,4.5827 +6.8994,4.5731 +5.9414,4.5636 +4.9697,4.5541 +3.9935,4.5445 +3.0222,4.535 +2.0649,4.5254 +1.1309,4.5159 +0.2289,4.5064 +-0.6324,4.4968 +-1.4447,4.4873 +-2.2004,4.4778 +-2.8922,4.4682 +-3.5137,4.4587 +-4.0587,4.4492 +-4.5222,4.4396 +-4.8997,4.4301 +-5.1876,4.4205 +-5.3833,4.411 +-5.4847,4.4015 +-5.491,4.3919 +-5.4021,4.3824 +-5.2189,4.3729 +-4.943,4.3633 +-4.5771,4.3538 +-4.1248,4.3442 +-3.5902,4.3347 +-2.9786,4.3252 +-2.2957,4.3156 +-1.548,4.3061 +-0.7427,4.2966 +0.1125,4.287 +1.0096,4.2966 +1.9399,4.3061 +2.8946,4.3156 +3.8646,4.3252 +4.8407,4.3347 +5.8135,4.3442 +6.7738,4.3538 +7.7125,4.3633 +8.6205,4.3729 +9.4892,4.3824 +10.3105,4.3919 +11.0763,4.4015 +11.7795,4.411 +12.4133,4.4205 +12.9717,4.4301 +13.4494,4.4396 +13.8418,4.4492 +14.1452,4.4587 +14.3566,4.4682 +14.4742,4.4778 +14.4967,4.4873 +14.4239,4.4968 +14.2566,4.5064 +13.9963,4.5159 +13.6455,4.5254 +13.2075,4.535 +12.6866,4.5445 +12.0877,4.5541 +11.4165,4.5636 +10.6793,4.5731 +9.8833,4.5827 +9.036,4.5922 +8.1454,4.5827 +7.2201,4.5731 +6.2689,4.5636 +5.3009,4.5541 +4.3252,4.5445 +3.3511,4.535 +2.3881,4.5254 +1.4451,4.5159 +0.5313,4.5064 +-0.3448,4.4968 +-1.1746,4.4873 +-1.9504,4.4778 +-2.6647,4.4682 +-3.3108,4.4587 +-3.8824,4.4492 +-4.3741,4.4396 +-4.7813,4.4301 +-5.1,4.4205 +-5.3273,4.411 +-5.4609,4.4015 +-5.4996,4.3919 +-5.443,4.3824 +-5.2916,4.3729 +-5.047,4.3633 +-4.7113,4.3538 +-4.2879,4.3442 +-3.7808,4.3347 +-3.1947,4.3252 +-2.5353,4.3156 +-1.8089,4.3061 +-1.0224,4.2966 +-0.1832,4.287 +0.7006,4.2966 +1.6206,4.3061 +2.568,4.3156 +3.5339,4.3252 +4.5089,4.3347 +5.4839,4.3442 +6.4495,4.3538 +7.3965,4.3633 +8.3159,4.3729 +9.199,4.3824 +10.0372,4.3919 +10.8227,4.4015 +11.548,4.411 +12.2061,4.4205 +12.7908,4.4301 +13.2964,4.4396 +13.7183,4.4492 +14.0523,4.4587 +14.2952,4.4682 +14.4449,4.4778 +14.4997,4.4873 +14.4593,4.4968 +14.324,4.5064 +14.095,4.5159 +13.7747,4.5254 +13.3659,4.535 +12.8727,4.5445 +12.2996,4.5541 +11.6523,4.5636 +10.9368,4.5731 +10.1599,4.5827 +9.3292,4.5922 +8.4524,4.6017 +7.5379,4.5922 +6.5945,4.5827 +5.6312,4.5731 +4.657,4.5636 +3.6814,4.5541 +2.7135,4.5445 +1.7627,4.535 +0.838,4.5254 +-0.0518,4.5159 +-0.8983,4.5064 +-1.6933,4.4968 +-2.4293,4.4873 +-3.0993,4.4778 +-3.6968,4.4682 +-4.2163,4.4587 +-4.6527,4.4492 +-5.0019,4.4396 +-5.2605,4.4301 +-5.4261,4.4205 +-5.4971,4.411 +-5.4729,4.4015 +-5.3536,4.3919 +-5.1404,4.3824 +-4.8354,4.3729 +-4.4414,4.3633 +-3.9622,4.3538 +-3.4024,4.3442 +-2.7673,4.3347 +-2.0629,4.3252 +-1.296,4.3156 +-0.4738,4.3061 +0.3958,4.2966 +1.3044,4.3061 +2.2435,4.3156 +3.2041,4.3252 +4.1771,4.3347 +5.1532,4.3442 +6.123,4.3538 +7.0773,4.3633 +8.0071,4.3729 +8.9035,4.3824 +9.7579,4.3919 +10.5622,4.4015 +11.3087,4.411 +11.9904,4.4205 +12.6007,4.4301 +13.1338,4.4396 +13.5846,4.4492 +13.9488,4.4587 +14.223,4.4682 +14.4046,4.4778 +14.4918,4.4873 +14.4837,4.4968 +14.3805,4.5064 +14.1832,4.5159 +13.8936,4.5254 +13.5145,4.535 +13.0495,4.5445 +12.503,4.5541 +11.8802,4.5636 +11.1872,4.5731 +10.4304,4.5827 +9.6171,4.5922 +8.755,4.6017 +7.8524,4.5922 +6.9178,4.5827 +5.9602,4.5731 +4.9887,4.5636 +4.0125,4.5541 +3.041,4.5445 +2.0833,4.535 +1.1487,4.5254 +0.2461,4.5159 +-0.616,4.5064 +-1.4294,4.4968 +-2.1863,4.4873 +-2.8794,4.4778 +-3.5023,4.4682 +-4.0489,4.4587 +-4.514,4.4492 +-4.8932,4.4396 +-5.1829,4.4301 +-5.3804,4.4205 +-5.4837,4.411 +-5.4918,4.4015 +-5.4048,4.3919 +-5.2233,4.3824 +-4.9492,4.3729 +-4.5851,4.3633 +-4.1344,4.3538 +-3.6014,4.3442 +-2.9912,4.3347 +-2.3096,4.3252 +-1.5631,4.3156 +-0.7589,4.3061 +0.0955,4.2966 +0.9918,4.3061 +1.9215,4.3156 +2.8759,4.3252 +3.8457,4.3347 +4.8217,4.3442 +5.7947,4.3538 +6.7553,4.3633 +7.6945,4.3729 +8.6032,4.3824 +9.4728,4.3919 +10.295,4.4015 +11.062,4.411 +11.7665,4.4205 +12.4017,4.4301 +12.9616,4.4396 +13.4409,4.4492 +13.835,4.4587 +14.1401,4.4682 +14.3534,4.4778 +14.4728,4.4873 +14.4971,4.4968 +14.4262,4.5064 +14.2607,4.5159 +14.0022,4.5254 +13.6532,4.535 +13.2169,4.5445 +12.6975,4.5541 +12.1001,4.5636 +11.4302,4.5731 +10.6942,4.5827 +9.8993,4.5922 +9.0529,4.6017 +8.1631,4.5922 +7.2384,4.5827 +6.2876,4.5731 +5.3198,4.5636 +4.3442,4.5541 +3.37,4.5445 +2.4066,4.535 +1.4632,4.5254 +0.5487,4.5159 +-0.3281,4.5064 +-1.159,4.4968 +-1.9359,4.4873 +-2.6515,4.4778 +-3.2989,4.4682 +-3.872,4.4587 +-4.3654,4.4492 +-4.7742,4.4396 +-5.0947,4.4301 +-5.3238,4.4205 +-5.4592,4.411 +-5.4997,4.4015 +-5.445,4.3919 +-5.2955,4.3824 +-5.0526,4.3729 +-4.7187,4.3633 +-4.297,4.3538 +-3.7914,4.3442 +-3.2068,4.3347 +-2.5488,4.3252 +-1.8237,4.3156 +-1.0382,4.3061 +-0.2,4.2966 +0.683,4.3061 +1.6024,4.3156 +2.5494,4.3252 +3.5149,4.3347 +4.4899,4.3442 +5.465,4.3538 +6.4308,4.3633 +7.3783,4.3729 +8.2983,4.3824 +9.1822,4.3919 +10.0214,4.4015 +10.808,4.411 +11.5345,4.4205 +12.194,4.4301 +12.7801,4.4396 +13.2874,4.4492 +13.7109,4.4587 +14.0466,4.4682 +14.2914,4.4778 +14.4429,4.4873 +14.4996,4.4968 +14.461,4.5064 +14.3275,4.5159 +14.1004,4.5254 +13.7817,4.535 +13.3747,4.5445 +12.883,4.5541 +12.3115,4.5636 +11.6656,4.5731 +10.9513,4.5827 +10.1756,4.5922 +9.3458,4.6017 +8.4698,4.6113 +7.556,4.6017 +6.6131,4.5922 +5.65,4.5827 +4.676,4.5731 +3.7003,4.5636 +2.7322,4.5541 +1.781,4.5445 +0.8557,4.535 +-0.0349,4.5254 +-0.8823,4.5159 +-1.6784,4.5064 +-2.4156,4.4968 +-3.0869,4.4873 +-3.686,4.4778 +-4.207,4.4682 +-4.645,4.4587 +-4.9959,4.4492 +-5.2563,4.4396 +-5.4238,4.4301 +-5.4966,4.4205 +-5.4743,4.411 +-5.3568,4.4015 +-5.1455,4.3919 +-4.8422,4.3824 +-4.4499,4.3729 +-3.9723,4.3633 +-3.414,4.3538 +-2.7803,4.3442 +-2.0772,4.3347 +-1.3114,4.3252 +-0.4903,4.3156 +0.3784,4.3061 +1.2864,4.3156 +2.225,4.3252 +3.1853,4.3347 +4.1581,4.3442 +5.1342,4.3538 +6.1042,4.3633 +7.059,4.3729 +7.9893,4.3824 +8.8864,4.3919 +9.7417,4.4015 +10.5471,4.411 +11.2948,4.4205 +11.9778,4.4301 +12.5895,4.4396 +13.1242,4.4492 +13.5766,4.4587 +13.9426,4.4682 +14.2186,4.4778 +14.402,4.4873 +14.491,4.4968 +14.4848,4.5064 +14.3835,4.5159 +14.1879,4.5254 +13.9001,4.535 +13.5227,4.5445 +13.0593,4.5541 +12.5144,4.5636 +11.893,4.5731 +11.2013,4.5827 +10.4456,4.5922 +9.6334,4.6017 +8.7722,4.6113 +7.8703,4.6017 +6.9362,4.5922 +5.979,4.5827 +5.0076,4.5731 +4.0315,4.5636 +3.0598,4.5541 +2.1018,4.5445 +1.1667,4.535 +0.2633,4.5254 +-0.5997,4.5159 +-1.4141,4.5064 +-2.1721,4.4968 +-2.8666,4.4873 +-3.4909,4.4778 +-4.039,4.4682 +-4.5057,4.4587 +-4.8867,4.4492 +-5.1782,4.4396 +-5.3774,4.4301 +-5.4826,4.4205 +-5.4926,4.411 +-5.4074,4.4015 +-5.2277,4.3919 +-4.9554,4.3824 +-4.593,4.3729 +-4.1439,4.3633 +-3.6125,4.3538 +-3.0038,4.3442 +-2.3235,4.3347 +-1.5782,4.3252 +-0.775,4.3156 +0.0784,4.3061 +0.974,4.3156 +1.9032,4.3252 +2.8571,4.3347 +3.8267,4.3442 +4.8027,4.3538 +5.7758,4.3633 +6.7368,4.3729 +7.6765,4.3824 +8.5858,4.3919 +9.4563,4.4015 +10.2795,4.411 +11.0476,4.4205 +11.7534,4.4301 +12.39,4.4396 +12.9515,4.4492 +13.4324,4.4587 +13.8282,4.4682 +14.1351,4.4778 +14.3502,4.4873 +14.4714,4.4968 +14.4976,4.5064 +14.4285,4.5159 +14.2648,4.5254 +14.0081,4.535 +13.6608,4.5445 +13.2262,4.5541 +12.7084,4.5636 +12.1124,4.5731 +11.4439,4.5827 +10.7092,4.5922 +9.9153,4.6017 +9.0698,4.6113 +8.1808,4.6017 +7.2567,4.5922 +6.3063,4.5827 +5.3387,4.5731 +4.3632,4.5636 +3.3889,4.5541 +2.4252,4.5445 +1.4813,4.535 +0.5662,4.5254 +-0.3115,4.5159 +-1.1433,4.5064 +-1.9213,4.4968 +-2.6382,4.4873 +-3.287,4.4778 +-3.8616,4.4682 +-4.3566,4.4587 +-4.7671,4.4492 +-5.0893,4.4396 +-5.3202,4.4301 +-5.4575,4.4205 +-5.4999,4.411 +-5.447,4.4015 +-5.2993,4.3919 +-5.0582,4.3824 +-4.7261,4.3729 +-4.306,4.3633 +-3.802,4.3538 +-3.2189,4.3442 +-2.5623,4.3347 +-1.8384,4.3252 +-1.054,4.3156 +-0.2168,4.3061 +0.6655,4.3156 +1.5842,4.3252 +2.5307,4.3347 +3.496,4.3442 +4.4709,4.3538 +5.4461,4.3633 +6.4122,4.3729 +7.3601,4.3824 +8.2808,4.3919 +9.1654,4.4015 +10.0056,4.411 +10.7933,4.4205 +11.521,4.4301 +12.1818,4.4396 +12.7695,4.4492 +13.2783,4.4587 +13.7035,4.4682 +14.0409,4.4778 +14.2875,4.4873 +14.4408,4.4968 +14.4994,4.5064 +14.4627,4.5159 +14.331,4.5254 +14.1057,4.535 +13.7888,4.5445 +13.3834,4.5541 +12.8934,4.5636 +12.3234,4.5731 +11.6788,4.5827 +10.9658,4.5922 +10.1912,4.6017 +9.3624,4.6113 +8.4872,4.6208 +7.5741,4.6113 +6.6317,4.6017 +5.6689,4.5922 +4.695,4.5827 +3.7192,4.5731 +2.7509,4.5636 +1.7993,4.5541 +0.8734,4.5445 +-0.018,4.535 +-0.8663,4.5254 +-1.6634,4.5159 +-2.4019,4.5064 +-3.0745,4.4968 +-3.675,4.4873 +-4.1976,4.4778 +-4.6373,4.4682 +-4.9899,4.4587 +-5.2521,4.4492 +-5.4214,4.4396 +-5.4961,4.4301 +-5.4756,4.4205 +-5.36,4.411 +-5.1505,4.4015 +-4.849,4.3919 +-4.4584,4.3824 +-3.9824,4.3729 +-3.4256,4.3633 +-2.7933,4.3538 +-2.0915,4.3442 +-1.3269,4.3347 +-0.5067,4.3252 +0.3611,4.3156 +1.2684,4.3252 +2.2065,4.3347 +3.1665,4.3442 +4.1391,4.3538 +5.1152,4.3633 +6.0855,4.3729 +7.0406,4.3824 +7.9715,4.3919 +8.8693,4.4015 +9.7255,4.411 +10.5319,4.4205 +11.2809,4.4301 +11.9652,4.4396 +12.5783,4.4492 +13.1145,4.4587 +13.5686,4.4682 +13.9363,4.4778 +14.2141,4.4873 +14.3993,4.4968 +14.4901,4.5064 +14.4858,4.5159 +14.3863,4.5254 +14.1926,4.535 +13.9066,4.5445 +13.5309,4.5541 +13.0691,4.5636 +12.5257,4.5731 +11.9058,4.5827 +11.2154,4.5922 +10.4609,4.6017 +9.6497,4.6113 +8.7893,4.6208 +7.8881,4.6113 +6.9546,4.6017 +5.9978,4.5922 +5.0266,4.5827 +4.0505,4.5731 +3.0786,4.5636 +2.1202,4.5541 +1.1846,4.5445 +0.2805,4.535 +-0.5834,4.5254 +-1.3988,4.5159 +-2.158,4.5064 +-2.8537,4.4968 +-3.4794,4.4873 +-4.0291,4.4778 +-4.4975,4.4682 +-4.8801,4.4587 +-5.1734,4.4492 +-5.3744,4.4396 +-5.4814,4.4301 +-5.4933,4.4205 +-5.4099,4.411 +-5.2321,4.4015 +-4.9616,4.3919 +-4.6009,4.3824 +-4.1535,4.3729 +-3.6236,4.3633 +-3.0163,4.3538 +-2.3374,4.3442 +-1.5933,4.3347 +-0.7912,4.3252 +0.0614,4.3156 +0.9562,4.3252 +1.8848,4.3347 +2.8384,4.3442 +3.8078,4.3538 +4.7837,4.3633 +5.757,4.3729 +6.7183,4.3824 +7.6584,4.3919 +8.5685,4.4015 +9.4398,4.411 +10.264,4.4205 +11.0333,4.4301 +11.7403,4.4396 +12.3783,4.4492 +12.9413,4.4587 +13.4238,4.4682 +13.8213,4.4778 +14.13,4.4873 +14.3469,4.4968 +14.4699,4.5064 +14.498,4.5159 +14.4308,4.5254 +14.2689,4.535 +14.014,4.5445 +13.6684,4.5541 +13.2354,4.5636 +12.7192,4.5731 +12.1247,4.5827 +11.4575,4.5922 +10.724,4.6017 +9.9312,4.6113 +9.0867,4.6208 +8.1984,4.6113 +7.2749,4.6017 +6.325,4.5922 +5.3577,4.5827 +4.3822,4.5731 +3.4078,4.5636 +2.4438,4.5541 +1.4994,4.5445 +0.5836,4.535 +-0.2948,4.5254 +-1.1276,4.5159 +-1.9068,4.5064 +-2.6249,4.4968 +-3.2751,4.4873 +-3.8512,4.4778 +-4.3477,4.4682 +-4.7599,4.4587 +-5.0839,4.4492 +-5.3166,4.4396 +-5.4557,4.4301 +-5.4999,4.4205 +-5.4489,4.411 +-5.303,4.4015 +-5.0638,4.3919 +-4.7334,4.3824 +-4.315,4.3729 +-3.8126,4.3633 +-3.231,4.3538 +-2.5757,4.3442 +-1.853,4.3347 +-1.0698,4.3252 +-0.2335,4.3156 +0.6479,4.3241 +1.566,4.3336 +2.5121,4.3431 +3.4771,4.3527 +4.4519,4.3622 +5.4271,4.3717 +6.3935,4.3813 +7.3419,4.3908 +8.2632,4.4004 +9.1486,4.4099 +9.9897,4.4194 +10.7785,4.429 +11.5075,4.4385 +12.1697,4.448 +12.7588,4.4576 +13.2692,4.4671 +13.696,4.4766 +14.0352,4.4862 +14.2836,4.4957 +14.4387,4.5053 +14.4991,4.5148 +14.4643,4.5243 +14.3345,4.5339 +14.1109,4.5434 +13.7958,4.5529 +13.3921,4.5625 +12.9037,4.572 +12.3352,4.5816 +11.692,4.5911 +10.9803,4.6006 +10.2068,4.6102 +9.379,4.6197 +8.5047,4.6292 +7.5922,4.6197 +6.6502,4.6102 +5.6878,4.6006 +4.714,4.5911 +3.7382,4.5816 +2.7696,4.572 +1.8176,4.5625 +0.8911,4.5529 +-0.001,4.5434 +-0.8502,4.5339 +-1.6485,4.5243 +-2.3881,4.5148 +-3.0621,4.5053 +-3.6641,4.4957 +-4.1882,4.4862 +-4.6296,4.4766 +-4.9839,4.4671 +-5.2479,4.4576 +-5.419,4.448 +-5.4956,4.4385 +-5.4769,4.429 +-5.3632,4.4194 +-5.1554,4.4099 +-4.8557,4.4004 +-4.4668,4.3908 +-3.9925,4.3813 +-3.4372,4.3717 +-2.8063,4.3622 +-2.1058,4.3527 +-1.3423,4.3431 +-0.5232,4.3336 +0.3439,4.3241 +1.2505,4.3336 +2.188,4.3431 +3.1477,4.3527 +4.1202,4.3622 +5.0963,4.3717 +6.0667,4.3813 +7.0222,4.3908 +7.9537,4.4004 +8.8522,4.4099 +9.7093,4.4194 +10.5168,4.429 +11.2669,4.4385 +11.9525,4.448 +12.5671,4.4576 +13.1049,4.4671 +13.5606,4.4766 +13.93,4.4862 +14.2096,4.4957 +14.3966,4.5053 +14.4893,4.5148 +14.4868,4.5243 +14.3892,4.5339 +14.1973,4.5434 +13.913,4.5529 +13.539,4.5625 +13.0789,4.572 +12.537,4.5816 +11.9186,4.5911 +11.2294,4.6006 +10.4762,4.6102 +9.6659,4.6197 +8.8065,4.6292 +7.906,4.6197 +6.9731,4.6102 +6.0165,4.6006 +5.0456,4.5911 +4.0694,4.5816 +3.0974,4.572 +2.1387,4.5625 +1.2025,4.5529 +0.2977,4.5434 +-0.567,4.5339 +-1.3834,4.5243 +-2.1438,4.5148 +-2.8409,4.5053 +-3.468,4.4957 +-4.0192,4.4862 +-4.4892,4.4766 +-4.8735,4.4671 +-5.1685,4.4576 +-5.3714,4.448 +-5.4802,4.4385 +-5.494,4.429 +-5.4124,4.4194 +-5.2365,4.4099 +-4.9677,4.4004 +-4.6087,4.3908 +-4.163,4.3813 +-3.6346,4.3717 +-3.0288,4.3622 +-2.3512,4.3527 +-1.6084,4.3431 +-0.8073,4.3336 +0.0444,4.3241 +0.9385,4.3336 +1.8665,4.3431 +2.8197,4.3527 +3.7888,4.3622 +4.7647,4.3717 +5.7382,4.3813 +6.6998,4.3908 +7.6404,4.4004 +8.5511,4.4099 +9.4232,4.4194 +10.2485,4.429 +11.0189,4.4385 +11.7272,4.448 +12.3666,4.4576 +12.9311,4.4671 +13.4152,4.4766 +13.8144,4.4862 +14.1248,4.4957 +14.3435,4.5053 +14.4684,4.5148 +14.4983,4.5243 +14.433,4.5339 +14.273,4.5434 +14.0198,4.5529 +13.676,4.5625 +13.2447,4.572 +12.73,4.5816 +12.137,4.5911 +11.4711,4.6006 +10.7389,4.6102 +9.9472,4.6197 +9.1036,4.6292 +8.2161,4.6197 +7.2932,4.6102 +6.3437,4.6006 +5.3766,4.5911 +4.4012,4.5816 +3.4267,4.572 +2.4624,4.5625 +1.5175,4.5529 +0.6011,4.5434 +-0.2782,4.5339 +-1.1119,4.5243 +-1.8922,4.5148 +-2.6115,4.5053 +-3.2631,4.4957 +-3.8407,4.4862 +-4.3388,4.4766 +-4.7527,4.4671 +-5.0785,4.4576 +-5.3129,4.448 +-5.4539,4.4385 +-5.5,4.429 +-5.4508,4.4194 +-5.3068,4.4099 +-5.0693,4.4004 +-4.7407,4.3908 +-4.3239,4.3813 +-3.8231,4.3717 +-3.243,4.3622 +-2.5891,4.3527 +-1.8677,4.3431 +-1.0856,4.3336 +-0.2502,4.3241 +0.6304,4.3159 +1.5479,4.3254 +2.4935,4.3349 +3.4583,4.3445 +4.4329,4.354 +5.4082,4.3636 +6.3749,4.3731 +7.3237,4.3826 +8.2456,4.3922 +9.1317,4.4017 +9.9738,4.4112 +10.7637,4.4208 +11.4939,4.4303 +12.1574,4.4399 +12.748,4.4494 +13.26,4.4589 +13.6885,4.4685 +14.0295,4.478 +14.2796,4.4875 +14.4366,4.4971 +14.4989,4.5066 +14.4659,4.5161 +14.3379,4.5257 +14.1162,4.5352 +13.8028,4.5448 +13.4008,4.5543 +12.914,4.5638 +12.347,4.5734 +11.7052,4.5829 +10.9948,4.5924 +10.2224,4.602 +9.3956,4.6115 +8.5221,4.621 +7.6102,4.6115 +6.6688,4.602 +5.7066,4.5924 +4.733,4.5829 +3.7571,4.5734 +2.7883,4.5638 +1.8359,4.5543 +0.9088,4.5448 +0.0159,4.5352 +-0.8342,4.5257 +-1.6335,4.5161 +-2.3743,4.5066 +-3.0497,4.4971 +-3.6531,4.4875 +-4.1788,4.478 +-4.6218,4.4685 +-4.9779,4.4589 +-5.2437,4.4494 +-5.4166,4.4399 +-5.495,4.4303 +-5.4782,4.4208 +-5.3663,4.4112 +-5.1604,4.4017 +-4.8624,4.3922 +-4.4752,4.3826 +-4.0025,4.3731 +-3.4487,4.3636 +-2.8193,4.354 +-2.12,4.3445 +-1.3577,4.3349 +-0.5396,4.3254 +0.3266,4.3159 +1.2325,4.3254 +2.1696,4.3349 +3.1288,4.3445 +4.1012,4.354 +5.0773,4.3636 +6.0479,4.3731 +7.0038,4.3826 +7.9359,4.3922 +8.8351,4.4017 +9.6931,4.4112 +10.5016,4.4208 +11.2529,4.4303 +11.9398,4.4399 +12.5559,4.4494 +13.0952,4.4589 +13.5526,4.4685 +13.9237,4.478 +14.205,4.4875 +14.3938,4.4971 +14.4884,4.5066 +14.4878,4.5161 +14.392,4.5257 +14.2019,4.5352 +13.9194,4.5448 +13.5471,4.5543 +13.0886,4.5638 +12.5483,4.5734 +11.9313,4.5829 +11.2435,4.5924 +10.4914,4.602 +9.6822,4.6115 +8.8236,4.621 +7.9239,4.6115 +6.9915,4.602 +6.0353,4.5924 +5.0646,4.5829 +4.0884,4.5734 +3.1162,4.5638 +2.1572,4.5543 +1.2204,4.5448 +0.315,4.5352 +-0.5506,4.5257 +-1.3681,4.5161 +-2.1296,4.5066 +-2.8279,4.4971 +-3.4565,4.4875 diff --git a/plugins/ts404/src/editor/mod.rs b/plugins/ts404/src/editor/mod.rs index 6ea3378..0750d97 100644 --- a/plugins/ts404/src/editor/mod.rs +++ b/plugins/ts404/src/editor/mod.rs @@ -40,10 +40,9 @@ pub(crate) fn create( }); }); labelled_node_float(cx, false, params, |params| ¶ms.tone); - labelled_node_float(cx, false, params, |params| ¶ms.out_level); }); HStack::new(cx, |cx| { - labelled_node_float(cx, false, params, |params| ¶ms.drive); + labelled_node_float(cx, false, params, |params| ¶ms.input_mode); labelled_node_float(cx, false, params, |params| ¶ms.component_matching); }) .class("small"); diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index 71e9cc9..b5d262c 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -101,13 +101,11 @@ impl Plugin for Ts404 { let dsp = &self.dsp; dsp.proxy - .set_parameter(DspParams::InputGain, self.params.drive.value()); + .set_parameter(DspParams::InputMode, self.params.input_mode.value().to_index() as _); dsp.proxy .set_parameter(DspParams::Distortion, self.params.dist.value()); dsp.proxy .set_parameter(DspParams::Tone, self.params.tone.value()); - dsp.proxy - .set_parameter(DspParams::OutputGain, self.params.out_level.value()); dsp.proxy.set_parameter( DspParams::ComponentMismatch, self.params.component_matching.value(), @@ -116,14 +114,6 @@ impl Plugin for Ts404 { DspParams::Bypass, if self.params.bypass.value() { 1.0 } else { 0.0 }, ); - dsp.proxy.set_parameter( - DspParams::BufferBypass, - if self.params.io_bypass.value() { - 1.0 - } else { - 0.0 - }, - ); true } diff --git a/plugins/ts404/src/params.rs b/plugins/ts404/src/params.rs index 2754ec7..620a6e3 100644 --- a/plugins/ts404/src/params.rs +++ b/plugins/ts404/src/params.rs @@ -1,30 +1,28 @@ -use crate::dsp::DspParams; +use crate::dsp::{DspParams, InputLevelMatching}; use nih_plug::formatters; -use nih_plug::params::{BoolParam, FloatParam, Params}; +use nih_plug::params::{BoolParam, EnumParam, FloatParam, Params}; use nih_plug::prelude::{AtomicF32, FloatRange}; use nih_plug::util::{gain_to_db, MINUS_INFINITY_DB, MINUS_INFINITY_GAIN}; +use nih_plug_vizia::ViziaState; use std::sync::mpsc::{channel, Receiver, Sender}; use std::sync::Arc; -use nih_plug_vizia::ViziaState; use valib::contrib::nih_plug::BindToParameter; use valib::dsp::parameter::RemoteControl; +pub(crate) const MAX_AGE: f32 = 100.; + #[derive(Params)] pub(crate) struct Ts404Params { #[id = "drive"] - pub(crate) drive: FloatParam, + pub(crate) input_mode: EnumParam, #[id = "dist"] pub(crate) dist: FloatParam, #[id = "tone"] pub(crate) tone: FloatParam, - #[id = "level"] - pub(crate) out_level: FloatParam, #[id = "cmpmat"] pub(crate) component_matching: FloatParam, #[id = "bypass"] pub(crate) bypass: BoolParam, - #[id = "byp_io"] - pub(crate) io_bypass: BoolParam, #[persist = "editor_state"] pub(crate) editor_state: Arc, } @@ -32,19 +30,8 @@ pub(crate) struct Ts404Params { impl Ts404Params { pub(crate) fn new(remote: &RemoteControl) -> Arc { Arc::new(Self { - drive: FloatParam::new( - "Drive", - 1.0, - FloatRange::Skewed { - min: 0.5, - max: 100.0, - factor: FloatRange::gain_skew_factor(gain_to_db(0.5), gain_to_db(100.0)), - }, - ) - .with_unit("dB") - .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) - .with_string_to_value(formatters::s2v_f32_gain_to_db()) - .bind_to_parameter(remote, DspParams::InputGain), + input_mode: EnumParam::new("Input mode", InputLevelMatching::Line) + .bind_to_parameter(remote, DspParams::InputMode), dist: FloatParam::new("Distortion", 0.1, FloatRange::Linear { min: 0.0, max: 1.0 }) .with_unit("%") .with_value_to_string(formatters::v2s_f32_percentage(2)) @@ -55,31 +42,17 @@ impl Ts404Params { .with_value_to_string(formatters::v2s_f32_percentage(2)) .with_string_to_value(formatters::s2v_f32_percentage()) .bind_to_parameter(remote, DspParams::Tone), - out_level: FloatParam::new( - "Output", - 0.158, - FloatRange::Skewed { - min: MINUS_INFINITY_GAIN, - max: 1.0, - factor: FloatRange::gain_skew_factor(MINUS_INFINITY_DB, gain_to_db(1.0)), - }, - ) - .with_unit(" dB") - .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) - .with_string_to_value(formatters::s2v_f32_gain_to_db()) - .bind_to_parameter(remote, DspParams::OutputGain), component_matching: FloatParam::new( "Age", 1., - FloatRange::Linear { min: 0.0, max: 1.0 }, + FloatRange::Linear { + min: 0.0, + max: MAX_AGE, + }, ) - .with_unit(" %") - .with_string_to_value(formatters::s2v_f32_percentage()) - .with_value_to_string(formatters::v2s_f32_percentage(0)) + .with_unit(" yr") .bind_to_parameter(remote, DspParams::ComponentMismatch), bypass: BoolParam::new("Bypass", false).bind_to_parameter(remote, DspParams::Bypass), - io_bypass: BoolParam::new("I/O Buffers Bypass", false) - .bind_to_parameter(remote, DspParams::BufferBypass), editor_state: crate::editor::default_state(), }) } From 21bad2fc2b9b1698313ae0984e9d654d1adb5f93 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Sun, 1 Sep 2024 00:45:17 +0200 Subject: [PATCH 26/51] feat: temporary GUI elements that work --- plugins/ts404/Cargo.lock | 173 +++++++++++++++++++- plugins/ts404/Cargo.toml | 12 +- plugins/ts404/src/dsp.rs | 8 +- plugins/ts404/src/editor/components/knob.rs | 111 ++++++++----- plugins/ts404/src/editor/mod.rs | 104 ++++++++++-- 5 files changed, 347 insertions(+), 61 deletions(-) diff --git a/plugins/ts404/Cargo.lock b/plugins/ts404/Cargo.lock index afbeab2..650de90 100644 --- a/plugins/ts404/Cargo.lock +++ b/plugins/ts404/Cargo.lock @@ -609,6 +609,18 @@ dependencies = [ "piper", ] +[[package]] +name = "bstr" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +dependencies = [ + "lazy_static", + "memchr", + "regex-automata 0.1.10", + "serde", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -874,6 +886,18 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -1117,7 +1141,7 @@ checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" dependencies = [ "cssparser-macros", "dtoa-short", - "itoa", + "itoa 1.0.11", "matches", "phf 0.10.1", "proc-macro2", @@ -1136,6 +1160,28 @@ dependencies = [ "syn 2.0.68", ] +[[package]] +name = "csv" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" +dependencies = [ + "bstr", + "csv-core", + "itoa 0.4.8", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "darling" version = "0.20.9" @@ -1258,6 +1304,12 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "enum-map" version = "2.7.3" @@ -1398,6 +1450,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flate2" version = "1.0.30" @@ -1833,6 +1891,22 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "insta" +version = "1.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "810ae6042d48e2c9e9215043563a58a80b877bc863228a74cf10c49d4620a6f5" +dependencies = [ + "console", + "csv", + "lazy_static", + "linked-hash-map", + "pest", + "pest_derive", + "serde", + "similar", +] + [[package]] name = "instant" version = "0.1.13" @@ -1890,6 +1964,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + [[package]] name = "itoa" version = "1.0.11" @@ -2039,6 +2119,12 @@ dependencies = [ "redox_syscall 0.4.1", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.3.8" @@ -2753,6 +2839,61 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pest" +version = "2.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "pest_meta" +version = "2.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + [[package]] name = "phf" version = "0.8.0" @@ -3401,7 +3542,7 @@ version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ - "itoa", + "itoa 1.0.11", "ryu", "serde", ] @@ -3437,6 +3578,17 @@ dependencies = [ "digest", ] +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -3480,6 +3632,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "similar" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" + [[package]] name = "siphasher" version = "0.3.11" @@ -3652,7 +3810,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", - "itoa", + "itoa 1.0.11", "libc", "num-conv", "num_threads", @@ -3833,6 +3991,7 @@ name = "ts404" version = "0.1.0" dependencies = [ "enum-map", + "insta", "nalgebra", "nih_plug", "nih_plug_vizia", @@ -3869,6 +4028,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + [[package]] name = "uds_windows" version = "1.1.0" @@ -3990,12 +4155,14 @@ dependencies = [ name = "valib" version = "0.1.0" dependencies = [ + "atomic_refcell", "az", "nalgebra", "nih_plug", "num-traits", "numeric_literals", "paste", + "petgraph", "portable-atomic", "profiling", "simba", diff --git a/plugins/ts404/Cargo.toml b/plugins/ts404/Cargo.toml index 21fd8b2..f5fb28e 100644 --- a/plugins/ts404/Cargo.toml +++ b/plugins/ts404/Cargo.toml @@ -20,16 +20,22 @@ nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git", features = ["s nih_plug_vizia = { git = "https://github.com/robbert-vdh/nih-plug.git" } num-traits = "0.2.17" numeric_literals = "0.2.0" -profiling = { version = "1.0.15", features = ["profile-with-tracy"], optional = true } +profiling = { version = "1.0.15" } #valib = { git = "https://github.com/SolarLiner/valib.git" } -valib = { path = "../valib", features = ["nih-plug"] } +valib = { path = "../valib", features = ["nih-plug", "wdf"] } + +[dev-dependencies] +insta = { version = "1.39.0", features = ["csv", "redactions"] } [features] -profiling = ["dep:profiling"] +profiling = ["profiling/profile-with-tracy"] [profile.dev] opt-level = 1 +[profile.test] +opt-level = 0 + [profile.release] lto = "thin" strip = "symbols" diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index 51066ba..04c79cf 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -72,13 +72,7 @@ pub enum InputLevelMatching { impl fmt::Display for InputLevelMatching { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - let scale: f32 = self.input_scale(); - match self { - Self::Instrument => write!(f, "Instrument ({} x)", scale), - Self::InstrumentHot => write!(f, "Instrument, Hot ({} x)", scale), - Self::Line => write!(f, "Line ({} x)", scale), - Self::Eurorack => write!(f, "Eurorack ({} x)", scale), - } + write!(f, "{}", Self::variants()[self.to_index()]) } } diff --git a/plugins/ts404/src/editor/components/knob.rs b/plugins/ts404/src/editor/components/knob.rs index 6d0b928..55d9278 100644 --- a/plugins/ts404/src/editor/components/knob.rs +++ b/plugins/ts404/src/editor/components/knob.rs @@ -1,10 +1,11 @@ use std::f32::consts::{FRAC_PI_2, TAU}; -use nih_plug::{nih_log, prelude::Param}; +use nih_plug::{nih_error, nih_log, prelude::Param}; use nih_plug_vizia::{ vizia::{prelude::*, vg}, widgets::param_base::ParamWidgetBase, }; +use nih_plug_vizia::vizia::vg::{ImageFlags, ImageId}; enum KnobEvents { SetValueNormalized(f32), @@ -173,6 +174,8 @@ impl View for Dot { pub struct Knob { widget_base: ParamWidgetBase, dragging: bool, + image_bg: Option, + image_fg: Option, } impl Knob { @@ -185,6 +188,8 @@ impl Knob { Self { widget_base: ParamWidgetBase::new(cx, params, get_param), dragging: false, + image_fg: None, + image_bg: None, } .build(cx, |cx| { KnobModel { @@ -192,37 +197,6 @@ impl Knob { text: String::new(), } .build(cx); - ZStack::new(cx, |cx| { - Arc::new(cx, bipolar, params, get_param, |w| { - w.unmodulated_normalized_value() - }) - .class("unmodulated"); - Arc::new(cx, bipolar, params, get_param, |w| { - w.modulated_normalized_value() - }) - .class("modulated"); - Ring::new(cx, params, get_param).z_index(2); - Dot { - widget_base: ParamWidgetBase::new(cx, params, get_param), - } - .build(cx, |_| ()) - .z_index(3); - //Textbox::new(cx, KnobModel::text) - // .class("textbox") - // .display(KnobModel::display_textbox.map(|display| { - // if *display { - // Display::Flex - // } else { - // Display::None - // } - // })) - // .on_submit(|cx, data, _| { - // cx.emit(KnobModelEvent::SetDisplayTextbox(false)); - // cx.emit(KnobEvents::EnterValuePlain(data)); - // }) - // .on_blur(|cx| cx.emit(KnobModelEvent::SetDisplayTextbox(false))); - }) - .z_index(1); }) } } @@ -239,12 +213,10 @@ impl View for Knob { { self.dragging = true; self.widget_base.begin_set_parameter(cx); - cx.capture(); cx.set_active(true); } WindowEvent::MouseUp(MouseButton::Left) => { self.dragging = false; - cx.release(); self.widget_base.end_set_parameter(cx); } &WindowEvent::MouseMove(..) => { @@ -254,9 +226,12 @@ impl View for Knob { } else { 5e-3 }; - let normalized_value = self.widget_base.unmodulated_normalized_value() - - speed * cx.mouse().frame_delta().1; - nih_log!("[{}] Normalized value: {normalized_value}", self.widget_base.name()); + let normalized_value = self.widget_base.unmodulated_normalized_value() + - speed * cx.mouse().frame_delta().1; + nih_log!( + "[{}] Normalized value: {normalized_value}", + self.widget_base.name() + ); self.widget_base.set_normalized_value(cx, normalized_value); } } @@ -306,4 +281,66 @@ impl View for Knob { self.widget_base.end_set_parameter(cx); }); } + + fn draw(&self, cx: &mut DrawContext, canvas: &mut Canvas) { + const MAX_ANGLE_DEG: f32 = 235f32; + const EXTEND_X: f32 = 7. / 89.; + const EXTEND_Y: f32 = 6. / 89.; + let mut bounds = cx.bounds(); + let width = bounds.width(); + let height = bounds.height(); + let add_width = EXTEND_X * width; + let add_height = EXTEND_Y * height; + bounds.x -= add_width; + bounds.w += 2. * add_width; + bounds.y -= add_height; + bounds.h += 2. * add_height; + + let param = self.widget_base.modulated_normalized_value(); + let knob_angle = 2. * (0.5 - param) * MAX_ANGLE_DEG.to_radians(); + + let fg = self.image_fg.or_else(|| { + canvas + .load_image_file( + "data/images/Knob Front@2x.png", + ImageFlags::GENERATE_MIPMAPS, + ) + .inspect_err(|err| nih_error!("Cannot load image: {err}")) + .ok() + }); + let bg = self.image_bg.or_else(|| { + canvas + .load_image_file("data/images/Knob BG@2x.png", ImageFlags::GENERATE_MIPMAPS) + .inspect_err(|err| nih_error!("Cannot load bg image: {err}")) + .ok() + }); + + let bg_paint = if let Some(id) = bg { + let w = bounds.width(); + let h = bounds.height(); + let (cx, cy) = bounds.center(); + vg::Paint::image(id, cx, cy, w, h, 0., 1.) + } else { + vg::Paint::color(Color::transparent().into()) + }; + let fg_paint = if let Some(id) = fg { + let w = bounds.width(); + let h = bounds.height(); + let (cx, cy) = bounds.center(); + vg::Paint::image(id, cx, cy, w, h, 0., 1.) + } else { + vg::Paint::color(Color::transparent().into()) + }; + + let mut bounds_path = vg::Path::new(); + bounds_path.rect(-bounds.w / 2., -bounds.h / 2., bounds.w, bounds.h); + + canvas.save(); + let (cx, cy) = bounds.center(); + canvas.translate(cx, cy); + canvas.rotate(knob_angle); + canvas.fill_path(&bounds_path, &bg_paint); + canvas.fill_path(&bounds_path, &fg_paint); + canvas.restore(); + } } diff --git a/plugins/ts404/src/editor/mod.rs b/plugins/ts404/src/editor/mod.rs index 0750d97..d41179c 100644 --- a/plugins/ts404/src/editor/mod.rs +++ b/plugins/ts404/src/editor/mod.rs @@ -1,18 +1,18 @@ use std::sync::Arc; +use components::led::Led; use nih_plug::prelude::*; -use nih_plug_vizia::{create_vizia_editor, ViziaState, ViziaTheming}; use nih_plug_vizia::vizia::prelude::*; -use nih_plug_vizia::vizia::views::VStack; - -use components::{knob::Knob, led::Led}; +use nih_plug_vizia::vizia::views::{Knob, VStack}; +use nih_plug_vizia::widgets::param_base::ParamWidgetBase; +use nih_plug_vizia::{create_vizia_editor, ViziaState, ViziaTheming}; use crate::params::Ts404Params; mod components; pub(crate) fn default_state() -> Arc { - ViziaState::new(|| (200, 350)) + ViziaState::new(|| (500, 150)) } pub(crate) fn create( @@ -25,6 +25,9 @@ pub(crate) fn create( move |cx, _gui_cx| { cx.add_stylesheet(include_style!("src/editor/style.css")) .expect("Failed to load stylesheet"); + cx.emit(EnvironmentEvent::SetThemeMode(AppTheme::BuiltIn( + ThemeMode::DarkMode, + ))); AppData { params: params.clone(), drive_led: drive_led.clone(), @@ -33,6 +36,7 @@ pub(crate) fn create( Binding::new(cx, AppData::params, |cx, params| { VStack::new(cx, |cx| { HStack::new(cx, |cx| { + labelled_node_bool(cx, AppData::params, |p| &p.bypass); ZStack::new(cx, |cx| { labelled_node_float(cx, false, params, |p| &p.dist); Binding::new(cx, AppData::drive_led, |cx, drive_led| { @@ -40,14 +44,11 @@ pub(crate) fn create( }); }); labelled_node_float(cx, false, params, |params| ¶ms.tone); - }); - HStack::new(cx, |cx| { labelled_node_float(cx, false, params, |params| ¶ms.input_mode); labelled_node_float(cx, false, params, |params| ¶ms.component_matching); }) .class("small"); }) - .max_height(Pixels(150.)) .id("ui"); }); }, @@ -62,6 +63,23 @@ struct AppData { impl Model for AppData {} +fn labelled_node_bool( + cx: &mut Context, + params: impl Lens>, + get_param: impl 'static + Copy + Fn(&Arc) -> &BoolParam, +) -> Handle<'_, impl View> { + labelled_node_generic(cx, params, get_param, move |cx| { + let active = params.map_ref(get_param).map(|p| p.value()); + let param_base = ParamWidgetBase::new(cx, params, get_param); + Switch::new(cx, active).on_toggle(move |cx| { + let next = if active.get(cx) { 0.0 } else { 1.0 }; + param_base.begin_set_parameter(cx); + param_base.set_normalized_value(cx, next); + param_base.end_set_parameter(cx); + }); + }) +} + fn labelled_node_float( cx: &mut Context, bipolar: bool, @@ -71,12 +89,76 @@ fn labelled_node_float( where P::Plain: Data + ToString, { - labelled_node_float_generic(cx, params, get_param, move |cx| { - Knob::new(cx, bipolar, params, get_param); + labelled_node_generic(cx, params, get_param, move |cx| { + let default_value = params + .map_ref(get_param) + .map(|param| param.default_normalized_value()); + let normalized_value = params + .map_ref(get_param) + .map(|param| param.modulated_normalized_value()); + let param_base = ParamWidgetBase::new(cx, params, get_param); + Knob::new(cx, default_value, normalized_value, bipolar) + .on_changing(move |cx, value| { + param_base.begin_set_parameter(cx); + param_base.set_normalized_value(cx, value); + param_base.end_set_parameter(cx); + }) + .width(Pixels(60.)) + .height(Pixels(60.)); + }) +} + +fn labelled_node_enum( + cx: &mut Context, + params: impl Lens>, + get_param: impl 'static + Copy + Fn(&Arc) -> &EnumParam, +) -> Handle<'_, impl View> { + #[derive(Lens)] + struct EnumData { + names: Vec, + } + impl Model for EnumData {} + + labelled_node_generic(cx, params, get_param, move |cx| { + let param = params.map_ref(get_param); + let name = param.map(|param| param.value().to_string()); + let num_values = E::variants().len(); + EnumData { + names: E::variants().into_iter().map(|s| s.to_string()).collect(), + } + .build(cx); + + Dropdown::new( + cx, + move |cx| Label::new(cx, name), + move |cx| { + List::new(cx, EnumData::names, move |cx, ix, item| { + let param_base = ParamWidgetBase::new(cx, params, get_param); + Label::new(cx, item) + .cursor(CursorIcon::Hand) + .bind(name, move |handle, selected| { + if item.get(&handle) == selected.get(&handle) { + handle.checked(true); + } + }) + .on_press(move |cx| { + let value = ix as f32 / num_values as f32; + param_base.begin_set_parameter(cx); + param_base.set_normalized_value(cx, value); + param_base.end_set_parameter(cx); + cx.emit(PopupEvent::Close); + }); + }); + }, + ) + .width(Pixels(150.)) + .min_space(Pixels(15.)) + .top(Stretch(2.)) + .bottom(Stretch(0.667)); }) } -fn labelled_node_float_generic( +fn labelled_node_generic( cx: &mut Context, params: impl Lens>, get_param: impl 'static + Copy + Fn(&Arc) -> &P, From 46f1c971848b618d3f8ed2f63f6cf2fcdcd670c7 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 2 Sep 2024 16:06:03 +0200 Subject: [PATCH 27/51] chore: update code to reflect valib changes --- plugins/ts404/Cargo.toml | 4 +++- plugins/ts404/src/dsp.rs | 18 +++++++----------- plugins/ts404/src/dsp/clipping.rs | 16 +++++++++++++++- plugins/ts404/src/editor/mod.rs | 6 +++++- plugins/ts404/src/lib.rs | 2 +- 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/plugins/ts404/Cargo.toml b/plugins/ts404/Cargo.toml index f5fb28e..9f122f0 100644 --- a/plugins/ts404/Cargo.toml +++ b/plugins/ts404/Cargo.toml @@ -37,8 +37,10 @@ opt-level = 1 opt-level = 0 [profile.release] -lto = "thin" +codegen-units = 1 +lto = "fat" strip = "symbols" +opt-level = 3 [profile.profiling] inherits = "release" diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index 04c79cf..954540c 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -15,19 +15,18 @@ use valib::dsp::{blocks::Bypass, BlockAdapter, DSPMeta, DSPProcess, DSPProcessBl use valib::filters::statespace::StateSpace; use valib::math::smooth_clamp; use valib::oversample::{Oversample, Oversampled}; -use valib::saturators::{Bjt, Saturator, Slew}; +use valib::saturators::{bjt, Saturator}; use valib::simd::{ AutoF64x2, AutoSimd, SimdBool, SimdComplexField, SimdPartialOrd, SimdValue, }; use valib::Scalar; use clipping::ClippingStage; -use crate::params::MAX_AGE; mod clipping; -fn emitter_follower_input() -> Bjt { - Bjt { +fn emitter_follower_input() -> bjt::CommonCollector { + bjt::CommonCollector { vee: T::zero(), vcc: T::from_f64(9.), xbias: T::from_f64(3.75041272), @@ -102,7 +101,7 @@ impl InputLevelMatching { pub struct InputStage { pub gain: SmoothedParam, state_space: StateSpace, - clip: Bjt, + clip: bjt::CommonCollector, } impl DSPMeta for InputStage { @@ -261,7 +260,6 @@ type DspInner = SwitchAB< pub struct Dsp> { inner: Oversampled>>, - samplerate: T, } impl> DSPMeta for Dsp { @@ -323,10 +321,9 @@ where Complex: SimdComplexField, ::Element: ToPrimitive, { - pub fn new(base_samplerate: f32, _target_samplerate: f32) -> RemoteControlled { - //let oversample = target_samplerate / base_samplerate; - //let oversample = oversample.ceil() as usize; - let oversample = 1; + pub fn new(base_samplerate: f32, target_samplerate: f32) -> RemoteControlled { + let oversample = target_samplerate / base_samplerate; + let oversample = oversample.ceil() as usize; nih_log!("Requested oversample: {oversample}x"); let oversample = Oversample::new(oversample, MAX_BLOCK_SIZE); let samplerate = base_samplerate * oversample.oversampling_amount() as f32; @@ -348,7 +345,6 @@ where 1e3, Dsp { inner, - samplerate: T::from_f64(samplerate as _), }, ) } diff --git a/plugins/ts404/src/dsp/clipping.rs b/plugins/ts404/src/dsp/clipping.rs index f7c9cf7..8f7d49b 100644 --- a/plugins/ts404/src/dsp/clipping.rs +++ b/plugins/ts404/src/dsp/clipping.rs @@ -123,7 +123,21 @@ impl> Stage3 { pub fn new(samplerate: T) -> Self { let iin = rcsource(T::from_f64(51e3), T::from_f64(0.)); let module = module( - diode_nr(DiodeClipper::new_silicon(1, 1, T::zero())), + node({ + let data = DiodeClipper::new_silicon(1, 1, T::zero()); + let mut wdf = DiodeNR::from_data(data); + #[cfg(debug_assertions)] + { + wdf.max_iter = 10; + wdf.max_tolerance = T::from_f64(1e-4); + } + #[cfg(not(debug_assertions))] + { + wdf.max_iter = 100; + wdf.max_tolerance = T::from_f64(1e-6); + } + wdf + }), parallel(iin.clone(), capacitor(samplerate, T::from_f64(51e-12))), ); Self { module, iin } diff --git a/plugins/ts404/src/editor/mod.rs b/plugins/ts404/src/editor/mod.rs index d41179c..ba900db 100644 --- a/plugins/ts404/src/editor/mod.rs +++ b/plugins/ts404/src/editor/mod.rs @@ -1,5 +1,5 @@ use std::sync::Arc; - +use std::sync::atomic::Ordering; use components::led::Led; use nih_plug::prelude::*; use nih_plug_vizia::vizia::prelude::*; @@ -48,6 +48,10 @@ pub(crate) fn create( labelled_node_float(cx, false, params, |params| ¶ms.component_matching); }) .class("small"); + Binding::new(cx, AppData::drive_led, |cx, drive| { + let display = drive.map(|x| format!("LED brightness: {}", x.load(Ordering::Relaxed))); + Label::new(cx, display); + }); }) .id("ui"); }); diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index b5d262c..363ca85 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -18,7 +18,7 @@ mod gen; mod params; mod util; -const TARGET_SAMPLERATE: f32 = 96000.; +const TARGET_SAMPLERATE: f32 = 192000.; type Sample = AutoF64x2; type Sample32 = AutoF32x2; From 0694a4301b08c6751e83a6ac238f5f317bb85eda Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 2 Sep 2024 21:58:52 +0200 Subject: [PATCH 28/51] feat: add crossover distortion to clipping stage --- plugins/ts404/src/dsp/clipping.rs | 60 +- ...__clipping__tests__crossover_dc_sweep.snap | 104 + ...404__dsp__clipping__tests__drive_test.snap | 8192 ++++++++--------- plugins/ts404/src/editor/components/led.rs | 2 +- 4 files changed, 4257 insertions(+), 4101 deletions(-) create mode 100644 plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__crossover_dc_sweep.snap diff --git a/plugins/ts404/src/dsp/clipping.rs b/plugins/ts404/src/dsp/clipping.rs index 8f7d49b..3c5828c 100644 --- a/plugins/ts404/src/dsp/clipping.rs +++ b/plugins/ts404/src/dsp/clipping.rs @@ -4,10 +4,11 @@ use nih_plug::prelude::AtomicF32; use nih_plug::util::db_to_gain_fast; use num_traits::{Float, ToPrimitive}; use std::sync::{atomic::Ordering, Arc}; -use valib::math::smooth_clamp; +use numeric_literals::replace_float_literals; +use valib::math::{smooth_clamp, smooth_max, smooth_min}; use valib::saturators::clippers::DiodeClipper; -use valib::saturators::Slew; -use valib::simd::SimdComplexField; +use valib::saturators::{Saturator, Slew}; +use valib::simd::{SimdComplexField, SimdValue}; use valib::util::lerp; use valib::wdf::dsl::*; use valib::{ @@ -16,6 +17,41 @@ use valib::{ Scalar, }; +struct CrossoverDistortion { + pub t: T, + pub drift: T, +} + +impl CrossoverDistortion { + pub fn new(drift: T) -> Self { + Self { + t: T::from_f64(1e-1), + drift, + } + } + + pub fn from_age(age: T) -> Self { + Self::new(Self::drift_from_age(age)) + } + + pub fn set_age(&mut self, age: T) { + self.drift = Self::drift_from_age(age); + } + + #[replace_float_literals(T::from_f64(literal))] + fn drift_from_age(age: T) -> T { + 2.96e-3 * age.simd_powf(1./3.) + } +} + +impl Saturator for CrossoverDistortion { + fn saturate(&self, x: T) -> T { + let l0 = x + self.drift; + let l1 = x - self.drift; + l0.simd_min(T::zero().simd_max(l1)) + } +} + type Stage1Module = WdfModule< ResistiveVoltageSource, Series, Series, ResistiveVoltageSource>>, @@ -181,6 +217,7 @@ pub struct ClippingStage> { pub(crate) led_rms: Rms, pub(crate) led_display: Arc, samplerate: T, + crossover: CrossoverDistortion, } impl> ClippingStage { @@ -196,11 +233,13 @@ impl> ClippingStage { stage3: Stage3::new(samplerate), led_rms: Rms::new(rms_samples), led_display: Arc::new(AtomicF32::new(0.0)), + crossover: CrossoverDistortion::new(T::zero()), samplerate, } } pub fn set_age(&mut self, age: T) { + self.crossover.set_age(age); self.out_slew.max_diff = component_matching_slew_rate(self.samplerate, age); } @@ -244,11 +283,13 @@ impl> DSPProcess<1, 1> for ClippingStage .to_f32() .unwrap_or_default() * 0.5; + let led_value = led_value.select(led_value.is_finite(), 0.); let led_value = self.led_rms.add_element(led_value); self.led_display.store(led_value, Ordering::Relaxed); + let vout = self.crossover.saturate(vplus + vf - T::from_f64(4.5)) + T::from_f64(4.5); self.out_slew.process([smooth_clamp( T::from_f64(0.1), - vplus + vf, + vout, T::zero(), T::from_f64(9.), )]) @@ -267,6 +308,17 @@ mod tests { use valib::dsp::buffer::{AudioBufferMut, AudioBufferRef}; use valib::dsp::{BlockAdapter, DSPProcessBlock}; + #[test] + fn crossover_dc_sweep() { + const N: usize = 100; + let crossover = CrossoverDistortion::new(1.); + let output: [f32; N] = std::array::from_fn(|i| { + let x = lerp(i as f32 / N as f32, -5., 5.); + crossover.saturate(x) + }); + insta::assert_csv_snapshot!(&output as &[_], { "[]" => insta::rounded_redaction(4) }); + } + #[test] fn drive_test() { const SAMPLERATE: f64 = 1024.; diff --git a/plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__crossover_dc_sweep.snap b/plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__crossover_dc_sweep.snap new file mode 100644 index 0000000..5031249 --- /dev/null +++ b/plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__crossover_dc_sweep.snap @@ -0,0 +1,104 @@ +--- +source: src/dsp/clipping.rs +expression: "&output as &[_]" +--- +-4.0 +-3.9 +-3.8 +-3.7 +-3.6 +-3.5 +-3.4 +-3.3 +-3.2 +-3.1 +-3.0 +-2.9 +-2.8 +-2.7 +-2.6 +-2.5 +-2.4 +-2.3 +-2.2 +-2.1 +-2.0 +-1.9 +-1.8 +-1.7 +-1.6 +-1.5 +-1.4 +-1.3 +-1.2 +-1.1 +-1.0 +-0.9 +-0.8 +-0.7 +-0.6 +-0.5 +-0.4 +-0.3 +-0.2 +-0.1 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.1 +0.2 +0.3 +0.4 +0.5 +0.6 +0.7 +0.8 +0.9 +1.0 +1.1 +1.2 +1.3 +1.4 +1.5 +1.6 +1.7 +1.8 +1.9 +2.0 +2.1 +2.2 +2.3 +2.4 +2.5 +2.6 +2.7 +2.8 +2.9 +3.0 +3.1 +3.2 +3.3 +3.4 +3.5 +3.6 +3.7 +3.8 +3.9 diff --git a/plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__drive_test.snap b/plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__drive_test.snap index 0eaf27d..c4231b8 100644 --- a/plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__drive_test.snap +++ b/plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__drive_test.snap @@ -2,4099 +2,4099 @@ source: src/dsp/clipping.rs expression: "&assert as &[_]" --- -4.5,0.0095 -5.475,0.0191 -6.4407,0.0286 -7.388,0.0381 -8.3077,0.0477 -9.1911,0.0572 -10.0298,0.0668 -10.8158,0.0763 -11.5417,0.0858 -12.2004,0.0954 -12.7858,0.1049 -13.2922,0.1144 -13.7148,0.124 -14.0496,0.1335 -14.2934,0.1431 -14.4439,0.1526 -14.4997,0.1621 -14.4601,0.1717 -14.3256,0.1812 -14.0975,0.1907 -13.778,0.2003 -13.37,0.2098 -12.8775,0.2193 -12.3052,0.2289 -11.6585,0.2384 -10.9436,0.248 -10.1673,0.2575 -9.337,0.267 -8.4606,0.2766 -7.5464,0.2861 -6.6032,0.2956 -5.64,0.3052 -4.6659,0.3147 -3.6903,0.3242 -2.7223,0.3338 -1.7713,0.3433 -0.8463,0.3529 --0.0439,0.3624 --0.8908,0.3719 --1.6863,0.3815 --2.4229,0.391 --3.0935,0.3815 --3.6917,0.3719 --4.2119,0.3624 --4.6491,0.3529 --4.9991,0.3433 --5.2585,0.3338 --5.425,0.3242 --5.4969,0.3147 --5.4735,0.3052 --5.3551,0.3147 --5.1428,0.3242 --4.8386,0.3338 --4.4454,0.3433 --3.967,0.3529 --3.4079,0.3624 --2.7734,0.3719 --2.0696,0.3815 --1.3032,0.391 --0.4815,0.4005 -0.3876,0.4101 -1.296,0.4196 -2.2349,0.4292 -3.1953,0.4387 -4.1682,0.4482 -5.1443,0.4578 -6.1142,0.4673 -7.0687,0.4768 -7.9988,0.4864 -8.8955,0.4959 -9.7503,0.5054 -10.5551,0.515 -11.3022,0.5245 -11.9845,0.5341 -12.5955,0.5436 -13.1293,0.5531 -13.5809,0.5627 -13.9459,0.5722 -14.221,0.5817 -14.4034,0.5913 -14.4914,0.6008 -14.4842,0.6104 -14.3819,0.6199 -14.1854,0.6294 -13.8967,0.639 -13.5183,0.6485 -13.0541,0.658 -12.5083,0.6676 -11.8862,0.6771 -11.1938,0.6866 -10.4375,0.6962 -9.6247,0.7057 -8.763,0.7153 -7.8608,0.7248 -6.9264,0.7343 -5.969,0.7439 -4.9976,0.7534 -4.0214,0.7629 -3.0498,0.7725 -2.092,0.782 -1.1571,0.7915 -0.2542,0.8011 --0.6084,0.8106 --1.4222,0.8202 --2.1797,0.8297 --2.8734,0.8202 --3.4969,0.8106 --4.0442,0.8011 --4.5101,0.7915 --4.8901,0.782 --5.1807,0.7725 --5.379,0.7629 --5.4831,0.7534 --5.4922,0.7439 --5.406,0.7343 --5.2254,0.7439 --4.9521,0.7534 --4.5888,0.7629 --4.1389,0.7725 --3.6066,0.782 --2.9971,0.7915 --2.3161,0.8011 --1.5702,0.8106 --0.7665,0.8202 -0.0875,0.8297 -0.9834,0.8392 -1.9129,0.8488 -2.8671,0.8583 -3.8368,0.8678 -4.8128,0.8774 -5.7858,0.8869 -6.7466,0.8965 -7.686,0.906 -8.595,0.9155 -9.465,0.9251 -10.2877,0.9346 -11.0553,0.9441 -11.7603,0.9537 -12.3962,0.9632 -12.9569,0.9727 -13.4369,0.9823 -13.8318,0.9918 -14.1378,1.0014 -14.3519,1.0109 -14.4721,1.0204 -14.4974,1.03 -14.4273,1.0395 -14.2627,1.049 -14.005,1.0586 -13.6567,1.0681 -13.2212,1.0777 -12.7026,1.0872 -12.1058,1.0967 -11.4366,1.1063 -10.7012,1.1158 -9.9068,1.1253 -9.0608,1.1349 -8.1714,1.1444 -7.247,1.1539 -6.2964,1.1635 -5.3287,1.173 -4.3531,1.1826 -3.3789,1.1921 -2.4153,1.2016 -1.4717,1.2112 -0.5569,1.2207 --0.3203,1.2302 --1.1516,1.2207 --1.9291,1.2112 --2.6452,1.2016 --3.2933,1.1921 --3.8671,1.1826 --4.3612,1.173 --4.7709,1.1635 --5.0922,1.1539 --5.3221,1.1444 --5.4584,1.1349 --5.4998,1.1253 --5.4459,1.1158 --5.2973,1.1063 --5.0552,1.0967 --4.7222,1.1063 --4.3012,1.1158 --3.7964,1.1253 --3.2125,1.1349 --2.5552,1.1444 --1.8306,1.1539 --1.0456,1.1635 --0.2079,1.173 -0.6748,1.1826 -1.5939,1.1921 -2.5406,1.2016 -3.5061,1.2112 -4.481,1.2207 -5.4561,1.2302 -6.4221,1.2398 -7.3698,1.2493 -8.2901,1.2589 -9.1743,1.2684 -10.014,1.2779 -10.8011,1.2875 -11.5282,1.297 -12.1883,1.3065 -12.7751,1.3161 -13.2831,1.3256 -13.7074,1.3351 -14.044,1.3447 -14.2896,1.3542 -14.4419,1.3638 -14.4995,1.3733 -14.4618,1.3828 -14.3291,1.3924 -14.1029,1.4019 -13.7851,1.4114 -13.3788,1.421 -12.8879,1.4305 -12.3171,1.44 -11.6718,1.4496 -10.9581,1.4591 -10.1829,1.4687 -9.3536,1.4782 -8.478,1.4877 -7.5645,1.4973 -6.6218,1.5068 -5.6589,1.5163 -4.6849,1.5259 -3.7092,1.5354 -2.741,1.545 -1.7896,1.5545 -0.864,1.564 --0.027,1.5545 --0.8748,1.545 --1.6714,1.5354 --2.4092,1.5259 --3.0811,1.5163 --3.6808,1.5068 --4.2026,1.4973 --4.6414,1.4877 --4.9931,1.4782 --5.2544,1.4687 --5.4227,1.4591 --5.4964,1.4496 --5.4749,1.44 --5.3583,1.4305 --5.1478,1.421 --4.8454,1.4114 --4.4539,1.421 --3.9771,1.4305 --3.4195,1.44 --2.7864,1.4496 --2.0839,1.4591 --1.3187,1.4687 --0.498,1.4782 -0.3703,1.4877 -1.278,1.4973 -2.2164,1.5068 -3.1765,1.5163 -4.1492,1.5259 -5.1253,1.5354 -6.0954,1.545 -7.0503,1.5545 -7.981,1.564 -8.8784,1.5736 -9.7341,1.5831 -10.54,1.5926 -11.2883,1.6022 -11.9719,1.6117 -12.5843,1.6212 -13.1197,1.6308 -13.5729,1.6403 -13.9397,1.6499 -14.2165,1.6594 -14.4007,1.6689 -14.4906,1.6785 -14.4853,1.688 -14.3848,1.6975 -14.1901,1.7071 -13.9031,1.7166 -13.5265,1.7262 -13.0639,1.7357 -12.5197,1.7452 -11.899,1.7548 -11.2079,1.7643 -10.4528,1.7738 -9.641,1.7834 -8.7802,1.7929 -7.8786,1.8024 -6.9449,1.812 -5.9878,1.8215 -5.0165,1.8311 -4.0404,1.8406 -3.0686,1.8501 -2.1104,1.8597 -1.1751,1.8501 -0.2714,1.8406 --0.592,1.8311 --1.4069,1.8215 --2.1655,1.812 --2.8606,1.8024 --3.4855,1.7929 --4.0344,1.7834 --4.5019,1.7738 --4.8836,1.7643 --5.1759,1.7548 --5.376,1.7452 --5.482,1.7357 --5.4929,1.7262 --5.4086,1.7166 --5.2298,1.7071 --4.9583,1.6975 --4.5967,1.688 --4.1484,1.6868 --3.6177,1.6963 --3.0096,1.7059 --2.33,1.7154 --1.5853,1.7249 --0.7826,1.7345 -0.0704,1.744 -0.9657,1.7535 -1.8946,1.7631 -2.8483,1.7726 -3.8178,1.7822 -4.7938,1.7917 -5.767,1.8012 -6.7281,1.8108 -7.668,1.8203 -8.5777,1.8298 -9.4485,1.8394 -10.2722,1.8489 -11.0409,1.8584 -11.7473,1.868 -12.3845,1.8775 -12.9467,1.8871 -13.4284,1.8966 -13.825,1.9061 -14.1327,1.9157 -14.3486,1.9252 -14.4707,1.9347 -14.4978,1.9443 -14.4296,1.9538 -14.2668,1.9633 -14.0109,1.9729 -13.6644,1.9824 -13.2305,1.992 -12.7135,2.0015 -12.1182,2.011 -11.4503,2.0206 -10.7161,2.0301 -9.9228,2.0396 -9.0777,2.0492 -8.1891,2.0587 -7.2652,2.0683 -6.3151,2.0778 -5.3476,2.0873 -4.3721,2.0969 -3.3977,2.1064 -2.4339,2.1159 -1.4898,2.1064 -0.5744,2.0969 --0.3037,2.0873 --1.1359,2.0778 --1.9145,2.0683 --2.6319,2.0587 --3.2814,2.0492 --3.8567,2.0396 --4.3524,2.0301 --4.7637,2.0206 --5.0868,2.011 --5.3185,2.0015 --5.4566,1.992 --5.4999,1.9824 --5.4479,1.9729 --5.301,1.9633 --5.0608,1.9538 --4.7295,1.9443 --4.3102,1.9347 --3.807,1.9252 --3.2246,1.9347 --2.5686,1.9443 --1.8452,1.9538 --1.0614,1.9633 --0.2246,1.9729 -0.6572,1.9824 -1.5757,1.992 -2.522,2.0015 -3.4872,2.011 -4.462,2.0206 -5.4372,2.0301 -6.4034,2.0396 -7.3516,2.0492 -8.2725,2.0587 -9.1575,2.0683 -9.9981,2.0778 -10.7863,2.0873 -11.5146,2.0969 -12.1761,2.1064 -12.7644,2.1159 -13.274,2.1255 -13.7,2.135 -14.0383,2.1445 -14.2857,2.1541 -14.4398,2.1636 -14.4993,2.1732 -14.4634,2.1827 -14.3326,2.1922 -14.1081,2.2018 -13.7921,2.2113 -13.3875,2.2208 -12.8982,2.2304 -12.3289,2.2399 -11.685,2.2495 -10.9726,2.259 -10.1986,2.2685 -9.3702,2.2781 -8.4954,2.2876 -7.5826,2.2971 -6.6404,2.3067 -5.6777,2.3162 -4.7039,2.3257 -3.7281,2.3353 -2.7597,2.3448 -1.8079,2.3353 -0.8817,2.3257 --0.01,2.3162 --0.8588,2.3067 --1.6564,2.2971 --2.3954,2.2876 --3.0687,2.2781 --3.6699,2.2685 --4.1932,2.259 --4.6337,2.2495 --4.9871,2.2399 --5.2502,2.2304 --5.4203,2.2208 --5.4959,2.2113 --5.4762,2.2018 --5.3615,2.1922 --5.1528,2.1827 --4.8521,2.1732 --4.4623,2.1636 --3.9871,2.1541 --3.4311,2.1605 --2.7994,2.17 --2.0982,2.1795 --1.3341,2.1891 --0.5144,2.1986 -0.353,2.2082 -1.26,2.2177 -2.1979,2.2272 -3.1577,2.2368 -4.1302,2.2463 -5.1063,2.2558 -6.0767,2.2654 -7.032,2.2749 -7.9632,2.2844 -8.8613,2.294 -9.7179,2.3035 -10.5248,2.3131 -11.2743,2.3226 -11.9592,2.3321 -12.5731,2.3417 -13.11,2.3512 -13.5649,2.3607 -13.9334,2.3703 -14.212,2.3798 -14.398,2.3894 -14.4897,2.3989 -14.4863,2.4084 -14.3877,2.418 -14.1948,2.4275 -13.9096,2.437 -13.5347,2.4466 -13.0737,2.4561 -12.531,2.4656 -11.9118,2.4752 -11.222,2.4847 -10.4681,2.4943 -9.6573,2.5038 -8.7974,2.5133 -7.8965,2.5229 -6.9633,2.5324 -6.0066,2.5419 -5.0355,2.5515 -4.0594,2.561 -3.0874,2.5515 -2.1289,2.5419 -1.193,2.5324 -0.2886,2.5229 --0.5757,2.5133 --1.3916,2.5038 --2.1513,2.4943 --2.8477,2.4847 --3.4741,2.4752 --4.0244,2.4656 --4.4936,2.4561 --4.877,2.4466 --5.1711,2.437 --5.373,2.4275 --5.4809,2.418 --5.4936,2.4084 --5.4111,2.3989 --5.2342,2.3894 --4.9645,2.3798 --4.6046,2.3703 --4.1579,2.3607 --3.6288,2.3512 --3.0222,2.3607 --2.3439,2.3703 --1.6004,2.3798 --0.7987,2.3894 -0.0534,2.3989 -0.9479,2.4084 -1.8763,2.418 -2.8296,2.4275 -3.7989,2.437 -4.7748,2.4466 -5.7482,2.4561 -6.7096,2.4656 -7.65,2.4752 -8.5604,2.4847 -9.432,2.4943 -10.2567,2.5038 -11.0265,2.5133 -11.7342,2.5229 -12.3728,2.5324 -12.9365,2.5419 -13.4198,2.5515 -13.8181,2.561 -14.1276,2.5706 -14.3453,2.5801 -14.4692,2.5896 -14.4982,2.5992 -14.4318,2.6087 -14.2708,2.6182 -14.0167,2.6278 -13.6719,2.6373 -13.2398,2.6468 -12.7243,2.6564 -12.1305,2.6659 -11.4639,2.6755 -10.731,2.685 -9.9387,2.6945 -9.0946,2.7041 -8.2067,2.7136 -7.2835,2.7231 -6.3338,2.7327 -5.3665,2.7422 -4.3911,2.7518 -3.4166,2.7422 -2.4525,2.7327 -1.5079,2.7231 -0.5918,2.7136 --0.287,2.7041 --1.1202,2.6945 --1.8999,2.685 --2.6186,2.6755 --3.2695,2.6659 --3.8463,2.6564 --4.3436,2.6468 --4.7566,2.6373 --5.0814,2.6278 --5.3149,2.6182 --5.4549,2.6087 --5.5,2.5992 --5.4498,2.5896 --5.3048,2.5801 --5.0664,2.5706 --4.7368,2.561 --4.3192,2.5515 --3.8175,2.5419 --3.2366,2.5324 --2.582,2.5419 --1.8599,2.5515 --1.0772,2.561 --0.2413,2.5706 -0.6397,2.5801 -1.5575,2.5896 -2.5034,2.5992 -3.4683,2.6087 -4.443,2.6182 -5.4183,2.6278 -6.3848,2.6373 -7.3333,2.6468 -8.2549,2.6564 -9.1407,2.6659 -9.9822,2.6755 -10.7715,2.685 -11.5011,2.6945 -12.1639,2.7041 -12.7537,2.7136 -13.2649,2.7231 -13.6925,2.7327 -14.0326,2.7422 -14.2817,2.7518 -14.4377,2.7613 -14.499,2.7708 -14.465,2.7804 -14.3361,2.7899 -14.1134,2.7994 -13.7991,2.809 -13.3962,2.8185 -12.9085,2.828 -12.3407,2.8376 -11.6982,2.8471 -10.9871,2.8567 -10.2142,2.8662 -9.3868,2.8757 -8.5128,2.8853 -7.6006,2.8948 -6.6589,2.9043 -5.6966,2.9139 -4.7229,2.9234 -3.7471,2.9139 -2.7784,2.9043 -1.8262,2.8948 -0.8994,2.8853 -0.0069,2.8757 --0.8427,2.8662 --1.6414,2.8567 --2.3817,2.8471 --3.0563,2.8376 --3.6589,2.828 --4.1838,2.8185 --4.6259,2.809 --4.9811,2.7994 --5.2459,2.7899 --5.4179,2.7804 --5.4953,2.7708 --5.4775,2.7613 --5.3646,2.7518 --5.1578,2.7422 --4.8588,2.7327 --4.4707,2.7231 --3.9972,2.7136 --3.4426,2.7041 --2.8124,2.6945 --2.1125,2.7041 --1.3495,2.7136 --0.5309,2.7231 -0.3358,2.7327 -1.242,2.7422 -2.1794,2.7518 -3.1388,2.7613 -4.1113,2.7708 -5.0874,2.7804 -6.0579,2.7899 -7.0136,2.7994 -7.9453,2.809 -8.8442,2.8185 -9.7017,2.828 -10.5097,2.8376 -11.2603,2.8471 -11.9466,2.8567 -12.5619,2.8662 -13.1003,2.8757 -13.5568,2.8853 -13.927,2.8948 -14.2074,2.9043 -14.3953,2.9139 -14.4889,2.9234 -14.4873,2.9329 -14.3905,2.9425 -14.1995,2.952 -13.916,2.9616 -13.5428,2.9711 -13.0835,2.9806 -12.5423,2.9902 -11.9245,2.9997 -11.236,3.0092 -10.4833,3.0188 -9.6736,3.0283 -8.8145,3.0379 -7.9144,3.0474 -6.9817,3.0569 -6.0254,3.0665 -5.0545,3.076 -4.0783,3.0665 -3.1062,3.0569 -2.1473,3.0474 -1.2109,3.0379 -0.3058,3.0283 --0.5593,3.0188 --1.3762,3.0092 --2.1371,2.9997 --2.8348,2.9902 --3.4626,2.9806 --4.0145,2.9711 --4.4853,2.9616 --4.8704,2.952 --5.1662,2.9425 --5.37,2.9329 --5.4797,2.9234 --5.4943,2.9139 --5.4136,2.9043 --5.2385,2.8948 --4.9706,2.8853 --4.6124,2.8757 --4.1674,2.8662 --3.6398,2.8567 --3.0347,2.8471 --2.3577,2.8376 --1.6154,2.8471 --0.8148,2.8567 -0.0364,2.8662 -0.9301,2.8757 -1.8579,2.8853 -2.8109,2.8948 -3.7799,2.9043 -4.7558,2.9139 -5.7293,2.9234 -6.6911,2.9329 -7.6319,2.9425 -8.543,2.952 -9.4155,2.9616 -10.2412,2.9711 -11.0121,2.9806 -11.721,2.9902 -12.3611,2.9997 -12.9263,3.0092 -13.4112,3.0188 -13.8112,3.0283 -14.1224,3.0379 -14.342,3.0474 -14.4677,3.0569 -14.4985,3.0665 -14.434,3.076 -14.2749,3.0855 -14.0225,3.0951 -13.6795,3.1046 -13.249,3.1141 -12.7351,3.1237 -12.1427,3.1332 -11.4775,3.1428 -10.7458,3.1523 -9.9546,3.1618 -9.1115,3.1714 -8.2243,3.1809 -7.3017,3.1904 -6.3524,3.2 -5.3855,3.2095 -4.4101,3.2 -3.4355,3.1904 -2.4711,3.1809 -1.5261,3.1714 -0.6093,3.1618 --0.2703,3.1523 --1.1045,3.1428 --1.8853,3.1332 --2.6052,3.1237 --3.2575,3.1141 --3.8358,3.1046 --4.3347,3.0951 --4.7494,3.0855 --5.0759,3.076 --5.3112,3.0665 --5.453,3.0569 --5.5,3.0474 --5.4517,3.0379 --5.3085,3.0283 --5.0719,3.0188 --4.7441,3.0092 --4.3281,2.9997 --3.8281,2.9902 --3.2487,2.9806 --2.5954,2.9711 --1.8746,2.9806 --1.093,2.9902 --0.2581,2.9997 -0.6222,3.0092 -1.5394,3.0188 -2.4848,3.0283 -3.4494,3.0379 -4.424,3.0474 -5.3994,3.0569 -6.3661,3.0665 -7.3151,3.076 -8.2373,3.0855 -9.1238,3.0951 -9.9663,3.1046 -10.7567,3.1141 -11.4875,3.1237 -12.1517,3.1332 -12.743,3.1428 -13.2557,3.1523 -13.685,3.1618 -14.0268,3.1714 -14.2778,3.1809 -14.4356,3.1904 -14.4987,3.2 -14.4666,3.2095 -14.3395,3.2191 -14.1186,3.2286 -13.8061,3.2381 -13.4049,3.2477 -12.9188,3.2572 -12.3525,3.2667 -11.7114,3.2763 -11.0015,3.2858 -10.2297,3.2953 -9.4033,3.3049 -8.5302,3.3144 -7.6187,3.324 -6.6775,3.3335 -5.7155,3.343 -4.7419,3.3335 -3.766,3.324 -2.7971,3.3144 -1.8445,3.3049 -0.9171,3.2953 -0.0239,3.2858 --0.8266,3.2763 --1.6264,3.2667 --2.3679,3.2572 --3.0438,3.2477 --3.6479,3.2381 --4.1744,3.2286 --4.6182,3.2191 --4.975,3.2095 --5.2417,3.2 --5.4154,3.1904 --5.4947,3.1809 --5.4788,3.1714 --5.3677,3.1618 --5.1627,3.1523 --4.8655,3.1428 --4.4791,3.1332 --4.0072,3.1237 --3.4541,3.1141 --2.8253,3.1046 --2.1267,3.0951 --1.3649,3.1046 --0.5473,3.1141 -0.3185,3.1237 -1.2241,3.1332 -2.1609,3.1428 -3.12,3.1523 -4.0923,3.1618 -5.0684,3.1714 -6.0391,3.1809 -6.9952,3.1904 -7.9275,3.2 -8.8271,3.2095 -9.6855,3.2191 -10.4945,3.2286 -11.2463,3.2381 -11.9339,3.2477 -12.5506,3.2572 -13.0906,3.2667 -13.5488,3.2763 -13.9207,3.2858 -14.2028,3.2953 -14.3925,3.3049 -14.488,3.3144 -14.4882,3.324 -14.3933,3.3335 -14.2041,3.343 -13.9224,3.3526 -13.5509,3.3621 -13.0932,3.3716 -12.5536,3.3812 -11.9373,3.3907 -11.25,3.4002 -10.4985,3.4098 -9.6898,3.4193 -8.8317,3.4289 -7.9322,3.4384 -7.0001,3.4479 -6.0441,3.4575 -5.0735,3.4479 -4.0973,3.4384 -3.125,3.4289 -2.1658,3.4193 -1.2289,3.4098 -0.3231,3.4002 --0.5429,3.3907 --1.3608,3.3812 --2.1229,3.3716 --2.8219,3.3621 --3.4511,3.3526 --4.0045,3.343 --4.4769,3.3335 --4.8637,3.324 --5.1614,3.3144 --5.3669,3.3049 --5.4784,3.2953 --5.4949,3.2858 --5.4161,3.2763 --5.2428,3.2667 --4.9767,3.2572 --4.6202,3.2477 --4.1769,3.2381 --3.6508,3.2286 --3.0471,3.2191 --2.3715,3.2095 --1.6304,3.2 --0.8309,3.2095 -0.0194,3.2191 -0.9124,3.2286 -1.8396,3.2381 -2.7922,3.2477 -3.761,3.2572 -4.7368,3.2667 -5.7105,3.2763 -6.6725,3.2858 -7.6139,3.2953 -8.5256,3.3049 -9.3989,3.3144 -10.2256,3.324 -10.9977,3.3335 -11.7079,3.343 -12.3494,3.3526 -12.9161,3.3621 -13.4026,3.3716 -13.8042,3.3812 -14.1172,3.3907 -14.3386,3.4002 -14.4662,3.4098 -14.4988,3.4193 -14.4362,3.4289 -14.2788,3.4384 -14.0283,3.4479 -13.687,3.4575 -13.2582,3.467 -12.7458,3.4765 -12.155,3.4861 -11.4911,3.4956 -10.7607,3.5052 -9.9706,3.5147 -9.1283,3.5242 -8.242,3.5338 -7.32,3.5433 -6.3711,3.5528 -5.4044,3.5433 -4.4291,3.5338 -3.4544,3.5242 -2.4897,3.5147 -1.5442,3.5052 -0.6268,3.4956 --0.2536,3.4861 --1.0888,3.4765 --1.8707,3.467 --2.5919,3.4575 --3.2455,3.4479 --3.8253,3.4384 --4.3258,3.4289 --4.7421,3.4193 --5.0704,3.4098 --5.3075,3.4002 --5.4512,3.3907 --5.5,3.3812 --5.4535,3.3716 --5.3122,3.3621 --5.0774,3.3526 --4.7513,3.343 --4.337,3.3335 --3.8386,3.324 --3.2607,3.3144 --2.6088,3.3049 --1.8892,3.2953 --1.1087,3.3049 --0.2748,3.3144 -0.6047,3.324 -1.5212,3.3335 -2.4662,3.343 -3.4305,3.3526 -4.405,3.3621 -5.3804,3.3716 -6.3475,3.3812 -7.2969,3.3907 -8.2197,3.4002 -9.107,3.4098 -9.9504,3.4193 -10.7419,3.4289 -11.4739,3.4384 -12.1395,3.4479 -12.7322,3.4575 -13.2465,3.467 -13.6775,3.4765 -14.021,3.4861 -14.2738,3.4956 -14.4334,3.5052 -14.4984,3.5147 -14.4681,3.5242 -14.3429,3.5338 -14.1238,3.5433 -13.813,3.5528 -13.4135,3.5624 -12.929,3.5719 -12.3642,3.5814 -11.7245,3.591 -11.0159,3.6005 -10.2453,3.6101 -9.4199,3.6196 -8.5476,3.6291 -7.6367,3.6387 -6.696,3.6482 -5.7343,3.6387 -4.7609,3.6291 -3.785,3.6196 -2.8158,3.6101 -1.8628,3.6005 -0.9349,3.591 -0.0409,3.5814 --0.8106,3.5719 --1.6114,3.5624 --2.354,3.5528 --3.0314,3.5433 --3.6369,3.5338 --4.1649,3.5242 --4.6103,3.5147 --4.969,3.5052 --5.2373,3.4956 --5.4129,3.4861 --5.4941,3.4765 --5.48,3.467 --5.3708,3.4575 --5.1675,3.4479 --4.8722,3.4384 --4.4875,3.4289 --4.0171,3.4193 --3.4656,3.4098 --2.8382,3.4002 --2.1409,3.3907 --1.3803,3.3812 --0.5637,3.3907 -0.3012,3.4002 -1.2061,3.4098 -2.1424,3.4193 -3.1012,3.4289 -4.0733,3.4384 -5.0494,3.4479 -6.0204,3.4575 -6.9768,3.467 -7.9096,3.4765 -8.81,3.4861 -9.6692,3.4956 -10.4793,3.5052 -11.2323,3.5147 -11.9212,3.5242 -12.5393,3.5338 -13.0809,3.5433 -13.5407,3.5528 -13.9143,3.5624 -14.1982,3.5719 -14.3897,3.5814 -14.487,3.591 -14.4891,3.6005 -14.396,3.6101 -14.2086,3.6196 -13.9287,3.6291 -13.559,3.6387 -13.1029,3.6482 -12.5648,3.6577 -11.9499,3.6673 -11.264,3.6768 -10.5137,3.6864 -9.706,3.6959 -8.8488,3.7054 -7.9501,3.715 -7.0185,3.7245 -6.0629,3.715 -5.0924,3.7054 -4.1163,3.6959 -3.1438,3.6864 -2.1843,3.6768 -1.2468,3.6673 -0.3403,3.6577 --0.5265,3.6482 --1.3454,3.6387 --2.1087,3.6291 --2.8089,3.6196 --3.4395,3.6101 --3.9945,3.6005 --4.4685,3.591 --4.8571,3.5814 --5.1564,3.5719 --5.3638,3.5624 --5.4772,3.5528 --5.4955,3.5433 --5.4185,3.5338 --5.2471,3.5242 --4.9827,3.5147 --4.628,3.5052 --4.1863,3.4956 --3.6618,3.4861 --3.0596,3.4765 --2.3853,3.467 --1.6454,3.4575 --0.847,3.467 -0.0024,3.4765 -0.8947,3.4861 -1.8213,3.4956 -2.7734,3.5052 -3.742,3.5147 -4.7179,3.5242 -5.6916,3.5338 -6.654,3.5433 -7.5958,3.5528 -8.5082,3.5624 -9.3824,3.5719 -10.21,3.5814 -10.9832,3.591 -11.6947,3.6005 -12.3376,3.6101 -12.9058,3.6196 -13.3939,3.6291 -13.7972,3.6387 -14.112,3.6482 -14.3352,3.6577 -14.4646,3.6673 -14.4991,3.6768 -14.4383,3.6864 -14.2828,3.6959 -14.0341,3.7054 -13.6945,3.715 -13.2673,3.7245 -12.7566,3.734 -12.1672,3.7436 -11.5047,3.7531 -10.7755,3.7626 -9.9865,3.7722 -9.1451,3.7817 -8.2596,3.7913 -7.3382,3.8008 -6.3897,3.8011 -5.4233,3.7916 -4.4481,3.782 -3.4733,3.7725 -2.5083,3.7629 -1.5623,3.7534 -0.6444,3.7439 --0.2369,3.7343 --1.073,3.7248 --1.856,3.7153 --2.5785,3.7057 --3.2335,3.6962 --3.8147,3.6867 --4.3168,3.6771 --4.7349,3.6676 --5.0649,3.658 --5.3038,3.6485 --5.4493,3.639 --5.5,3.6294 --5.4553,3.6199 --5.3158,3.6104 --5.0828,3.6008 --4.7585,3.5913 --4.3459,3.5817 --3.8491,3.5722 --3.2726,3.5627 --2.6221,3.5531 --1.9038,3.5436 --1.1244,3.5341 --0.2914,3.5436 -0.5872,3.5531 -1.5031,3.5627 -2.4476,3.5722 -3.4116,3.5817 -4.386,3.5913 -5.3615,3.6008 -6.3288,3.6104 -7.2786,3.6199 -8.202,3.6294 -9.0901,3.639 -9.9345,3.6485 -10.7271,3.658 -11.4603,3.6676 -12.1272,3.6771 -12.7214,3.6867 -13.2373,3.6962 -13.6699,3.7057 -14.0152,3.7153 -14.2697,3.7248 -14.4312,3.7343 -14.4981,3.7439 -14.4696,3.7534 -14.3462,3.7629 -14.1289,3.7725 -13.8199,3.782 -13.4221,3.7916 -12.9392,3.8011 -12.376,3.8106 -11.7376,3.8202 -11.0303,3.8297 -10.2608,3.8392 -9.4364,3.8488 -8.565,3.8583 -7.6548,3.8679 -6.7145,3.8774 -5.7532,3.8679 -4.7799,3.8583 -3.8039,3.8488 -2.8346,3.8392 -1.8811,3.8297 -0.9526,3.8202 -0.0579,3.8106 --0.7945,3.8011 --1.5964,3.7916 --2.3402,3.782 --3.0188,3.7725 --3.6258,3.7629 --4.1554,3.7534 --4.6025,3.7439 --4.9628,3.7343 --5.233,3.7248 --5.4104,3.7153 --5.4934,3.7057 --5.4812,3.6962 --5.3738,3.6867 --5.1724,3.6771 --4.8788,3.6676 --4.4958,3.658 --4.0271,3.6485 --3.4771,3.639 --2.8511,3.6294 --2.1551,3.6199 --1.3957,3.6104 --0.58,3.6199 -0.284,3.6294 -1.1882,3.639 -2.124,3.6485 -3.0824,3.658 -4.0543,3.6676 -5.0305,3.6771 -6.0016,3.6867 -6.9584,3.6962 -7.8918,3.7057 -8.7928,3.7153 -9.653,3.7248 -10.464,3.7343 -11.2182,3.7439 -11.9084,3.7534 -12.528,3.7629 -13.0711,3.7725 -13.5325,3.782 -13.9079,3.7916 -14.1936,3.8011 -14.3869,3.8106 -14.486,3.8202 -14.49,3.8297 -14.3987,3.8392 -14.2132,3.8488 -13.935,3.8583 -13.567,3.8679 -13.1126,3.8774 -12.5761,3.8869 -11.9626,3.8965 -11.278,3.906 -10.5289,3.9155 -9.7222,3.9251 -8.8659,3.9346 -7.9679,3.9441 -7.0369,3.9537 -6.0817,3.9441 -5.1114,3.9346 -4.1353,3.9251 -3.1627,3.9155 -2.2028,3.906 -1.2648,3.8965 -0.3576,3.8869 --0.5101,3.8774 --1.33,3.8679 --2.0944,3.8583 --2.796,3.8488 --3.428,3.8392 --3.9845,3.8297 --4.4601,3.8202 --4.8503,3.8106 --5.1515,3.8011 --5.3607,3.7916 --5.4759,3.782 --5.496,3.7725 --5.4209,3.7629 --5.2513,3.7534 --4.9887,3.7439 --4.6357,3.7343 --4.1957,3.7248 --3.6728,3.7153 --3.072,3.7057 --2.3991,3.6962 --1.6604,3.6867 --0.863,3.6771 --0.0145,3.6867 -0.877,3.6962 -1.803,3.7057 -2.7547,3.7153 -3.7231,3.7248 -4.6989,3.7343 -5.6727,3.7439 -6.6354,3.7534 -7.5778,3.7629 -8.4908,3.7725 -9.3658,3.782 -10.1944,3.7916 -10.9688,3.8011 -11.6815,3.8106 -12.3258,3.8202 -12.8955,3.8297 -13.3852,3.8392 -13.7902,3.8488 -14.1067,3.8583 -14.3317,3.8679 -14.463,3.8774 -14.4993,3.8869 -14.4404,3.8965 -14.2867,3.906 -14.0398,3.9155 -13.702,3.9251 -13.2764,3.9346 -12.7673,3.9441 -12.1794,3.9537 -11.5182,3.9632 -10.7903,3.9728 -10.0023,3.9823 -9.162,3.9918 -8.2772,4.0014 -7.3564,4.0109 -6.4084,4.0014 -5.4422,3.9918 -4.4671,3.9823 -3.4922,3.9728 -2.527,3.9632 -1.5805,3.9537 -0.6619,3.9441 --0.2202,3.9346 --1.0572,3.9251 --1.8413,3.9155 --2.565,3.906 --3.2214,3.8965 --3.8042,3.8869 --4.3078,3.8774 --4.7276,3.8679 --5.0593,3.8583 --5.3,3.8488 --5.4474,3.8392 --5.4999,3.8297 --5.4571,3.8202 --5.3195,3.8106 --5.0882,3.8011 --4.7656,3.7916 --4.3548,3.782 --3.8595,3.7725 --3.2846,3.7629 --2.6355,3.7534 --1.9184,3.7439 --1.1401,3.7343 --0.3081,3.7439 -0.5697,3.7534 -1.485,3.7629 -2.429,3.7725 -3.3927,3.782 -4.367,3.7916 -5.3426,3.8011 -6.3101,3.8106 -7.2604,3.8202 -8.1844,3.8297 -9.0732,3.8392 -9.9185,3.8488 -10.7122,3.8583 -11.4466,3.8679 -12.1149,3.8774 -12.7106,3.8869 -13.2281,3.8965 -13.6623,3.906 -14.0093,3.9155 -14.2657,3.9251 -14.429,3.9346 -14.4977,3.9441 -14.4711,3.9537 -14.3495,3.9632 -14.134,3.9728 -13.8268,3.9823 -13.4306,3.9918 -12.9494,4.0014 -12.3876,4.0109 -11.7507,4.0204 -11.0447,4.03 -10.2763,4.0395 -9.4529,4.049 -8.5823,4.0586 -7.6728,4.0681 -6.733,4.0586 -5.772,4.049 -4.7989,4.0395 -3.8229,4.03 -2.8533,4.0204 -1.8995,4.0109 -0.9704,4.0014 -0.0749,3.9918 --0.7783,3.9823 --1.5813,3.9728 --2.3263,3.9632 --3.0063,3.9537 --3.6148,3.9441 --4.1459,3.9346 --4.5946,3.9251 --4.9567,3.9155 --5.2286,3.906 --5.4079,3.8965 --5.4927,3.8869 --5.4823,3.8774 --5.3768,3.8679 --5.1772,3.8583 --4.8853,3.8488 --4.5041,3.8392 --4.037,3.8297 --3.4885,3.8202 --2.864,3.8106 --2.1693,3.8011 --1.411,3.7916 --0.5964,3.782 -0.2668,3.7916 -1.1703,3.8011 -2.1055,3.8106 -3.0636,3.8202 -4.0353,3.8297 -5.0115,3.8392 -5.9828,3.8488 -6.94,3.8583 -7.8739,3.8679 -8.7757,3.8774 -9.6367,3.8869 -10.4488,3.8965 -11.2041,3.906 -11.8956,3.9155 -12.5167,3.9251 -13.0613,3.9346 -13.5244,3.9441 -13.9014,3.9537 -14.1889,3.9632 -14.384,3.9728 -14.485,3.9823 -14.4908,3.9918 -14.4014,4.0014 -14.2177,4.0109 -13.9413,4.0204 -13.575,4.03 -13.1222,4.0395 -12.5873,4.049 -11.9752,4.0586 -11.292,4.0681 -10.544,4.0777 -9.7384,4.0872 -8.8829,4.0967 -7.9857,4.1063 -7.0552,4.0967 -6.1004,4.0872 -5.1303,4.0777 -4.1543,4.0681 -3.1815,4.0586 -2.2213,4.049 -1.2828,4.0395 -0.3749,4.03 --0.4936,4.0204 --1.3146,4.0109 --2.0801,4.0014 --2.783,3.9918 --3.4164,3.9823 --3.9744,3.9728 --4.4516,3.9632 --4.8436,3.9537 --5.1465,3.9441 --5.3575,3.9346 --5.4745,3.9251 --5.4965,3.9155 --5.4233,3.906 --5.2555,3.8965 --4.9947,3.8869 --4.6434,3.8774 --4.2051,3.8679 --3.6837,3.8583 --3.0844,3.8488 --2.4128,3.8392 --1.6754,3.8297 --0.879,3.8202 --0.0315,3.8297 -0.8593,3.8392 -1.7847,3.8488 -2.736,3.8583 -3.7042,3.8679 -4.6799,3.8774 -5.6539,3.8869 -6.6169,3.8965 -7.5597,3.906 -8.4734,3.9155 -9.3492,3.9251 -10.1788,3.9346 -10.9543,3.9441 -11.6682,3.9537 -12.3139,3.9632 -12.8851,3.9728 -13.3765,3.9823 -13.7832,3.9918 -14.1014,4.0014 -14.3282,4.0109 -14.4613,4.0204 -14.4995,4.03 -14.4424,4.0395 -14.2906,4.049 -14.0455,4.0586 -13.7094,4.0681 -13.2855,4.0777 -12.778,4.0872 -12.1915,4.0967 -11.5318,4.1063 -10.805,4.1158 -10.0182,4.1253 -9.1788,4.1349 -8.2948,4.1444 -7.3746,4.154 -6.427,4.1444 -5.4611,4.1349 -4.486,4.1253 -3.5111,4.1158 -2.5456,4.1063 -1.5987,4.0967 -0.6794,4.0872 --0.2034,4.0777 --1.0414,4.0681 --1.8266,4.0586 --2.5516,4.049 --3.2093,4.0395 --3.7936,4.03 --4.2988,4.0204 --4.7202,4.0109 --5.0537,4.0014 --5.2962,3.9918 --5.4454,3.9823 --5.4998,3.9728 --5.4588,3.9632 --5.323,3.9537 --5.0936,3.9441 --4.7728,3.9346 --4.3636,3.9251 --3.8699,3.9155 --3.2965,3.906 --2.6488,3.8965 --1.9329,3.8869 --1.1558,3.8774 --0.3248,3.8679 -0.5523,3.8774 -1.4669,3.8869 -2.4104,3.8965 -3.3739,3.906 -4.348,3.9155 -5.3237,3.9251 -6.2914,3.9346 -7.2421,3.9441 -8.1667,3.9537 -9.0563,3.9632 -9.9026,3.9728 -10.6973,3.9823 -11.433,3.9918 -12.1026,4.0014 -12.6997,4.0109 -13.2188,4.0204 -13.6547,4.03 -14.0034,4.0395 -14.2616,4.049 -14.4267,4.0586 -14.4972,4.0681 -14.4725,4.0777 -14.3528,4.0872 -14.1391,4.0967 -13.8336,4.1063 -13.4392,4.1158 -12.9595,4.1253 -12.3993,4.1349 -11.7638,4.1444 -11.0591,4.154 -10.2918,4.1635 -9.4694,4.173 -8.5996,4.1826 -7.6908,4.1921 -6.7516,4.1826 -5.7909,4.173 -4.8178,4.1635 -3.8418,4.154 -2.8721,4.1444 -1.9178,4.1349 -0.9882,4.1253 -0.092,4.1158 --0.7622,4.1063 --1.5662,4.0967 --2.3124,4.0872 --2.9937,4.0777 --3.6036,4.0681 --4.1363,4.0586 --4.5867,4.049 --4.9505,4.0395 --5.2242,4.03 --5.4053,4.0204 --5.492,4.0109 --5.4834,4.0014 --5.3798,3.9918 --5.182,3.9823 --4.8919,3.9728 --4.5123,3.9632 --4.0469,3.9537 --3.5,3.9441 --2.8768,3.9346 --2.1834,3.9251 --1.4263,3.9155 --0.6127,3.906 -0.2496,3.9155 -1.1524,3.9251 -2.0871,3.9346 -3.0448,3.9441 -4.0164,3.9537 -4.9925,3.9632 -5.964,3.9728 -6.9215,3.9823 -7.856,3.9918 -8.7585,4.0014 -9.6204,4.0109 -10.4335,4.0204 -11.19,4.03 -11.8828,4.0395 -12.5053,4.049 -13.0515,4.0586 -13.5162,4.0681 -13.8949,4.0777 -14.1842,4.0872 -14.3811,4.0967 -14.4839,4.1063 -14.4916,4.1158 -14.4041,4.1253 -14.2221,4.1349 -13.9476,4.1444 -13.583,4.154 -13.1318,4.1635 -12.5984,4.173 -11.9878,4.1826 -11.3059,4.1921 -10.5591,4.2016 -9.7546,4.2112 -8.9,4.2207 -8.0035,4.2302 -7.0736,4.2207 -6.1192,4.2112 -5.1493,4.2016 -4.1732,4.1921 -3.2003,4.1826 -2.2398,4.173 -1.3008,4.1635 -0.3922,4.154 --0.4771,4.1444 --1.2991,4.1349 --2.0658,4.1253 --2.7699,4.1158 --3.4048,4.1063 --3.9643,4.0967 --4.4432,4.0872 --4.8368,4.0777 --5.1415,4.0681 --5.3543,4.0586 --5.4732,4.049 --5.497,4.0395 --5.4256,4.03 --5.2596,4.0204 --5.0006,4.0109 --4.6511,4.0014 --4.2144,3.9918 --3.6946,3.9823 --3.0968,3.9728 --2.4265,3.9632 --1.6903,3.9537 --0.8951,3.9441 --0.0484,3.9537 -0.8416,3.9632 -1.7664,3.9728 -2.7173,3.9823 -3.6852,3.9918 -4.6609,4.0014 -5.635,4.0109 -6.5983,4.0204 -7.5416,4.03 -8.4559,4.0395 -9.3326,4.049 -10.1631,4.0586 -10.9397,4.0681 -11.655,4.0777 -12.3021,4.0872 -12.8748,4.0967 -13.3677,4.1063 -13.7761,4.1158 -14.0961,4.1253 -14.3247,4.1349 -14.4596,4.1444 -14.4997,4.154 -14.4445,4.1635 -14.2945,4.173 -14.0511,4.1826 -13.7168,4.1921 -13.2946,4.2016 -12.7886,4.2112 -12.2036,4.2207 -11.5453,4.2302 -10.8197,4.2398 -10.034,4.2493 -9.1955,4.2589 -8.3123,4.2684 -7.3928,4.2589 -6.4457,4.2493 -5.48,4.2398 -4.505,4.2302 -3.53,4.2207 -2.5642,4.2112 -1.6169,4.2016 -0.697,4.1921 --0.1866,4.1826 --1.0256,4.173 --1.8119,4.1635 --2.5381,4.154 --3.1972,4.1444 --3.783,4.1349 --4.2898,4.1253 --4.7128,4.1158 --5.0481,4.1063 --5.2924,4.0967 --5.4434,4.0872 --5.4996,4.0777 --5.4605,4.0681 --5.3266,4.0586 --5.099,4.049 --4.7799,4.0395 --4.3723,4.03 --3.8803,4.0204 --3.3084,4.0109 --2.662,4.0014 --1.9475,3.9918 --1.1714,3.9823 --0.3414,3.9728 -0.5348,3.9823 -1.4488,3.9918 -2.3918,4.0014 -3.355,4.0109 -4.329,4.0204 -5.3047,4.03 -6.2727,4.0395 -7.2239,4.049 -8.149,4.0586 -9.0394,4.0681 -9.8866,4.0777 -10.6824,4.0872 -11.4193,4.0967 -12.0902,4.1063 -12.6888,4.1158 -13.2094,4.1253 -13.6471,4.1349 -13.9975,4.1444 -14.2574,4.154 -14.4244,4.1635 -14.4968,4.173 -14.4739,4.1826 -14.356,4.1921 -14.1441,4.2016 -13.8404,4.2112 -13.4477,4.2207 -12.9697,4.2302 -12.4109,4.2398 -11.7768,4.2493 -11.0734,4.2589 -10.3073,4.2684 -9.4859,4.2779 -8.617,4.2875 -7.7088,4.297 -6.7701,4.2875 -5.8097,4.2779 -4.8368,4.2684 -3.8608,4.2589 -2.8908,4.2493 -1.9362,4.2398 -1.006,4.2302 -0.109,4.2207 --0.746,4.2112 --1.5511,4.2016 --2.2985,4.1921 --2.9811,4.1826 --3.5925,4.173 --4.1267,4.1635 --4.5787,4.154 --4.9443,4.1444 --5.2198,4.1349 --5.4027,4.1253 --5.4912,4.1158 --5.4845,4.1063 --5.3827,4.0967 --5.1867,4.0872 --4.8984,4.0777 --4.5205,4.0681 --4.0567,4.0586 --3.5113,4.049 --2.8896,4.0395 --2.1975,4.03 --1.4416,4.0204 --0.629,4.0109 -0.2324,4.0204 -1.1345,4.03 -2.0687,4.0395 -3.026,4.049 -3.9974,4.0586 -4.9736,4.0681 -5.9452,4.0777 -6.9031,4.0872 -7.8381,4.0967 -8.7413,4.1063 -9.604,4.1158 -10.4182,4.1253 -11.1759,4.1349 -11.87,4.1444 -12.4939,4.154 -13.0416,4.1635 -13.5079,4.173 -13.8884,4.1826 -14.1794,4.1921 -14.3782,4.2016 -14.4828,4.2112 -14.4924,4.2207 -14.4067,4.2302 -14.2266,4.2398 -13.9538,4.2493 -13.5909,4.2589 -13.1414,4.2684 -12.6095,4.2779 -12.0004,4.2875 -11.3198,4.297 -10.5742,4.3065 -9.7708,4.3161 -8.9171,4.3256 -8.0213,4.3352 -7.0919,4.3256 -6.1379,4.3161 -5.1683,4.3065 -4.1922,4.297 -3.2192,4.2875 -2.2583,4.2779 -1.3188,4.2684 -0.4096,4.2589 --0.4607,4.2493 --1.2836,4.2398 --2.0515,4.2302 --2.7569,4.2207 --3.3931,4.2112 --3.9542,4.2016 --4.4346,4.1921 --4.83,4.1826 --5.1364,4.173 --5.351,4.1635 --5.4718,4.154 --5.4975,4.1444 --5.4279,4.1349 --5.2638,4.1253 --5.0066,4.1158 --4.6588,4.1063 --4.2237,4.0967 --3.7055,4.0872 --3.1091,4.0777 --2.4402,4.0681 --1.7052,4.0586 --0.911,4.049 --0.0653,4.0395 -0.8239,4.049 -1.7482,4.0586 -2.6986,4.0681 -3.6663,4.0777 -4.6419,4.0872 -5.6161,4.0967 -6.5797,4.1063 -7.5235,4.1158 -8.4385,4.1253 -9.3159,4.1349 -10.1475,4.1444 -10.9252,4.154 -11.6417,4.1635 -12.2902,4.173 -12.8644,4.1826 -13.3589,4.1921 -13.769,4.2016 -14.0908,4.2112 -14.3211,4.2207 -14.4579,4.2302 -14.4998,4.2398 -14.4464,4.2493 -14.2983,4.2589 -14.0567,4.2684 -13.7241,4.2779 -13.3036,4.2875 -12.7992,4.297 -12.2157,4.3065 -11.5587,4.3161 -10.8345,4.3256 -10.0498,4.3352 -9.2123,4.3447 -8.3299,4.3542 -7.411,4.3447 -6.4643,4.3352 -5.4989,4.3256 -4.524,4.3161 -3.5489,4.3065 -2.5829,4.297 -1.6351,4.2875 -0.7146,4.2779 --0.1698,4.2684 --1.0098,4.2589 --1.7972,4.2493 --2.5246,4.2398 --3.1851,4.2302 --3.7723,4.2207 --4.2807,4.2112 --4.7054,4.2016 --5.0425,4.1921 --5.2885,4.1826 --5.4414,4.173 --5.4994,4.1635 --5.4622,4.154 --5.3301,4.1444 --5.1043,4.1349 --4.7869,4.1253 --4.3811,4.1158 --3.8906,4.1063 --3.3202,4.0967 --2.6753,4.0872 --1.962,4.0777 --1.1871,4.0681 --0.358,4.0586 -0.5174,4.0681 -1.4307,4.0777 -2.3733,4.0872 -3.3361,4.0967 -4.31,4.1063 -5.2858,4.1158 -6.254,4.1253 -7.2056,4.1349 -8.1313,4.1444 -9.0225,4.154 -9.8705,4.1635 -10.6674,4.173 -11.4055,4.1826 -12.0778,4.1921 -12.6779,4.2016 -13.2001,4.2112 -13.6394,4.2207 -13.9915,4.2302 -14.2533,4.2398 -14.422,4.2493 -14.4963,4.2589 -14.4753,4.2684 -14.3592,4.2779 -14.1492,4.2875 -13.8472,4.297 -13.4561,4.3065 -12.9797,4.3161 -12.4225,4.3256 -11.7899,4.3352 -11.0877,4.3447 -10.3228,4.3542 -9.5024,4.3638 -8.6343,4.3733 -7.7268,4.3828 -6.7886,4.3733 -5.8285,4.3638 -4.8558,4.3542 -3.8797,4.3447 -2.9096,4.3352 -1.9545,4.3256 -1.0238,4.3161 -0.1261,4.3065 --0.7298,4.297 --1.536,4.2875 --2.2846,4.2779 --2.9685,4.2684 --3.5813,4.2589 --4.1171,4.2493 --4.5708,4.2398 --4.938,4.2302 --5.2153,4.2207 --5.4,4.2112 --5.4904,4.2016 --5.4855,4.1921 --5.3856,4.1826 --5.1914,4.173 --4.9049,4.1635 --4.5287,4.154 --4.0665,4.1444 --3.5227,4.1349 --2.9024,4.1253 --2.2116,4.1158 --1.4569,4.1063 --0.6453,4.0967 -0.2152,4.1063 -1.1166,4.1158 -2.0502,4.1253 -3.0072,4.1349 -3.9784,4.1444 -4.9546,4.154 -5.9264,4.1635 -6.8847,4.173 -7.8202,4.1826 -8.7241,4.1921 -9.5877,4.2016 -10.4028,4.2112 -11.1617,4.2207 -11.8572,4.2302 -12.4825,4.2398 -13.0317,4.2493 -13.4997,4.2589 -13.8819,4.2684 -14.1746,4.2779 -14.3752,4.2875 -14.4817,4.297 -14.4931,4.3065 -14.4092,4.3161 -14.231,4.3256 -13.9599,4.3352 -13.5988,4.3447 -13.1509,4.3542 -12.6206,4.3638 -12.013,4.3733 -11.3337,4.3828 -10.5893,4.3924 -9.7869,4.4019 -8.9341,4.4114 -8.0391,4.421 -7.1103,4.4114 -6.1566,4.4019 -5.1872,4.3924 -4.2112,4.3828 -3.238,4.3733 -2.2768,4.3638 -1.3368,4.3542 -0.4269,4.3447 --0.4442,4.3352 --1.2681,4.3256 --2.0371,4.3161 --2.7438,4.3065 --3.3814,4.297 --3.944,4.2875 --4.4261,4.2779 --4.8231,4.2684 --5.1313,4.2589 --5.3477,4.2493 --5.4703,4.2398 --5.4979,4.2302 --5.4302,4.2207 --5.2678,4.2112 --5.0124,4.2016 --4.6664,4.1921 --4.233,4.1826 --3.7164,4.173 --3.1214,4.1635 --2.4539,4.154 --1.7201,4.1444 --0.927,4.1349 --0.0822,4.1253 -0.8063,4.1349 -1.7299,4.1444 -2.68,4.154 -3.6474,4.1635 -4.6229,4.173 -5.5972,4.1826 -6.5611,4.1921 -7.5054,4.2016 -8.421,4.2112 -9.2993,4.2207 -10.1318,4.2302 -10.9106,4.2398 -11.6284,4.2493 -12.2782,4.2589 -12.854,4.2684 -13.3501,4.2779 -13.7618,4.2875 -14.0854,4.297 -14.3175,4.3065 -14.4562,4.3161 -14.4999,4.3256 -14.4484,4.3352 -14.302,4.3447 -14.0623,4.3542 -13.7314,4.3638 -13.3126,4.3733 -12.8098,4.3828 -12.2278,4.3924 -11.5722,4.4019 -10.8491,4.4114 -10.0656,4.421 -9.2291,4.4305 -8.3474,4.4401 -7.4291,4.4305 -6.4829,4.421 -5.5178,4.4114 -4.543,4.4019 -3.5678,4.3924 -2.6015,4.3828 -1.6533,4.3733 -0.7322,4.3638 --0.153,4.3542 --0.9939,4.3447 --1.7824,4.3352 --2.5111,4.3256 --3.1729,4.3161 --3.7616,4.3065 --4.2716,4.297 --4.698,4.2875 --5.0368,4.2779 --5.2846,4.2684 --5.4393,4.2589 --5.4992,4.2493 --5.4638,4.2398 --5.3335,4.2302 --5.1095,4.2207 --4.794,4.2112 --4.3898,4.2016 --3.901,4.1921 --3.332,4.1826 --2.6885,4.173 --1.9765,4.1635 --1.2027,4.154 --0.3746,4.1444 -0.5,4.154 -1.4126,4.1635 -2.3547,4.173 -3.3172,4.1826 -4.2911,4.1921 -5.2668,4.2016 -6.2353,4.2112 -7.1873,4.2207 -8.1136,4.2302 -9.0055,4.2398 -9.8545,4.2493 -10.6525,4.2589 -11.3918,4.2684 -12.0654,4.2779 -12.667,4.2875 -13.1907,4.297 -13.6316,4.3065 -13.9855,4.3161 -14.249,4.3256 -14.4197,4.3352 -14.4957,4.3447 -14.4766,4.3542 -14.3623,4.3638 -14.1541,4.3733 -13.8539,4.3828 -13.4646,4.3924 -12.9898,4.4019 -12.4341,4.4114 -11.8028,4.421 -11.102,4.4305 -10.3382,4.4401 -9.5188,4.4496 -8.6516,4.4591 -7.7448,4.4496 -6.807,4.4401 -5.8473,4.4305 -4.8748,4.421 -3.8987,4.4114 -2.9283,4.4019 -1.9729,4.3924 -1.0416,4.3828 -0.1432,4.3733 --0.7136,4.3638 --1.5208,4.3542 --2.2706,4.3447 --2.9559,4.3352 --3.5701,4.3256 --4.1074,4.3161 --4.5627,4.3065 --4.9317,4.297 --5.2108,4.2875 --5.3973,4.2779 --5.4895,4.2684 --5.4866,4.2589 --5.3884,4.2493 --5.1961,4.2398 --4.9113,4.2302 --4.5369,4.2207 --4.0763,4.2112 --3.534,4.2016 --2.9152,4.1921 --2.2257,4.1826 --1.4721,4.173 --0.6616,4.1635 -0.1981,4.154 -1.0987,4.1635 -2.0318,4.173 -2.9884,4.1826 -3.9594,4.1921 -4.9356,4.2016 -5.9076,4.2112 -6.8662,4.2207 -7.8023,4.2302 -8.7068,4.2398 -9.5713,4.2493 -10.3875,4.2589 -11.1476,4.2684 -11.8443,4.2779 -12.471,4.2875 -13.0218,4.297 -13.4914,4.3065 -13.8753,4.3161 -14.1698,4.3256 -14.3722,4.3352 -14.4806,4.3447 -14.4938,4.3542 -14.4118,4.3638 -14.2353,4.3733 -13.9661,4.3828 -13.6067,4.3924 -13.1605,4.4019 -12.6317,4.4114 -12.0255,4.421 -11.3476,4.4305 -10.6044,4.4401 -9.803,4.4496 -8.9511,4.4591 -8.0568,4.4687 -7.1286,4.4591 -6.1754,4.4496 -5.2062,4.4401 -4.2302,4.4305 -3.2568,4.421 -2.2953,4.4114 -1.3548,4.4019 -0.4443,4.3924 --0.4276,4.3828 --1.2526,4.3733 --2.0227,4.3638 --2.7307,4.3542 --3.3697,4.3447 --3.9338,4.3352 --4.4175,4.3256 --4.8162,4.3161 --5.1262,4.3065 --5.3444,4.297 --5.4688,4.2875 --5.4983,4.2779 --5.4324,4.2684 --5.2719,4.2589 --5.0183,4.2493 --4.674,4.2398 --4.2422,4.2302 --3.7272,4.2207 --3.1337,4.2112 --2.4675,4.2016 --1.7349,4.1921 --0.9429,4.1826 --0.0991,4.173 -0.7886,4.1826 -1.7117,4.1921 -2.6613,4.2016 -3.6284,4.2112 -4.6039,4.2207 -5.5784,4.2302 -6.5425,4.2398 -7.4873,4.2493 -8.4035,4.2589 -9.2826,4.2684 -10.1161,4.2779 -10.896,4.2875 -11.6151,4.297 -12.2663,4.3065 -12.8435,4.3161 -13.3412,4.3256 -13.7547,4.3352 -14.0799,4.3447 -14.3139,4.3542 -14.4544,4.3638 -14.5,4.3733 -14.4503,4.3828 -14.3058,4.3924 -14.0678,4.4019 -13.7387,4.4114 -13.3216,4.421 -12.8203,4.4305 -12.2398,4.4401 -11.5856,4.4496 -10.8638,4.4591 -10.0814,4.4687 -9.2458,4.4782 -8.365,4.4877 -7.4473,4.4782 -6.5015,4.4687 -5.5367,4.4591 -4.562,4.4496 -3.5867,4.4401 -2.6202,4.4305 -1.6715,4.421 -0.7498,4.4114 --0.1362,4.4019 --0.978,4.3924 --1.7676,4.3828 --2.4975,4.3733 --3.1607,4.3638 --3.7509,4.3542 --4.2625,4.3447 --4.6905,4.3352 --5.031,4.3256 --5.2807,4.3161 --5.4372,4.3065 --5.4989,4.297 --5.4654,4.2875 --5.337,4.2779 --5.1148,4.2684 --4.8009,4.2589 --4.3985,4.2493 --3.9112,4.2398 --3.3438,4.2302 --2.7017,4.2207 --1.9909,4.2112 --1.2183,4.2016 --0.3912,4.1921 -0.4826,4.2016 -1.3946,4.2112 -2.3362,4.2207 -3.2984,4.2302 -4.2721,4.2398 -5.2479,4.2493 -6.2166,4.2589 -7.169,4.2684 -8.0959,4.2779 -8.9886,4.2875 -9.8385,4.297 -10.6375,4.3065 -11.378,4.3161 -12.053,4.3256 -12.656,4.3352 -13.1813,4.3447 -13.6239,4.3542 -13.9795,4.3638 -14.2448,4.3733 -14.4172,4.3828 -14.4952,4.3924 -14.4779,4.4019 -14.3655,4.4114 -14.1591,4.421 -13.8606,4.4305 -13.473,4.4401 -12.9998,4.4496 -12.4457,4.4591 -11.8158,4.4687 -11.1162,4.4782 -10.3536,4.4877 -9.5352,4.4973 -8.6688,4.5068 -7.7627,4.4973 -6.8255,4.4877 -5.8662,4.4782 -4.8938,4.4687 -3.9177,4.4591 -2.9471,4.4496 -1.9913,4.4401 -1.0594,4.4305 -0.1603,4.421 --0.6974,4.4114 --1.5056,4.4019 --2.2566,4.3924 --2.9432,4.3828 --3.5589,4.3733 --4.0978,4.3638 --4.5547,4.3542 --4.9254,4.3447 --5.2062,4.3352 --5.3946,4.3256 --5.4886,4.3161 --5.4875,4.3065 --5.3912,4.297 --5.2007,4.2875 --4.9177,4.2779 --4.545,4.2684 --4.0861,4.2589 --3.5453,4.2493 --2.9279,4.2398 --2.2397,4.2302 --1.4873,4.2207 --0.6779,4.2112 -0.1809,4.2016 -1.0809,4.2112 -2.0134,4.2207 -2.9697,4.2302 -3.9405,4.2398 -4.9166,4.2493 -5.8888,4.2589 -6.8478,4.2684 -7.7843,4.2779 -8.6896,4.2875 -9.555,4.297 -10.3721,4.3065 -11.1334,4.3161 -11.8314,4.3256 -12.4595,4.3352 -13.0118,4.3447 -13.483,4.3542 -13.8686,4.3638 -14.165,4.3733 -14.3692,4.3828 -14.4793,4.3924 -14.4944,4.4019 -14.4143,4.4114 -14.2396,4.421 -13.9722,4.4305 -13.6145,4.4401 -13.1699,4.4496 -12.6428,4.4591 -12.038,4.4687 -11.3614,4.4782 -10.6194,4.4877 -9.8191,4.4973 -8.9681,4.5068 -8.0746,4.5164 -7.1469,4.5068 -6.1941,4.4973 -5.2251,4.4877 -4.2492,4.4782 -3.2757,4.4687 -2.3139,4.4591 -1.3728,4.4496 -0.4616,4.4401 --0.4111,4.4305 --1.237,4.421 --2.0083,4.4114 --2.7175,4.4019 --3.358,4.3924 --3.9236,4.3828 --4.4089,4.3733 --4.8093,4.3638 --5.121,4.3542 --5.3411,4.3447 --5.4673,4.3352 --5.4986,4.3256 --5.4346,4.3161 --5.2759,4.3065 --5.0241,4.297 --4.6815,4.2875 --4.2514,4.2779 --3.7379,4.2684 --3.146,4.2589 --2.4811,4.2493 --1.7498,4.2398 --0.9589,4.2302 --0.1159,4.2207 -0.771,4.2302 -1.6934,4.2398 -2.6426,4.2493 -3.6095,4.2589 -4.5849,4.2684 -5.5595,4.2779 -6.5239,4.2875 -7.4691,4.297 -8.386,4.3065 -9.2659,4.3161 -10.1003,4.3256 -10.8814,4.3352 -11.6017,4.3447 -12.2543,4.3542 -12.833,4.3638 -13.3323,4.3733 -13.7474,4.3828 -14.0745,4.3924 -14.3102,4.4019 -14.4525,4.4114 -14.5,4.421 -14.4522,4.4305 -14.3095,4.4401 -14.0733,4.4496 -13.746,4.4591 -13.3305,4.4687 -12.8309,4.4782 -12.2519,4.4877 -11.599,4.4973 -10.8784,4.5068 -10.0971,4.5164 -9.2625,4.5259 -8.3825,4.5354 -7.4654,4.5259 -6.5202,4.5164 -5.5556,4.5068 -4.581,4.4973 -3.6057,4.4877 -2.6388,4.4782 -1.6897,4.4687 -0.7674,4.4591 --0.1194,4.4496 --0.9621,4.4401 --1.7528,4.4305 --2.4839,4.421 --3.1485,4.4114 --3.7401,4.4019 --4.2533,4.3924 --4.683,4.3828 --5.0253,4.3733 --5.2767,4.3638 --5.435,4.3542 --5.4987,4.3447 --5.467,4.3352 --5.3404,4.3256 --5.12,4.3161 --4.8079,4.3065 --4.4071,4.297 --3.9215,4.2875 --3.3556,4.2779 --2.7149,4.2684 --2.0054,4.2589 --1.2339,4.2493 --0.4077,4.2398 -0.4652,4.2383 -1.3765,4.2479 -2.3176,4.2574 -3.2795,4.267 -4.2531,4.2765 -5.229,4.286 -6.1979,4.2956 -7.1507,4.3051 -8.0782,4.3146 -8.9716,4.3242 -9.8224,4.3337 -10.6225,4.3432 -11.3642,4.3528 -12.0405,4.3623 -12.645,4.3719 -13.1719,4.3814 -13.6161,4.3909 -13.9734,4.4005 -14.2405,4.41 -14.4148,4.4195 -14.4946,4.4291 -14.4791,4.4386 -14.3685,4.4481 -14.164,4.4577 -13.8673,4.4672 -13.4813,4.4768 -13.0098,4.4863 -12.4572,4.4958 -11.8288,4.5054 -11.1305,4.5149 -10.369,4.5244 -9.5516,4.534 -8.6861,4.5435 -7.7807,4.534 -6.844,4.5244 -5.885,4.5149 -4.9128,4.5054 -3.9366,4.4958 -2.9658,4.4863 -2.0097,4.4768 -1.0773,4.4672 -0.1774,4.4577 --0.6812,4.4481 --1.4904,4.4386 --2.2426,4.4291 --2.9305,4.4195 --3.5476,4.41 --4.088,4.4005 --4.5466,4.3909 --4.919,4.3814 --5.2016,4.3719 --5.3918,4.3623 --5.4877,4.3528 --5.4884,4.3432 --5.394,4.3337 --5.2053,4.3242 --4.9241,4.3146 --4.5531,4.3051 --4.0958,4.2956 --3.5566,4.286 --2.9406,4.2765 --2.2538,4.267 --1.5025,4.2574 --0.6941,4.2479 -0.1638,4.2383 -1.063,4.2479 -1.995,4.2574 -2.9509,4.267 -3.9215,4.2765 -4.8976,4.286 -5.87,4.2956 -6.8293,4.3051 -7.7664,4.3146 -8.6723,4.3242 -9.5386,4.3337 -10.3568,4.3432 -11.1191,4.3528 -11.8184,4.3623 -12.448,4.3719 -13.0019,4.3814 -13.4747,4.3909 -13.862,4.4005 -14.1601,4.41 -14.3661,4.4195 -14.4781,4.4291 -14.495,4.4386 -14.4167,4.4481 -14.2439,4.4577 -13.9783,4.4672 -13.6223,4.4768 -13.1794,4.4863 -12.6538,4.4958 -12.0505,4.5054 -11.3752,4.5149 -10.6344,4.5244 -9.8352,4.534 -8.9851,4.5435 -8.0923,4.5531 -7.1653,4.5435 -6.2128,4.534 -5.244,4.5244 -4.2682,4.5149 -3.2946,4.5054 -2.3324,4.4958 -1.3909,4.4863 -0.479,4.4768 --0.3945,4.4672 --1.2215,4.4577 --1.9939,4.4481 --2.7044,4.4386 --3.3462,4.4291 --3.9133,4.4195 --4.4003,4.41 --4.8024,4.4005 --5.1158,4.3909 --5.3377,4.3814 --5.4658,4.3719 --5.4989,4.3623 --5.4367,4.3528 --5.2799,4.3432 --5.0299,4.3337 --4.689,4.3242 --4.2606,4.3146 --3.7487,4.3051 --3.1582,4.2956 --2.4947,4.286 --1.7646,4.2765 --0.9748,4.267 --0.1328,4.2574 -0.7534,4.267 -1.6752,4.2765 -2.624,4.286 -3.5906,4.2956 -4.5659,4.3051 -5.5406,4.3146 -6.5053,4.3242 -7.451,4.3337 -8.3685,4.3432 -9.2492,4.3528 -10.0846,4.3623 -10.8668,4.3719 -11.5883,4.3814 -12.2423,4.3909 -12.8225,4.4005 -13.3234,4.41 -13.7402,4.4195 -14.069,4.4291 -14.3065,4.4386 -14.4507,4.4481 -14.5,4.4577 -14.454,4.4672 -14.3132,4.4768 -14.0788,4.4863 -13.7532,4.4958 -13.3394,4.5054 -12.8414,4.5149 -12.2638,4.5244 -11.6123,4.534 -10.8931,4.5435 -10.1129,4.5531 -9.2792,4.5626 -8.4,4.5721 -7.4836,4.5626 -6.5388,4.5531 -5.5745,4.5435 -4.6,4.534 -3.6246,4.5244 -2.6575,4.5149 -1.708,4.5054 -0.785,4.4958 --0.1025,4.4863 --0.9462,4.4768 --1.738,4.4672 --2.4703,4.4577 --3.1362,4.4481 --3.7294,4.4386 --4.2441,4.4291 --4.6755,4.4195 --5.0195,4.41 --5.2727,4.4005 --5.4328,4.3909 --5.4983,4.3814 --5.4685,4.3719 --5.3437,4.3623 --5.1251,4.3528 --4.8148,4.3432 --4.4158,4.3337 --3.9317,4.3242 --3.3673,4.3146 --2.728,4.3051 --2.0198,4.2956 --1.2494,4.286 --0.4243,4.2765 -0.4478,4.267 -1.3585,4.2765 -2.2991,4.286 -3.2607,4.2956 -4.2341,4.3051 -5.21,4.3146 -6.1792,4.3242 -7.1323,4.3337 -8.0604,4.3432 -8.9546,4.3528 -9.8063,4.3623 -10.6074,4.3719 -11.3504,4.3814 -12.028,4.3909 -12.634,4.4005 -13.1624,4.41 -13.6083,4.4195 -13.9673,4.4291 -14.2362,4.4386 -14.4123,4.4481 -14.4939,4.4577 -14.4803,4.4672 -14.3716,4.4768 -14.1688,4.4863 -13.8739,4.4958 -13.4897,4.5054 -13.0198,4.5149 -12.4687,4.5244 -11.8417,4.534 -11.1447,4.5435 -10.3844,4.5531 -9.568,4.5626 -8.7033,4.5721 -7.7986,4.5626 -6.8625,4.5531 -5.9038,4.5435 -4.9317,4.534 -3.9556,4.5244 -2.9846,4.5149 -2.0281,4.5054 -1.0951,4.4958 -0.1946,4.4863 --0.6649,4.4768 --1.4752,4.4672 --2.2286,4.4577 --2.9178,4.4481 --3.5363,4.4386 --4.0783,4.4291 --4.5385,4.4195 --4.9126,4.41 --5.197,4.4005 --5.389,4.3909 --5.4867,4.3814 --5.4893,4.3719 --5.3967,4.3623 --5.2098,4.3528 --4.9304,4.3432 --4.5611,4.3337 --4.1055,4.3242 --3.5678,4.3146 --2.9533,4.3051 --2.2678,4.2956 --1.5177,4.286 --0.7103,4.2765 -0.1467,4.267 -1.0452,4.2765 -1.9766,4.286 -2.9321,4.2956 -3.9025,4.3051 -4.8787,4.3146 -5.8512,4.3242 -6.8108,4.3337 -7.7484,4.3432 -8.6551,4.3528 -9.5221,4.3623 -10.3413,4.3719 -11.1049,4.3814 -11.8055,4.3909 -12.4365,4.4005 -12.9918,4.41 -13.4663,4.4195 -13.8553,4.4291 -14.1551,4.4386 -14.363,4.4481 -14.4768,4.4577 -14.4956,4.4672 -14.4192,4.4768 -14.2482,4.4863 -13.9843,4.4958 -13.6301,4.5054 -13.1888,4.5149 -12.6648,4.5244 -12.0629,4.534 -11.389,4.5435 -10.6494,4.5531 -9.8512,4.5626 -9.0021,4.5721 -8.11,4.5636 -7.1836,4.5541 -6.2315,4.5445 -5.263,4.535 -4.2872,4.5254 -3.3134,4.5159 -2.3509,4.5064 -1.409,4.4968 -0.4964,4.4873 --0.378,4.4778 --1.2059,4.4682 --1.9794,4.4587 --2.6912,4.4492 --3.3344,4.4396 --3.903,4.4301 --4.3916,4.4205 --4.7954,4.411 --5.1106,4.4015 --5.3342,4.3919 --5.4642,4.3824 --5.4992,4.3729 --5.4389,4.3633 --5.2838,4.3538 --5.0356,4.3442 --4.6965,4.3347 --4.2697,4.3252 --3.7594,4.3156 --3.1704,4.3061 --2.5083,4.2966 --1.7794,4.287 --0.9907,4.2775 --0.1496,4.268 -0.7357,4.2775 -1.657,4.287 -2.6053,4.2966 -3.5717,4.3061 -4.5469,4.3156 -5.5217,4.3252 -6.4867,4.3347 -7.4328,4.3442 -8.351,4.3538 -9.2325,4.3633 -10.0688,4.3729 -10.8521,4.3824 -11.5749,4.3919 -12.2303,4.4015 -12.8119,4.411 -13.3144,4.4205 -13.7329,4.4301 -14.0634,4.4396 -14.3028,4.4492 -14.4488,4.4587 -14.4999,4.4682 -14.4558,4.4778 -14.3168,4.4873 -14.0843,4.4968 -13.7604,4.5064 -13.3483,4.5159 -12.8518,4.5254 -12.2758,4.535 -11.6257,4.5445 -10.9077,4.5541 -10.1286,4.5636 -9.2959,4.5731 -8.4175,4.5827 -7.5017,4.5731 -6.5574,4.5636 -5.5934,4.5541 -4.619,4.5445 -3.6435,4.535 -2.6762,4.5254 -1.7262,4.5159 -0.8027,4.5064 --0.0856,4.4968 --0.9302,4.4873 --1.7231,4.4778 --2.4567,4.4682 --3.1239,4.4587 --3.7186,4.4492 --4.2349,4.4396 --4.6679,4.4301 --5.0136,4.4205 --5.2687,4.411 --5.4306,4.4015 --5.498,4.3919 --5.47,4.3824 --5.3471,4.3729 --5.1303,4.3633 --4.8217,4.3538 --4.4244,4.3442 --3.9419,4.3347 --3.3791,4.3252 --2.7411,4.3156 --2.0342,4.3061 --1.2649,4.2966 --0.4408,4.287 -0.4304,4.2775 -1.3404,4.287 -2.2806,4.2966 -3.2418,4.3061 -4.2151,4.3156 -5.1911,4.3252 -6.1604,4.3347 -7.114,4.3442 -8.0427,4.3538 -8.9376,4.3633 -9.7902,4.3729 -10.5924,4.3824 -11.3365,4.3919 -12.0155,4.4015 -12.6229,4.411 -13.1529,4.4205 -13.6004,4.4301 -13.9612,4.4396 -14.2318,4.4492 -14.4098,4.4587 -14.4932,4.4682 -14.4815,4.4778 -14.3746,4.4873 -14.1737,4.4968 -13.8805,4.5064 -13.498,4.5159 -13.0297,4.5254 -12.4801,4.535 -11.8545,4.5445 -11.1589,4.5541 -10.3997,4.5636 -9.5844,4.5731 -8.7206,4.5827 -7.8165,4.5731 -6.8809,4.5636 -5.9226,4.5541 -4.9507,4.5445 -3.9746,4.535 -3.0034,4.5254 -2.0465,4.5159 -1.113,4.5064 -0.2117,4.4968 --0.6486,4.4873 --1.46,4.4778 --2.2145,4.4682 --2.905,4.4587 --3.525,4.4492 --4.0685,4.4396 --4.5304,4.4301 --4.9062,4.4205 --5.1923,4.411 --5.3862,4.4015 --5.4858,4.3919 --5.4902,4.3824 --5.3995,4.3729 --5.2144,4.3633 --4.9367,4.3538 --4.5691,4.3442 --4.1151,4.3347 --3.579,4.3252 --2.966,4.3156 --2.2817,4.3061 --1.5329,4.2966 --0.7265,4.287 -0.1296,4.2775 -1.0274,4.287 -1.9583,4.2966 -2.9134,4.3061 -3.8836,4.3156 -4.8597,4.3252 -5.8323,4.3347 -6.7923,4.3442 -7.7304,4.3538 -8.6378,4.3633 -9.5057,4.3729 -10.3259,4.3824 -11.0906,4.3919 -11.7925,4.4015 -12.4249,4.411 -12.9818,4.4205 -13.4579,4.4301 -13.8486,4.4396 -14.1502,4.4492 -14.3598,4.4587 -14.4755,4.4682 -14.4962,4.4778 -14.4216,4.4873 -14.2524,4.4968 -13.9903,4.5064 -13.6378,4.5159 -13.1982,4.5254 -12.6757,4.535 -12.0753,4.5445 -11.4027,4.5541 -10.6644,4.5636 -9.8673,4.5731 -9.019,4.5827 -8.1277,4.5731 -7.2019,4.5636 -6.2502,4.5541 -5.2819,4.5445 -4.3062,4.535 -3.3323,4.5254 -2.3695,4.5159 -1.427,4.5064 -0.5138,4.4968 --0.3614,4.4873 --1.1903,4.4778 --1.9649,4.4682 --2.678,4.4587 --3.3226,4.4492 --3.8927,4.4396 --4.3829,4.4301 --4.7884,4.4205 --5.1053,4.411 --5.3308,4.4015 --5.4626,4.3919 --5.4994,4.3824 --5.4409,4.3729 --5.2878,4.3633 --5.0413,4.3538 --4.7039,4.3442 --4.2789,4.3347 --3.7701,4.3252 --3.1826,4.3156 --2.5218,4.3061 --1.7942,4.2966 --1.0065,4.287 --0.1664,4.2775 -0.7182,4.287 -1.6388,4.2966 -2.5867,4.3061 -3.5528,4.3156 -4.5279,4.3252 -5.5028,4.3347 -6.4681,4.3442 -7.4147,4.3538 -8.3335,4.3633 -9.2157,4.3729 -10.053,4.3824 -10.8374,4.3919 -11.5615,4.4015 -12.2182,4.411 -12.8014,4.4205 -13.3054,4.4301 -13.7256,4.4396 -14.0579,4.4492 -14.299,4.4587 -14.4468,4.4682 -14.4998,4.4778 -14.4576,4.4873 -14.3204,4.4968 -14.0897,4.5064 -13.7675,4.5159 -13.3571,4.5254 -12.8623,4.535 -12.2877,4.5445 -11.639,4.5541 -10.9222,4.5636 -10.1443,4.5731 -9.3125,4.5827 -8.4349,4.5922 -7.5198,4.5827 -6.5759,4.5731 -5.6123,4.5636 -4.638,4.5541 -3.6624,4.5445 -2.6948,4.535 -1.7445,4.5254 -0.8203,4.5159 --0.0688,4.5064 --0.9143,4.4968 --1.7082,4.4873 --2.443,4.4778 --3.1116,4.4682 --3.7077,4.4587 --4.2256,4.4492 --4.6603,4.4396 --5.0078,4.4301 --5.2646,4.4205 --5.4284,4.411 --5.4976,4.4015 --5.4715,4.3919 --5.3504,4.3824 --5.1354,4.3729 --4.8286,4.3633 --4.4329,4.3538 --3.9521,4.3442 --3.3907,4.3347 --2.7542,4.3252 --2.0485,4.3156 --1.2805,4.3061 --0.4573,4.2966 -0.4131,4.287 -1.3224,4.2966 -2.262,4.3061 -3.223,4.3156 -4.1961,4.3252 -5.1721,4.3347 -6.1417,4.3442 -7.0957,4.3538 -8.0249,4.3633 -8.9205,4.3729 -9.774,4.3824 -10.5773,4.3919 -11.3226,4.4015 -12.003,4.411 -12.6118,4.4205 -13.1433,4.4301 -13.5925,4.4396 -13.955,4.4492 -14.2275,4.4587 -14.4072,4.4682 -14.4925,4.4778 -14.4826,4.4873 -14.3776,4.4968 -14.1785,4.5064 -13.8871,4.5159 -13.5063,4.5254 -13.0396,4.535 -12.4916,4.5445 -11.8674,4.5541 -11.173,4.5636 -10.4151,4.5731 -9.6007,4.5827 -8.7378,4.5922 -7.8345,4.5827 -6.8994,4.5731 -5.9414,4.5636 -4.9697,4.5541 -3.9935,4.5445 -3.0222,4.535 -2.0649,4.5254 -1.1309,4.5159 -0.2289,4.5064 --0.6324,4.4968 --1.4447,4.4873 --2.2004,4.4778 --2.8922,4.4682 --3.5137,4.4587 --4.0587,4.4492 --4.5222,4.4396 --4.8997,4.4301 --5.1876,4.4205 --5.3833,4.411 --5.4847,4.4015 --5.491,4.3919 --5.4021,4.3824 --5.2189,4.3729 --4.943,4.3633 --4.5771,4.3538 --4.1248,4.3442 --3.5902,4.3347 --2.9786,4.3252 --2.2957,4.3156 --1.548,4.3061 --0.7427,4.2966 -0.1125,4.287 -1.0096,4.2966 -1.9399,4.3061 -2.8946,4.3156 -3.8646,4.3252 -4.8407,4.3347 -5.8135,4.3442 -6.7738,4.3538 -7.7125,4.3633 -8.6205,4.3729 -9.4892,4.3824 -10.3105,4.3919 -11.0763,4.4015 -11.7795,4.411 -12.4133,4.4205 -12.9717,4.4301 -13.4494,4.4396 -13.8418,4.4492 -14.1452,4.4587 -14.3566,4.4682 -14.4742,4.4778 -14.4967,4.4873 -14.4239,4.4968 -14.2566,4.5064 -13.9963,4.5159 -13.6455,4.5254 -13.2075,4.535 -12.6866,4.5445 -12.0877,4.5541 -11.4165,4.5636 -10.6793,4.5731 -9.8833,4.5827 -9.036,4.5922 -8.1454,4.5827 -7.2201,4.5731 -6.2689,4.5636 -5.3009,4.5541 -4.3252,4.5445 -3.3511,4.535 -2.3881,4.5254 -1.4451,4.5159 -0.5313,4.5064 --0.3448,4.4968 --1.1746,4.4873 --1.9504,4.4778 --2.6647,4.4682 --3.3108,4.4587 --3.8824,4.4492 --4.3741,4.4396 --4.7813,4.4301 --5.1,4.4205 --5.3273,4.411 --5.4609,4.4015 --5.4996,4.3919 --5.443,4.3824 --5.2916,4.3729 --5.047,4.3633 --4.7113,4.3538 --4.2879,4.3442 --3.7808,4.3347 --3.1947,4.3252 --2.5353,4.3156 --1.8089,4.3061 --1.0224,4.2966 --0.1832,4.287 -0.7006,4.2966 -1.6206,4.3061 -2.568,4.3156 -3.5339,4.3252 -4.5089,4.3347 -5.4839,4.3442 -6.4495,4.3538 -7.3965,4.3633 -8.3159,4.3729 -9.199,4.3824 -10.0372,4.3919 -10.8227,4.4015 -11.548,4.411 -12.2061,4.4205 -12.7908,4.4301 -13.2964,4.4396 -13.7183,4.4492 -14.0523,4.4587 -14.2952,4.4682 -14.4449,4.4778 -14.4997,4.4873 -14.4593,4.4968 -14.324,4.5064 -14.095,4.5159 -13.7747,4.5254 -13.3659,4.535 -12.8727,4.5445 -12.2996,4.5541 -11.6523,4.5636 -10.9368,4.5731 -10.1599,4.5827 -9.3292,4.5922 -8.4524,4.6017 -7.5379,4.5922 -6.5945,4.5827 -5.6312,4.5731 -4.657,4.5636 -3.6814,4.5541 -2.7135,4.5445 -1.7627,4.535 -0.838,4.5254 --0.0518,4.5159 --0.8983,4.5064 --1.6933,4.4968 --2.4293,4.4873 --3.0993,4.4778 --3.6968,4.4682 --4.2163,4.4587 --4.6527,4.4492 --5.0019,4.4396 --5.2605,4.4301 --5.4261,4.4205 --5.4971,4.411 --5.4729,4.4015 --5.3536,4.3919 --5.1404,4.3824 --4.8354,4.3729 --4.4414,4.3633 --3.9622,4.3538 --3.4024,4.3442 --2.7673,4.3347 --2.0629,4.3252 --1.296,4.3156 --0.4738,4.3061 -0.3958,4.2966 -1.3044,4.3061 -2.2435,4.3156 -3.2041,4.3252 -4.1771,4.3347 -5.1532,4.3442 -6.123,4.3538 -7.0773,4.3633 -8.0071,4.3729 -8.9035,4.3824 -9.7579,4.3919 -10.5622,4.4015 -11.3087,4.411 -11.9904,4.4205 -12.6007,4.4301 -13.1338,4.4396 -13.5846,4.4492 -13.9488,4.4587 -14.223,4.4682 -14.4046,4.4778 -14.4918,4.4873 -14.4837,4.4968 -14.3805,4.5064 -14.1832,4.5159 -13.8936,4.5254 -13.5145,4.535 -13.0495,4.5445 -12.503,4.5541 -11.8802,4.5636 -11.1872,4.5731 -10.4304,4.5827 -9.6171,4.5922 -8.755,4.6017 -7.8524,4.5922 -6.9178,4.5827 -5.9602,4.5731 -4.9887,4.5636 -4.0125,4.5541 -3.041,4.5445 -2.0833,4.535 -1.1487,4.5254 -0.2461,4.5159 --0.616,4.5064 --1.4294,4.4968 --2.1863,4.4873 --2.8794,4.4778 --3.5023,4.4682 --4.0489,4.4587 --4.514,4.4492 --4.8932,4.4396 --5.1829,4.4301 --5.3804,4.4205 --5.4837,4.411 --5.4918,4.4015 --5.4048,4.3919 --5.2233,4.3824 --4.9492,4.3729 --4.5851,4.3633 --4.1344,4.3538 --3.6014,4.3442 --2.9912,4.3347 --2.3096,4.3252 --1.5631,4.3156 --0.7589,4.3061 -0.0955,4.2966 -0.9918,4.3061 -1.9215,4.3156 -2.8759,4.3252 -3.8457,4.3347 -4.8217,4.3442 -5.7947,4.3538 -6.7553,4.3633 -7.6945,4.3729 -8.6032,4.3824 -9.4728,4.3919 -10.295,4.4015 -11.062,4.411 -11.7665,4.4205 -12.4017,4.4301 -12.9616,4.4396 -13.4409,4.4492 -13.835,4.4587 -14.1401,4.4682 -14.3534,4.4778 -14.4728,4.4873 -14.4971,4.4968 -14.4262,4.5064 -14.2607,4.5159 -14.0022,4.5254 -13.6532,4.535 -13.2169,4.5445 -12.6975,4.5541 -12.1001,4.5636 -11.4302,4.5731 -10.6942,4.5827 -9.8993,4.5922 -9.0529,4.6017 -8.1631,4.5922 -7.2384,4.5827 -6.2876,4.5731 -5.3198,4.5636 -4.3442,4.5541 -3.37,4.5445 -2.4066,4.535 -1.4632,4.5254 -0.5487,4.5159 --0.3281,4.5064 --1.159,4.4968 --1.9359,4.4873 --2.6515,4.4778 --3.2989,4.4682 --3.872,4.4587 --4.3654,4.4492 --4.7742,4.4396 --5.0947,4.4301 --5.3238,4.4205 --5.4592,4.411 --5.4997,4.4015 --5.445,4.3919 --5.2955,4.3824 --5.0526,4.3729 --4.7187,4.3633 --4.297,4.3538 --3.7914,4.3442 --3.2068,4.3347 --2.5488,4.3252 --1.8237,4.3156 --1.0382,4.3061 --0.2,4.2966 -0.683,4.3061 -1.6024,4.3156 -2.5494,4.3252 -3.5149,4.3347 -4.4899,4.3442 -5.465,4.3538 -6.4308,4.3633 -7.3783,4.3729 -8.2983,4.3824 -9.1822,4.3919 -10.0214,4.4015 -10.808,4.411 -11.5345,4.4205 -12.194,4.4301 -12.7801,4.4396 -13.2874,4.4492 -13.7109,4.4587 -14.0466,4.4682 -14.2914,4.4778 -14.4429,4.4873 -14.4996,4.4968 -14.461,4.5064 -14.3275,4.5159 -14.1004,4.5254 -13.7817,4.535 -13.3747,4.5445 -12.883,4.5541 -12.3115,4.5636 -11.6656,4.5731 -10.9513,4.5827 -10.1756,4.5922 -9.3458,4.6017 -8.4698,4.6113 -7.556,4.6017 -6.6131,4.5922 -5.65,4.5827 -4.676,4.5731 -3.7003,4.5636 -2.7322,4.5541 -1.781,4.5445 -0.8557,4.535 --0.0349,4.5254 --0.8823,4.5159 --1.6784,4.5064 --2.4156,4.4968 --3.0869,4.4873 --3.686,4.4778 --4.207,4.4682 --4.645,4.4587 --4.9959,4.4492 --5.2563,4.4396 --5.4238,4.4301 --5.4966,4.4205 --5.4743,4.411 --5.3568,4.4015 --5.1455,4.3919 --4.8422,4.3824 --4.4499,4.3729 --3.9723,4.3633 --3.414,4.3538 --2.7803,4.3442 --2.0772,4.3347 --1.3114,4.3252 --0.4903,4.3156 -0.3784,4.3061 -1.2864,4.3156 -2.225,4.3252 -3.1853,4.3347 -4.1581,4.3442 -5.1342,4.3538 -6.1042,4.3633 -7.059,4.3729 -7.9893,4.3824 -8.8864,4.3919 -9.7417,4.4015 -10.5471,4.411 -11.2948,4.4205 -11.9778,4.4301 -12.5895,4.4396 -13.1242,4.4492 -13.5766,4.4587 -13.9426,4.4682 -14.2186,4.4778 -14.402,4.4873 -14.491,4.4968 -14.4848,4.5064 -14.3835,4.5159 -14.1879,4.5254 -13.9001,4.535 -13.5227,4.5445 -13.0593,4.5541 -12.5144,4.5636 -11.893,4.5731 -11.2013,4.5827 -10.4456,4.5922 -9.6334,4.6017 -8.7722,4.6113 -7.8703,4.6017 -6.9362,4.5922 -5.979,4.5827 -5.0076,4.5731 -4.0315,4.5636 -3.0598,4.5541 -2.1018,4.5445 -1.1667,4.535 -0.2633,4.5254 --0.5997,4.5159 --1.4141,4.5064 --2.1721,4.4968 --2.8666,4.4873 --3.4909,4.4778 --4.039,4.4682 --4.5057,4.4587 --4.8867,4.4492 --5.1782,4.4396 --5.3774,4.4301 --5.4826,4.4205 --5.4926,4.411 --5.4074,4.4015 --5.2277,4.3919 --4.9554,4.3824 --4.593,4.3729 --4.1439,4.3633 --3.6125,4.3538 --3.0038,4.3442 --2.3235,4.3347 --1.5782,4.3252 --0.775,4.3156 -0.0784,4.3061 -0.974,4.3156 -1.9032,4.3252 -2.8571,4.3347 -3.8267,4.3442 -4.8027,4.3538 -5.7758,4.3633 -6.7368,4.3729 -7.6765,4.3824 -8.5858,4.3919 -9.4563,4.4015 -10.2795,4.411 -11.0476,4.4205 -11.7534,4.4301 -12.39,4.4396 -12.9515,4.4492 -13.4324,4.4587 -13.8282,4.4682 -14.1351,4.4778 -14.3502,4.4873 -14.4714,4.4968 -14.4976,4.5064 -14.4285,4.5159 -14.2648,4.5254 -14.0081,4.535 -13.6608,4.5445 -13.2262,4.5541 -12.7084,4.5636 -12.1124,4.5731 -11.4439,4.5827 -10.7092,4.5922 -9.9153,4.6017 -9.0698,4.6113 -8.1808,4.6017 -7.2567,4.5922 -6.3063,4.5827 -5.3387,4.5731 -4.3632,4.5636 -3.3889,4.5541 -2.4252,4.5445 -1.4813,4.535 -0.5662,4.5254 --0.3115,4.5159 --1.1433,4.5064 --1.9213,4.4968 --2.6382,4.4873 --3.287,4.4778 --3.8616,4.4682 --4.3566,4.4587 --4.7671,4.4492 --5.0893,4.4396 --5.3202,4.4301 --5.4575,4.4205 --5.4999,4.411 --5.447,4.4015 --5.2993,4.3919 --5.0582,4.3824 --4.7261,4.3729 --4.306,4.3633 --3.802,4.3538 --3.2189,4.3442 --2.5623,4.3347 --1.8384,4.3252 --1.054,4.3156 --0.2168,4.3061 -0.6655,4.3156 -1.5842,4.3252 -2.5307,4.3347 -3.496,4.3442 -4.4709,4.3538 -5.4461,4.3633 -6.4122,4.3729 -7.3601,4.3824 -8.2808,4.3919 -9.1654,4.4015 -10.0056,4.411 -10.7933,4.4205 -11.521,4.4301 -12.1818,4.4396 -12.7695,4.4492 -13.2783,4.4587 -13.7035,4.4682 -14.0409,4.4778 -14.2875,4.4873 -14.4408,4.4968 -14.4994,4.5064 -14.4627,4.5159 -14.331,4.5254 -14.1057,4.535 -13.7888,4.5445 -13.3834,4.5541 -12.8934,4.5636 -12.3234,4.5731 -11.6788,4.5827 -10.9658,4.5922 -10.1912,4.6017 -9.3624,4.6113 -8.4872,4.6208 -7.5741,4.6113 -6.6317,4.6017 -5.6689,4.5922 -4.695,4.5827 -3.7192,4.5731 -2.7509,4.5636 -1.7993,4.5541 -0.8734,4.5445 --0.018,4.535 --0.8663,4.5254 --1.6634,4.5159 --2.4019,4.5064 --3.0745,4.4968 --3.675,4.4873 --4.1976,4.4778 --4.6373,4.4682 --4.9899,4.4587 --5.2521,4.4492 --5.4214,4.4396 --5.4961,4.4301 --5.4756,4.4205 --5.36,4.411 --5.1505,4.4015 --4.849,4.3919 --4.4584,4.3824 --3.9824,4.3729 --3.4256,4.3633 --2.7933,4.3538 --2.0915,4.3442 --1.3269,4.3347 --0.5067,4.3252 -0.3611,4.3156 -1.2684,4.3252 -2.2065,4.3347 -3.1665,4.3442 -4.1391,4.3538 -5.1152,4.3633 -6.0855,4.3729 -7.0406,4.3824 -7.9715,4.3919 -8.8693,4.4015 -9.7255,4.411 -10.5319,4.4205 -11.2809,4.4301 -11.9652,4.4396 -12.5783,4.4492 -13.1145,4.4587 -13.5686,4.4682 -13.9363,4.4778 -14.2141,4.4873 -14.3993,4.4968 -14.4901,4.5064 -14.4858,4.5159 -14.3863,4.5254 -14.1926,4.535 -13.9066,4.5445 -13.5309,4.5541 -13.0691,4.5636 -12.5257,4.5731 -11.9058,4.5827 -11.2154,4.5922 -10.4609,4.6017 -9.6497,4.6113 -8.7893,4.6208 -7.8881,4.6113 -6.9546,4.6017 -5.9978,4.5922 -5.0266,4.5827 -4.0505,4.5731 -3.0786,4.5636 -2.1202,4.5541 -1.1846,4.5445 -0.2805,4.535 --0.5834,4.5254 --1.3988,4.5159 --2.158,4.5064 --2.8537,4.4968 --3.4794,4.4873 --4.0291,4.4778 --4.4975,4.4682 --4.8801,4.4587 --5.1734,4.4492 --5.3744,4.4396 --5.4814,4.4301 --5.4933,4.4205 --5.4099,4.411 --5.2321,4.4015 --4.9616,4.3919 --4.6009,4.3824 --4.1535,4.3729 --3.6236,4.3633 --3.0163,4.3538 --2.3374,4.3442 --1.5933,4.3347 --0.7912,4.3252 -0.0614,4.3156 -0.9562,4.3252 -1.8848,4.3347 -2.8384,4.3442 -3.8078,4.3538 -4.7837,4.3633 -5.757,4.3729 -6.7183,4.3824 -7.6584,4.3919 -8.5685,4.4015 -9.4398,4.411 -10.264,4.4205 -11.0333,4.4301 -11.7403,4.4396 -12.3783,4.4492 -12.9413,4.4587 -13.4238,4.4682 -13.8213,4.4778 -14.13,4.4873 -14.3469,4.4968 -14.4699,4.5064 -14.498,4.5159 -14.4308,4.5254 -14.2689,4.535 -14.014,4.5445 -13.6684,4.5541 -13.2354,4.5636 -12.7192,4.5731 -12.1247,4.5827 -11.4575,4.5922 -10.724,4.6017 -9.9312,4.6113 -9.0867,4.6208 -8.1984,4.6113 -7.2749,4.6017 -6.325,4.5922 -5.3577,4.5827 -4.3822,4.5731 -3.4078,4.5636 -2.4438,4.5541 -1.4994,4.5445 -0.5836,4.535 --0.2948,4.5254 --1.1276,4.5159 --1.9068,4.5064 --2.6249,4.4968 --3.2751,4.4873 --3.8512,4.4778 --4.3477,4.4682 --4.7599,4.4587 --5.0839,4.4492 --5.3166,4.4396 --5.4557,4.4301 --5.4999,4.4205 --5.4489,4.411 --5.303,4.4015 --5.0638,4.3919 --4.7334,4.3824 --4.315,4.3729 --3.8126,4.3633 --3.231,4.3538 --2.5757,4.3442 --1.853,4.3347 --1.0698,4.3252 --0.2335,4.3156 -0.6479,4.3241 -1.566,4.3336 -2.5121,4.3431 -3.4771,4.3527 -4.4519,4.3622 -5.4271,4.3717 -6.3935,4.3813 -7.3419,4.3908 -8.2632,4.4004 -9.1486,4.4099 -9.9897,4.4194 -10.7785,4.429 -11.5075,4.4385 -12.1697,4.448 -12.7588,4.4576 -13.2692,4.4671 -13.696,4.4766 -14.0352,4.4862 -14.2836,4.4957 -14.4387,4.5053 -14.4991,4.5148 -14.4643,4.5243 -14.3345,4.5339 -14.1109,4.5434 -13.7958,4.5529 -13.3921,4.5625 -12.9037,4.572 -12.3352,4.5816 -11.692,4.5911 -10.9803,4.6006 -10.2068,4.6102 -9.379,4.6197 -8.5047,4.6292 -7.5922,4.6197 -6.6502,4.6102 -5.6878,4.6006 -4.714,4.5911 -3.7382,4.5816 -2.7696,4.572 -1.8176,4.5625 -0.8911,4.5529 --0.001,4.5434 --0.8502,4.5339 --1.6485,4.5243 --2.3881,4.5148 --3.0621,4.5053 --3.6641,4.4957 --4.1882,4.4862 --4.6296,4.4766 --4.9839,4.4671 --5.2479,4.4576 --5.419,4.448 --5.4956,4.4385 --5.4769,4.429 --5.3632,4.4194 --5.1554,4.4099 --4.8557,4.4004 --4.4668,4.3908 --3.9925,4.3813 --3.4372,4.3717 --2.8063,4.3622 --2.1058,4.3527 --1.3423,4.3431 --0.5232,4.3336 -0.3439,4.3241 -1.2505,4.3336 -2.188,4.3431 -3.1477,4.3527 -4.1202,4.3622 -5.0963,4.3717 -6.0667,4.3813 -7.0222,4.3908 -7.9537,4.4004 -8.8522,4.4099 -9.7093,4.4194 -10.5168,4.429 -11.2669,4.4385 -11.9525,4.448 -12.5671,4.4576 -13.1049,4.4671 -13.5606,4.4766 -13.93,4.4862 -14.2096,4.4957 -14.3966,4.5053 -14.4893,4.5148 -14.4868,4.5243 -14.3892,4.5339 -14.1973,4.5434 -13.913,4.5529 -13.539,4.5625 -13.0789,4.572 -12.537,4.5816 -11.9186,4.5911 -11.2294,4.6006 -10.4762,4.6102 -9.6659,4.6197 -8.8065,4.6292 -7.906,4.6197 -6.9731,4.6102 -6.0165,4.6006 -5.0456,4.5911 -4.0694,4.5816 -3.0974,4.572 -2.1387,4.5625 -1.2025,4.5529 -0.2977,4.5434 --0.567,4.5339 --1.3834,4.5243 --2.1438,4.5148 --2.8409,4.5053 --3.468,4.4957 --4.0192,4.4862 --4.4892,4.4766 --4.8735,4.4671 --5.1685,4.4576 --5.3714,4.448 --5.4802,4.4385 --5.494,4.429 --5.4124,4.4194 --5.2365,4.4099 --4.9677,4.4004 --4.6087,4.3908 --4.163,4.3813 --3.6346,4.3717 --3.0288,4.3622 --2.3512,4.3527 --1.6084,4.3431 --0.8073,4.3336 -0.0444,4.3241 -0.9385,4.3336 -1.8665,4.3431 -2.8197,4.3527 -3.7888,4.3622 -4.7647,4.3717 -5.7382,4.3813 -6.6998,4.3908 -7.6404,4.4004 -8.5511,4.4099 -9.4232,4.4194 -10.2485,4.429 -11.0189,4.4385 -11.7272,4.448 -12.3666,4.4576 -12.9311,4.4671 -13.4152,4.4766 -13.8144,4.4862 -14.1248,4.4957 -14.3435,4.5053 -14.4684,4.5148 -14.4983,4.5243 -14.433,4.5339 -14.273,4.5434 -14.0198,4.5529 -13.676,4.5625 -13.2447,4.572 -12.73,4.5816 -12.137,4.5911 -11.4711,4.6006 -10.7389,4.6102 -9.9472,4.6197 -9.1036,4.6292 -8.2161,4.6197 -7.2932,4.6102 -6.3437,4.6006 -5.3766,4.5911 -4.4012,4.5816 -3.4267,4.572 -2.4624,4.5625 -1.5175,4.5529 -0.6011,4.5434 --0.2782,4.5339 --1.1119,4.5243 --1.8922,4.5148 --2.6115,4.5053 --3.2631,4.4957 --3.8407,4.4862 --4.3388,4.4766 --4.7527,4.4671 --5.0785,4.4576 --5.3129,4.448 --5.4539,4.4385 --5.5,4.429 --5.4508,4.4194 --5.3068,4.4099 --5.0693,4.4004 --4.7407,4.3908 --4.3239,4.3813 --3.8231,4.3717 --3.243,4.3622 --2.5891,4.3527 --1.8677,4.3431 --1.0856,4.3336 --0.2502,4.3241 -0.6304,4.3159 -1.5479,4.3254 -2.4935,4.3349 -3.4583,4.3445 -4.4329,4.354 -5.4082,4.3636 -6.3749,4.3731 -7.3237,4.3826 -8.2456,4.3922 -9.1317,4.4017 -9.9738,4.4112 -10.7637,4.4208 -11.4939,4.4303 -12.1574,4.4399 -12.748,4.4494 -13.26,4.4589 -13.6885,4.4685 -14.0295,4.478 -14.2796,4.4875 -14.4366,4.4971 -14.4989,4.5066 -14.4659,4.5161 -14.3379,4.5257 -14.1162,4.5352 -13.8028,4.5448 -13.4008,4.5543 -12.914,4.5638 -12.347,4.5734 -11.7052,4.5829 -10.9948,4.5924 -10.2224,4.602 -9.3956,4.6115 -8.5221,4.621 -7.6102,4.6115 -6.6688,4.602 -5.7066,4.5924 -4.733,4.5829 -3.7571,4.5734 -2.7883,4.5638 -1.8359,4.5543 -0.9088,4.5448 -0.0159,4.5352 --0.8342,4.5257 --1.6335,4.5161 --2.3743,4.5066 --3.0497,4.4971 --3.6531,4.4875 --4.1788,4.478 --4.6218,4.4685 --4.9779,4.4589 --5.2437,4.4494 --5.4166,4.4399 --5.495,4.4303 --5.4782,4.4208 --5.3663,4.4112 --5.1604,4.4017 --4.8624,4.3922 --4.4752,4.3826 --4.0025,4.3731 --3.4487,4.3636 --2.8193,4.354 --2.12,4.3445 --1.3577,4.3349 --0.5396,4.3254 -0.3266,4.3159 -1.2325,4.3254 -2.1696,4.3349 -3.1288,4.3445 -4.1012,4.354 -5.0773,4.3636 -6.0479,4.3731 -7.0038,4.3826 -7.9359,4.3922 -8.8351,4.4017 -9.6931,4.4112 -10.5016,4.4208 -11.2529,4.4303 -11.9398,4.4399 -12.5559,4.4494 -13.0952,4.4589 -13.5526,4.4685 -13.9237,4.478 -14.205,4.4875 -14.3938,4.4971 -14.4884,4.5066 -14.4878,4.5161 -14.392,4.5257 -14.2019,4.5352 -13.9194,4.5448 -13.5471,4.5543 -13.0886,4.5638 -12.5483,4.5734 -11.9313,4.5829 -11.2435,4.5924 -10.4914,4.602 -9.6822,4.6115 -8.8236,4.621 -7.9239,4.6115 -6.9915,4.602 -6.0353,4.5924 -5.0646,4.5829 -4.0884,4.5734 -3.1162,4.5638 -2.1572,4.5543 -1.2204,4.5448 -0.315,4.5352 --0.5506,4.5257 --1.3681,4.5161 --2.1296,4.5066 --2.8279,4.4971 --3.4565,4.4875 +4.5,0.0 +5.475,0.0095 +6.4407,0.0191 +7.388,0.0286 +8.3077,0.0381 +9.1911,0.0477 +10.0298,0.0572 +10.8158,0.0668 +11.5417,0.0763 +12.2004,0.0858 +12.7858,0.0954 +13.2922,0.1049 +13.7148,0.1144 +14.0496,0.124 +14.2934,0.1335 +14.4439,0.1431 +14.4997,0.1526 +14.4601,0.1621 +14.3256,0.1717 +14.0975,0.1812 +13.778,0.1907 +13.37,0.2003 +12.8775,0.2098 +12.3052,0.2193 +11.6585,0.2289 +10.9436,0.2384 +10.1673,0.248 +9.337,0.2575 +8.4606,0.267 +7.5464,0.2766 +6.6032,0.2861 +5.64,0.2956 +4.6659,0.3052 +3.6903,0.3147 +2.7223,0.3242 +1.7713,0.3338 +0.8463,0.3433 +-0.0439,0.3529 +-0.8908,0.3624 +-1.6863,0.3719 +-2.4229,0.3815 +-3.0935,0.3719 +-3.6917,0.3624 +-4.2119,0.3529 +-4.6491,0.3433 +-4.9991,0.3338 +-5.2585,0.3242 +-5.425,0.3147 +-5.4969,0.3052 +-5.4735,0.2956 +-5.3551,0.3052 +-5.1428,0.3147 +-4.8386,0.3242 +-4.4454,0.3338 +-3.967,0.3433 +-3.4079,0.3529 +-2.7734,0.3624 +-2.0696,0.3719 +-1.3032,0.3815 +-0.4815,0.391 +0.3876,0.4005 +1.296,0.4101 +2.2349,0.4196 +3.1953,0.4292 +4.1682,0.4387 +5.1443,0.4482 +6.1142,0.4578 +7.0687,0.4673 +7.9988,0.4768 +8.8955,0.4864 +9.7503,0.4959 +10.5551,0.5054 +11.3022,0.515 +11.9845,0.5245 +12.5955,0.5341 +13.1293,0.5436 +13.5809,0.5531 +13.9459,0.5627 +14.221,0.5722 +14.4034,0.5817 +14.4914,0.5913 +14.4842,0.6008 +14.3819,0.6104 +14.1854,0.6199 +13.8967,0.6294 +13.5183,0.639 +13.0541,0.6485 +12.5083,0.658 +11.8862,0.6676 +11.1938,0.6771 +10.4375,0.6866 +9.6247,0.6962 +8.763,0.7057 +7.8608,0.7153 +6.9264,0.7248 +5.969,0.7343 +4.9976,0.7439 +4.0214,0.7534 +3.0498,0.7629 +2.092,0.7725 +1.1571,0.782 +0.2542,0.7915 +-0.6084,0.8011 +-1.4222,0.8106 +-2.1797,0.8202 +-2.8734,0.8106 +-3.4969,0.8011 +-4.0442,0.7915 +-4.5101,0.782 +-4.8901,0.7725 +-5.1807,0.7629 +-5.379,0.7534 +-5.4831,0.7439 +-5.4922,0.7343 +-5.406,0.7248 +-5.2254,0.7343 +-4.9521,0.7439 +-4.5888,0.7534 +-4.1389,0.7629 +-3.6066,0.7725 +-2.9971,0.782 +-2.3161,0.7915 +-1.5702,0.8011 +-0.7665,0.8106 +0.0875,0.8202 +0.9834,0.8297 +1.9129,0.8392 +2.8671,0.8488 +3.8368,0.8583 +4.8128,0.8678 +5.7858,0.8774 +6.7466,0.8869 +7.686,0.8965 +8.595,0.906 +9.465,0.9155 +10.2877,0.9251 +11.0553,0.9346 +11.7603,0.9441 +12.3962,0.9537 +12.9569,0.9632 +13.4369,0.9727 +13.8318,0.9823 +14.1378,0.9918 +14.3519,1.0014 +14.4721,1.0109 +14.4974,1.0204 +14.4273,1.03 +14.2627,1.0395 +14.005,1.049 +13.6567,1.0586 +13.2212,1.0681 +12.7026,1.0777 +12.1058,1.0872 +11.4366,1.0967 +10.7012,1.1063 +9.9068,1.1158 +9.0608,1.1253 +8.1714,1.1349 +7.247,1.1444 +6.2964,1.1539 +5.3287,1.1635 +4.3531,1.173 +3.3789,1.1826 +2.4153,1.1921 +1.4717,1.2016 +0.5569,1.2112 +-0.3203,1.2207 +-1.1516,1.2112 +-1.9291,1.2016 +-2.6452,1.1921 +-3.2933,1.1826 +-3.8671,1.173 +-4.3612,1.1635 +-4.7709,1.1539 +-5.0922,1.1444 +-5.3221,1.1349 +-5.4584,1.1253 +-5.4998,1.1158 +-5.4459,1.1063 +-5.2973,1.0967 +-5.0552,1.0872 +-4.7222,1.0967 +-4.3012,1.1063 +-3.7964,1.1158 +-3.2125,1.1253 +-2.5552,1.1349 +-1.8306,1.1444 +-1.0456,1.1539 +-0.2079,1.1635 +0.6748,1.173 +1.5939,1.1826 +2.5406,1.1921 +3.5061,1.2016 +4.481,1.2112 +5.4561,1.2207 +6.4221,1.2302 +7.3698,1.2398 +8.2901,1.2493 +9.1743,1.2589 +10.014,1.2684 +10.8011,1.2779 +11.5282,1.2875 +12.1883,1.297 +12.7751,1.3065 +13.2831,1.3161 +13.7074,1.3256 +14.044,1.3351 +14.2896,1.3447 +14.4419,1.3542 +14.4995,1.3638 +14.4618,1.3733 +14.3291,1.3828 +14.1029,1.3924 +13.7851,1.4019 +13.3788,1.4114 +12.8879,1.421 +12.3171,1.4305 +11.6718,1.44 +10.9581,1.4496 +10.1829,1.4591 +9.3536,1.4687 +8.478,1.4782 +7.5645,1.4877 +6.6218,1.4973 +5.6589,1.5068 +4.6849,1.5163 +3.7092,1.5259 +2.741,1.5354 +1.7896,1.545 +0.864,1.5545 +-0.027,1.545 +-0.8748,1.5354 +-1.6714,1.5259 +-2.4092,1.5163 +-3.0811,1.5068 +-3.6808,1.4973 +-4.2026,1.4877 +-4.6414,1.4782 +-4.9931,1.4687 +-5.2544,1.4591 +-5.4227,1.4496 +-5.4964,1.44 +-5.4749,1.4305 +-5.3583,1.421 +-5.1478,1.4114 +-4.8454,1.4019 +-4.4539,1.3924 +-3.9771,1.4019 +-3.4195,1.4114 +-2.7864,1.421 +-2.0839,1.4305 +-1.3187,1.44 +-0.498,1.4496 +0.3703,1.4591 +1.278,1.4687 +2.2164,1.4782 +3.1765,1.4877 +4.1492,1.4973 +5.1253,1.5068 +6.0954,1.5163 +7.0503,1.5259 +7.981,1.5354 +8.8784,1.545 +9.7341,1.5545 +10.54,1.564 +11.2883,1.5736 +11.9719,1.5831 +12.5843,1.5926 +13.1197,1.6022 +13.5729,1.6117 +13.9397,1.6212 +14.2165,1.6308 +14.4007,1.6403 +14.4906,1.6499 +14.4853,1.6594 +14.3848,1.6689 +14.1901,1.6785 +13.9031,1.688 +13.5265,1.6975 +13.0639,1.7071 +12.5197,1.7166 +11.899,1.7262 +11.2079,1.7357 +10.4528,1.7452 +9.641,1.7548 +8.7802,1.7643 +7.8786,1.7738 +6.9449,1.7834 +5.9878,1.7929 +5.0165,1.8024 +4.0404,1.812 +3.0686,1.8215 +2.1104,1.8311 +1.1751,1.8215 +0.2714,1.812 +-0.592,1.8024 +-1.4069,1.7929 +-2.1655,1.7834 +-2.8606,1.7738 +-3.4855,1.7643 +-4.0344,1.7548 +-4.5019,1.7452 +-4.8836,1.7357 +-5.1759,1.7262 +-5.376,1.7166 +-5.482,1.7071 +-5.4929,1.6975 +-5.4086,1.688 +-5.2298,1.6785 +-4.9583,1.6689 +-4.5967,1.6594 +-4.1484,1.6689 +-3.6177,1.6785 +-3.0096,1.688 +-2.33,1.6975 +-1.5853,1.7071 +-0.7826,1.7166 +0.0704,1.7262 +0.9657,1.7357 +1.8946,1.7452 +2.8483,1.7548 +3.8178,1.7643 +4.7938,1.7738 +5.767,1.7834 +6.7281,1.7929 +7.668,1.8024 +8.5777,1.812 +9.4485,1.8215 +10.2722,1.8311 +11.0409,1.8406 +11.7473,1.8501 +12.3845,1.8597 +12.9467,1.8692 +13.4284,1.8787 +13.825,1.8883 +14.1327,1.8978 +14.3486,1.9073 +14.4707,1.9169 +14.4978,1.9264 +14.4296,1.936 +14.2668,1.9455 +14.0109,1.955 +13.6644,1.9646 +13.2305,1.9741 +12.7135,1.9836 +12.1182,1.9932 +11.4503,2.0027 +10.7161,2.0123 +9.9228,2.0218 +9.0777,2.0313 +8.1891,2.0409 +7.2652,2.0504 +6.3151,2.0599 +5.3476,2.0695 +4.3721,2.079 +3.3977,2.0885 +2.4339,2.0981 +1.4898,2.0885 +0.5744,2.079 +-0.3037,2.0695 +-1.1359,2.0599 +-1.9145,2.0504 +-2.6319,2.0409 +-3.2814,2.0313 +-3.8567,2.0218 +-4.3524,2.0123 +-4.7637,2.0027 +-5.0868,1.9932 +-5.3185,1.9836 +-5.4566,1.9741 +-5.4999,1.9646 +-5.4479,1.955 +-5.301,1.9455 +-5.0608,1.936 +-4.7295,1.9264 +-4.3102,1.9169 +-3.807,1.9073 +-3.2246,1.9169 +-2.5686,1.9264 +-1.8452,1.936 +-1.0614,1.9455 +-0.2246,1.955 +0.6572,1.9646 +1.5757,1.9741 +2.522,1.9836 +3.4872,1.9932 +4.462,2.0027 +5.4372,2.0123 +6.4034,2.0218 +7.3516,2.0313 +8.2725,2.0409 +9.1575,2.0504 +9.9981,2.0599 +10.7863,2.0695 +11.5146,2.079 +12.1761,2.0885 +12.7644,2.0981 +13.274,2.1076 +13.7,2.1172 +14.0383,2.1267 +14.2857,2.1362 +14.4398,2.1458 +14.4993,2.1553 +14.4634,2.1648 +14.3326,2.1744 +14.1081,2.1839 +13.7921,2.1935 +13.3875,2.203 +12.8982,2.2125 +12.3289,2.2221 +11.685,2.2316 +10.9726,2.2411 +10.1986,2.2507 +9.3702,2.2602 +8.4954,2.2697 +7.5826,2.2793 +6.6404,2.2888 +5.6777,2.2984 +4.7039,2.3079 +3.7281,2.3174 +2.7597,2.327 +1.8079,2.3365 +0.8817,2.327 +-0.01,2.3174 +-0.8588,2.3079 +-1.6564,2.2984 +-2.3954,2.2888 +-3.0687,2.2793 +-3.6699,2.2697 +-4.1932,2.2602 +-4.6337,2.2507 +-4.9871,2.2411 +-5.2502,2.2316 +-5.4203,2.2221 +-5.4959,2.2125 +-5.4762,2.203 +-5.3615,2.1935 +-5.1528,2.1839 +-4.8521,2.1744 +-4.4623,2.1648 +-3.9871,2.1553 +-3.4311,2.1458 +-2.7994,2.1553 +-2.0982,2.1648 +-1.3341,2.1744 +-0.5144,2.1839 +0.353,2.1935 +1.26,2.203 +2.1979,2.2125 +3.1577,2.2221 +4.1302,2.2316 +5.1063,2.2411 +6.0767,2.2507 +7.032,2.2602 +7.9632,2.2697 +8.8613,2.2793 +9.7179,2.2888 +10.5248,2.2984 +11.2743,2.3079 +11.9592,2.3174 +12.5731,2.327 +13.11,2.3365 +13.5649,2.346 +13.9334,2.3556 +14.212,2.3651 +14.398,2.3746 +14.4897,2.3842 +14.4863,2.3937 +14.3877,2.4033 +14.1948,2.4128 +13.9096,2.4223 +13.5347,2.4319 +13.0737,2.4414 +12.531,2.4509 +11.9118,2.4605 +11.222,2.47 +10.4681,2.4796 +9.6573,2.4891 +8.7974,2.4986 +7.8965,2.5082 +6.9633,2.5177 +6.0066,2.5272 +5.0355,2.5368 +4.0594,2.5463 +3.0874,2.5368 +2.1289,2.5463 +1.193,2.5368 +0.2886,2.5272 +-0.5757,2.5177 +-1.3916,2.5082 +-2.1513,2.4986 +-2.8477,2.4891 +-3.4741,2.4796 +-4.0244,2.47 +-4.4936,2.4605 +-4.877,2.4509 +-5.1711,2.4414 +-5.373,2.4319 +-5.4809,2.4223 +-5.4936,2.4128 +-5.4111,2.4033 +-5.2342,2.3937 +-4.9645,2.3842 +-4.6046,2.3746 +-4.1579,2.3651 +-3.6288,2.3556 +-3.0222,2.3651 +-2.3439,2.3746 +-1.6004,2.3842 +-0.7987,2.3937 +0.0534,2.4033 +0.9479,2.4128 +1.8763,2.4223 +2.8296,2.4319 +3.7989,2.4414 +4.7748,2.4509 +5.7482,2.4605 +6.7096,2.47 +7.65,2.4796 +8.5604,2.4891 +9.432,2.4986 +10.2567,2.5082 +11.0265,2.5177 +11.7342,2.5272 +12.3728,2.5368 +12.9365,2.5463 +13.4198,2.5558 +13.8181,2.5654 +14.1276,2.5749 +14.3453,2.5845 +14.4692,2.594 +14.4982,2.6035 +14.4318,2.6131 +14.2708,2.6226 +14.0167,2.6321 +13.6719,2.6417 +13.2398,2.6512 +12.7243,2.6608 +12.1305,2.6703 +11.4639,2.6798 +10.731,2.6894 +9.9387,2.6989 +9.0946,2.7084 +8.2067,2.718 +7.2835,2.7275 +6.3338,2.737 +5.3665,2.7466 +4.3911,2.7561 +3.4166,2.7466 +2.4525,2.7561 +1.5079,2.7466 +0.5918,2.737 +-0.287,2.7275 +-1.1202,2.718 +-1.8999,2.7084 +-2.6186,2.6989 +-3.2695,2.6894 +-3.8463,2.6798 +-4.3436,2.6703 +-4.7566,2.6608 +-5.0814,2.6512 +-5.3149,2.6417 +-5.4549,2.6321 +-5.5,2.6226 +-5.4498,2.6131 +-5.3048,2.6035 +-5.0664,2.594 +-4.7368,2.5845 +-4.3192,2.5749 +-3.8175,2.5654 +-3.2366,2.5558 +-2.582,2.5654 +-1.8599,2.5558 +-1.0772,2.5654 +-0.2413,2.5749 +0.6397,2.5845 +1.5575,2.594 +2.5034,2.6035 +3.4683,2.6131 +4.443,2.6226 +5.4183,2.6321 +6.3848,2.6417 +7.3333,2.6512 +8.2549,2.6608 +9.1407,2.6703 +9.9822,2.6798 +10.7715,2.6894 +11.5011,2.6989 +12.1639,2.7084 +12.7537,2.718 +13.2649,2.7275 +13.6925,2.737 +14.0326,2.7466 +14.2817,2.7561 +14.4377,2.7657 +14.499,2.7752 +14.465,2.7847 +14.3361,2.7943 +14.1134,2.8038 +13.7991,2.8133 +13.3962,2.8229 +12.9085,2.8324 +12.3407,2.8419 +11.6982,2.8515 +10.9871,2.861 +10.2142,2.8706 +9.3868,2.8801 +8.5128,2.8896 +7.6006,2.8992 +6.6589,2.9087 +5.6966,2.9182 +4.7229,2.9278 +3.7471,2.9182 +2.7784,2.9278 +1.8262,2.9182 +0.8994,2.9087 +0.0069,2.8992 +-0.8427,2.8896 +-1.6414,2.8801 +-2.3817,2.8706 +-3.0563,2.861 +-3.6589,2.8515 +-4.1838,2.8419 +-4.6259,2.8324 +-4.9811,2.8229 +-5.2459,2.8133 +-5.4179,2.8038 +-5.4953,2.7943 +-5.4775,2.7847 +-5.3646,2.7752 +-5.1578,2.7657 +-4.8588,2.7561 +-4.4707,2.7466 +-3.9972,2.737 +-3.4426,2.7275 +-2.8124,2.718 +-2.1125,2.7084 +-1.3495,2.718 +-0.5309,2.7275 +0.3358,2.737 +1.242,2.7466 +2.1794,2.7561 +3.1388,2.7657 +4.1113,2.7752 +5.0874,2.7847 +6.0579,2.7943 +7.0136,2.8038 +7.9453,2.8133 +8.8442,2.8229 +9.7017,2.8324 +10.5097,2.8419 +11.2603,2.8515 +11.9466,2.861 +12.5619,2.8706 +13.1003,2.8801 +13.5568,2.8896 +13.927,2.8992 +14.2074,2.9087 +14.3953,2.9182 +14.4889,2.9278 +14.4873,2.9373 +14.3905,2.9469 +14.1995,2.9564 +13.916,2.9659 +13.5428,2.9755 +13.0835,2.985 +12.5423,2.9945 +11.9245,3.0041 +11.236,3.0136 +10.4833,3.0231 +9.6736,3.0327 +8.8145,3.0422 +7.9144,3.0518 +6.9817,3.0613 +6.0254,3.0708 +5.0545,3.0804 +4.0783,3.0708 +3.1062,3.0804 +2.1473,3.0708 +1.2109,3.0613 +0.3058,3.0518 +-0.5593,3.0422 +-1.3762,3.0327 +-2.1371,3.0231 +-2.8348,3.0136 +-3.4626,3.0041 +-4.0145,2.9945 +-4.4853,2.985 +-4.8704,2.9755 +-5.1662,2.9659 +-5.37,2.9564 +-5.4797,2.9469 +-5.4943,2.9373 +-5.4136,2.9278 +-5.2385,2.9182 +-4.9706,2.9087 +-4.6124,2.8992 +-4.1674,2.8896 +-3.6398,2.8801 +-3.0347,2.8706 +-2.3577,2.861 +-1.6154,2.8706 +-0.8148,2.8801 +0.0364,2.8896 +0.9301,2.8992 +1.8579,2.9087 +2.8109,2.9182 +3.7799,2.9278 +4.7558,2.9373 +5.7293,2.9469 +6.6911,2.9564 +7.6319,2.9659 +8.543,2.9755 +9.4155,2.985 +10.2412,2.9945 +11.0121,3.0041 +11.721,3.0136 +12.3611,3.0231 +12.9263,3.0327 +13.4112,3.0422 +13.8112,3.0518 +14.1224,3.0613 +14.342,3.0708 +14.4677,3.0804 +14.4985,3.0899 +14.434,3.0994 +14.2749,3.109 +14.0225,3.1185 +13.6795,3.1281 +13.249,3.1376 +12.7351,3.1471 +12.1427,3.1567 +11.4775,3.1662 +10.7458,3.1757 +9.9546,3.1853 +9.1115,3.1948 +8.2243,3.2043 +7.3017,3.2139 +6.3524,3.2234 +5.3855,3.233 +4.4101,3.2234 +3.4355,3.233 +2.4711,3.2234 +1.5261,3.2139 +0.6093,3.2043 +-0.2703,3.1948 +-1.1045,3.1853 +-1.8853,3.1757 +-2.6052,3.1662 +-3.2575,3.1567 +-3.8358,3.1471 +-4.3347,3.1376 +-4.7494,3.1281 +-5.0759,3.1185 +-5.3112,3.109 +-5.453,3.0994 +-5.5,3.0899 +-5.4517,3.0804 +-5.3085,3.0708 +-5.0719,3.0613 +-4.7441,3.0518 +-4.3281,3.0422 +-3.8281,3.0327 +-3.2487,3.0231 +-2.5954,3.0136 +-1.8746,3.0231 +-1.093,3.0136 +-0.2581,3.0231 +0.6222,3.0327 +1.5394,3.0422 +2.4848,3.0518 +3.4494,3.0613 +4.424,3.0708 +5.3994,3.0804 +6.3661,3.0899 +7.3151,3.0994 +8.2373,3.109 +9.1238,3.1185 +9.9663,3.1281 +10.7567,3.1376 +11.4875,3.1471 +12.1517,3.1567 +12.743,3.1662 +13.2557,3.1757 +13.685,3.1853 +14.0268,3.1948 +14.2778,3.2043 +14.4356,3.2139 +14.4987,3.2234 +14.4666,3.233 +14.3395,3.2425 +14.1186,3.252 +13.8061,3.2616 +13.4049,3.2711 +12.9188,3.2806 +12.3525,3.2902 +11.7114,3.2997 +11.0015,3.3093 +10.2297,3.3188 +9.4033,3.3283 +8.5302,3.3379 +7.6187,3.3474 +6.6775,3.3569 +5.7155,3.3665 +4.7419,3.3569 +3.766,3.3665 +2.7971,3.3569 +1.8445,3.3474 +0.9171,3.3379 +0.0239,3.3283 +-0.8266,3.3188 +-1.6264,3.3093 +-2.3679,3.2997 +-3.0438,3.2902 +-3.6479,3.2806 +-4.1744,3.2711 +-4.6182,3.2616 +-4.975,3.252 +-5.2417,3.2425 +-5.4154,3.233 +-5.4947,3.2234 +-5.4788,3.2139 +-5.3677,3.2043 +-5.1627,3.1948 +-4.8655,3.1853 +-4.4791,3.1757 +-4.0072,3.1662 +-3.4541,3.1567 +-2.8253,3.1471 +-2.1267,3.1376 +-1.3649,3.1281 +-0.5473,3.1376 +0.3185,3.1471 +1.2241,3.1567 +2.1609,3.1662 +3.12,3.1757 +4.0923,3.1853 +5.0684,3.1948 +6.0391,3.2043 +6.9952,3.2139 +7.9275,3.2234 +8.8271,3.233 +9.6855,3.2425 +10.4945,3.252 +11.2463,3.2616 +11.9339,3.2711 +12.5506,3.2806 +13.0906,3.2902 +13.5488,3.2997 +13.9207,3.3093 +14.2028,3.3188 +14.3925,3.3283 +14.488,3.3379 +14.4882,3.3474 +14.3933,3.3569 +14.2041,3.3665 +13.9224,3.376 +13.5509,3.3855 +13.0932,3.3951 +12.5536,3.4046 +11.9373,3.4142 +11.25,3.4237 +10.4985,3.4332 +9.6898,3.4428 +8.8317,3.4523 +7.9322,3.4618 +7.0001,3.4714 +6.0441,3.4809 +5.0735,3.4714 +4.0973,3.4809 +3.125,3.4714 +2.1658,3.4618 +1.2289,3.4523 +0.3231,3.4428 +-0.5429,3.4332 +-1.3608,3.4237 +-2.1229,3.4142 +-2.8219,3.4046 +-3.4511,3.3951 +-4.0045,3.3855 +-4.4769,3.376 +-4.8637,3.3665 +-5.1614,3.3569 +-5.3669,3.3474 +-5.4784,3.3379 +-5.4949,3.3283 +-5.4161,3.3188 +-5.2428,3.3093 +-4.9767,3.2997 +-4.6202,3.2902 +-4.1769,3.2806 +-3.6508,3.2711 +-3.0471,3.2616 +-2.3715,3.252 +-1.6304,3.2425 +-0.8309,3.233 +0.0194,3.2425 +0.9124,3.252 +1.8396,3.2616 +2.7922,3.2711 +3.761,3.2806 +4.7368,3.2902 +5.7105,3.2997 +6.6725,3.3093 +7.6139,3.3188 +8.5256,3.3283 +9.3989,3.3379 +10.2256,3.3474 +10.9977,3.3569 +11.7079,3.3665 +12.3494,3.376 +12.9161,3.3855 +13.4026,3.3951 +13.8042,3.4046 +14.1172,3.4142 +14.3386,3.4237 +14.4662,3.4332 +14.4988,3.4428 +14.4362,3.4523 +14.2788,3.4618 +14.0283,3.4714 +13.687,3.4809 +13.2582,3.4904 +12.7458,3.5 +12.155,3.5095 +11.4911,3.5191 +10.7607,3.5286 +9.9706,3.5381 +9.1283,3.5477 +8.242,3.5572 +7.32,3.5667 +6.3711,3.5763 +5.4044,3.5858 +4.4291,3.5763 +3.4544,3.5667 +2.4897,3.5572 +1.5442,3.5477 +0.6268,3.5381 +-0.2536,3.5286 +-1.0888,3.5191 +-1.8707,3.5095 +-2.5919,3.5 +-3.2455,3.4904 +-3.8253,3.4809 +-4.3258,3.4714 +-4.7421,3.4618 +-5.0704,3.4523 +-5.3075,3.4428 +-5.4512,3.4332 +-5.5,3.4237 +-5.4535,3.4142 +-5.3122,3.4046 +-5.0774,3.3951 +-4.7513,3.3855 +-4.337,3.376 +-3.8386,3.3665 +-3.2607,3.3569 +-2.6088,3.3474 +-1.8892,3.3379 +-1.1087,3.3283 +-0.2748,3.3379 +0.6047,3.3474 +1.5212,3.3569 +2.4662,3.3665 +3.4305,3.376 +4.405,3.3855 +5.3804,3.3951 +6.3475,3.4046 +7.2969,3.4142 +8.2197,3.4237 +9.107,3.4332 +9.9504,3.4428 +10.7419,3.4523 +11.4739,3.4618 +12.1395,3.4714 +12.7322,3.4809 +13.2465,3.4904 +13.6775,3.5 +14.021,3.5095 +14.2738,3.5191 +14.4334,3.5286 +14.4984,3.5381 +14.4681,3.5477 +14.3429,3.5572 +14.1238,3.5667 +13.813,3.5763 +13.4135,3.5858 +12.929,3.5954 +12.3642,3.6049 +11.7245,3.6144 +11.0159,3.624 +10.2453,3.6335 +9.4199,3.643 +8.5476,3.6526 +7.6367,3.6621 +6.696,3.6716 +5.7343,3.6812 +4.7609,3.6716 +3.785,3.6621 +2.8158,3.6526 +1.8628,3.643 +0.9349,3.6335 +0.0409,3.624 +-0.8106,3.6144 +-1.6114,3.6049 +-2.354,3.5954 +-3.0314,3.5858 +-3.6369,3.5763 +-4.1649,3.5667 +-4.6103,3.5572 +-4.969,3.5477 +-5.2373,3.5381 +-5.4129,3.5286 +-5.4941,3.5191 +-5.48,3.5095 +-5.3708,3.5 +-5.1675,3.4904 +-4.8722,3.4809 +-4.4875,3.4714 +-4.0171,3.4618 +-3.4656,3.4523 +-2.8382,3.4428 +-2.1409,3.4332 +-1.3803,3.4237 +-0.5637,3.4332 +0.3012,3.4428 +1.2061,3.4523 +2.1424,3.4618 +3.1012,3.4714 +4.0733,3.4809 +5.0494,3.4904 +6.0204,3.5 +6.9768,3.5095 +7.9096,3.5191 +8.81,3.5286 +9.6692,3.5381 +10.4793,3.5477 +11.2323,3.5572 +11.9212,3.5667 +12.5393,3.5763 +13.0809,3.5858 +13.5407,3.5954 +13.9143,3.6049 +14.1982,3.6144 +14.3897,3.624 +14.487,3.6335 +14.4891,3.643 +14.396,3.6526 +14.2086,3.6621 +13.9287,3.6716 +13.559,3.6812 +13.1029,3.6907 +12.5648,3.7003 +11.9499,3.7098 +11.264,3.7193 +10.5137,3.7289 +9.706,3.7384 +8.8488,3.7479 +7.9501,3.7575 +7.0185,3.767 +6.0629,3.7766 +5.0924,3.767 +4.1163,3.7575 +3.1438,3.7479 +2.1843,3.7384 +1.2468,3.7289 +0.3403,3.7193 +-0.5265,3.7098 +-1.3454,3.7003 +-2.1087,3.6907 +-2.8089,3.6812 +-3.4395,3.6716 +-3.9945,3.6621 +-4.4685,3.6526 +-4.8571,3.643 +-5.1564,3.6335 +-5.3638,3.624 +-5.4772,3.6144 +-5.4955,3.6049 +-5.4185,3.5954 +-5.2471,3.5858 +-4.9827,3.5763 +-4.628,3.5667 +-4.1863,3.5572 +-3.6618,3.5477 +-3.0596,3.5381 +-2.3853,3.5286 +-1.6454,3.5191 +-0.847,3.5095 +0.0024,3.5191 +0.8947,3.5286 +1.8213,3.5381 +2.7734,3.5477 +3.742,3.5572 +4.7179,3.5667 +5.6916,3.5763 +6.654,3.5858 +7.5958,3.5954 +8.5082,3.6049 +9.3824,3.6144 +10.21,3.624 +10.9832,3.6335 +11.6947,3.643 +12.3376,3.6526 +12.9058,3.6621 +13.3939,3.6716 +13.7972,3.6812 +14.112,3.6907 +14.3352,3.7003 +14.4646,3.7098 +14.4991,3.7193 +14.4383,3.7289 +14.2828,3.7384 +14.0341,3.7479 +13.6945,3.7575 +13.2673,3.767 +12.7566,3.7766 +12.1672,3.7861 +11.5047,3.7956 +10.7755,3.8052 +9.9865,3.8147 +9.1451,3.8242 +8.2596,3.8338 +7.3382,3.8433 +6.3897,3.8528 +5.4233,3.8433 +4.4481,3.8338 +3.4733,3.8242 +2.5083,3.8147 +1.5623,3.8052 +0.6444,3.7956 +-0.2369,3.7861 +-1.073,3.7766 +-1.856,3.767 +-2.5785,3.7575 +-3.2335,3.7479 +-3.8147,3.7384 +-4.3168,3.7289 +-4.7349,3.7193 +-5.0649,3.7098 +-5.3038,3.7003 +-5.4493,3.6907 +-5.5,3.6812 +-5.4553,3.6716 +-5.3158,3.6621 +-5.0828,3.6526 +-4.7585,3.643 +-4.3459,3.6335 +-3.8491,3.624 +-3.2726,3.6144 +-2.6221,3.6049 +-1.9038,3.5954 +-1.1244,3.5858 +-0.2914,3.5763 +0.5872,3.5858 +1.5031,3.5954 +2.4476,3.6049 +3.4116,3.6144 +4.386,3.624 +5.3615,3.6335 +6.3288,3.643 +7.2786,3.6526 +8.202,3.6621 +9.0901,3.6716 +9.9345,3.6812 +10.7271,3.6907 +11.4603,3.7003 +12.1272,3.7098 +12.7214,3.7193 +13.2373,3.7289 +13.6699,3.7384 +14.0152,3.7479 +14.2697,3.7575 +14.4312,3.767 +14.4981,3.7766 +14.4696,3.7861 +14.3462,3.7956 +14.1289,3.8052 +13.8199,3.8147 +13.4221,3.8242 +12.9392,3.8338 +12.376,3.8433 +11.7376,3.8528 +11.0303,3.8624 +10.2608,3.8719 +9.4364,3.8815 +8.565,3.891 +7.6548,3.9005 +6.7145,3.9101 +5.7532,3.9005 +4.7799,3.891 +3.8039,3.8815 +2.8346,3.8719 +1.8811,3.8624 +0.9526,3.8528 +0.0579,3.8433 +-0.7945,3.8338 +-1.5964,3.8242 +-2.3402,3.8147 +-3.0188,3.8052 +-3.6258,3.7956 +-4.1554,3.7861 +-4.6025,3.7766 +-4.9628,3.767 +-5.233,3.7575 +-5.4104,3.7479 +-5.4934,3.7384 +-5.4812,3.7289 +-5.3738,3.7193 +-5.1724,3.7098 +-4.8788,3.7003 +-4.4958,3.6907 +-4.0271,3.6812 +-3.4771,3.6716 +-2.8511,3.6621 +-2.1551,3.6526 +-1.3957,3.643 +-0.58,3.6335 +0.284,3.643 +1.1882,3.6526 +2.124,3.6621 +3.0824,3.6716 +4.0543,3.6812 +5.0305,3.6907 +6.0016,3.7003 +6.9584,3.7098 +7.8918,3.7193 +8.7928,3.7289 +9.653,3.7384 +10.464,3.7479 +11.2182,3.7575 +11.9084,3.767 +12.528,3.7766 +13.0711,3.7861 +13.5325,3.7956 +13.9079,3.8052 +14.1936,3.8147 +14.3869,3.8242 +14.486,3.8338 +14.49,3.8433 +14.3987,3.8528 +14.2132,3.8624 +13.935,3.8719 +13.567,3.8815 +13.1126,3.891 +12.5761,3.9005 +11.9626,3.9101 +11.278,3.9196 +10.5289,3.9291 +9.7222,3.9387 +8.8659,3.9482 +7.9679,3.9577 +7.0369,3.9673 +6.0817,3.9577 +5.1114,3.9482 +4.1353,3.9387 +3.1627,3.9291 +2.2028,3.9196 +1.2648,3.9101 +0.3576,3.9005 +-0.5101,3.891 +-1.33,3.8815 +-2.0944,3.8719 +-2.796,3.8624 +-3.428,3.8528 +-3.9845,3.8433 +-4.4601,3.8338 +-4.8503,3.8242 +-5.1515,3.8147 +-5.3607,3.8052 +-5.4759,3.7956 +-5.496,3.7861 +-5.4209,3.7766 +-5.2513,3.767 +-4.9887,3.7575 +-4.6357,3.7479 +-4.1957,3.7384 +-3.6728,3.7289 +-3.072,3.7193 +-2.3991,3.7098 +-1.6604,3.7003 +-0.863,3.6907 +-0.0145,3.7003 +0.877,3.7098 +1.803,3.7193 +2.7547,3.7289 +3.7231,3.7384 +4.6989,3.7479 +5.6727,3.7575 +6.6354,3.767 +7.5778,3.7766 +8.4908,3.7861 +9.3658,3.7956 +10.1944,3.8052 +10.9688,3.8147 +11.6815,3.8242 +12.3258,3.8338 +12.8955,3.8433 +13.3852,3.8528 +13.7902,3.8624 +14.1067,3.8719 +14.3317,3.8815 +14.463,3.891 +14.4993,3.9005 +14.4404,3.9101 +14.2867,3.9196 +14.0398,3.9291 +13.702,3.9387 +13.2764,3.9482 +12.7673,3.9577 +12.1794,3.9673 +11.5182,3.9768 +10.7903,3.9864 +10.0023,3.9959 +9.162,4.0054 +8.2772,4.015 +7.3564,4.0245 +6.4084,4.034 +5.4422,4.0285 +4.4671,4.0189 +3.4922,4.0094 +2.527,3.9999 +1.5805,3.9903 +0.6619,3.9808 +-0.2202,3.9713 +-1.0572,3.9617 +-1.8413,3.9522 +-2.565,3.9427 +-3.2214,3.9331 +-3.8042,3.9236 +-4.3078,3.914 +-4.7276,3.9045 +-5.0593,3.895 +-5.3,3.8854 +-5.4474,3.8759 +-5.4999,3.8664 +-5.4571,3.8568 +-5.3195,3.8473 +-5.0882,3.8378 +-4.7656,3.8282 +-4.3548,3.8187 +-3.8595,3.8091 +-3.2846,3.7996 +-2.6355,3.7901 +-1.9184,3.7805 +-1.1401,3.771 +-0.3081,3.7805 +0.5697,3.7901 +1.485,3.7996 +2.429,3.8091 +3.3927,3.8187 +4.367,3.8282 +5.3426,3.8378 +6.3101,3.8473 +7.2604,3.8568 +8.1844,3.8664 +9.0732,3.8759 +9.9185,3.8854 +10.7122,3.895 +11.4466,3.9045 +12.1149,3.914 +12.7106,3.9236 +13.2281,3.9331 +13.6623,3.9427 +14.0093,3.9522 +14.2657,3.9617 +14.429,3.9713 +14.4977,3.9808 +14.4711,3.9903 +14.3495,3.9999 +14.134,4.0094 +13.8268,4.0189 +13.4306,4.0285 +12.9494,4.038 +12.3876,4.0476 +11.7507,4.0571 +11.0447,4.0666 +10.2763,4.0762 +9.4529,4.0857 +8.5823,4.0952 +7.6728,4.1048 +6.733,4.1143 +5.772,4.1239 +4.7989,4.1143 +3.8229,4.1048 +2.8533,4.0952 +1.8995,4.0857 +0.9704,4.0762 +0.0749,4.0666 +-0.7783,4.0571 +-1.5813,4.0476 +-2.3263,4.038 +-3.0063,4.0285 +-3.6148,4.0189 +-4.1459,4.0094 +-4.5946,3.9999 +-4.9567,3.9903 +-5.2286,3.9808 +-5.4079,3.9713 +-5.4927,3.9617 +-5.4823,3.9522 +-5.3768,3.9427 +-5.1772,3.9331 +-4.8853,3.9236 +-4.5041,3.914 +-4.037,3.9045 +-3.4885,3.895 +-2.864,3.8854 +-2.1693,3.8759 +-1.411,3.8664 +-0.5964,3.8568 +0.2668,3.8664 +1.1703,3.8568 +2.1055,3.8664 +3.0636,3.8759 +4.0353,3.8854 +5.0115,3.895 +5.9828,3.9045 +6.94,3.914 +7.8739,3.9236 +8.7757,3.9331 +9.6367,3.9427 +10.4488,3.9522 +11.2041,3.9617 +11.8956,3.9713 +12.5167,3.9808 +13.0613,3.9903 +13.5244,3.9999 +13.9014,4.0094 +14.1889,4.0189 +14.384,4.0285 +14.485,4.038 +14.4908,4.0476 +14.4014,4.0571 +14.2177,4.0666 +13.9413,4.0762 +13.575,4.0857 +13.1222,4.0952 +12.5873,4.1048 +11.9752,4.1143 +11.292,4.1239 +10.544,4.1334 +9.7384,4.1429 +8.8829,4.1525 +7.9857,4.162 +7.0552,4.1715 +6.1004,4.1811 +5.1303,4.1715 +4.1543,4.162 +3.1815,4.1525 +2.2213,4.1429 +1.2828,4.1334 +0.3749,4.1239 +-0.4936,4.1143 +-1.3146,4.1048 +-2.0801,4.0952 +-2.783,4.0857 +-3.4164,4.0762 +-3.9744,4.0666 +-4.4516,4.0571 +-4.8436,4.0476 +-5.1465,4.038 +-5.3575,4.0285 +-5.4745,4.0189 +-5.4965,4.0094 +-5.4233,3.9999 +-5.2555,3.9903 +-4.9947,3.9808 +-4.6434,3.9713 +-4.2051,3.9617 +-3.6837,3.9522 +-3.0844,3.9427 +-2.4128,3.9331 +-1.6754,3.9236 +-0.879,3.914 +-0.0315,3.9045 +0.8593,3.914 +1.7847,3.9236 +2.736,3.9331 +3.7042,3.9427 +4.6799,3.9522 +5.6539,3.9617 +6.6169,3.9713 +7.5597,3.9808 +8.4734,3.9903 +9.3492,3.9999 +10.1788,4.0094 +10.9543,4.0189 +11.6682,4.0285 +12.3139,4.038 +12.8851,4.0476 +13.3765,4.0571 +13.7832,4.0666 +14.1014,4.0762 +14.3282,4.0857 +14.4613,4.0952 +14.4995,4.1048 +14.4424,4.1143 +14.2906,4.1239 +14.0455,4.1334 +13.7094,4.1429 +13.2855,4.1525 +12.778,4.162 +12.1915,4.1715 +11.5318,4.1811 +10.805,4.1906 +10.0182,4.2001 +9.1788,4.2097 +8.2948,4.2192 +7.3746,4.2288 +6.427,4.2383 +5.4611,4.2288 +4.486,4.2192 +3.5111,4.2097 +2.5456,4.2001 +1.5987,4.1906 +0.6794,4.1811 +-0.2034,4.1715 +-1.0414,4.162 +-1.8266,4.1525 +-2.5516,4.1429 +-3.2093,4.1334 +-3.7936,4.1239 +-4.2988,4.1143 +-4.7202,4.1048 +-5.0537,4.0952 +-5.2962,4.0857 +-5.4454,4.0762 +-5.4998,4.0666 +-5.4588,4.0571 +-5.323,4.0476 +-5.0936,4.038 +-4.7728,4.0285 +-4.3636,4.0189 +-3.8699,4.0094 +-3.2965,3.9999 +-2.6488,3.9903 +-1.9329,3.9808 +-1.1558,3.9713 +-0.3248,3.9617 +0.5523,3.9713 +1.4669,3.9808 +2.4104,3.9903 +3.3739,3.9999 +4.348,4.0094 +5.3237,4.0189 +6.2914,4.0285 +7.2421,4.038 +8.1667,4.0476 +9.0563,4.0571 +9.9026,4.0666 +10.6973,4.0762 +11.433,4.0857 +12.1026,4.0952 +12.6997,4.1048 +13.2188,4.1143 +13.6547,4.1239 +14.0034,4.1334 +14.2616,4.1429 +14.4267,4.1525 +14.4972,4.162 +14.4725,4.1715 +14.3528,4.1811 +14.1391,4.1906 +13.8336,4.2001 +13.4392,4.2097 +12.9595,4.2192 +12.3993,4.2288 +11.7638,4.2383 +11.0591,4.2478 +10.2918,4.2574 +9.4694,4.2669 +8.5996,4.2764 +7.6908,4.286 +6.7516,4.2955 +5.7909,4.286 +4.8178,4.2764 +3.8418,4.2669 +2.8721,4.2574 +1.9178,4.2478 +0.9882,4.2383 +0.092,4.2288 +-0.7622,4.2192 +-1.5662,4.2097 +-2.3124,4.2001 +-2.9937,4.1906 +-3.6036,4.1811 +-4.1363,4.1715 +-4.5867,4.162 +-4.9505,4.1525 +-5.2242,4.1429 +-5.4053,4.1334 +-5.492,4.1239 +-5.4834,4.1143 +-5.3798,4.1048 +-5.182,4.0952 +-4.8919,4.0857 +-4.5123,4.0762 +-4.0469,4.0666 +-3.5,4.0571 +-2.8768,4.0476 +-2.1834,4.038 +-1.4263,4.0285 +-0.6127,4.0189 +0.2496,4.0285 +1.1524,4.038 +2.0871,4.0476 +3.0448,4.0571 +4.0164,4.0666 +4.9925,4.0762 +5.964,4.0857 +6.9215,4.0952 +7.856,4.1048 +8.7585,4.1143 +9.6204,4.1239 +10.4335,4.1334 +11.19,4.1429 +11.8828,4.1525 +12.5053,4.162 +13.0515,4.1715 +13.5162,4.1811 +13.8949,4.1906 +14.1842,4.2001 +14.3811,4.2097 +14.4839,4.2192 +14.4916,4.2288 +14.4041,4.2383 +14.2221,4.2478 +13.9476,4.2574 +13.583,4.2669 +13.1318,4.2764 +12.5984,4.286 +11.9878,4.2955 +11.3059,4.3051 +10.5591,4.3146 +9.7546,4.3241 +8.9,4.3337 +8.0035,4.3432 +7.0736,4.3527 +6.1192,4.3432 +5.1493,4.3337 +4.1732,4.3241 +3.2003,4.3146 +2.2398,4.3051 +1.3008,4.2955 +0.3922,4.286 +-0.4771,4.2764 +-1.2991,4.2669 +-2.0658,4.2574 +-2.7699,4.2478 +-3.4048,4.2383 +-3.9643,4.2288 +-4.4432,4.2192 +-4.8368,4.2097 +-5.1415,4.2001 +-5.3543,4.1906 +-5.4732,4.1811 +-5.497,4.1715 +-5.4256,4.162 +-5.2596,4.1525 +-5.0006,4.1429 +-4.6511,4.1334 +-4.2144,4.1239 +-3.6946,4.1143 +-3.0968,4.1048 +-2.4265,4.0952 +-1.6903,4.0857 +-0.8951,4.0762 +-0.0484,4.0666 +0.8416,4.0762 +1.7664,4.0666 +2.7173,4.0762 +3.6852,4.0857 +4.6609,4.0952 +5.635,4.1048 +6.5983,4.1143 +7.5416,4.1239 +8.4559,4.1334 +9.3326,4.1429 +10.1631,4.1525 +10.9397,4.162 +11.655,4.1715 +12.3021,4.1811 +12.8748,4.1906 +13.3677,4.2001 +13.7761,4.2097 +14.0961,4.2192 +14.3247,4.2288 +14.4596,4.2383 +14.4997,4.2478 +14.4445,4.2574 +14.2945,4.2669 +14.0511,4.2764 +13.7168,4.286 +13.2946,4.2955 +12.7886,4.3051 +12.2036,4.3146 +11.5453,4.3241 +10.8197,4.3337 +10.034,4.3432 +9.1955,4.3527 +8.3123,4.3623 +7.3928,4.3527 +6.4457,4.3623 +5.48,4.3527 +4.505,4.3432 +3.53,4.3337 +2.5642,4.3241 +1.6169,4.3146 +0.697,4.3051 +-0.1866,4.2955 +-1.0256,4.286 +-1.8119,4.2764 +-2.5381,4.2669 +-3.1972,4.2574 +-3.783,4.2478 +-4.2898,4.2383 +-4.7128,4.2288 +-5.0481,4.2192 +-5.2924,4.2097 +-5.4434,4.2001 +-5.4996,4.1906 +-5.4605,4.1811 +-5.3266,4.1715 +-5.099,4.162 +-4.7799,4.1525 +-4.3723,4.1429 +-3.8803,4.1334 +-3.3084,4.1239 +-2.662,4.1143 +-1.9475,4.1048 +-1.1714,4.0952 +-0.3414,4.0857 +0.5348,4.0952 +1.4488,4.0857 +2.3918,4.0952 +3.355,4.1048 +4.329,4.1143 +5.3047,4.1239 +6.2727,4.1334 +7.2239,4.1429 +8.149,4.1525 +9.0394,4.162 +9.8866,4.1715 +10.6824,4.1811 +11.4193,4.1906 +12.0902,4.2001 +12.6888,4.2097 +13.2094,4.2192 +13.6471,4.2288 +13.9975,4.2383 +14.2574,4.2478 +14.4244,4.2574 +14.4968,4.2669 +14.4739,4.2764 +14.356,4.286 +14.1441,4.2955 +13.8404,4.3051 +13.4477,4.3146 +12.9697,4.3241 +12.4109,4.3337 +11.7768,4.3432 +11.0734,4.3527 +10.3073,4.3623 +9.4859,4.3718 +8.617,4.3813 +7.7088,4.3863 +6.7701,4.3959 +5.8097,4.3863 +4.8368,4.3768 +3.8608,4.3673 +2.8908,4.3577 +1.9362,4.3482 +1.006,4.3387 +0.109,4.3291 +-0.746,4.3196 +-1.5511,4.31 +-2.2985,4.3005 +-2.9811,4.291 +-3.5925,4.2814 +-4.1267,4.2719 +-4.5787,4.2624 +-4.9443,4.2528 +-5.2198,4.2433 +-5.4027,4.2337 +-5.4912,4.2242 +-5.4845,4.2147 +-5.3827,4.2051 +-5.1867,4.1956 +-4.8984,4.1861 +-4.5205,4.1765 +-4.0567,4.167 +-3.5113,4.1575 +-2.8896,4.1479 +-2.1975,4.1384 +-1.4416,4.1288 +-0.629,4.1193 +0.2324,4.122 +1.1345,4.1125 +2.0687,4.122 +3.026,4.1315 +3.9974,4.1411 +4.9736,4.1506 +5.9452,4.1602 +6.9031,4.1697 +7.8381,4.1792 +8.7413,4.1888 +9.604,4.1983 +10.4182,4.2078 +11.1759,4.2174 +11.87,4.2269 +12.4939,4.2364 +13.0416,4.246 +13.5079,4.2555 +13.8884,4.2651 +14.1794,4.2746 +14.3782,4.2841 +14.4828,4.2937 +14.4924,4.3032 +14.4067,4.3127 +14.2266,4.3223 +13.9538,4.3318 +13.5909,4.3414 +13.1414,4.3509 +12.6095,4.3604 +12.0004,4.37 +11.3198,4.3795 +10.5742,4.389 +9.7708,4.3986 +8.9171,4.4081 +8.0213,4.4176 +7.0919,4.4272 +6.1379,4.4176 +5.1683,4.4081 +4.1922,4.3986 +3.2192,4.389 +2.2583,4.3795 +1.3188,4.37 +0.4096,4.3604 +-0.4607,4.3509 +-1.2836,4.3414 +-2.0515,4.3318 +-2.7569,4.3223 +-3.3931,4.3127 +-3.9542,4.3032 +-4.4346,4.2937 +-4.83,4.2841 +-5.1364,4.2746 +-5.351,4.2651 +-5.4718,4.2555 +-5.4975,4.246 +-5.4279,4.2364 +-5.2638,4.2269 +-5.0066,4.2174 +-4.6588,4.2078 +-4.2237,4.1983 +-3.7055,4.1888 +-3.1091,4.1792 +-2.4402,4.1697 +-1.7052,4.1602 +-0.911,4.1506 +-0.0653,4.1411 +0.8239,4.1506 +1.7482,4.1602 +2.6986,4.1697 +3.6663,4.1792 +4.6419,4.1888 +5.6161,4.1983 +6.5797,4.2078 +7.5235,4.2174 +8.4385,4.2269 +9.3159,4.2364 +10.1475,4.246 +10.9252,4.2555 +11.6417,4.2651 +12.2902,4.2746 +12.8644,4.2841 +13.3589,4.2937 +13.769,4.3032 +14.0908,4.3127 +14.3211,4.3223 +14.4579,4.3318 +14.4998,4.3414 +14.4464,4.3509 +14.2983,4.3604 +14.0567,4.37 +13.7241,4.3795 +13.3036,4.389 +12.7992,4.3986 +12.2157,4.4081 +11.5587,4.4176 +10.8345,4.4272 +10.0498,4.4367 +9.2123,4.4463 +8.3299,4.4558 +7.411,4.4653 +6.4643,4.4664 +5.4989,4.4568 +4.524,4.4473 +3.5489,4.4378 +2.5829,4.4282 +1.6351,4.4187 +0.7146,4.4092 +-0.1698,4.3996 +-1.0098,4.3901 +-1.7972,4.3806 +-2.5246,4.371 +-3.1851,4.3615 +-3.7723,4.3519 +-4.2807,4.3424 +-4.7054,4.3329 +-5.0425,4.3233 +-5.2885,4.3138 +-5.4414,4.3043 +-5.4994,4.2947 +-5.4622,4.2852 +-5.3301,4.2756 +-5.1043,4.2661 +-4.7869,4.2566 +-4.3811,4.247 +-3.8906,4.2375 +-3.3202,4.228 +-2.6753,4.2184 +-1.962,4.2089 +-1.1871,4.1994 +-0.358,4.1898 +0.5174,4.1994 +1.4307,4.2089 +2.3733,4.2184 +3.3361,4.228 +4.31,4.2375 +5.2858,4.247 +6.254,4.2566 +7.2056,4.2661 +8.1313,4.2756 +9.0225,4.2852 +9.8705,4.2947 +10.6674,4.3043 +11.4055,4.3138 +12.0778,4.3233 +12.6779,4.3329 +13.2001,4.3424 +13.6394,4.3519 +13.9915,4.3615 +14.2533,4.371 +14.422,4.3806 +14.4963,4.3901 +14.4753,4.3996 +14.3592,4.4092 +14.1492,4.4187 +13.8472,4.4282 +13.4561,4.4378 +12.9797,4.4473 +12.4225,4.4568 +11.7899,4.4664 +11.0877,4.4759 +10.3228,4.4855 +9.5024,4.495 +8.6343,4.5045 +7.7268,4.5141 +6.7886,4.5236 +5.8285,4.5141 +4.8558,4.5045 +3.8797,4.495 +2.9096,4.4855 +1.9545,4.4759 +1.0238,4.4664 +0.1261,4.4568 +-0.7298,4.4473 +-1.536,4.4378 +-2.2846,4.4282 +-2.9685,4.4187 +-3.5813,4.4092 +-4.1171,4.3996 +-4.5708,4.3901 +-4.938,4.3806 +-5.2153,4.371 +-5.4,4.3615 +-5.4904,4.3519 +-5.4855,4.3424 +-5.3856,4.3329 +-5.1914,4.3233 +-4.9049,4.3138 +-4.5287,4.3043 +-4.0665,4.2947 +-3.5227,4.2852 +-2.9024,4.2756 +-2.2116,4.2661 +-1.4569,4.2566 +-0.6453,4.247 +0.2152,4.2375 +1.1166,4.247 +2.0502,4.2375 +3.0072,4.247 +3.9784,4.2566 +4.9546,4.2661 +5.9264,4.2756 +6.8847,4.2852 +7.8202,4.2947 +8.7241,4.3043 +9.5877,4.3138 +10.4028,4.3233 +11.1617,4.3329 +11.8572,4.3424 +12.4825,4.3519 +13.0317,4.3615 +13.4997,4.371 +13.8819,4.3806 +14.1746,4.3901 +14.3752,4.3996 +14.4817,4.4092 +14.4931,4.4187 +14.4092,4.4282 +14.231,4.4378 +13.9599,4.4473 +13.5988,4.4568 +13.1509,4.4664 +12.6206,4.4759 +12.013,4.4855 +11.3337,4.495 +10.5893,4.5045 +9.7869,4.5141 +8.9341,4.5236 +8.0391,4.5331 +7.1103,4.5427 +6.1566,4.5331 +5.1872,4.5236 +4.2112,4.5141 +3.238,4.5045 +2.2768,4.495 +1.3368,4.4855 +0.4269,4.4759 +-0.4442,4.4664 +-1.2681,4.4568 +-2.0371,4.4473 +-2.7438,4.4378 +-3.3814,4.4282 +-3.944,4.4187 +-4.4261,4.4092 +-4.8231,4.3996 +-5.1313,4.3901 +-5.3477,4.3806 +-5.4703,4.371 +-5.4979,4.3615 +-5.4302,4.3519 +-5.2678,4.3424 +-5.0124,4.3329 +-4.6664,4.3233 +-4.233,4.3138 +-3.7164,4.3043 +-3.1214,4.2947 +-2.4539,4.2852 +-1.7201,4.2756 +-0.927,4.2661 +-0.0822,4.2566 +0.8063,4.2661 +1.7299,4.2566 +2.68,4.2661 +3.6474,4.2756 +4.6229,4.2852 +5.5972,4.2947 +6.5611,4.3043 +7.5054,4.3138 +8.421,4.3233 +9.2993,4.3329 +10.1318,4.3424 +10.9106,4.3519 +11.6284,4.3615 +12.2782,4.371 +12.854,4.3806 +13.3501,4.3901 +13.7618,4.3996 +14.0854,4.4092 +14.3175,4.4187 +14.4562,4.4282 +14.4999,4.4378 +14.4484,4.4473 +14.302,4.4568 +14.0623,4.4664 +13.7314,4.4759 +13.3126,4.4855 +12.8098,4.495 +12.2278,4.5045 +11.5722,4.5141 +10.8491,4.5236 +10.0656,4.5331 +9.2291,4.5427 +8.3474,4.5522 +7.4291,4.5427 +6.4829,4.5522 +5.5178,4.5427 +4.543,4.5331 +3.5678,4.5236 +2.6015,4.5141 +1.6533,4.5045 +0.7322,4.495 +-0.153,4.4855 +-0.9939,4.4759 +-1.7824,4.4664 +-2.5111,4.4568 +-3.1729,4.4473 +-3.7616,4.4378 +-4.2716,4.4282 +-4.698,4.4187 +-5.0368,4.4092 +-5.2846,4.3996 +-5.4393,4.3901 +-5.4992,4.3806 +-5.4638,4.371 +-5.3335,4.3615 +-5.1095,4.3519 +-4.794,4.3424 +-4.3898,4.3329 +-3.901,4.3233 +-3.332,4.3138 +-2.6885,4.3043 +-1.9765,4.2947 +-1.2027,4.2852 +-0.3746,4.2756 +0.5,4.2661 +1.4126,4.2566 +2.3547,4.2661 +3.3172,4.2756 +4.2911,4.2852 +5.2668,4.2947 +6.2353,4.3043 +7.1873,4.3138 +8.1136,4.3233 +9.0055,4.3329 +9.8545,4.3424 +10.6525,4.3519 +11.3918,4.3615 +12.0654,4.371 +12.667,4.3806 +13.1907,4.3901 +13.6316,4.3996 +13.9855,4.4092 +14.249,4.4187 +14.4197,4.4282 +14.4957,4.4378 +14.4766,4.4473 +14.3623,4.4568 +14.1541,4.4664 +13.8539,4.4759 +13.4646,4.4855 +12.9898,4.495 +12.4341,4.5045 +11.8028,4.5141 +11.102,4.5236 +10.3382,4.5331 +9.5188,4.5427 +8.6516,4.5522 +7.7448,4.5427 +6.807,4.5522 +5.8473,4.5427 +4.8748,4.5331 +3.8987,4.5236 +2.9283,4.5141 +1.9729,4.5045 +1.0416,4.495 +0.1432,4.4855 +-0.7136,4.4759 +-1.5208,4.4664 +-2.2706,4.4568 +-2.9559,4.4473 +-3.5701,4.4378 +-4.1074,4.4282 +-4.5627,4.4187 +-4.9317,4.4092 +-5.2108,4.3996 +-5.3973,4.3901 +-5.4895,4.3806 +-5.4866,4.371 +-5.3884,4.3615 +-5.1961,4.3519 +-4.9113,4.3424 +-4.5369,4.3329 +-4.0763,4.3233 +-3.534,4.3138 +-2.9152,4.3043 +-2.2257,4.2947 +-1.4721,4.2852 +-0.6616,4.2756 +0.1981,4.2661 +1.0987,4.2566 +2.0318,4.2661 +2.9884,4.2756 +3.9594,4.2852 +4.9356,4.2947 +5.9076,4.3043 +6.8662,4.3138 +7.8023,4.3233 +8.7068,4.3329 +9.5713,4.3424 +10.3875,4.3519 +11.1476,4.3615 +11.8443,4.371 +12.471,4.3806 +13.0218,4.3901 +13.4914,4.3996 +13.8753,4.4092 +14.1698,4.4187 +14.3722,4.4282 +14.4806,4.4378 +14.4938,4.4473 +14.4118,4.4568 +14.2353,4.4664 +13.9661,4.4759 +13.6067,4.4855 +13.1605,4.495 +12.6317,4.5045 +12.0255,4.5141 +11.3476,4.5236 +10.6044,4.5331 +9.803,4.5427 +8.9511,4.5522 +8.0568,4.5451 +7.1286,4.5547 +6.1754,4.5451 +5.2062,4.5356 +4.2302,4.5261 +3.2568,4.5165 +2.2953,4.507 +1.3548,4.4975 +0.4443,4.4879 +-0.4276,4.4784 +-1.2526,4.4689 +-2.0227,4.4593 +-2.7307,4.4498 +-3.3697,4.4402 +-3.9338,4.4307 +-4.4175,4.4212 +-4.8162,4.4116 +-5.1262,4.4021 +-5.3444,4.3926 +-5.4688,4.383 +-5.4983,4.3735 +-5.4324,4.364 +-5.2719,4.3544 +-5.0183,4.3449 +-4.674,4.3353 +-4.2422,4.3258 +-3.7272,4.3163 +-3.1337,4.3067 +-2.4675,4.2972 +-1.7349,4.2877 +-0.9429,4.2781 +-0.0991,4.2686 +0.7886,4.2781 +1.7117,4.2877 +2.6613,4.2972 +3.6284,4.3067 +4.6039,4.3163 +5.5784,4.3258 +6.5425,4.3353 +7.4873,4.3449 +8.4035,4.3544 +9.2826,4.364 +10.1161,4.3735 +10.896,4.383 +11.6151,4.3926 +12.2663,4.4021 +12.8435,4.4116 +13.3412,4.4212 +13.7547,4.4307 +14.0799,4.4402 +14.3139,4.4498 +14.4544,4.4593 +14.5,4.4689 +14.4503,4.4784 +14.3058,4.4879 +14.0678,4.4975 +13.7387,4.507 +13.3216,4.5165 +12.8203,4.5261 +12.2398,4.5356 +11.5856,4.5451 +10.8638,4.5547 +10.0814,4.5642 +9.2458,4.5738 +8.365,4.5833 +7.4473,4.5928 +6.5015,4.5833 +5.5367,4.5738 +4.562,4.5642 +3.5867,4.5547 +2.6202,4.5451 +1.6715,4.5356 +0.7498,4.5261 +-0.1362,4.5165 +-0.978,4.507 +-1.7676,4.4975 +-2.4975,4.4879 +-3.1607,4.4784 +-3.7509,4.4689 +-4.2625,4.4593 +-4.6905,4.4498 +-5.031,4.4402 +-5.2807,4.4307 +-5.4372,4.4212 +-5.4989,4.4116 +-5.4654,4.4021 +-5.337,4.3926 +-5.1148,4.383 +-4.8009,4.3735 +-4.3985,4.364 +-3.9112,4.3544 +-3.3438,4.3449 +-2.7017,4.3353 +-1.9909,4.3258 +-1.2183,4.3163 +-0.3912,4.3067 +0.4826,4.2972 +1.3946,4.3067 +2.3362,4.2972 +3.2984,4.3067 +4.2721,4.3163 +5.2479,4.3258 +6.2166,4.3353 +7.169,4.3449 +8.0959,4.3544 +8.9886,4.364 +9.8385,4.3735 +10.6375,4.383 +11.378,4.3926 +12.053,4.4021 +12.656,4.4116 +13.1813,4.4212 +13.6239,4.4307 +13.9795,4.4402 +14.2448,4.4498 +14.4172,4.4593 +14.4952,4.4689 +14.4779,4.4784 +14.3655,4.4879 +14.1591,4.4975 +13.8606,4.507 +13.473,4.5165 +12.9998,4.5261 +12.4457,4.5356 +11.8158,4.5451 +11.1162,4.5547 +10.3536,4.5642 +9.5352,4.5738 +8.6688,4.5833 +7.7627,4.5928 +6.8255,4.6024 +5.8662,4.5928 +4.8938,4.5833 +3.9177,4.5738 +2.9471,4.5642 +1.9913,4.5547 +1.0594,4.5451 +0.1603,4.5356 +-0.6974,4.5261 +-1.5056,4.5165 +-2.2566,4.507 +-2.9432,4.4975 +-3.5589,4.4879 +-4.0978,4.4784 +-4.5547,4.4689 +-4.9254,4.4593 +-5.2062,4.4498 +-5.3946,4.4402 +-5.4886,4.4307 +-5.4875,4.4212 +-5.3912,4.4116 +-5.2007,4.4021 +-4.9177,4.3926 +-4.545,4.383 +-4.0861,4.3735 +-3.5453,4.364 +-2.9279,4.3544 +-2.2397,4.3449 +-1.4873,4.3353 +-0.6779,4.3258 +0.1809,4.3163 +1.0809,4.3258 +2.0134,4.3163 +2.9697,4.3258 +3.9405,4.3353 +4.9166,4.3449 +5.8888,4.3544 +6.8478,4.364 +7.7843,4.3735 +8.6896,4.383 +9.555,4.3926 +10.3721,4.4021 +11.1334,4.4116 +11.8314,4.4212 +12.4595,4.4307 +13.0118,4.4402 +13.483,4.4498 +13.8686,4.4593 +14.165,4.4689 +14.3692,4.4784 +14.4793,4.4879 +14.4944,4.4975 +14.4143,4.507 +14.2396,4.5165 +13.9722,4.5261 +13.6145,4.5356 +13.1699,4.5451 +12.6428,4.5547 +12.038,4.5642 +11.3614,4.5738 +10.6194,4.5833 +9.8191,4.5928 +8.9681,4.6024 +8.0746,4.6119 +7.1469,4.6214 +6.1941,4.6119 +5.2251,4.6024 +4.2492,4.5928 +3.2757,4.5833 +2.3139,4.5738 +1.3728,4.5642 +0.4616,4.5547 +-0.4111,4.5451 +-1.237,4.5356 +-2.0083,4.5261 +-2.7175,4.5165 +-3.358,4.507 +-3.9236,4.4975 +-4.4089,4.4879 +-4.8093,4.4784 +-5.121,4.4689 +-5.3411,4.4593 +-5.4673,4.4498 +-5.4986,4.4402 +-5.4346,4.4307 +-5.2759,4.4212 +-5.0241,4.4116 +-4.6815,4.4021 +-4.2514,4.3926 +-3.7379,4.383 +-3.146,4.3735 +-2.4811,4.364 +-1.7498,4.3544 +-0.9589,4.3449 +-0.1159,4.3353 +0.771,4.3449 +1.6934,4.3353 +2.6426,4.3449 +3.6095,4.3544 +4.5849,4.364 +5.5595,4.3735 +6.5239,4.383 +7.4691,4.3926 +8.386,4.4021 +9.2659,4.4116 +10.1003,4.4212 +10.8814,4.4307 +11.6017,4.4402 +12.2543,4.4498 +12.833,4.4593 +13.3323,4.4689 +13.7474,4.4784 +14.0745,4.4879 +14.3102,4.4975 +14.4525,4.507 +14.5,4.5165 +14.4522,4.5261 +14.3095,4.5356 +14.0733,4.5451 +13.746,4.5547 +13.3305,4.5642 +12.8309,4.5738 +12.2519,4.5833 +11.599,4.5928 +10.8784,4.6024 +10.0971,4.6119 +9.2625,4.6214 +8.3825,4.631 +7.4654,4.6214 +6.5202,4.631 +5.5556,4.6214 +4.581,4.6119 +3.6057,4.6024 +2.6388,4.5928 +1.6897,4.5833 +0.7674,4.5738 +-0.1194,4.5642 +-0.9621,4.5547 +-1.7528,4.5451 +-2.4839,4.5356 +-3.1485,4.5261 +-3.7401,4.5165 +-4.2533,4.507 +-4.683,4.4975 +-5.0253,4.4879 +-5.2767,4.4784 +-5.435,4.4689 +-5.4987,4.4593 +-5.467,4.4498 +-5.3404,4.4402 +-5.12,4.4307 +-4.8079,4.4212 +-4.4071,4.4116 +-3.9215,4.4021 +-3.3556,4.3926 +-2.7149,4.383 +-2.0054,4.3735 +-1.2339,4.364 +-0.4077,4.3544 +0.4652,4.3449 +1.3765,4.3353 +2.3176,4.3449 +3.2795,4.3544 +4.2531,4.364 +5.229,4.3735 +6.1979,4.383 +7.1507,4.3926 +8.0782,4.4021 +8.9716,4.4116 +9.8224,4.4212 +10.6225,4.4307 +11.3642,4.4402 +12.0405,4.4498 +12.645,4.4593 +13.1719,4.4689 +13.6161,4.4784 +13.9734,4.4879 +14.2405,4.4975 +14.4148,4.507 +14.4946,4.5165 +14.4791,4.5261 +14.3685,4.5356 +14.164,4.5451 +13.8673,4.5547 +13.4813,4.5642 +13.0098,4.5738 +12.4572,4.5833 +11.8288,4.5928 +11.1305,4.6024 +10.369,4.6119 +9.5516,4.6214 +8.6861,4.631 +7.7807,4.6214 +6.844,4.631 +5.885,4.6214 +4.9128,4.6119 +3.9366,4.6024 +2.9658,4.5928 +2.0097,4.5833 +1.0773,4.5738 +0.1774,4.5642 +-0.6812,4.5547 +-1.4904,4.5451 +-2.2426,4.5356 +-2.9305,4.5261 +-3.5476,4.5165 +-4.088,4.507 +-4.5466,4.4975 +-4.919,4.4879 +-5.2016,4.4784 +-5.3918,4.4689 +-5.4877,4.4593 +-5.4884,4.4498 +-5.394,4.4402 +-5.2053,4.4307 +-4.9241,4.4212 +-4.5531,4.4116 +-4.0958,4.4021 +-3.5566,4.3926 +-2.9406,4.383 +-2.2538,4.3735 +-1.5025,4.364 +-0.6941,4.3544 +0.1638,4.3449 +1.063,4.3353 +1.995,4.3258 +2.9509,4.3353 +3.9215,4.3449 +4.8976,4.3544 +5.87,4.364 +6.8293,4.3735 +7.7664,4.383 +8.6723,4.3926 +9.5386,4.4021 +10.3568,4.4116 +11.1191,4.4212 +11.8184,4.4307 +12.448,4.4402 +13.0019,4.4498 +13.4747,4.4593 +13.862,4.4689 +14.1601,4.4784 +14.3661,4.4879 +14.4781,4.4975 +14.495,4.507 +14.4167,4.5165 +14.2439,4.5261 +13.9783,4.5356 +13.6223,4.5451 +13.1794,4.5547 +12.6538,4.5642 +12.0505,4.5738 +11.3752,4.5833 +10.6344,4.5928 +9.8352,4.6024 +8.9851,4.6119 +8.0923,4.6024 +7.1653,4.6119 +6.2128,4.6024 +5.244,4.5928 +4.2682,4.5833 +3.2946,4.5738 +2.3324,4.5642 +1.3909,4.5547 +0.479,4.5451 +-0.3945,4.5356 +-1.2215,4.5261 +-1.9939,4.5165 +-2.7044,4.507 +-3.3462,4.4975 +-3.9133,4.4879 +-4.4003,4.4784 +-4.8024,4.4689 +-5.1158,4.4593 +-5.3377,4.4498 +-5.4658,4.4402 +-5.4989,4.4307 +-5.4367,4.4212 +-5.2799,4.4116 +-5.0299,4.4021 +-4.689,4.3926 +-4.2606,4.383 +-3.7487,4.3735 +-3.1582,4.364 +-2.4947,4.3544 +-1.7646,4.3449 +-0.9748,4.3353 +-0.1328,4.3258 +0.7534,4.3353 +1.6752,4.3449 +2.624,4.3544 +3.5906,4.364 +4.5659,4.3735 +5.5406,4.383 +6.5053,4.3926 +7.451,4.4021 +8.3685,4.4116 +9.2492,4.4212 +10.0846,4.4307 +10.8668,4.4402 +11.5883,4.4498 +12.2423,4.4593 +12.8225,4.4689 +13.3234,4.4784 +13.7402,4.4879 +14.069,4.4975 +14.3065,4.507 +14.4507,4.5165 +14.5,4.5261 +14.454,4.5356 +14.3132,4.5451 +14.0788,4.5547 +13.7532,4.5642 +13.3394,4.5738 +12.8414,4.5833 +12.2638,4.5928 +11.6123,4.6024 +10.8931,4.6119 +10.1129,4.6214 +9.2792,4.631 +8.4,4.6405 +7.4836,4.6501 +6.5388,4.6405 +5.5745,4.631 +4.6,4.6214 +3.6246,4.6119 +2.6575,4.6024 +1.708,4.5928 +0.785,4.5833 +-0.1025,4.5738 +-0.9462,4.5642 +-1.738,4.5547 +-2.4703,4.5451 +-3.1362,4.5356 +-3.7294,4.5261 +-4.2441,4.5165 +-4.6755,4.507 +-5.0195,4.4975 +-5.2727,4.4879 +-5.4328,4.4784 +-5.4983,4.4689 +-5.4685,4.4593 +-5.3437,4.4498 +-5.1251,4.4402 +-4.8148,4.4307 +-4.4158,4.4212 +-3.9317,4.4116 +-3.3673,4.4021 +-2.728,4.3926 +-2.0198,4.383 +-1.2494,4.3735 +-0.4243,4.364 +0.4478,4.3544 +1.3585,4.364 +2.2991,4.3544 +3.2607,4.364 +4.2341,4.3735 +5.21,4.383 +6.1792,4.3926 +7.1323,4.4021 +8.0604,4.4116 +8.9546,4.4212 +9.8063,4.4307 +10.6074,4.4402 +11.3504,4.4498 +12.028,4.4593 +12.634,4.4689 +13.1624,4.4784 +13.6083,4.4879 +13.9673,4.4975 +14.2362,4.507 +14.4123,4.5165 +14.4939,4.5261 +14.4803,4.5356 +14.3716,4.5451 +14.1688,4.5547 +13.8739,4.5642 +13.4897,4.5738 +13.0198,4.5833 +12.4687,4.5928 +11.8417,4.6024 +11.1447,4.6119 +10.3844,4.6214 +9.568,4.631 +8.7033,4.6405 +7.7986,4.6501 +6.8625,4.6405 +5.9038,4.631 +4.9317,4.6214 +3.9556,4.6119 +2.9846,4.6024 +2.0281,4.5928 +1.0951,4.5833 +0.1946,4.5738 +-0.6649,4.5642 +-1.4752,4.5547 +-2.2286,4.5451 +-2.9178,4.5356 +-3.5363,4.5261 +-4.0783,4.5165 +-4.5385,4.507 +-4.9126,4.4975 +-5.197,4.4879 +-5.389,4.4784 +-5.4867,4.4689 +-5.4893,4.4593 +-5.3967,4.4498 +-5.2098,4.4402 +-4.9304,4.4307 +-4.5611,4.4212 +-4.1055,4.4116 +-3.5678,4.4021 +-2.9533,4.3926 +-2.2678,4.383 +-1.5177,4.3735 +-0.7103,4.364 +0.1467,4.3544 +1.0452,4.364 +1.9766,4.3544 +2.9321,4.364 +3.9025,4.3735 +4.8787,4.383 +5.8512,4.3926 +6.8108,4.4021 +7.7484,4.4116 +8.6551,4.4212 +9.5221,4.4307 +10.3413,4.4402 +11.1049,4.4498 +11.8055,4.4593 +12.4365,4.4689 +12.9918,4.4784 +13.4663,4.4879 +13.8553,4.4975 +14.1551,4.507 +14.363,4.5165 +14.4768,4.5261 +14.4956,4.5356 +14.4192,4.5451 +14.2482,4.5547 +13.9843,4.5642 +13.6301,4.5738 +13.1888,4.5833 +12.6648,4.5928 +12.0629,4.6024 +11.389,4.6119 +10.6494,4.6214 +9.8512,4.631 +9.0021,4.6405 +8.11,4.6501 +7.1836,4.6596 +6.2315,4.6501 +5.263,4.6405 +4.2872,4.631 +3.3134,4.6214 +2.3509,4.6119 +1.409,4.6024 +0.4964,4.5928 +-0.378,4.5833 +-1.2059,4.5738 +-1.9794,4.5642 +-2.6912,4.5547 +-3.3344,4.5451 +-3.903,4.5356 +-4.3916,4.5261 +-4.7954,4.5165 +-5.1106,4.507 +-5.3342,4.4975 +-5.4642,4.4879 +-5.4992,4.4784 +-5.4389,4.4689 +-5.2838,4.4593 +-5.0356,4.4498 +-4.6965,4.4402 +-4.2697,4.4307 +-3.7594,4.4212 +-3.1704,4.4116 +-2.5083,4.4021 +-1.7794,4.3926 +-0.9907,4.383 +-0.1496,4.3735 +0.7357,4.364 +1.657,4.3544 +2.6053,4.364 +3.5717,4.3735 +4.5469,4.383 +5.5217,4.3926 +6.4867,4.4021 +7.4328,4.4116 +8.351,4.4212 +9.2325,4.4307 +10.0688,4.4402 +10.8521,4.4498 +11.5749,4.4593 +12.2303,4.4689 +12.8119,4.4784 +13.3144,4.4879 +13.7329,4.4975 +14.0634,4.507 +14.3028,4.5165 +14.4488,4.5261 +14.4999,4.5356 +14.4558,4.5451 +14.3168,4.5547 +14.0843,4.5642 +13.7604,4.5738 +13.3483,4.5833 +12.8518,4.5928 +12.2758,4.6024 +11.6257,4.6119 +10.9077,4.6214 +10.1286,4.631 +9.2959,4.6405 +8.4175,4.6501 +7.5017,4.6405 +6.5574,4.6501 +5.5934,4.6405 +4.619,4.631 +3.6435,4.6214 +2.6762,4.6119 +1.7262,4.6024 +0.8027,4.5928 +-0.0856,4.5833 +-0.9302,4.5738 +-1.7231,4.5642 +-2.4567,4.5547 +-3.1239,4.5451 +-3.7186,4.5356 +-4.2349,4.5261 +-4.6679,4.5165 +-5.0136,4.507 +-5.2687,4.4975 +-5.4306,4.4879 +-5.498,4.4784 +-5.47,4.4689 +-5.3471,4.4593 +-5.1303,4.4498 +-4.8217,4.4402 +-4.4244,4.4307 +-3.9419,4.4212 +-3.3791,4.4116 +-2.7411,4.4021 +-2.0342,4.3926 +-1.2649,4.383 +-0.4408,4.3735 +0.4304,4.364 +1.3404,4.3544 +2.2806,4.364 +3.2418,4.3735 +4.2151,4.383 +5.1911,4.3926 +6.1604,4.4021 +7.114,4.4116 +8.0427,4.4212 +8.9376,4.4307 +9.7902,4.4402 +10.5924,4.4498 +11.3365,4.4593 +12.0155,4.4689 +12.6229,4.4784 +13.1529,4.4879 +13.6004,4.4975 +13.9612,4.507 +14.2318,4.5165 +14.4098,4.5261 +14.4932,4.5356 +14.4815,4.5451 +14.3746,4.5547 +14.1737,4.5642 +13.8805,4.5738 +13.498,4.5833 +13.0297,4.5928 +12.4801,4.6024 +11.8545,4.6119 +11.1589,4.6214 +10.3997,4.631 +9.5844,4.6405 +8.7206,4.6501 +7.8165,4.6405 +6.8809,4.6501 +5.9226,4.6405 +4.9507,4.631 +3.9746,4.6214 +3.0034,4.6119 +2.0465,4.6024 +1.113,4.5928 +0.2117,4.5833 +-0.6486,4.5738 +-1.46,4.5642 +-2.2145,4.5547 +-2.905,4.5451 +-3.525,4.5356 +-4.0685,4.5261 +-4.5304,4.5165 +-4.9062,4.507 +-5.1923,4.4975 +-5.3862,4.4879 +-5.4858,4.4784 +-5.4902,4.4689 +-5.3995,4.4593 +-5.2144,4.4498 +-4.9367,4.4402 +-4.5691,4.4307 +-4.1151,4.4212 +-3.579,4.4116 +-2.966,4.4021 +-2.2817,4.3926 +-1.5329,4.383 +-0.7265,4.3735 +0.1296,4.364 +1.0274,4.3544 +1.9583,4.3449 +2.9134,4.3544 +3.8836,4.364 +4.8597,4.3735 +5.8323,4.383 +6.7923,4.3926 +7.7304,4.4021 +8.6378,4.4116 +9.5057,4.4212 +10.3259,4.4307 +11.0906,4.4402 +11.7925,4.4498 +12.4249,4.4593 +12.9818,4.4689 +13.4579,4.4784 +13.8486,4.4879 +14.1502,4.4975 +14.3598,4.507 +14.4755,4.5165 +14.4962,4.5261 +14.4216,4.5356 +14.2524,4.5451 +13.9903,4.5547 +13.6378,4.5642 +13.1982,4.5738 +12.6757,4.5833 +12.0753,4.5928 +11.4027,4.6024 +10.6644,4.6119 +9.8673,4.6214 +9.019,4.631 +8.1277,4.6214 +7.2019,4.631 +6.2502,4.6214 +5.2819,4.6119 +4.3062,4.6024 +3.3323,4.5928 +2.3695,4.5833 +1.427,4.5738 +0.5138,4.5642 +-0.3614,4.5547 +-1.1903,4.5451 +-1.9649,4.5356 +-2.678,4.5261 +-3.3226,4.5165 +-3.8927,4.507 +-4.3829,4.4975 +-4.7884,4.4879 +-5.1053,4.4784 +-5.3308,4.4689 +-5.4626,4.4593 +-5.4994,4.4498 +-5.4409,4.4402 +-5.2878,4.4307 +-5.0413,4.4212 +-4.7039,4.4116 +-4.2789,4.4021 +-3.7701,4.3926 +-3.1826,4.383 +-2.5218,4.3735 +-1.7942,4.364 +-1.0065,4.3544 +-0.1664,4.3449 +0.7182,4.3544 +1.6388,4.364 +2.5867,4.3552 +3.5528,4.3648 +4.5279,4.3743 +5.5028,4.3838 +6.4681,4.3934 +7.4147,4.4029 +8.3335,4.4124 +9.2157,4.422 +10.053,4.4315 +10.8374,4.4411 +11.5615,4.4506 +12.2182,4.4601 +12.8014,4.4697 +13.3054,4.4792 +13.7256,4.4887 +14.0579,4.4983 +14.299,4.5078 +14.4468,4.5173 +14.4998,4.5269 +14.4576,4.5364 +14.3204,4.546 +14.0897,4.5555 +13.7675,4.565 +13.3571,4.5746 +12.8623,4.5841 +12.2877,4.5936 +11.639,4.6032 +10.9222,4.6127 +10.1443,4.6223 +9.3125,4.6318 +8.4349,4.6413 +7.5198,4.6509 +6.5759,4.6413 +5.6123,4.6318 +4.638,4.6223 +3.6624,4.6127 +2.6948,4.6032 +1.7445,4.5936 +0.8203,4.5841 +-0.0688,4.5746 +-0.9143,4.565 +-1.7082,4.5555 +-2.443,4.546 +-3.1116,4.5364 +-3.7077,4.5269 +-4.2256,4.5173 +-4.6603,4.5078 +-5.0078,4.4983 +-5.2646,4.4887 +-5.4284,4.4792 +-5.4976,4.4697 +-5.4715,4.4601 +-5.3504,4.4506 +-5.1354,4.4411 +-4.8286,4.4315 +-4.4329,4.422 +-3.9521,4.4124 +-3.3907,4.4029 +-2.7542,4.3934 +-2.0485,4.3838 +-1.2805,4.3743 +-0.4573,4.3648 +0.4131,4.3552 +1.3224,4.3648 +2.262,4.3552 +3.223,4.3648 +4.1961,4.3743 +5.1721,4.3838 +6.1417,4.3934 +7.0957,4.4029 +8.0249,4.4124 +8.9205,4.422 +9.774,4.4315 +10.5773,4.4411 +11.3226,4.4506 +12.003,4.4601 +12.6118,4.4697 +13.1433,4.4792 +13.5925,4.4887 +13.955,4.4983 +14.2275,4.5078 +14.4072,4.5173 +14.4925,4.5269 +14.4826,4.5364 +14.3776,4.546 +14.1785,4.5555 +13.8871,4.565 +13.5063,4.5746 +13.0396,4.5841 +12.4916,4.5936 +11.8674,4.6032 +11.173,4.6127 +10.4151,4.6223 +9.6007,4.6318 +8.7378,4.6413 +7.8345,4.6509 +6.8994,4.6497 +5.9414,4.6402 +4.9697,4.6306 +3.9935,4.6211 +3.0222,4.6115 +2.0649,4.602 +1.1309,4.5925 +0.2289,4.5829 +-0.6324,4.5734 +-1.4447,4.5639 +-2.2004,4.5543 +-2.8922,4.5448 +-3.5137,4.5353 +-4.0587,4.5257 +-4.5222,4.5162 +-4.8997,4.5066 +-5.1876,4.4971 +-5.3833,4.4876 +-5.4847,4.478 +-5.491,4.4685 +-5.4021,4.459 +-5.2189,4.4494 +-4.943,4.4399 +-4.5771,4.4303 +-4.1248,4.4208 +-3.5902,4.4113 +-2.9786,4.4017 +-2.2957,4.3922 +-1.548,4.3827 +-0.7427,4.3731 +0.1125,4.3636 +1.0096,4.3731 +1.9399,4.3636 +2.8946,4.3731 +3.8646,4.3827 +4.8407,4.3922 +5.8135,4.4017 +6.7738,4.4113 +7.7125,4.4208 +8.6205,4.4303 +9.4892,4.4399 +10.3105,4.4494 +11.0763,4.459 +11.7795,4.4685 +12.4133,4.478 +12.9717,4.4876 +13.4494,4.4971 +13.8418,4.5066 +14.1452,4.5162 +14.3566,4.5257 +14.4742,4.5353 +14.4967,4.5448 +14.4239,4.5543 +14.2566,4.5639 +13.9963,4.5734 +13.6455,4.5829 +13.2075,4.5925 +12.6866,4.602 +12.0877,4.6115 +11.4165,4.6211 +10.6793,4.6306 +9.8833,4.6402 +9.036,4.6497 +8.1454,4.6592 +7.2201,4.6688 +6.2689,4.6592 +5.3009,4.6497 +4.3252,4.6402 +3.3511,4.6306 +2.3881,4.6211 +1.4451,4.6115 +0.5313,4.602 +-0.3448,4.5925 +-1.1746,4.5829 +-1.9504,4.5734 +-2.6647,4.5639 +-3.3108,4.5543 +-3.8824,4.5448 +-4.3741,4.5353 +-4.7813,4.5257 +-5.1,4.5162 +-5.3273,4.5066 +-5.4609,4.4971 +-5.4996,4.4876 +-5.443,4.478 +-5.2916,4.4685 +-5.047,4.459 +-4.7113,4.4494 +-4.2879,4.4399 +-3.7808,4.4303 +-3.1947,4.4208 +-2.5353,4.4113 +-1.8089,4.4017 +-1.0224,4.3922 +-0.1832,4.3827 +0.7006,4.3731 +1.6206,4.3636 +2.568,4.3731 +3.5339,4.3827 +4.5089,4.3922 +5.4839,4.4017 +6.4495,4.4113 +7.3965,4.4208 +8.3159,4.4303 +9.199,4.4399 +10.0372,4.4494 +10.8227,4.459 +11.548,4.4685 +12.2061,4.478 +12.7908,4.4876 +13.2964,4.4971 +13.7183,4.5066 +14.0523,4.5162 +14.2952,4.5257 +14.4449,4.5353 +14.4997,4.5448 +14.4593,4.5543 +14.324,4.5639 +14.095,4.5734 +13.7747,4.5829 +13.3659,4.5925 +12.8727,4.602 +12.2996,4.6115 +11.6523,4.6211 +10.9368,4.6306 +10.1599,4.6402 +9.3292,4.6497 +8.4524,4.6592 +7.5379,4.6497 +6.5945,4.6592 +5.6312,4.6497 +4.657,4.6402 +3.6814,4.6306 +2.7135,4.6211 +1.7627,4.6115 +0.838,4.602 +-0.0518,4.5925 +-0.8983,4.5829 +-1.6933,4.5734 +-2.4293,4.5639 +-3.0993,4.5543 +-3.6968,4.5448 +-4.2163,4.5353 +-4.6527,4.5257 +-5.0019,4.5162 +-5.2605,4.5066 +-5.4261,4.4971 +-5.4971,4.4876 +-5.4729,4.478 +-5.3536,4.4685 +-5.1404,4.459 +-4.8354,4.4494 +-4.4414,4.4399 +-3.9622,4.4303 +-3.4024,4.4208 +-2.7673,4.4113 +-2.0629,4.4017 +-1.296,4.3922 +-0.4738,4.3827 +0.3958,4.3731 +1.3044,4.3636 +2.2435,4.3731 +3.2041,4.3827 +4.1771,4.3922 +5.1532,4.4017 +6.123,4.4113 +7.0773,4.4208 +8.0071,4.4303 +8.9035,4.4399 +9.7579,4.4494 +10.5622,4.459 +11.3087,4.4685 +11.9904,4.478 +12.6007,4.4876 +13.1338,4.4971 +13.5846,4.5066 +13.9488,4.5162 +14.223,4.5257 +14.4046,4.5353 +14.4918,4.5448 +14.4837,4.5543 +14.3805,4.5639 +14.1832,4.5734 +13.8936,4.5829 +13.5145,4.5925 +13.0495,4.602 +12.503,4.6115 +11.8802,4.6211 +11.1872,4.6306 +10.4304,4.6402 +9.6171,4.6497 +8.755,4.6592 +7.8524,4.6497 +6.9178,4.6592 +5.9602,4.6497 +4.9887,4.6402 +4.0125,4.6306 +3.041,4.6211 +2.0833,4.6115 +1.1487,4.602 +0.2461,4.5925 +-0.616,4.5829 +-1.4294,4.5734 +-2.1863,4.5639 +-2.8794,4.5543 +-3.5023,4.5448 +-4.0489,4.5353 +-4.514,4.5257 +-4.8932,4.5162 +-5.1829,4.5066 +-5.3804,4.4971 +-5.4837,4.4876 +-5.4918,4.478 +-5.4048,4.4685 +-5.2233,4.459 +-4.9492,4.4494 +-4.5851,4.4399 +-4.1344,4.4303 +-3.6014,4.4208 +-2.9912,4.4113 +-2.3096,4.4017 +-1.5631,4.3922 +-0.7589,4.3827 +0.0955,4.3731 +0.9918,4.3636 +1.9215,4.3541 +2.8759,4.3636 +3.8457,4.3731 +4.8217,4.3827 +5.7947,4.3922 +6.7553,4.4017 +7.6945,4.4113 +8.6032,4.4208 +9.4728,4.4303 +10.295,4.4399 +11.062,4.4494 +11.7665,4.459 +12.4017,4.4685 +12.9616,4.478 +13.4409,4.4876 +13.835,4.4971 +14.1401,4.5066 +14.3534,4.5162 +14.4728,4.5257 +14.4971,4.5353 +14.4262,4.5448 +14.2607,4.5543 +14.0022,4.5639 +13.6532,4.5734 +13.2169,4.5829 +12.6975,4.5925 +12.1001,4.602 +11.4302,4.6115 +10.6942,4.6211 +9.8993,4.6306 +9.0529,4.6402 +8.1631,4.6306 +7.2384,4.6402 +6.2876,4.6306 +5.3198,4.6211 +4.3442,4.6115 +3.37,4.602 +2.4066,4.5925 +1.4632,4.5829 +0.5487,4.5734 +-0.3281,4.5639 +-1.159,4.5543 +-1.9359,4.5448 +-2.6515,4.5353 +-3.2989,4.5257 +-3.872,4.5162 +-4.3654,4.5066 +-4.7742,4.4971 +-5.0947,4.4876 +-5.3238,4.478 +-5.4592,4.4685 +-5.4997,4.459 +-5.445,4.4494 +-5.2955,4.4399 +-5.0526,4.4303 +-4.7187,4.4208 +-4.297,4.4113 +-3.7914,4.4017 +-3.2068,4.3922 +-2.5488,4.3827 +-1.8237,4.3731 +-1.0382,4.3636 +-0.2,4.3541 +0.683,4.3475 +1.6024,4.357 +2.5494,4.3475 +3.5149,4.357 +4.4899,4.3666 +5.465,4.3761 +6.4308,4.3856 +7.3783,4.3952 +8.2983,4.4047 +9.1822,4.4142 +10.0214,4.4238 +10.808,4.4333 +11.5345,4.4429 +12.194,4.4524 +12.7801,4.4619 +13.2874,4.4715 +13.7109,4.481 +14.0466,4.4905 +14.2914,4.5001 +14.4429,4.5096 +14.4996,4.5192 +14.461,4.5287 +14.3275,4.5382 +14.1004,4.5478 +13.7817,4.5573 +13.3747,4.5668 +12.883,4.5764 +12.3115,4.5859 +11.6656,4.5954 +10.9513,4.605 +10.1756,4.6145 +9.3458,4.6241 +8.4698,4.6336 +7.556,4.6431 +6.6131,4.6336 +5.65,4.6241 +4.676,4.6145 +3.7003,4.605 +2.7322,4.5954 +1.781,4.5859 +0.8557,4.5764 +-0.0349,4.5668 +-0.8823,4.5573 +-1.6784,4.5478 +-2.4156,4.5382 +-3.0869,4.5287 +-3.686,4.5192 +-4.207,4.5096 +-4.645,4.5001 +-4.9959,4.4905 +-5.2563,4.481 +-5.4238,4.4715 +-5.4966,4.4619 +-5.4743,4.4524 +-5.3568,4.4429 +-5.1455,4.4333 +-4.8422,4.4238 +-4.4499,4.4142 +-3.9723,4.4047 +-3.414,4.3952 +-2.7803,4.3856 +-2.0772,4.3761 +-1.3114,4.3666 +-0.4903,4.357 +0.3784,4.3475 +1.2864,4.357 +2.225,4.3475 +3.1853,4.357 +4.1581,4.3666 +5.1342,4.3761 +6.1042,4.3856 +7.059,4.3952 +7.9893,4.4047 +8.8864,4.4142 +9.7417,4.4238 +10.5471,4.4333 +11.2948,4.4429 +11.9778,4.4524 +12.5895,4.4619 +13.1242,4.4715 +13.5766,4.481 +13.9426,4.4905 +14.2186,4.5001 +14.402,4.5096 +14.491,4.5192 +14.4848,4.5287 +14.3835,4.5382 +14.1879,4.5478 +13.9001,4.5573 +13.5227,4.5668 +13.0593,4.5764 +12.5144,4.5859 +11.893,4.5954 +11.2013,4.605 +10.4456,4.6145 +9.6334,4.6241 +8.7722,4.6336 +7.8703,4.6431 +6.9362,4.6527 +5.979,4.6431 +5.0076,4.6336 +4.0315,4.6241 +3.0598,4.6145 +2.1018,4.605 +1.1667,4.5954 +0.2633,4.5859 +-0.5997,4.5764 +-1.4141,4.5668 +-2.1721,4.5573 +-2.8666,4.5478 +-3.4909,4.5382 +-4.039,4.5287 +-4.5057,4.5192 +-4.8867,4.5096 +-5.1782,4.5001 +-5.3774,4.4905 +-5.4826,4.481 +-5.4926,4.4715 +-5.4074,4.4619 +-5.2277,4.4524 +-4.9554,4.4429 +-4.593,4.4333 +-4.1439,4.4238 +-3.6125,4.4142 +-3.0038,4.4047 +-2.3235,4.3952 +-1.5782,4.3856 +-0.775,4.3761 +0.0784,4.3666 +0.974,4.3761 +1.9032,4.3666 +2.8571,4.3761 +3.8267,4.3856 +4.8027,4.3952 +5.7758,4.4047 +6.7368,4.4142 +7.6765,4.4238 +8.5858,4.4333 +9.4563,4.4429 +10.2795,4.4524 +11.0476,4.4619 +11.7534,4.4715 +12.39,4.481 +12.9515,4.4905 +13.4324,4.5001 +13.8282,4.5096 +14.1351,4.5192 +14.3502,4.5287 +14.4714,4.5382 +14.4976,4.5478 +14.4285,4.5573 +14.2648,4.5668 +14.0081,4.5764 +13.6608,4.5859 +13.2262,4.5954 +12.7084,4.605 +12.1124,4.6145 +11.4439,4.6241 +10.7092,4.6336 +9.9153,4.6431 +9.0698,4.6527 +8.1808,4.6622 +7.2567,4.6717 +6.3063,4.6622 +5.3387,4.6527 +4.3632,4.6431 +3.3889,4.6336 +2.4252,4.6241 +1.4813,4.6145 +0.5662,4.605 +-0.3115,4.5954 +-1.1433,4.5859 +-1.9213,4.5764 +-2.6382,4.5668 +-3.287,4.5573 +-3.8616,4.5478 +-4.3566,4.5382 +-4.7671,4.5287 +-5.0893,4.5192 +-5.3202,4.5096 +-5.4575,4.5001 +-5.4999,4.4905 +-5.447,4.481 +-5.2993,4.4715 +-5.0582,4.4619 +-4.7261,4.4524 +-4.306,4.4429 +-3.802,4.4333 +-3.2189,4.4238 +-2.5623,4.4142 +-1.8384,4.4047 +-1.054,4.3952 +-0.2168,4.3856 +0.6655,4.3761 +1.5842,4.3666 +2.5307,4.3761 +3.496,4.3856 +4.4709,4.3952 +5.4461,4.4047 +6.4122,4.4142 +7.3601,4.4238 +8.2808,4.4333 +9.1654,4.4429 +10.0056,4.4524 +10.7933,4.4619 +11.521,4.4715 +12.1818,4.481 +12.7695,4.4905 +13.2783,4.5001 +13.7035,4.5096 +14.0409,4.5192 +14.2875,4.5287 +14.4408,4.5382 +14.4994,4.5478 +14.4627,4.5573 +14.331,4.5668 +14.1057,4.5764 +13.7888,4.5859 +13.3834,4.5954 +12.8934,4.605 +12.3234,4.6145 +11.6788,4.6241 +10.9658,4.6336 +10.1912,4.6431 +9.3624,4.6527 +8.4872,4.6622 +7.5741,4.6527 +6.6317,4.6622 +5.6689,4.6527 +4.695,4.6431 +3.7192,4.6336 +2.7509,4.6241 +1.7993,4.6145 +0.8734,4.605 +-0.018,4.5954 +-0.8663,4.5859 +-1.6634,4.5764 +-2.4019,4.5668 +-3.0745,4.5573 +-3.675,4.5478 +-4.1976,4.5382 +-4.6373,4.5287 +-4.9899,4.5192 +-5.2521,4.5096 +-5.4214,4.5001 +-5.4961,4.4905 +-5.4756,4.481 +-5.36,4.4715 +-5.1505,4.4619 +-4.849,4.4524 +-4.4584,4.4429 +-3.9824,4.4333 +-3.4256,4.4238 +-2.7933,4.4142 +-2.0915,4.4047 +-1.3269,4.3952 +-0.5067,4.3856 +0.3611,4.3761 +1.2684,4.3666 +2.2065,4.3761 +3.1665,4.3856 +4.1391,4.3952 +5.1152,4.4047 +6.0855,4.4142 +7.0406,4.4238 +7.9715,4.4333 +8.8693,4.4429 +9.7255,4.4524 +10.5319,4.4619 +11.2809,4.4715 +11.9652,4.481 +12.5783,4.4905 +13.1145,4.5001 +13.5686,4.5096 +13.9363,4.5192 +14.2141,4.5287 +14.3993,4.5382 +14.4901,4.5478 +14.4858,4.5573 +14.3863,4.5668 +14.1926,4.5764 +13.9066,4.5859 +13.5309,4.5954 +13.0691,4.605 +12.5257,4.6145 +11.9058,4.6241 +11.2154,4.6336 +10.4609,4.6431 +9.6497,4.6527 +8.7893,4.6622 +7.8881,4.6527 +6.9546,4.6622 +5.9978,4.6527 +5.0266,4.6431 +4.0505,4.6336 +3.0786,4.6241 +2.1202,4.6145 +1.1846,4.605 +0.2805,4.5954 +-0.5834,4.5859 +-1.3988,4.5764 +-2.158,4.5668 +-2.8537,4.5573 +-3.4794,4.5478 +-4.0291,4.5382 +-4.4975,4.5287 +-4.8801,4.5192 +-5.1734,4.5096 +-5.3744,4.5001 +-5.4814,4.4905 +-5.4933,4.481 +-5.4099,4.4715 +-5.2321,4.4619 +-4.9616,4.4524 +-4.6009,4.4429 +-4.1535,4.4333 +-3.6236,4.4238 +-3.0163,4.4142 +-2.3374,4.4047 +-1.5933,4.3952 +-0.7912,4.3856 +0.0614,4.3761 +0.9562,4.3666 +1.8848,4.357 +2.8384,4.3666 +3.8078,4.3761 +4.7837,4.3856 +5.757,4.3952 +6.7183,4.4047 +7.6584,4.4142 +8.5685,4.4238 +9.4398,4.4333 +10.264,4.4429 +11.0333,4.4524 +11.7403,4.4619 +12.3783,4.4715 +12.9413,4.481 +13.4238,4.4905 +13.8213,4.5001 +14.13,4.5096 +14.3469,4.5192 +14.4699,4.5287 +14.498,4.5382 +14.4308,4.5478 +14.2689,4.5573 +14.014,4.5668 +13.6684,4.5764 +13.2354,4.5859 +12.7192,4.5954 +12.1247,4.605 +11.4575,4.6145 +10.724,4.6241 +9.9312,4.6336 +9.0867,4.6431 +8.1984,4.6336 +7.2749,4.6431 +6.325,4.6336 +5.3577,4.6241 +4.3822,4.6145 +3.4078,4.605 +2.4438,4.5954 +1.4994,4.5859 +0.5836,4.5764 +-0.2948,4.5668 +-1.1276,4.5573 +-1.9068,4.5478 +-2.6249,4.5382 +-3.2751,4.5287 +-3.8512,4.5192 +-4.3477,4.5096 +-4.7599,4.5001 +-5.0839,4.4905 +-5.3166,4.481 +-5.4557,4.4715 +-5.4999,4.4619 +-5.4489,4.4524 +-5.303,4.4429 +-5.0638,4.4333 +-4.7334,4.4238 +-4.315,4.4142 +-3.8126,4.4047 +-3.231,4.3952 +-2.5757,4.3856 +-1.853,4.3761 +-1.0698,4.3666 +-0.2335,4.357 +0.6479,4.3475 +1.566,4.357 +2.5121,4.3475 +3.4771,4.357 +4.4519,4.3666 +5.4271,4.3761 +6.3935,4.3856 +7.3419,4.3952 +8.2632,4.4047 +9.1486,4.4142 +9.9897,4.4238 +10.7785,4.4333 +11.5075,4.4429 +12.1697,4.4524 +12.7588,4.4619 +13.2692,4.4715 +13.696,4.481 +14.0352,4.4905 +14.2836,4.5001 +14.4387,4.5096 +14.4991,4.5192 +14.4643,4.5287 +14.3345,4.5382 +14.1109,4.5478 +13.7958,4.5573 +13.3921,4.5668 +12.9037,4.5764 +12.3352,4.5859 +11.692,4.5954 +10.9803,4.605 +10.2068,4.6145 +9.379,4.6241 +8.5047,4.6336 +7.5922,4.6431 +6.6502,4.6336 +5.6878,4.6241 +4.714,4.6145 +3.7382,4.605 +2.7696,4.5954 +1.8176,4.5859 +0.8911,4.5764 +-0.001,4.5668 +-0.8502,4.5573 +-1.6485,4.5478 +-2.3881,4.5382 +-3.0621,4.5287 +-3.6641,4.5192 +-4.1882,4.5096 +-4.6296,4.5001 +-4.9839,4.4905 +-5.2479,4.481 +-5.419,4.4715 +-5.4956,4.4619 +-5.4769,4.4524 +-5.3632,4.4429 +-5.1554,4.4333 +-4.8557,4.4238 +-4.4668,4.4142 +-3.9925,4.4047 +-3.4372,4.3952 +-2.8063,4.3856 +-2.1058,4.3761 +-1.3423,4.3666 +-0.5232,4.357 +0.3439,4.3475 +1.2505,4.357 +2.188,4.3475 +3.1477,4.357 +4.1202,4.3666 +5.0963,4.3761 +6.0667,4.3856 +7.0222,4.3952 +7.9537,4.4047 +8.8522,4.4142 +9.7093,4.4238 +10.5168,4.4333 +11.2669,4.4429 +11.9525,4.4524 +12.5671,4.4619 +13.1049,4.4715 +13.5606,4.481 +13.93,4.4905 +14.2096,4.5001 +14.3966,4.5096 +14.4893,4.5192 +14.4868,4.5287 +14.3892,4.5382 +14.1973,4.5478 +13.913,4.5573 +13.539,4.5668 +13.0789,4.5764 +12.537,4.5859 +11.9186,4.5954 +11.2294,4.605 +10.4762,4.6145 +9.6659,4.6241 +8.8065,4.6336 +7.906,4.6431 +6.9731,4.6527 +6.0165,4.6431 +5.0456,4.6336 +4.0694,4.6241 +3.0974,4.6145 +2.1387,4.605 +1.2025,4.5954 +0.2977,4.5859 +-0.567,4.5764 +-1.3834,4.5668 +-2.1438,4.5573 +-2.8409,4.5478 +-3.468,4.5382 +-4.0192,4.5287 +-4.4892,4.5192 +-4.8735,4.5096 +-5.1685,4.5001 +-5.3714,4.4905 +-5.4802,4.481 +-5.494,4.4715 +-5.4124,4.4619 +-5.2365,4.4524 +-4.9677,4.4429 +-4.6087,4.4333 +-4.163,4.4238 +-3.6346,4.4142 +-3.0288,4.4047 +-2.3512,4.3952 +-1.6084,4.3856 +-0.8073,4.3761 +0.0444,4.3666 +0.9385,4.3761 +1.8665,4.3666 +2.8197,4.3761 +3.7888,4.3856 +4.7647,4.3952 +5.7382,4.4047 +6.6998,4.4142 +7.6404,4.4238 +8.5511,4.4333 +9.4232,4.4429 +10.2485,4.4524 +11.0189,4.4619 +11.7272,4.4715 +12.3666,4.481 +12.9311,4.4905 +13.4152,4.5001 +13.8144,4.5096 +14.1248,4.5192 +14.3435,4.5287 +14.4684,4.5382 +14.4983,4.5478 +14.433,4.5573 +14.273,4.5668 +14.0198,4.5764 +13.676,4.5859 +13.2447,4.5954 +12.73,4.605 +12.137,4.6145 +11.4711,4.6241 +10.7389,4.6336 +9.9472,4.6431 +9.1036,4.6527 +8.2161,4.6431 +7.2932,4.6336 +6.3437,4.6241 +5.3766,4.6145 +4.4012,4.605 +3.4267,4.5954 +2.4624,4.5859 +1.5175,4.5764 +0.6011,4.5668 +-0.2782,4.5573 +-1.1119,4.5478 +-1.8922,4.5382 +-2.6115,4.5287 +-3.2631,4.5192 +-3.8407,4.5096 +-4.3388,4.5001 +-4.7527,4.4905 +-5.0785,4.481 +-5.3129,4.4715 +-5.4539,4.4619 +-5.5,4.4524 +-5.4508,4.4429 +-5.3068,4.4333 +-5.0693,4.4238 +-4.7407,4.4142 +-4.3239,4.4047 +-3.8231,4.3952 +-3.243,4.3856 +-2.5891,4.3761 +-1.8677,4.3666 +-1.0856,4.357 +-0.2502,4.3475 +0.6304,4.338 +1.5479,4.3284 +2.4935,4.338 +3.4583,4.3475 +4.4329,4.357 +5.4082,4.3666 +6.3749,4.3761 +7.3237,4.3856 +8.2456,4.3952 +9.1317,4.4047 +9.9738,4.4142 +10.7637,4.4238 +11.4939,4.4333 +12.1574,4.4429 +12.748,4.4524 +13.26,4.4619 +13.6885,4.4715 +14.0295,4.481 +14.2796,4.4905 +14.4366,4.5001 +14.4989,4.5096 +14.4659,4.5192 +14.3379,4.5287 +14.1162,4.5382 +13.8028,4.5478 +13.4008,4.5573 +12.914,4.5668 +12.347,4.5764 +11.7052,4.5859 +10.9948,4.5954 +10.2224,4.605 +9.3956,4.6145 +8.5221,4.6241 +7.6102,4.6145 +6.6688,4.6241 +5.7066,4.6145 +4.733,4.605 +3.7571,4.5954 +2.7883,4.5859 +1.8359,4.5764 +0.9088,4.5668 +0.0159,4.5573 +-0.8342,4.5478 +-1.6335,4.5382 +-2.3743,4.5287 +-3.0497,4.5192 +-3.6531,4.5096 +-4.1788,4.5001 +-4.6218,4.4905 +-4.9779,4.481 +-5.2437,4.4715 +-5.4166,4.4619 +-5.495,4.4524 +-5.4782,4.4429 +-5.3663,4.4333 +-5.1604,4.4238 +-4.8624,4.4142 +-4.4752,4.4047 +-4.0025,4.3952 +-3.4487,4.3856 +-2.8193,4.3761 +-2.12,4.3666 +-1.3577,4.357 +-0.5396,4.3475 +0.3266,4.338 +1.2325,4.3284 +2.1696,4.338 +3.1288,4.3475 +4.1012,4.357 +5.0773,4.3666 +6.0479,4.3761 +7.0038,4.3856 +7.9359,4.3952 +8.8351,4.4047 +9.6931,4.4142 +10.5016,4.4238 +11.2529,4.4333 +11.9398,4.4429 +12.5559,4.4524 +13.0952,4.4619 +13.5526,4.4715 +13.9237,4.481 +14.205,4.4905 +14.3938,4.5001 +14.4884,4.5096 +14.4878,4.5192 +14.392,4.5287 +14.2019,4.5382 +13.9194,4.5478 +13.5471,4.5573 +13.0886,4.5668 +12.5483,4.5764 +11.9313,4.5859 +11.2435,4.5954 +10.4914,4.605 +9.6822,4.6145 +8.8236,4.6241 +7.9239,4.6145 +6.9915,4.6241 +6.0353,4.6145 +5.0646,4.605 +4.0884,4.5954 +3.1162,4.5859 +2.1572,4.5764 +1.2204,4.5668 +0.315,4.5573 +-0.5506,4.5478 +-1.3681,4.5382 +-2.1296,4.5287 +-2.8279,4.5192 +-3.4565,4.5096 diff --git a/plugins/ts404/src/editor/components/led.rs b/plugins/ts404/src/editor/components/led.rs index bb48ec5..895ac46 100644 --- a/plugins/ts404/src/editor/components/led.rs +++ b/plugins/ts404/src/editor/components/led.rs @@ -27,7 +27,7 @@ impl View for Led { let color = cx.font_color(); let drive_led = self.drive_led.load(Ordering::Relaxed); - let brightness = 1. - f32::exp(-drive_led / 150.); + let brightness = 1. - f32::exp(-drive_led); let paint = vg::Paint::color(vg::Color::rgba( (color.r() as f32 * (1. + brightness)) as u8, (color.g() as f32 * (1. + brightness)) as u8, From 2bb55f0337d5ef4d1f5e1431dc2eb75e8eaf0066 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Mon, 2 Sep 2024 22:01:05 +0200 Subject: [PATCH 29/51] chore: linting + formatting --- plugins/ts404/src/dsp.rs | 32 ++++++++++++--------- plugins/ts404/src/dsp/clipping.rs | 12 ++++---- plugins/ts404/src/editor/components/knob.rs | 2 +- plugins/ts404/src/editor/components/led.rs | 2 +- plugins/ts404/src/editor/components/mod.rs | 2 +- plugins/ts404/src/editor/mod.rs | 9 +++--- plugins/ts404/src/lib.rs | 9 +++--- plugins/ts404/src/main.rs | 2 +- plugins/ts404/src/params.rs | 4 +-- 9 files changed, 38 insertions(+), 36 deletions(-) diff --git a/plugins/ts404/src/dsp.rs b/plugins/ts404/src/dsp.rs index 954540c..e0a0324 100644 --- a/plugins/ts404/src/dsp.rs +++ b/plugins/ts404/src/dsp.rs @@ -8,7 +8,6 @@ use nih_plug::prelude::{AtomicF32, Enum}; use nih_plug_vizia::vizia::prelude::Data; use num_traits::{Float, ToPrimitive}; use numeric_literals::replace_float_literals; -use valib::{dsp::blocks::{Series, SwitchAB}, math::{smooth_max, smooth_min}}; use valib::dsp::buffer::{AudioBufferMut, AudioBufferRef}; use valib::dsp::parameter::{HasParameters, ParamId, ParamName, RemoteControlled, SmoothedParam}; use valib::dsp::{blocks::Bypass, BlockAdapter, DSPMeta, DSPProcess, DSPProcessBlock}; @@ -16,10 +15,12 @@ use valib::filters::statespace::StateSpace; use valib::math::smooth_clamp; use valib::oversample::{Oversample, Oversampled}; use valib::saturators::{bjt, Saturator}; -use valib::simd::{ - AutoF64x2, AutoSimd, SimdBool, SimdComplexField, SimdPartialOrd, SimdValue, -}; +use valib::simd::{SimdComplexField, SimdValue}; use valib::Scalar; +use valib::{ + dsp::blocks::{Series, SwitchAB}, + math::{smooth_max, smooth_min}, +}; use clipping::ClippingStage; @@ -56,14 +57,18 @@ impl Default for OutputEmitterFollower { impl Saturator for OutputEmitterFollower { fn saturate(&self, x: T) -> T { - smooth_max(self.t, T::zero(), smooth_min(self.t, x + self.xbias, (x + self.kbias) * self.ksat)) + smooth_max( + self.t, + T::zero(), + smooth_min(self.t, x + self.xbias, (x + self.kbias) * self.ksat), + ) } } #[derive(Debug, Copy, Clone, PartialEq, Enum, Data)] pub enum InputLevelMatching { Instrument, - #[name="Instrument (Hot)"] + #[name = "Instrument (Hot)"] InstrumentHot, Line, Eurorack, @@ -173,7 +178,12 @@ impl DSPProcess<1, 1> for ToneStage { let tone = self.tone.next_sample_as(); self.update_state_matrices(self.dt, tone); let [y] = self.state_space.process(x); - [smooth_clamp(T::from_f64(0.1), y, T::zero(), T::from_f64(9.))] + [smooth_clamp( + T::from_f64(0.1), + y, + T::zero(), + T::from_f64(9.), + )] } } @@ -340,13 +350,7 @@ where )); let inner = DspInner::new(samplerate, Bypass::default(), inner, true); let inner = oversample.with_dsp(base_samplerate, BlockAdapter(inner)); - RemoteControlled::new( - base_samplerate, - 1e3, - Dsp { - inner, - }, - ) + RemoteControlled::new(base_samplerate, 1e3, Dsp { inner }) } pub fn get_led_display(&self) -> Arc { diff --git a/plugins/ts404/src/dsp/clipping.rs b/plugins/ts404/src/dsp/clipping.rs index 3c5828c..6b400da 100644 --- a/plugins/ts404/src/dsp/clipping.rs +++ b/plugins/ts404/src/dsp/clipping.rs @@ -1,15 +1,13 @@ -use crate::params::MAX_AGE; use crate::{util::Rms, TARGET_SAMPLERATE}; use nih_plug::prelude::AtomicF32; use nih_plug::util::db_to_gain_fast; use num_traits::{Float, ToPrimitive}; -use std::sync::{atomic::Ordering, Arc}; use numeric_literals::replace_float_literals; -use valib::math::{smooth_clamp, smooth_max, smooth_min}; +use std::sync::{atomic::Ordering, Arc}; +use valib::math::smooth_clamp; use valib::saturators::clippers::DiodeClipper; use valib::saturators::{Saturator, Slew}; use valib::simd::{SimdComplexField, SimdValue}; -use valib::util::lerp; use valib::wdf::dsl::*; use valib::{ dsp::{DSPMeta, DSPProcess}, @@ -40,7 +38,7 @@ impl CrossoverDistortion { #[replace_float_literals(T::from_f64(literal))] fn drift_from_age(age: T) -> T { - 2.96e-3 * age.simd_powf(1./3.) + 2.96e-3 * age.simd_powf(1. / 3.) } } @@ -240,8 +238,7 @@ impl> ClippingStage { pub fn set_age(&mut self, age: T) { self.crossover.set_age(age); - self.out_slew.max_diff = - component_matching_slew_rate(self.samplerate, age); + self.out_slew.max_diff = component_matching_slew_rate(self.samplerate, age); } pub fn set_dist(&mut self, amt: T) { @@ -307,6 +304,7 @@ mod tests { use super::*; use valib::dsp::buffer::{AudioBufferMut, AudioBufferRef}; use valib::dsp::{BlockAdapter, DSPProcessBlock}; + use valib::util::lerp; #[test] fn crossover_dc_sweep() { diff --git a/plugins/ts404/src/editor/components/knob.rs b/plugins/ts404/src/editor/components/knob.rs index 55d9278..7828974 100644 --- a/plugins/ts404/src/editor/components/knob.rs +++ b/plugins/ts404/src/editor/components/knob.rs @@ -1,11 +1,11 @@ use std::f32::consts::{FRAC_PI_2, TAU}; use nih_plug::{nih_error, nih_log, prelude::Param}; +use nih_plug_vizia::vizia::vg::{ImageFlags, ImageId}; use nih_plug_vizia::{ vizia::{prelude::*, vg}, widgets::param_base::ParamWidgetBase, }; -use nih_plug_vizia::vizia::vg::{ImageFlags, ImageId}; enum KnobEvents { SetValueNormalized(f32), diff --git a/plugins/ts404/src/editor/components/led.rs b/plugins/ts404/src/editor/components/led.rs index 895ac46..ac1f653 100644 --- a/plugins/ts404/src/editor/components/led.rs +++ b/plugins/ts404/src/editor/components/led.rs @@ -1,5 +1,5 @@ -use std::sync::Arc; use std::sync::atomic::Ordering; +use std::sync::Arc; use nih_plug::prelude::AtomicF32; use nih_plug_vizia::vizia::prelude::*; diff --git a/plugins/ts404/src/editor/components/mod.rs b/plugins/ts404/src/editor/components/mod.rs index a815ebc..43d696c 100644 --- a/plugins/ts404/src/editor/components/mod.rs +++ b/plugins/ts404/src/editor/components/mod.rs @@ -1,2 +1,2 @@ pub(super) mod knob; -pub(super) mod led; \ No newline at end of file +pub(super) mod led; diff --git a/plugins/ts404/src/editor/mod.rs b/plugins/ts404/src/editor/mod.rs index ba900db..fa19e89 100644 --- a/plugins/ts404/src/editor/mod.rs +++ b/plugins/ts404/src/editor/mod.rs @@ -1,11 +1,11 @@ -use std::sync::Arc; -use std::sync::atomic::Ordering; use components::led::Led; use nih_plug::prelude::*; use nih_plug_vizia::vizia::prelude::*; use nih_plug_vizia::vizia::views::{Knob, VStack}; use nih_plug_vizia::widgets::param_base::ParamWidgetBase; use nih_plug_vizia::{create_vizia_editor, ViziaState, ViziaTheming}; +use std::sync::atomic::Ordering; +use std::sync::Arc; use crate::params::Ts404Params; @@ -49,7 +49,8 @@ pub(crate) fn create( }) .class("small"); Binding::new(cx, AppData::drive_led, |cx, drive| { - let display = drive.map(|x| format!("LED brightness: {}", x.load(Ordering::Relaxed))); + let display = + drive.map(|x| format!("LED brightness: {}", x.load(Ordering::Relaxed))); Label::new(cx, display); }); }) @@ -128,7 +129,7 @@ fn labelled_node_enum( let name = param.map(|param| param.value().to_string()); let num_values = E::variants().len(); EnumData { - names: E::variants().into_iter().map(|s| s.to_string()).collect(), + names: E::variants().iter().map(|s| s.to_string()).collect(), } .build(cx); diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index 363ca85..fb63667 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -1,8 +1,7 @@ -use std::sync::mpsc::{channel, Sender}; use std::sync::Arc; use nih_plug::prelude::*; -use valib::contrib::nih_plug::{process_buffer_simd64, BindToParameter}; +use valib::contrib::nih_plug::process_buffer_simd64; use valib::dsp::parameter::RemoteControlled; use valib::dsp::DSPMeta; use valib::simd::{AutoF32x2, AutoF64x2}; @@ -100,8 +99,10 @@ impl Plugin for Ts404 { self.dsp.inner.set_led_display(&drive_led); let dsp = &self.dsp; - dsp.proxy - .set_parameter(DspParams::InputMode, self.params.input_mode.value().to_index() as _); + dsp.proxy.set_parameter( + DspParams::InputMode, + self.params.input_mode.value().to_index() as _, + ); dsp.proxy .set_parameter(DspParams::Distortion, self.params.dist.value()); dsp.proxy diff --git a/plugins/ts404/src/main.rs b/plugins/ts404/src/main.rs index b8aabd7..fd0d368 100644 --- a/plugins/ts404/src/main.rs +++ b/plugins/ts404/src/main.rs @@ -4,4 +4,4 @@ use ts404::Ts404; fn main() { profiling::register_thread!("Main thread"); nih_export_standalone::(); -} \ No newline at end of file +} diff --git a/plugins/ts404/src/params.rs b/plugins/ts404/src/params.rs index 620a6e3..acadef4 100644 --- a/plugins/ts404/src/params.rs +++ b/plugins/ts404/src/params.rs @@ -1,10 +1,8 @@ use crate::dsp::{DspParams, InputLevelMatching}; use nih_plug::formatters; use nih_plug::params::{BoolParam, EnumParam, FloatParam, Params}; -use nih_plug::prelude::{AtomicF32, FloatRange}; -use nih_plug::util::{gain_to_db, MINUS_INFINITY_DB, MINUS_INFINITY_GAIN}; +use nih_plug::prelude::FloatRange; use nih_plug_vizia::ViziaState; -use std::sync::mpsc::{channel, Receiver, Sender}; use std::sync::Arc; use valib::contrib::nih_plug::BindToParameter; use valib::dsp::parameter::RemoteControl; From e3f85a8f6abae075a619c292f93393c5bbf8750e Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Thu, 12 Sep 2024 22:44:53 +0200 Subject: [PATCH 30/51] chore: use new features from valib --- plugins/ts404/.idea/ts404.iml | 1 + plugins/ts404/Cargo.lock | 515 ++++++++++++++++++++++++++++++++-- plugins/ts404/Cargo.toml | 2 +- 3 files changed, 488 insertions(+), 30 deletions(-) diff --git a/plugins/ts404/.idea/ts404.iml b/plugins/ts404/.idea/ts404.iml index bf203bd..71fbd98 100644 --- a/plugins/ts404/.idea/ts404.iml +++ b/plugins/ts404/.idea/ts404.iml @@ -13,5 +13,6 @@ + \ No newline at end of file diff --git a/plugins/ts404/Cargo.lock b/plugins/ts404/Cargo.lock index 650de90..2b36235 100644 --- a/plugins/ts404/Cargo.lock +++ b/plugins/ts404/Cargo.lock @@ -86,6 +86,18 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -101,6 +113,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + [[package]] name = "alsa" version = "0.7.1" @@ -574,7 +592,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -1123,13 +1141,19 @@ version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto-common" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array", + "generic-array 0.14.7", "typenum", ] @@ -1298,6 +1322,12 @@ dependencies = [ "dtoa", ] +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + [[package]] name = "either" version = "1.13.0" @@ -1310,6 +1340,15 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + [[package]] name = "enum-map" version = "2.7.3" @@ -1405,6 +1444,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "extended" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9673d8203fcb076b19dfd17e38b3d4ae9f44959416ea532ce72415a6020365" + [[package]] name = "fastrand" version = "1.9.0" @@ -1451,10 +1496,16 @@ dependencies = [ ] [[package]] -name = "fixedbitset" -version = "0.4.2" +name = "fixed" +version = "1.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "85c6e0b89bf864acd20590dbdbad56f69aeb898abfc9443008fd7bd48b2cc85a" +dependencies = [ + "az", + "bytemuck", + "half", + "typenum", +] [[package]] name = "flate2" @@ -1543,6 +1594,38 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "fundsp" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62d5e805ba4f6d7d7c4124e35602b35d5e8448916deae715eda946244eb99f78" +dependencies = [ + "dyn-clone", + "funutd", + "hashbrown", + "libm", + "microfft", + "num-complex", + "numeric-array", + "once_cell", + "symphonia", + "thingbuf", + "tinyvec", + "wide", +] + +[[package]] +name = "funutd" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30f658de1fbeca3b70faf090e33d1ecf32b0efd1805bede4a8fd6ef562b7ab83" +dependencies = [ + "dyn-clone", + "glam", + "hashbrown", + "libm", +] + [[package]] name = "futures-core" version = "0.3.30" @@ -1653,6 +1736,15 @@ dependencies = [ "version_check", ] +[[package]] +name = "generic-array" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96512db27971c2c3eece70a1e106fbe6c87760234e31e8f7e5634912fe52794a" +dependencies = [ + "typenum", +] + [[package]] name = "gethostname" version = "0.2.3" @@ -1702,6 +1794,15 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "glam" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "779ae4bf7e8421cf91c0b3b64e7e8b40b862fba4d393f59150042de7c4965a94" +dependencies = [ + "libm", +] + [[package]] name = "glob" version = "0.3.1" @@ -1794,11 +1895,25 @@ dependencies = [ "scroll", ] +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] [[package]] name = "heck" @@ -2257,6 +2372,17 @@ dependencies = [ "autocfg", ] +[[package]] +name = "microfft" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b6673eb0cc536241d6734c2ca45abfdbf90e9e7791c66a36a7ba3c315b76cf" +dependencies = [ + "cfg-if", + "num-complex", + "static_assertions", +] + [[package]] name = "midi-consts" version = "0.1.0" @@ -2328,7 +2454,7 @@ dependencies = [ "num-complex", "num-rational", "num-traits", - "simba", + "simba 0.8.1", "typenum", ] @@ -2596,6 +2722,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2670,6 +2797,16 @@ dependencies = [ "libc", ] +[[package]] +name = "numeric-array" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a6096447d657bfba01c49d38338b6c8e68e0e34d595360345375b798a4a765" +dependencies = [ + "generic-array 1.1.0", + "num-traits", +] + [[package]] name = "numeric_literals" version = "0.2.0" @@ -2884,16 +3021,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap", -] - [[package]] name = "phf" version = "0.8.0" @@ -2976,6 +3103,26 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + [[package]] name = "pin-project-lite" version = "0.2.14" @@ -3057,9 +3204,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" +checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265" [[package]] name = "powerfmt" @@ -3626,6 +3773,20 @@ dependencies = [ "wide", ] +[[package]] +name = "simba" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa" +dependencies = [ + "approx", + "fixed", + "num-complex", + "num-traits", + "paste", + "wide", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -3711,6 +3872,201 @@ dependencies = [ "zeno", ] +[[package]] +name = "symphonia" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9" +dependencies = [ + "lazy_static", + "symphonia-bundle-flac", + "symphonia-bundle-mp3", + "symphonia-codec-aac", + "symphonia-codec-adpcm", + "symphonia-codec-alac", + "symphonia-codec-pcm", + "symphonia-codec-vorbis", + "symphonia-core", + "symphonia-format-caf", + "symphonia-format-isomp4", + "symphonia-format-mkv", + "symphonia-format-ogg", + "symphonia-format-riff", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-bundle-flac" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72e34f34298a7308d4397a6c7fbf5b84c5d491231ce3dd379707ba673ab3bd97" +dependencies = [ + "log", + "symphonia-core", + "symphonia-metadata", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-bundle-mp3" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c01c2aae70f0f1fb096b6f0ff112a930b1fb3626178fba3ae68b09dce71706d4" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-codec-aac" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdbf25b545ad0d3ee3e891ea643ad115aff4ca92f6aec472086b957a58522f70" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-codec-adpcm" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c94e1feac3327cd616e973d5be69ad36b3945f16b06f19c6773fc3ac0b426a0f" +dependencies = [ + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-codec-alac" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d8a6666649a08412906476a8b0efd9b9733e241180189e9f92b09c08d0e38f3" +dependencies = [ + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-codec-pcm" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f395a67057c2ebc5e84d7bb1be71cce1a7ba99f64e0f0f0e303a03f79116f89b" +dependencies = [ + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-codec-vorbis" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a98765fb46a0a6732b007f7e2870c2129b6f78d87db7987e6533c8f164a9f30" +dependencies = [ + "log", + "symphonia-core", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-core" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "798306779e3dc7d5231bd5691f5a813496dc79d3f56bf82e25789f2094e022c3" +dependencies = [ + "arrayvec", + "bitflags 1.3.2", + "bytemuck", + "lazy_static", + "log", +] + +[[package]] +name = "symphonia-format-caf" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e43c99c696a388295a29fe71b133079f5d8b18041cf734c5459c35ad9097af50" +dependencies = [ + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-format-isomp4" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abfdf178d697e50ce1e5d9b982ba1b94c47218e03ec35022d9f0e071a16dc844" +dependencies = [ + "encoding_rs", + "log", + "symphonia-core", + "symphonia-metadata", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-format-mkv" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bb43471a100f7882dc9937395bd5ebee8329298e766250b15b3875652fe3d6f" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", + "symphonia-metadata", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-format-ogg" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ada3505789516bcf00fc1157c67729eded428b455c27ca370e41f4d785bfa931" +dependencies = [ + "log", + "symphonia-core", + "symphonia-metadata", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-format-riff" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f7be232f962f937f4b7115cbe62c330929345434c834359425e043bfd15f50" +dependencies = [ + "extended", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc622b9841a10089c5b18e99eb904f4341615d5aa55bbf4eedde1be721a4023c" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-utils-xiph" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "484472580fa49991afda5f6550ece662237b00c6f562c7d9638d1b086ed010fe" +dependencies = [ + "symphonia-core", + "symphonia-metadata", +] + [[package]] name = "syn" version = "1.0.109" @@ -3773,6 +4129,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "thingbuf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "662b54ef6f7b4e71f683dadc787bbb2d8e8ef2f91b682ebed3164a5a7abca905" +dependencies = [ + "pin-project", +] + [[package]] name = "thiserror" version = "1.0.61" @@ -3847,9 +4212,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -4155,22 +4520,30 @@ dependencies = [ name = "valib" version = "0.1.0" dependencies = [ - "atomic_refcell", + "valib-core", + "valib-filters", + "valib-nih-plug", + "valib-oversample", + "valib-saturators", + "valib-wdf", +] + +[[package]] +name = "valib-core" +version = "0.1.0" +dependencies = [ "az", "nalgebra", - "nih_plug", "num-traits", "numeric_literals", - "paste", - "petgraph", "portable-atomic", "profiling", - "simba", - "valib_derive", + "simba 0.9.0", + "valib-derive", ] [[package]] -name = "valib_derive" +name = "valib-derive" version = "0.1.0" dependencies = [ "darling", @@ -4179,6 +4552,70 @@ dependencies = [ "syn 2.0.68", ] +[[package]] +name = "valib-filters" +version = "0.1.0" +dependencies = [ + "nalgebra", + "num-traits", + "numeric_literals", + "profiling", + "valib-core", + "valib-saturators", +] + +[[package]] +name = "valib-nih-plug" +version = "0.1.0" +dependencies = [ + "fundsp", + "nih_plug", + "num-complex", + "numeric-array", + "numeric_literals", + "profiling", + "typenum", + "valib-core", +] + +[[package]] +name = "valib-oversample" +version = "0.1.0" +dependencies = [ + "num-complex", + "numeric_literals", + "profiling", + "valib-core", + "valib-filters", + "valib-saturators", +] + +[[package]] +name = "valib-saturators" +version = "0.1.0" +dependencies = [ + "nalgebra", + "num-traits", + "numeric_literals", + "paste", + "profiling", + "valib-core", +] + +[[package]] +name = "valib-wdf" +version = "0.1.0" +dependencies = [ + "atomic_refcell", + "nalgebra", + "num-traits", + "numeric_literals", + "profiling", + "valib-core", + "valib-filters", + "valib-saturators", +] + [[package]] name = "valuable" version = "0.1.0" @@ -4481,9 +4918,9 @@ dependencies = [ [[package]] name = "wide" -version = "0.7.25" +version = "0.7.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2caba658a80831539b30698ae9862a72db6697dfdd7151e46920f5f2755c3ce2" +checksum = "b828f995bf1e9622031f8009f8481a85406ce1f4d4588ff746d872043e855690" dependencies = [ "bytemuck", "safe_arch", @@ -5048,6 +5485,26 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + [[package]] name = "zvariant" version = "3.15.2" diff --git a/plugins/ts404/Cargo.toml b/plugins/ts404/Cargo.toml index 9f122f0..466c255 100644 --- a/plugins/ts404/Cargo.toml +++ b/plugins/ts404/Cargo.toml @@ -22,7 +22,7 @@ num-traits = "0.2.17" numeric_literals = "0.2.0" profiling = { version = "1.0.15" } #valib = { git = "https://github.com/SolarLiner/valib.git" } -valib = { path = "../valib", features = ["nih-plug", "wdf"] } +valib = { path = "../valib", features = ["oversample", "wdf", "nih-plug"] } [dev-dependencies] insta = { version = "1.39.0", features = ["csv", "redactions"] } From 36ab58505831dfbea7b6c58a05b546dbedefa714 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Thu, 12 Sep 2024 23:42:45 +0200 Subject: [PATCH 31/51] chore: finish adding ts404 --- .idea/valib.iml | 1 + Cargo.lock | 3542 +++++++++++++++++++++++++++++++++-- Cargo.toml | 2 +- bundler.toml | 3 + plugins/ts404/.cargo/config | 2 - plugins/ts404/Cargo.toml | 37 +- plugins/ts404/bundler.toml | 2 - 7 files changed, 3404 insertions(+), 185 deletions(-) delete mode 100644 plugins/ts404/.cargo/config delete mode 100644 plugins/ts404/bundler.toml diff --git a/.idea/valib.iml b/.idea/valib.iml index a08ddf9..d844b6c 100644 --- a/.idea/valib.iml +++ b/.idea/valib.iml @@ -26,6 +26,7 @@ + diff --git a/Cargo.lock b/Cargo.lock index faf9d0c..f4a34cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,75 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "accesskit" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76eb1adf08c5bcaa8490b9851fd53cca27fa9880076f178ea9d29f05196728a8" + +[[package]] +name = "accesskit_consumer" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04bb4d9e4772fe0d47df57d0d5dbe5d85dd05e2f37ae1ddb6b105e76be58fb00" +dependencies = [ + "accesskit", +] + +[[package]] +name = "accesskit_macos" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134d0acf6acb667c89d3332999b1a5df4edbc8d6113910f392ebb73f2b03bb56" +dependencies = [ + "accesskit", + "accesskit_consumer", + "objc2", + "once_cell", +] + +[[package]] +name = "accesskit_unix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e084cb5168790c0c112626175412dc5ad127083441a8248ae49ddf6725519e83" +dependencies = [ + "accesskit", + "accesskit_consumer", + "async-channel 1.9.0", + "atspi", + "futures-lite 1.13.0", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eac0a7f2d7cd7a93b938af401d3d8e8b7094217989a7c25c55a953023436e31" +dependencies = [ + "accesskit", + "accesskit_consumer", + "arrayvec", + "once_cell", + "paste", + "windows 0.48.0", +] + +[[package]] +name = "accesskit_winit" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "825d23acee1bd6d25cbaa3ca6ed6e73faf24122a774ec33d52c5c86c6ab423c0" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_unix", + "accesskit_windows", + "winit", +] + [[package]] name = "addr2line" version = "0.24.1" @@ -44,12 +113,76 @@ dependencies = [ "memchr", ] +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + [[package]] name = "allocator-api2" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +[[package]] +name = "alsa" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2562ad8dcf0f789f65c6fdaad8a8a9708ed6b488e649da28c01656ad66b8b47" +dependencies = [ + "alsa-sys", + "bitflags 1.3.2", + "libc", + "nix 0.24.3", +] + +[[package]] +name = "alsa" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" +dependencies = [ + "alsa-sys", + "bitflags 2.6.0", + "cfg-if", + "libc", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "android-activity" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0" +dependencies = [ + "android-properties", + "bitflags 1.3.2", + "cc", + "jni-sys", + "libc", + "log", + "ndk 0.7.0", + "ndk-context", + "ndk-sys 0.4.1+23.1.7779620", + "num_enum 0.6.1", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -65,6 +198,55 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" + +[[package]] +name = "anstyle-parse" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + [[package]] name = "anyhow" version = "1.0.86" @@ -92,6 +274,198 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "async-broadcast" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +dependencies = [ + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.1.1", + "futures-lite 2.3.0", + "slab", +] + +[[package]] +name = "async-fs" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "blocking", + "futures-lite 1.13.0", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.27", + "slab", + "socket2", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +dependencies = [ + "async-lock 3.4.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.3.0", + "parking", + "polling 3.7.3", + "rustix 0.38.37", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.3.1", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +dependencies = [ + "async-io 1.13.0", + "async-lock 2.8.0", + "async-signal", + "blocking", + "cfg-if", + "event-listener 3.1.0", + "futures-lite 1.13.0", + "rustix 0.38.37", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io 2.3.4", + "async-lock 3.4.0", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 0.38.37", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "atomic_float" version = "0.1.0" @@ -104,13 +478,40 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" +[[package]] +name = "atspi" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "674e7a3376837b2e7d12d34d58ac47073c491dc3bf6f71a7adaf687d4d817faa" +dependencies = [ + "async-recursion", + "async-trait", + "atspi-macros", + "enumflags2", + "futures-lite 1.13.0", + "serde", + "tracing", + "zbus", + "zbus_names", +] + +[[package]] +name = "atspi-macros" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb4870a32c0eaa17e35bca0e6b16020635157121fb7d45593d242c295bc768" +dependencies = [ + "quote", + "syn 1.0.109", +] + [[package]] name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] @@ -142,6 +543,59 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "baseview" +version = "0.1.0" +source = "git+https://github.com/RustAudio/baseview.git?rev=2c1b1a7b0fef1a29a5150a6a8f6fef6a0cbab8c4#2c1b1a7b0fef1a29a5150a6a8f6fef6a0cbab8c4" +dependencies = [ + "cocoa", + "core-foundation", + "keyboard-types", + "nix 0.22.3", + "objc", + "raw-window-handle", + "uuid", + "winapi", + "x11", + "xcb", + "xcb-util", +] + +[[package]] +name = "baseview" +version = "0.1.0" +source = "git+https://github.com/RustAudio/baseview.git?rev=579130ecb4f9f315ae52190af42f0ea46aeaa4a2#579130ecb4f9f315ae52190af42f0ea46aeaa4a2" +dependencies = [ + "cocoa", + "core-foundation", + "keyboard-types", + "nix 0.22.3", + "objc", + "raw-window-handle", + "uuid", + "winapi", + "x11", + "x11rb 0.13.1", +] + +[[package]] +name = "bindgen" +version = "0.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.77", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -154,6 +608,12 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block-buffer" version = "0.10.4" @@ -163,6 +623,38 @@ dependencies = [ "generic-array 0.14.7", ] +[[package]] +name = "block-sys" +version = "0.1.0-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" +dependencies = [ + "objc-sys", +] + +[[package]] +name = "block2" +version = "0.2.0-alpha.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" +dependencies = [ + "block-sys", + "objc2-encode", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite 2.3.0", + "piper", +] + [[package]] name = "bstr" version = "0.2.17" @@ -186,6 +678,20 @@ name = "bytemuck" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] [[package]] name = "byteorder" @@ -193,6 +699,18 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "bytes" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" + +[[package]] +name = "cache-padded" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "981520c98f422fcc584dc1a95c334e6953900b9106bc47a9839b81790009eb21" + [[package]] name = "camino" version = "1.1.7" @@ -231,15 +749,47 @@ version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" dependencies = [ + "jobserver", + "libc", "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + [[package]] name = "chrono" version = "0.4.38" @@ -254,17 +804,134 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading 0.8.5", +] + +[[package]] +name = "clap" +version = "4.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" +dependencies = [ + "clap_builder", + "clap_derive", +] + [[package]] name = "clap-sys" version = "0.3.0" source = "git+https://github.com/robbert-vdh/clap-sys.git?branch=feature/cstr-macro#523a5f8a8dd021ec99e7d6e0c0ebe7741a3da9d4" +[[package]] +name = "clap_builder" +version = "4.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", + "terminal_size", +] + +[[package]] +name = "clap_derive" +version = "4.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "clipboard-win" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fdf5e01086b6be750428ba4a40619f847eb2e95756eee84b18e06e5f0b50342" +dependencies = [ + "lazy-bytes-cast", + "winapi", +] + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics 0.22.3", + "foreign-types 0.3.2", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "libc", + "objc", +] + [[package]] name = "color_quant" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "colorchoice" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "console" version = "0.15.8" @@ -277,6 +944,35 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "copypasta" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "133fc8675ee3a4ec9aa513584deda9aa0faeda3586b87f7f0f2ba082c66fb172" +dependencies = [ + "clipboard-win", + "objc", + "objc-foundation", + "objc_id", + "x11-clipboard", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -284,49 +980,144 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", - "libc", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.3.2", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "core-text" +version = "20.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d2790b5c08465d49f8dc05c8bcae9fea467855947db39b0f8145c091aaced5" +dependencies = [ + "core-foundation", + "core-graphics 0.23.2", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "coreaudio-rs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", ] [[package]] -name = "core-foundation-sys" -version = "0.8.7" +name = "coreaudio-sys" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +checksum = "2ce857aa0b77d77287acc1ac3e37a05a8c95a2af3647d23b15f263bdaeb7562b" +dependencies = [ + "bindgen", +] [[package]] -name = "core-graphics" -version = "0.23.2" +name = "coremidi" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +checksum = "1a7847ca018a67204508b77cb9e6de670125075f7464fff5f673023378fa34f5" dependencies = [ - "bitflags 1.3.2", "core-foundation", - "core-graphics-types", - "foreign-types", - "libc", + "core-foundation-sys", + "coremidi-sys", ] [[package]] -name = "core-graphics-types" -version = "0.1.3" +name = "coremidi-sys" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +checksum = "709d142e542467e028d5dc5f0374392339ab7dead0c48c129504de2ccd667e1b" dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "libc", + "core-foundation-sys", ] [[package]] -name = "core-text" -version = "20.1.0" +name = "cosmic-text" +version = "0.8.0" +source = "git+https://github.com/pop-os/cosmic-text?rev=79275d15e857428e9b8874f28413197e878f3788#79275d15e857428e9b8874f28413197e878f3788" +dependencies = [ + "aliasable", + "fontdb", + "libm", + "log", + "rangemap", + "rustybuzz", + "swash", + "sys-locale", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + +[[package]] +name = "cpal" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9d2790b5c08465d49f8dc05c8bcae9fea467855947db39b0f8145c091aaced5" +checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" dependencies = [ - "core-foundation", - "core-graphics", - "foreign-types", + "alsa 0.9.1", + "core-foundation-sys", + "coreaudio-rs", + "dasp_sample", + "jni", + "js-sys", "libc", + "mach2", + "ndk 0.8.0", + "ndk-context", + "oboe", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.54.0", ] [[package]] @@ -419,6 +1210,33 @@ dependencies = [ "typenum", ] +[[package]] +name = "cssparser" +version = "0.29.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa 1.0.11", + "matches", + "phf 0.10.1", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.77", +] + [[package]] name = "csv" version = "1.1.6" @@ -476,6 +1294,12 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + [[package]] name = "deranged" version = "0.3.11" @@ -485,6 +1309,30 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.77", +] + [[package]] name = "digest" version = "0.10.7" @@ -533,13 +1381,45 @@ dependencies = [ "valib", ] +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "dlib" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading", + "libloading 0.8.5", +] + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", ] [[package]] @@ -560,6 +1440,12 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "encode_unicode" version = "0.3.6" @@ -575,18 +1461,122 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "enumflags2" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener 5.3.1", + "pin-project-lite", +] + [[package]] name = "extended" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af9673d8203fcb076b19dfd17e38b3d4ae9f44959416ea532ce72415a6020365" +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + [[package]] name = "fdeflate" version = "0.3.4" @@ -596,6 +1586,27 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "femtovg" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3a2d0ff0df09856a5c1c89cc83863a1f0f994c55452186621bb57a01f270b3" +dependencies = [ + "bitflags 2.6.0", + "fnv", + "generational-arena", + "glow", + "image", + "imgref", + "lru", + "rgb", + "rustybuzz", + "unicode-bidi", + "unicode-segmentation", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "fixed" version = "1.28.0" @@ -624,6 +1635,40 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" +[[package]] +name = "fluent-bundle" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe0a21ee80050c678013f82edf4b705fe2f26f1f9877593d13198612503f493" +dependencies = [ + "fluent-langneg", + "fluent-syntax", + "intl-memoizer", + "intl_pluralrules", + "rustc-hash", + "self_cell 0.10.3", + "smallvec", + "unic-langid", +] + +[[package]] +name = "fluent-langneg" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94" +dependencies = [ + "unic-langid", +] + +[[package]] +name = "fluent-syntax" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a530c4694a6a8d528794ee9bbd8ba0122e779629ac908d15ad5a7ae7763a33d" +dependencies = [ + "thiserror", +] + [[package]] name = "fnv" version = "1.0.7" @@ -639,7 +1684,7 @@ dependencies = [ "bitflags 2.6.0", "byteorder", "core-foundation", - "core-graphics", + "core-graphics 0.23.2", "core-text", "dirs", "dwrote", @@ -655,6 +1700,37 @@ dependencies = [ "yeslogic-fontconfig-sys", ] +[[package]] +name = "font-types" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f0189ccb084f77c5523e08288d418cbaa09c451a08515678a0aa265df9a8b60" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "fontdb" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af8d8cbea8f21307d7e84bca254772981296f058a1d36b461bf4d83a7499fc9e" +dependencies = [ + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser 0.19.2", +] + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -662,7 +1738,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared", + "foreign-types-shared 0.3.1", ] [[package]] @@ -676,6 +1752,12 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "foreign-types-shared" version = "0.3.1" @@ -773,6 +1855,34 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand 2.1.1", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.30" @@ -820,6 +1930,37 @@ dependencies = [ "slab", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generational-arena" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877e94aff08e743b651baaea359664321055749b398adff8740a7399af7796e7" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "generator" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb949699c3e4df3a183b1d2142cb24277057055ed23c68ed58894f76c517223" +dependencies = [ + "cfg-if", + "libc", + "log", + "rustversion", + "windows 0.58.0", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -839,6 +1980,37 @@ dependencies = [ "typenum", ] +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.2.15" @@ -847,7 +2019,7 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] @@ -866,6 +2038,17 @@ version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + [[package]] name = "glam" version = "0.28.0" @@ -881,6 +2064,81 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "glow" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin" +version = "0.30.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc93b03242719b8ad39fb26ed2b01737144ce7bd4bfc7adadcef806596760fe" +dependencies = [ + "bitflags 1.3.2", + "cfg_aliases", + "cgl", + "core-foundation", + "dispatch", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "libloading 0.7.4", + "objc2", + "once_cell", + "raw-window-handle", + "windows-sys 0.45.0", + "x11-dl", +] + +[[package]] +name = "glutin-winit" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "629a873fc04062830bfe8f97c03773bcd7b371e23bcc465d0a61448cd1588fa4" +dependencies = [ + "cfg_aliases", + "glutin", + "raw-window-handle", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af784eb26c5a68ec85391268e074f0aa618c096eadb5d6330b0911cf34fe57c5" +dependencies = [ + "gl_generator", + "windows-sys 0.45.0", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b53cb5fe568964aa066a3ba91eac5ecbac869fb0842cd0dc9e412434f1a1494" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef89398e90033fc6bc65e9bd42fd29bbbfd483bda5b56dc5562f455550618165" +dependencies = [ + "gl_generator", +] + [[package]] name = "goblin" version = "0.6.1" @@ -912,6 +2170,12 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -921,6 +2185,24 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -932,7 +2214,7 @@ dependencies = [ "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.52.0", ] [[package]] @@ -964,6 +2246,12 @@ dependencies = [ "png", ] +[[package]] +name = "imgref" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" + [[package]] name = "indexmap" version = "2.2.6" @@ -990,6 +2278,63 @@ dependencies = [ "similar", ] +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "intl-memoizer" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe22e020fce238ae18a6d5d8c502ee76a52a6e880d99477657e6acc30ec57bda" +dependencies = [ + "type-map", + "unic-langid", +] + +[[package]] +name = "intl_pluralrules" +version = "7.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972" +dependencies = [ + "unic-langid", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -1002,6 +2347,64 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "jack" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e5a18a3c2aefb354fb77111ade228b20267bdc779de84e7a4ccf7ea96b9a6cd" +dependencies = [ + "bitflags 1.3.2", + "jack-sys", + "lazy_static", + "libc", + "log", +] + +[[package]] +name = "jack-sys" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6013b7619b95a22b576dfb43296faa4ecbe40abbdb97dfd22ead520775fc86ab" +dependencies = [ + "bitflags 1.3.2", + "lazy_static", + "libc", + "libloading 0.7.4", + "log", + "pkg-config", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + [[package]] name = "jpeg-decoder" version = "0.3.1" @@ -1017,6 +2420,21 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "keyboard-types" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7668b7cff6a51fe61cdde64cd27c8a220786f399501b57ebe36f7d8112fd68" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + [[package]] name = "ladder" version = "0.1.0" @@ -1025,6 +2443,12 @@ dependencies = [ "valib", ] +[[package]] +name = "lazy-bytes-cast" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10257499f089cd156ad82d0a9cd57d9501fa2c989068992a97eb3c27836f206b" + [[package]] name = "lazy_static" version = "1.5.0" @@ -1037,6 +2461,16 @@ version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + [[package]] name = "libloading" version = "0.8.5" @@ -1053,6 +2487,17 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "libredox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall 0.4.1", +] + [[package]] name = "libredox" version = "0.1.3" @@ -1069,46 +2514,137 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + [[package]] name = "lock_api" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "lru" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "718e8fae447df0c7e1ba7f5189829e63fd536945c8988d61444c19039f16b670" + +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matrixmultiply" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" dependencies = [ "autocfg", - "scopeguard", + "rawpointer", ] [[package]] -name = "log" -version = "0.4.22" +name = "memchr" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] -name = "malloc_buf" -version = "0.0.6" +name = "memmap2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" dependencies = [ "libc", ] [[package]] -name = "matrixmultiply" -version = "0.3.9" +name = "memoffset" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ "autocfg", - "rawpointer", ] [[package]] -name = "memchr" -version = "2.7.4" +name = "memoffset" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] [[package]] name = "microfft" @@ -1127,6 +2663,28 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f2dd5c7f8aaf48a76e389068ab25ed80bdbc226b887f9013844c415698c9952" +[[package]] +name = "midir" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a456444d83e7ead06ae6a5c0a215ed70282947ff3897fb45fcb052b757284731" +dependencies = [ + "alsa 0.7.1", + "bitflags 1.3.2", + "coremidi", + "js-sys", + "libc", + "wasm-bindgen", + "web-sys", + "windows 0.43.0", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.7.4" @@ -1146,6 +2704,27 @@ dependencies = [ "adler2", ] +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "morphorm" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "618fb979b26c8898ae0ed4677ca01385b0588bd4a27a8b2d3d9795f468e33366" +dependencies = [ + "smallvec", +] + [[package]] name = "nalgebra" version = "0.32.6" @@ -1173,6 +2752,58 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "ndk" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys 0.4.1+23.1.7779620", + "num_enum 0.5.11", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.6.0", + "jni-sys", + "log", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum 0.7.3", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.4.1+23.1.7779620" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + [[package]] name = "nih_log" version = "0.3.1" @@ -1184,7 +2815,7 @@ dependencies = [ "once_cell", "termcolor", "time", - "windows", + "windows 0.44.0", ] [[package]] @@ -1197,26 +2828,37 @@ dependencies = [ "atomic_float", "atomic_refcell", "backtrace", + "baseview 0.1.0 (git+https://github.com/RustAudio/baseview.git?rev=579130ecb4f9f315ae52190af42f0ea46aeaa4a2)", "bitflags 1.3.2", "cfg-if", + "clap", "clap-sys", "core-foundation", + "cpal", "crossbeam", + "jack", "libc", "log", "midi-consts", + "midir", "nih_log", "nih_plug_derive", "objc", "parking_lot", "raw-window-handle", + "rtrb", "serde", "serde_json", "vst3-sys", "widestring", - "windows", + "windows 0.44.0", ] +[[package]] +name = "nih_plug_assets" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/nih_plug_assets.git#a04e327923e120bfaba864098c906d7444e40d6b" + [[package]] name = "nih_plug_derive" version = "0.1.0" @@ -1227,6 +2869,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "nih_plug_vizia" +version = "0.0.0" +source = "git+https://github.com/robbert-vdh/nih-plug.git#dfafe90349aa3d8e40922ec031b6d673803d6432" +dependencies = [ + "baseview 0.1.0 (git+https://github.com/RustAudio/baseview.git?rev=2c1b1a7b0fef1a29a5150a6a8f6fef6a0cbab8c4)", + "crossbeam", + "nih_plug", + "nih_plug_assets", + "serde", + "vizia", +] + [[package]] name = "nih_plug_xtask" version = "0.1.0" @@ -1240,6 +2895,63 @@ dependencies = [ "toml", ] +[[package]] +name = "nix" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-complex" version = "0.4.6" @@ -1255,6 +2967,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -1284,6 +3007,69 @@ dependencies = [ "libm", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive 0.7.3", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "num_threads" version = "0.1.7" @@ -1323,25 +3109,125 @@ dependencies = [ ] [[package]] -name = "object" -version = "0.36.4" +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc-sys" +version = "0.2.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" + +[[package]] +name = "objc2" +version = "0.3.0-beta.3.patch-leaks.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" +dependencies = [ + "block2", + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-encode" +version = "2.0.0-pre.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" +dependencies = [ + "objc-sys", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "object" +version = "0.36.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +dependencies = [ + "memchr", +] + +[[package]] +name = "oboe" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" +dependencies = [ + "jni", + "ndk 0.8.0", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", +] + +[[package]] +name = "oboe-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" +dependencies = [ + "cc", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "orbclient" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +dependencies = [ + "libredox 0.0.2", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" dependencies = [ - "memchr", + "futures-core", + "pin-project-lite", ] [[package]] -name = "once_cell" -version = "1.19.0" +name = "overload" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] -name = "option-ext" -version = "0.2.0" +name = "parking" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -1361,7 +3247,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.4", "smallvec", "windows-targets 0.52.6", ] @@ -1391,6 +3277,12 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + [[package]] name = "pest" version = "2.7.12" @@ -1436,6 +3328,88 @@ dependencies = [ "sha2", ] +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project" version = "1.1.5" @@ -1468,6 +3442,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand 2.1.1", + "futures-io", +] + [[package]] name = "pkg-config" version = "0.3.30" @@ -1495,7 +3480,7 @@ dependencies = [ "plotters-backend", "plotters-bitmap", "plotters-svg", - "ttf-parser", + "ttf-parser 0.20.0", "wasm-bindgen", "web-sys", ] @@ -1539,6 +3524,37 @@ dependencies = [ "miniz_oxide 0.7.4", ] +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix 0.38.37", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "portable-atomic" version = "1.7.0" @@ -1551,6 +3567,21 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "prettyplease" version = "0.2.20" @@ -1561,6 +3592,16 @@ dependencies = [ "syn 2.0.77", ] +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + [[package]] name = "proc-macro-crate" version = "3.2.0" @@ -1570,6 +3611,12 @@ dependencies = [ "toml_edit 0.22.20", ] +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + [[package]] name = "proc-macro2" version = "1.0.86" @@ -1586,6 +3633,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" dependencies = [ "profiling-procmacros", + "tracy-client", ] [[package]] @@ -1607,6 +3655,93 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rangemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" + [[package]] name = "raw-window-handle" version = "0.5.2" @@ -1619,6 +3754,34 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" +[[package]] +name = "read-fonts" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c141b9980e1150201b2a3a32879001c8f975fe313ec3df5471a9b5c79a880cd" +dependencies = [ + "bytemuck", + "font-types", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.5.4" @@ -1634,8 +3797,8 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", - "libredox", + "getrandom 0.2.15", + "libredox 0.1.3", "thiserror", ] @@ -1657,7 +3820,7 @@ dependencies = [ "aho-corasick", "memchr", "regex-automata 0.4.7", - "regex-syntax", + "regex-syntax 0.8.4", ] [[package]] @@ -1665,6 +3828,9 @@ name = "regex-automata" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] [[package]] name = "regex-automata" @@ -1674,9 +3840,15 @@ checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.4", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.4" @@ -1689,6 +3861,15 @@ version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +dependencies = [ + "bytemuck", +] + [[package]] name = "rstest" version = "0.21.0" @@ -1709,7 +3890,7 @@ checksum = "4165dfae59a39dd41d8dec720d3cbfbc71f69744efb480a3920f5d4e0cc6798d" dependencies = [ "cfg-if", "glob", - "proc-macro-crate", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", "regex", @@ -1719,12 +3900,27 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "rtrb" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99e704dd104faf2326a320140f70f0b736d607c1caa1b1748a6c568a79819109" +dependencies = [ + "cache-padded", +] + [[package]] name = "rustc-demangle" version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.4.1" @@ -1734,6 +3930,56 @@ dependencies = [ "semver", ] +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys 0.4.14", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "rustybuzz" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162bdf42e261bee271b3957691018634488084ef577dddeb6420a9684cab2a6a" +dependencies = [ + "bitflags 1.3.2", + "bytemuck", + "libm", + "smallvec", + "ttf-parser 0.18.1", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-general-category", + "unicode-script", +] + [[package]] name = "ryu" version = "1.0.18" @@ -1767,6 +4013,12 @@ dependencies = [ "valib", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -1783,16 +4035,47 @@ dependencies = [ ] [[package]] -name = "scroll_derive" -version = "0.11.1" +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "selectors" +version = "0.23.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "phf 0.8.0", + "phf_codegen", + "precomputed-hash", + "smallvec", +] + +[[package]] +name = "self_cell" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", + "self_cell 1.0.4", ] +[[package]] +name = "self_cell" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a" + [[package]] name = "semver" version = "1.0.23" @@ -1833,6 +4116,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "serde_spanned" version = "0.6.6" @@ -1842,6 +4136,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1853,12 +4158,30 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "simba" version = "0.8.1" @@ -1898,6 +4221,22 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640" +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "skrifa" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abea4738067b1e628c6ce28b2c216c19e9ea95715cdb332680e821c3bec2ef23" +dependencies = [ + "bytemuck", + "read-fonts", +] + [[package]] name = "slab" version = "0.4.9" @@ -1915,12 +4254,31 @@ dependencies = [ "valib", ] +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + [[package]] name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -1942,6 +4300,17 @@ dependencies = [ "valib", ] +[[package]] +name = "swash" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93cdc334a50fcc2aa3f04761af3b28196280a6aaadb1ef11215c478ae32615ac" +dependencies = [ + "skrifa", + "yazi", + "zeno", +] + [[package]] name = "symphonia" version = "0.5.4" @@ -2159,6 +4528,28 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sys-locale" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e801cf239ecd6ccd71f03d270d67dd53d13e90aab208bf4b8fe4ad957ea949b0" +dependencies = [ + "libc", +] + +[[package]] +name = "tempfile" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +dependencies = [ + "cfg-if", + "fastrand 2.1.1", + "once_cell", + "rustix 0.38.37", + "windows-sys 0.59.0", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -2168,6 +4559,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "terminal_size" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" +dependencies = [ + "rustix 0.38.37", + "windows-sys 0.48.0", +] + [[package]] name = "thingbuf" version = "0.1.6" @@ -2240,6 +4641,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", +] + [[package]] name = "tinyvec" version = "1.8.0" @@ -2290,39 +4700,267 @@ dependencies = [ ] [[package]] -name = "toml_edit" -version = "0.22.20" +name = "toml_edit" +version = "0.22.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow 0.6.18", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tracy-client" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373db47331c3407b343538df77eea2516884a0b126cdfb4b135acfd400015dd7" +dependencies = [ + "loom", + "once_cell", + "tracy-client-sys", +] + +[[package]] +name = "tracy-client-sys" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49cf0064dcb31c99aa1244c1b93439359e53f72ed217eef5db50abd442241e9a" +dependencies = [ + "cc", +] + +[[package]] +name = "ts404" +version = "0.1.0" +dependencies = [ + "enum-map", + "insta", + "nalgebra", + "nih_plug", + "nih_plug_vizia", + "num-traits", + "numeric_literals", + "profiling", + "valib", +] + +[[package]] +name = "ttf-parser" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0609f771ad9c6155384897e1df4d948e692667cc0588548b68eb44d052b27633" + +[[package]] +name = "ttf-parser" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49d64318d8311fc2668e48b63969f4343e0a85c4a109aa8460d6672e364b8bd1" + +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + +[[package]] +name = "type-map" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9f" +dependencies = [ + "rustc-hash", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset 0.9.1", + "tempfile", + "winapi", +] + +[[package]] +name = "unic-langid" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dd9d1e72a73b25e07123a80776aae3e7b0ec461ef94f9151eed6ec88005a44" +dependencies = [ + "unic-langid-impl", + "unic-langid-macros", +] + +[[package]] +name = "unic-langid-impl" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5422c1f65949306c99240b81de9f3f15929f5a8bfe05bb44b034cc8bf593e5" +dependencies = [ + "tinystr", +] + +[[package]] +name = "unic-langid-macros" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da1cd2c042d3c7569a1008806b02039e7a4a2bdf8f8e96bd3c792434a0e275e" +dependencies = [ + "proc-macro-hack", + "tinystr", + "unic-langid-impl", + "unic-langid-macros-impl", +] + +[[package]] +name = "unic-langid-macros-impl" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ed7f4237ba393424195053097c1516bd4590dc82b84f2f97c5c69e12704555b" +dependencies = [ + "proc-macro-hack", + "quote", + "syn 2.0.77", + "unic-langid-impl", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56d12260fb92d52f9008be7e4bca09f584780eb2266dc8fecc6a192bec561694" + +[[package]] +name = "unicode-ccc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1" + +[[package]] +name = "unicode-general-category" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2281c8c1d221438e373249e065ca4989c4c36952c211ff21a0ee91c44a3869e7" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow 0.6.18", -] +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] -name = "ttf-parser" -version = "0.20.0" +name = "unicode-script" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" +checksum = "ad8d71f5726e5f285a935e9fe8edfd53f0491eb6e9a5774097fdabee7cd8c9cd" [[package]] -name = "typenum" -version = "1.17.0" +name = "unicode-segmentation" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] -name = "ucd-trie" -version = "0.1.6" +name = "utf8parse" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] -name = "unicode-ident" -version = "1.0.12" +name = "uuid" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.15", +] [[package]] name = "valib" @@ -2492,12 +5130,154 @@ dependencies = [ "valib-saturators", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vizia" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "vizia_baseview", + "vizia_core", + "vizia_winit", +] + +[[package]] +name = "vizia_baseview" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "baseview 0.1.0 (git+https://github.com/RustAudio/baseview.git?rev=2c1b1a7b0fef1a29a5150a6a8f6fef6a0cbab8c4)", + "femtovg", + "lazy_static", + "raw-window-handle", + "vizia_core", + "vizia_id", + "vizia_input", +] + +[[package]] +name = "vizia_core" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "accesskit", + "bitflags 2.6.0", + "chrono", + "copypasta", + "cosmic-text", + "femtovg", + "fluent-bundle", + "fluent-langneg", + "fnv", + "image", + "instant", + "log", + "morphorm", + "swash", + "sys-locale", + "unic-langid", + "unicode-segmentation", + "vizia_derive", + "vizia_id", + "vizia_input", + "vizia_storage", + "vizia_style", + "vizia_window", + "web-sys", +] + +[[package]] +name = "vizia_derive" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "vizia_id" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" + +[[package]] +name = "vizia_input" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "bitflags 1.3.2", + "keyboard-types", + "vizia_id", +] + +[[package]] +name = "vizia_storage" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "morphorm", + "vizia_id", +] + +[[package]] +name = "vizia_style" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "bitflags 2.6.0", + "cssparser", + "femtovg", + "morphorm", + "selectors", + "smallvec", +] + +[[package]] +name = "vizia_window" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "accesskit", + "morphorm", + "vizia_input", + "vizia_style", +] + +[[package]] +name = "vizia_winit" +version = "0.1.0" +source = "git+https://github.com/robbert-vdh/vizia.git?tag=patched-2024-05-06#e3fab5530cda9cb90f679508d9f058bd62189d36" +dependencies = [ + "accesskit", + "accesskit_winit", + "console_error_panic_hook", + "copypasta", + "femtovg", + "glutin", + "glutin-winit", + "raw-window-handle", + "vizia_core", + "vizia_id", + "vizia_input", + "vizia_window", + "wasm-bindgen", + "web-sys", + "winapi", + "winit", +] + [[package]] name = "vst3-com" version = "0.1.0" @@ -2535,6 +5315,12 @@ dependencies = [ "vst3-com", ] +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + [[package]] name = "walkdir" version = "2.5.0" @@ -2545,6 +5331,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -2578,123 +5370,305 @@ dependencies = [ ] [[package]] -name = "wasm-bindgen-macro" -version = "0.2.93" +name = "wasm-bindgen-futures" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "wayland-scanner" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wdfclipper" +version = "0.1.0" +dependencies = [ + "nih_plug", + "num-traits", + "thread_local", + "valib", +] + +[[package]] +name = "web-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[package]] +name = "wide" +version = "0.7.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b828f995bf1e9622031f8009f8481a85406ce1f4d4588ff746d872043e855690" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "winapi-wsapoll" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1eafc5f679c576995526e81635d0cf9695841736712b4e892f87abbe6fed3f28" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04662ed0e3e5630dfa9b26e4cb823b817f1a9addda855d973a9458c236556244" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-implement 0.48.0", + "windows-interface 0.48.0", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" dependencies = [ - "quote", - "wasm-bindgen-macro-support", + "windows-core 0.54.0", + "windows-targets 0.52.6", ] [[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.93" +name = "windows" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", - "wasm-bindgen-backend", - "wasm-bindgen-shared", + "windows-core 0.58.0", + "windows-targets 0.52.6", ] [[package]] -name = "wasm-bindgen-shared" -version = "0.2.93" +name = "windows-core" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" - -[[package]] -name = "wdfclipper" -version = "0.1.0" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "nih_plug", - "num-traits", - "thread_local", - "valib", + "windows-targets 0.52.6", ] [[package]] -name = "web-sys" -version = "0.3.70" +name = "windows-core" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" dependencies = [ - "js-sys", - "wasm-bindgen", + "windows-result 0.1.2", + "windows-targets 0.52.6", ] [[package]] -name = "weezl" -version = "0.1.8" +name = "windows-core" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings", + "windows-targets 0.52.6", +] [[package]] -name = "wide" -version = "0.7.28" +name = "windows-implement" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b828f995bf1e9622031f8009f8481a85406ce1f4d4588ff746d872043e855690" +checksum = "5e2ee588991b9e7e6c8338edf3333fbe4da35dc72092643958ebb43f0ab2c49c" dependencies = [ - "bytemuck", - "safe_arch", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "widestring" -version = "1.1.0" +name = "windows-implement" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] [[package]] -name = "winapi" -version = "0.3.9" +name = "windows-interface" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "e6fb8df20c9bcaa8ad6ab513f7b40104840c8867d5751126e4df3b08388d0cc7" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "windows-interface" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] [[package]] -name = "winapi-util" -version = "0.1.9" +name = "windows-result" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ - "windows-sys 0.52.0", + "windows-targets 0.52.6", ] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "windows-result" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] [[package]] -name = "windows" -version = "0.44.0" +name = "windows-strings" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-targets 0.42.2", + "windows-result 0.2.0", + "windows-targets 0.52.6", ] [[package]] -name = "windows-core" -version = "0.52.0" +name = "windows-sys" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets 0.52.6", + "windows-targets 0.42.2", ] [[package]] @@ -2715,6 +5689,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -2893,6 +5876,36 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winit" +version = "0.28.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9596d90b45384f5281384ab204224876e8e8bf7d58366d9b795ad99aa9894b94" +dependencies = [ + "android-activity", + "bitflags 1.3.2", + "cfg_aliases", + "core-foundation", + "core-graphics 0.22.3", + "dispatch", + "instant", + "libc", + "log", + "mio", + "ndk 0.7.0", + "objc2", + "once_cell", + "orbclient", + "percent-encoding", + "raw-window-handle", + "redox_syscall 0.3.5", + "wasm-bindgen", + "wayland-scanner", + "web-sys", + "windows-sys 0.45.0", + "x11-dl", +] + [[package]] name = "winnow" version = "0.5.40" @@ -2920,6 +5933,114 @@ dependencies = [ "winapi", ] +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-clipboard" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "980b9aa9226c3b7de8e2adb11bf20124327c054e0e5812d2aac0b5b5a87e7464" +dependencies = [ + "x11rb 0.10.1", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507" +dependencies = [ + "gethostname 0.2.3", + "nix 0.24.3", + "winapi", + "winapi-wsapoll", + "x11rb-protocol 0.10.0", +] + +[[package]] +name = "x11rb" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "as-raw-xcb-connection", + "gethostname 0.4.3", + "libc", + "rustix 0.38.37", + "x11rb-protocol 0.13.1", +] + +[[package]] +name = "x11rb-protocol" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56b245751c0ac9db0e006dc812031482784e434630205a93c73cfefcaabeac67" +dependencies = [ + "nix 0.24.3", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[package]] +name = "xcb" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62056f63138b39116f82a540c983cc11f1c90cd70b3d492a70c25eaa50bd22a6" +dependencies = [ + "libc", + "log", + "x11", +] + +[[package]] +name = "xcb-util" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43893e47f27bf7d81d489feef3a0e34a457e90bc314b7e74ad9bb3980e4c1c48" +dependencies = [ + "libc", + "xcb", +] + +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "xml-rs" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26" + [[package]] name = "xtask" version = "0.1.0" @@ -2927,6 +6048,12 @@ dependencies = [ "nih_plug_xtask", ] +[[package]] +name = "yazi" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" + [[package]] name = "yeslogic-fontconfig-sys" version = "6.0.0" @@ -2938,12 +6065,85 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "zbus" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io 1.13.0", + "async-lock 2.8.0", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "byteorder", + "derivative", + "enumflags2", + "event-listener 2.5.3", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.26.4", + "once_cell", + "ordered-stream", + "rand 0.8.5", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "winapi", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "regex", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zeno" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" + [[package]] name = "zerocopy" version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] @@ -2957,3 +6157,41 @@ dependencies = [ "quote", "syn 2.0.77", ] + +[[package]] +name = "zvariant" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" +dependencies = [ + "byteorder", + "enumflags2", + "libc", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] diff --git a/Cargo.toml b/Cargo.toml index cb916a8..54b15f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["crates/*", "examples/*", "xtask"] +members = ["crates/*", "examples/*", "plugins/ts404", "xtask"] [workspace.package] version = "0.1.0" diff --git a/bundler.toml b/bundler.toml index 082de8a..64e4b42 100644 --- a/bundler.toml +++ b/bundler.toml @@ -18,3 +18,6 @@ name = "Slew" [wdfclipper] name = "Diode Clipper (WDF)" + +[ts404] +name = "TS-404" diff --git a/plugins/ts404/.cargo/config b/plugins/ts404/.cargo/config deleted file mode 100644 index 4e547e5..0000000 --- a/plugins/ts404/.cargo/config +++ /dev/null @@ -1,2 +0,0 @@ -[alias] -xtask = "run --package xtask --release --" diff --git a/plugins/ts404/Cargo.toml b/plugins/ts404/Cargo.toml index 466c255..f4d5b3b 100644 --- a/plugins/ts404/Cargo.toml +++ b/plugins/ts404/Cargo.toml @@ -7,42 +7,23 @@ license = "GPL-3.0-or-later" homepage = "https://solarliner.dev" description = "An inspired but fantasy screamer guitar pedal emulation" -[workspace] -members = ["xtask"] - [lib] crate-type = ["lib", "cdylib"] [dependencies] +valib = { path = "../..", features = ["oversample", "wdf", "nih-plug"] } + +nalgebra.workspace = true +nih_plug = { workspace = true, features = ["standalone"] } +nih_plug_vizia.workspace = true +num-traits.workspace = true +numeric_literals.workspace = true +profiling.workspace = true + enum-map = "2.7.3" -nalgebra = "0.32.3" -nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git", features = ["standalone"] } -nih_plug_vizia = { git = "https://github.com/robbert-vdh/nih-plug.git" } -num-traits = "0.2.17" -numeric_literals = "0.2.0" -profiling = { version = "1.0.15" } -#valib = { git = "https://github.com/SolarLiner/valib.git" } -valib = { path = "../valib", features = ["oversample", "wdf", "nih-plug"] } [dev-dependencies] insta = { version = "1.39.0", features = ["csv", "redactions"] } [features] profiling = ["profiling/profile-with-tracy"] - -[profile.dev] -opt-level = 1 - -[profile.test] -opt-level = 0 - -[profile.release] -codegen-units = 1 -lto = "fat" -strip = "symbols" -opt-level = 3 - -[profile.profiling] -inherits = "release" -debug = true -strip = "none" diff --git a/plugins/ts404/bundler.toml b/plugins/ts404/bundler.toml deleted file mode 100644 index f9094ee..0000000 --- a/plugins/ts404/bundler.toml +++ /dev/null @@ -1,2 +0,0 @@ -[ts404] -name = "TS-404" From 4b67ef7ea2411432b78189cbe924b64c5e477142 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Thu, 12 Sep 2024 23:49:10 +0200 Subject: [PATCH 32/51] chore: introduce cargo makefiles --- .github/workflows/{build.yml => ci.yml} | 37 ++++---------- .github/workflows/test.yml | 68 ------------------------- Makefile.plugins.toml | 21 ++++++++ examples/diodeclipper/Makefile.toml | 1 + examples/dirty-biquad/Makefile.toml | 1 + examples/ladder/Makefile.toml | 1 + examples/saturators/Makefile.toml | 1 + examples/slew/Makefile.toml | 1 + examples/svfmixer/Makefile.toml | 1 + examples/wdfclipper/Makefile.toml | 1 + plugins/abrasive/Makefile.toml | 1 + plugins/ts404/Makefile.toml | 27 +++------- 12 files changed, 46 insertions(+), 115 deletions(-) rename .github/workflows/{build.yml => ci.yml} (74%) delete mode 100644 .github/workflows/test.yml create mode 100644 Makefile.plugins.toml create mode 100644 examples/diodeclipper/Makefile.toml create mode 100644 examples/dirty-biquad/Makefile.toml create mode 100644 examples/ladder/Makefile.toml create mode 100644 examples/saturators/Makefile.toml create mode 100644 examples/slew/Makefile.toml create mode 100644 examples/svfmixer/Makefile.toml create mode 100644 examples/wdfclipper/Makefile.toml create mode 100644 plugins/abrasive/Makefile.toml diff --git a/.github/workflows/build.yml b/.github/workflows/ci.yml similarity index 74% rename from .github/workflows/build.yml rename to .github/workflows/ci.yml index 9faa4e3..2362940 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Automated Builds +name: CI on: push: @@ -63,31 +63,16 @@ jobs: # The macOS AArch64/universal build is done from an x86_64 macOS CI # runner, so it needs to be cross compiled target: ${{ matrix.cross-target }} - - name: Build valib - run: cargo build -p valib --release - - name: Package all targets from bundler.toml - # Instead of hardcoding which targets to build and package, we'll - # package everything that's got en entry in the `bundler.toml` file - run: | - # Building can be sped up by specifying all packages in one go - package_args=() - for package in $(cargo xtask known-packages); do - package_args+=("-p" "$package") - done - - runner_name=${{ matrix.name }} - if [[ $runner_name = 'macos-universal' ]]; then - export MACOSX_DEPLOYMENT_TARGET=10.13 - cargo xtask bundle-universal "${package_args[@]}" --release - else - cross_target=${{ matrix.cross-target }} - if [[ -n $cross_target ]]; then - package_args+=("--target" "$cross_target") - fi - - cargo xtask bundle "${package_args[@]}" --release - fi - + - name: Install cargo-make + uses: actions-rs/cargo@v1 + with: + command: install + args: --debug cargo-make + - name: Run CI + uses: actions-rs/cargo@v1 + with: + command: make + args: --no-workspace workspace-ci-flow - name: Determine build archive name run: | echo "ARCHIVE_NAME=valib-plugins-$(git describe --always)-${{ matrix.name }}" >> "$GITHUB_ENV" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 1f9ecb3..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,68 +0,0 @@ -name: Tests - -on: - push: - branches: - - main - tags: - # Run when pushing version tags, since otherwise it's impossible to - # restart a successful build after pushing a tag - - '*.*.*' - pull_request: - branches: - - main - -defaults: - run: - # This otherwise gets run under dash which does not support brace expansion - shell: bash - -jobs: - test: - strategy: - matrix: - os: [ubuntu-22.04, macos-11, windows-latest] - name: Build and test all components - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v2 - # Needed for git-describe to do anything useful - - name: Fetch all git history - run: git fetch --force --prune --tags --unshallow - - - name: Install dependencies - if: startsWith(matrix.os, 'ubuntu') - run: | - sudo apt-get update - sudo apt-get install -y libasound2-dev libgl-dev libjack-dev libx11-xcb-dev libxcb1-dev libxcb-dri2-0-dev libxcb-icccm4-dev libxcursor-dev libxkbcommon-dev libxcb-shape0-dev libxcb-xfixes0-dev - - uses: actions/cache@v2 - # FIXME: Caching `target/` causes the Windows runner to blow up after some time - if: startsWith(matrix.os, 'windows') - with: - path: | - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - key: ${{ matrix.name }}-${{ matrix.cross-target }} - - uses: actions/cache@v2 - if: "!startsWith(matrix.os, 'windows')" - with: - path: | - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ matrix.name }}-${{ matrix.cross-target }} - - - name: Set up Rust toolchain - uses: actions-rs/toolchain@v1 - - name: Build all targets - uses: actions-rs/cargo@v1 - with: - command: build - args: --workspace --all-targets --all-features - - name: Run the tests - uses: actions-rs/cargo@v1 - with: - command: test - args: --workspace --all-targets --all-features diff --git a/Makefile.plugins.toml b/Makefile.plugins.toml new file mode 100644 index 0000000..f52090c --- /dev/null +++ b/Makefile.plugins.toml @@ -0,0 +1,21 @@ +[tasks.xtask-build] +command = "cargo" +args = ["build", "-p", "xtask", "--release"] + +[tasks.bundle] +dependencies = ["xtask-build"] +command = "cargo" +args = ["xtask", "bundle", "${CARGO_MAKE_CRATE_NAME}", "${@}"] + +[tasks.bundle-universal] +dependencies = ["xtask-build"] +command = "cargo" +args = ["xtask", "bundle-universal", "${CARGO_MAKE_CRATE_NAME}", "${@}"] + +[tasks.build] +clear = true +dependencies = ["pre-build"] +run_task = [ + { name = "bundle-universal", condition = { platforms = ["mac"] } }, + { name = "bundle" } +] \ No newline at end of file diff --git a/examples/diodeclipper/Makefile.toml b/examples/diodeclipper/Makefile.toml new file mode 100644 index 0000000..1243632 --- /dev/null +++ b/examples/diodeclipper/Makefile.toml @@ -0,0 +1 @@ +extend = "../../Makefile.plugins.toml" \ No newline at end of file diff --git a/examples/dirty-biquad/Makefile.toml b/examples/dirty-biquad/Makefile.toml new file mode 100644 index 0000000..1243632 --- /dev/null +++ b/examples/dirty-biquad/Makefile.toml @@ -0,0 +1 @@ +extend = "../../Makefile.plugins.toml" \ No newline at end of file diff --git a/examples/ladder/Makefile.toml b/examples/ladder/Makefile.toml new file mode 100644 index 0000000..1243632 --- /dev/null +++ b/examples/ladder/Makefile.toml @@ -0,0 +1 @@ +extend = "../../Makefile.plugins.toml" \ No newline at end of file diff --git a/examples/saturators/Makefile.toml b/examples/saturators/Makefile.toml new file mode 100644 index 0000000..1243632 --- /dev/null +++ b/examples/saturators/Makefile.toml @@ -0,0 +1 @@ +extend = "../../Makefile.plugins.toml" \ No newline at end of file diff --git a/examples/slew/Makefile.toml b/examples/slew/Makefile.toml new file mode 100644 index 0000000..1243632 --- /dev/null +++ b/examples/slew/Makefile.toml @@ -0,0 +1 @@ +extend = "../../Makefile.plugins.toml" \ No newline at end of file diff --git a/examples/svfmixer/Makefile.toml b/examples/svfmixer/Makefile.toml new file mode 100644 index 0000000..1243632 --- /dev/null +++ b/examples/svfmixer/Makefile.toml @@ -0,0 +1 @@ +extend = "../../Makefile.plugins.toml" \ No newline at end of file diff --git a/examples/wdfclipper/Makefile.toml b/examples/wdfclipper/Makefile.toml new file mode 100644 index 0000000..1243632 --- /dev/null +++ b/examples/wdfclipper/Makefile.toml @@ -0,0 +1 @@ +extend = "../../Makefile.plugins.toml" \ No newline at end of file diff --git a/plugins/abrasive/Makefile.toml b/plugins/abrasive/Makefile.toml new file mode 100644 index 0000000..1243632 --- /dev/null +++ b/plugins/abrasive/Makefile.toml @@ -0,0 +1 @@ +extend = "../../Makefile.plugins.toml" \ No newline at end of file diff --git a/plugins/ts404/Makefile.toml b/plugins/ts404/Makefile.toml index c5fba50..136723e 100644 --- a/plugins/ts404/Makefile.toml +++ b/plugins/ts404/Makefile.toml @@ -1,8 +1,4 @@ -[config] -default_to_workspace = false - -[tasks.default] -alias = "bundle" +extend = "../../Makefile.plugins.toml" [tasks.venv] script_runner = "@shell" @@ -10,10 +6,6 @@ script = """ poetry install --no-root """ -[tasks.xtask-build] -extend = "build" -args = ["build", "-p", "xtask", "--release"] - [tasks.generate] dependencies = ["venv"] script_runner = "@shell" @@ -22,20 +14,13 @@ poetry run python ./gen_statespace.py """ condition = { files_modified = { input = ["./gen_statespace.py"], output = ["./src/gen.rs"] } } -[tasks.build] -args = ["build", "-p", "ts404", "${@}"] +[tasks.format-flow] dependencies = ["generate"] +[tasks.pre-build] +run_task = "generate" + [tasks.run] command = "cargo" -args = ["run" ,"-p", "ts404", "${@}"] +args = ["run", "-p", "ts404", "${@}"] dependencies = ["generate"] - -[tasks.bundle] -dependencies = ["build", "xtask-build"] -command = "cargo" -args = ["xtask", "bundle", "ts404", "${@}"] -install_crate = false - -[tasks.bundle.macos] -args = ["xtask", "bundle-universal", "ts404", "${@}"] From 1177ec3e7a97c12a0ed87513f1da1c778944b980 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Thu, 12 Sep 2024 23:49:53 +0200 Subject: [PATCH 33/51] ci: introduce clippy linting --- .github/workflows/clippy.yml | 41 ++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/clippy.yml diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml new file mode 100644 index 0000000..ea68bd9 --- /dev/null +++ b/.github/workflows/clippy.yml @@ -0,0 +1,41 @@ +name: Clippy lints + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + clippy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y libasound2-dev libgl-dev libjack-dev libx11-xcb-dev libxcb1-dev libxcb-dri2-0-dev libxcb-icccm4-dev libxcursor-dev libxkbcommon-dev libxcb-shape0-dev libxcb-xfixes0-dev + - uses: actions/cache@v2 + with: + path: | + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ matrix.name }}-${{ matrix.cross-target }} + + - name: Set up Rust toolchain + uses: actions-rs/toolchain@v1 + - name: Install cargo-make + uses: actions-rs/cargo@v1 + with: + command: install + args: --debug cargo-make + - name: pre-build + run: cargo make pre-build + - name: Run clippy + uses: clechasseur/rs-clippy-check@v3 + with: + args: --workspace --all-targets --all-features \ No newline at end of file From 34bc57a612f5c47be033e1646e50c9028e605fdf Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Thu, 12 Sep 2024 23:52:00 +0200 Subject: [PATCH 34/51] ci: fix all jobs needing poetry + pre-building --- .github/workflows/ci.yml | 2 ++ .github/workflows/clippy.yml | 3 ++- .github/workflows/documentation.yml | 9 +++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2362940..b1daaac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,6 +57,8 @@ jobs: target/ key: ${{ matrix.name }}-${{ matrix.cross-target }} + - name: Install Poetry + uses: snok/install-poetry@v1 - name: Set up Rust toolchain uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml index ea68bd9..deddaca 100644 --- a/.github/workflows/clippy.yml +++ b/.github/workflows/clippy.yml @@ -25,7 +25,8 @@ jobs: ~/.cargo/git/db/ target/ key: ${{ matrix.name }}-${{ matrix.cross-target }} - + - name: Install Poetry + uses: snok/install-poetry@v1 - name: Set up Rust toolchain uses: actions-rs/toolchain@v1 - name: Install cargo-make diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index e5ccd6f..ad35a1c 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -30,8 +30,17 @@ jobs: - uses: actions/checkout@v2 - name: Fetch all git history run: git fetch --force --prune --tags --unshallow + - name: Install Poetry + uses: snok/install-poetry@v1 - name: Set up Rust toolchain uses: actions-rs/toolchain@v1 + - name: Install cargo-make + uses: actions-rs/cargo@v1 + with: + command: install + args: --debug cargo-make + - name: pre-build + run: cargo make pre-build - name: Build documentation run: cargo doc --all-features --no-deps - name: Fix permissions From b110e5b8850f244914adf70bacc9cdb82618eb03 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Thu, 12 Sep 2024 23:57:28 +0200 Subject: [PATCH 35/51] ci: install python 3.12 --- .github/workflows/ci.yml | 5 ++++- .github/workflows/clippy.yml | 4 ++++ .github/workflows/documentation.yml | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b1daaac..5e55a11 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -56,7 +56,10 @@ jobs: ~/.cargo/git/db/ target/ key: ${{ matrix.name }}-${{ matrix.cross-target }} - + - name: Install Pyhton 3.12 + uses: actions/setup-python@v5 + with: + python-version: '3.12' - name: Install Poetry uses: snok/install-poetry@v1 - name: Set up Rust toolchain diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml index deddaca..b6eac7e 100644 --- a/.github/workflows/clippy.yml +++ b/.github/workflows/clippy.yml @@ -25,6 +25,10 @@ jobs: ~/.cargo/git/db/ target/ key: ${{ matrix.name }}-${{ matrix.cross-target }} + - name: Install Pyhton 3.12 + uses: actions/setup-python@v5 + with: + python-version: '3.12' - name: Install Poetry uses: snok/install-poetry@v1 - name: Set up Rust toolchain diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index ad35a1c..495569e 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -30,6 +30,10 @@ jobs: - uses: actions/checkout@v2 - name: Fetch all git history run: git fetch --force --prune --tags --unshallow + - name: Install Pyhton 3.12 + uses: actions/setup-python@v5 + with: + python-version: '3.12' - name: Install Poetry uses: snok/install-poetry@v1 - name: Set up Rust toolchain From 6fb07f31bab96e1ad1aa3e3f108de6c5cef67d31 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 09:01:40 +0200 Subject: [PATCH 36/51] fix: compile error --- crates/valib-core/src/dsp/blocks.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/valib-core/src/dsp/blocks.rs b/crates/valib-core/src/dsp/blocks.rs index 3c4a371..6025661 100644 --- a/crates/valib-core/src/dsp/blocks.rs +++ b/crates/valib-core/src/dsp/blocks.rs @@ -642,8 +642,10 @@ where fn process(&mut self, x: [Self::Sample; I]) -> [Self::Sample; O] { self.0 .iter_mut() - .map(|dsp| { - profiling::scope!("Parallel", &format!("{_i}")); + .enumerate() + .map(|(i, dsp)| { + let _ = i; // Needed to shut down warnings when the profiling macro evaluates to noop + profiling::scope!("Parallel", &format!("{i}")); dsp.process(x) }) .fold([Self::Sample::from_f64(0.0); O], |out, dsp| { From 0ee14c987a3467a9ece8140a2f25a17b1a81c3ff Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 09:49:12 +0200 Subject: [PATCH 37/51] ci: fix poetry installed but not found --- .github/workflows/ci.yml | 4 +- .github/workflows/clippy.yml | 4 +- .github/workflows/documentation.yml | 4 +- plugins/ts404/.github/workflows/build.yml | 90 ------------------- .../ts404/.github/workflows/readme-Linux.txt | 10 --- .../.github/workflows/readme-Windows.txt | 10 --- .../ts404/.github/workflows/readme-macOS.txt | 10 --- 7 files changed, 6 insertions(+), 126 deletions(-) delete mode 100644 plugins/ts404/.github/workflows/build.yml delete mode 100644 plugins/ts404/.github/workflows/readme-Linux.txt delete mode 100644 plugins/ts404/.github/workflows/readme-Windows.txt delete mode 100644 plugins/ts404/.github/workflows/readme-macOS.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5e55a11..b0cf1a8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,8 +60,8 @@ jobs: uses: actions/setup-python@v5 with: python-version: '3.12' - - name: Install Poetry - uses: snok/install-poetry@v1 + - name: Install poetry + run: pip install poetry - name: Set up Rust toolchain uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml index b6eac7e..94b697a 100644 --- a/.github/workflows/clippy.yml +++ b/.github/workflows/clippy.yml @@ -29,8 +29,8 @@ jobs: uses: actions/setup-python@v5 with: python-version: '3.12' - - name: Install Poetry - uses: snok/install-poetry@v1 + - name: Install poetry + run: pip install poetry - name: Set up Rust toolchain uses: actions-rs/toolchain@v1 - name: Install cargo-make diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 495569e..89f73ee 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -34,8 +34,8 @@ jobs: uses: actions/setup-python@v5 with: python-version: '3.12' - - name: Install Poetry - uses: snok/install-poetry@v1 + - name: Install poetry + run: pip install poetry - name: Set up Rust toolchain uses: actions-rs/toolchain@v1 - name: Install cargo-make diff --git a/plugins/ts404/.github/workflows/build.yml b/plugins/ts404/.github/workflows/build.yml deleted file mode 100644 index f4d9c9b..0000000 --- a/plugins/ts404/.github/workflows/build.yml +++ /dev/null @@ -1,90 +0,0 @@ -name: Automated Builds - -on: - push: - branches: - - master - tags: - # Run when pushing version tags, since otherwise it's impossible to - # restart a successful build after pushing a tag - - '*.*.*' - pull_request: - branches: - - master - -defaults: - run: - # This otherwise gets run under dash which does not support brace expansion - shell: bash - -jobs: - # We'll only package the plugins with an entry in bundler.toml - package: - strategy: - matrix: - include: - - { name: ubuntu-22.04, os: ubuntu-22.04, cross-target: '' } - - { name: macos-universal, os: macos-11, cross-target: aarch64-apple-darwin } - - { name: windows, os: windows-latest, cross-target: '' } - name: Package plugin binaries - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v2 - - name: Fetch all git history - run: git fetch --force --prune --tags --unshallow - - - name: Install dependencies - if: startsWith(matrix.os, 'ubuntu') - run: | - sudo apt-get update - sudo apt-get install -y libasound2-dev libgl-dev libjack-dev libx11-xcb-dev libxcb1-dev libxcb-dri2-0-dev libxcb-icccm4-dev libxcursor-dev libxkbcommon-dev libxcb-shape0-dev libxcb-xfixes0-dev - - uses: actions/cache@v2 - # FIXME: Caching `target/` causes the Windows runner to blow up after some time - if: startsWith(matrix.os, 'windows') - with: - path: | - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - key: ${{ matrix.name }}-${{ matrix.cross-target }} - - uses: actions/cache@v2 - if: "!startsWith(matrix.os, 'windows')" - with: - path: | - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ matrix.name }}-${{ matrix.cross-target }} - - - name: Set up Rust toolchain - uses: actions-rs/toolchain@v1 - with: - # The macOS AArch64/universal build is done from an x86_64 macOS CI - # runner, so it needs to be cross compiled - target: ${{ matrix.cross-target }} - - name: Install cargo-make - run: cargo install --force cargo-make - - name: Setup Python - uses: actions/setup-python@v5.0.0 - with: - # Version range or exact version of Python or PyPy to use, using SemVer's version range syntax. Reads from .python-version if unset. - python-version: 3.12 - - name: Install poetry - run: pip install poetry - - name: Build and bundle plugin - run: cargo make bundle --release - - name: Determine build archive name - run: | - echo "ARCHIVE_NAME=ts404-$(git describe --always)-${{ matrix.name }}" >> "$GITHUB_ENV" - - name: Move all packaged plugin into a directory - run: | - # GitHub Action strips the top level directory, great, have another one - mkdir -p "$ARCHIVE_NAME/$ARCHIVE_NAME" - mv target/bundled/* "$ARCHIVE_NAME/$ARCHIVE_NAME" - - name: Add an OS-specific readme file with installation instructions - run: cp ".github/workflows/readme-${{ runner.os }}.txt" "$ARCHIVE_NAME/$ARCHIVE_NAME/README.txt" - - uses: actions/upload-artifact@v2 - with: - name: ${{ env.ARCHIVE_NAME }} - path: ${{ env.ARCHIVE_NAME }} diff --git a/plugins/ts404/.github/workflows/readme-Linux.txt b/plugins/ts404/.github/workflows/readme-Linux.txt deleted file mode 100644 index 1a2f474..0000000 --- a/plugins/ts404/.github/workflows/readme-Linux.txt +++ /dev/null @@ -1,10 +0,0 @@ -To install the VST3 plugins, copy the .vst3 _directories_ to: -~/.vst3 - -To install the CLAP plugins, copy the .clap files to: -~/.clap - -You will need to create these directories yourself it they do not yet exist. - -See https://github.com/free-audio/clap#hosts for instructions on how to enable -CLAP support in your DAW. diff --git a/plugins/ts404/.github/workflows/readme-Windows.txt b/plugins/ts404/.github/workflows/readme-Windows.txt deleted file mode 100644 index 611fdb3..0000000 --- a/plugins/ts404/.github/workflows/readme-Windows.txt +++ /dev/null @@ -1,10 +0,0 @@ -To install the VST3 plugins, copy the .vst3 _directories_ to: -C:/Program Files/Common Files/VST3/ - -To install the CLAP plugins, copy the .clap files to: -C:/Program Files/Common Files/CLAP/ - -You will need to create these directories yourself it they do not yet exist. - -See https://github.com/free-audio/clap#hosts for instructions on how to enable -CLAP support in your DAW. diff --git a/plugins/ts404/.github/workflows/readme-macOS.txt b/plugins/ts404/.github/workflows/readme-macOS.txt deleted file mode 100644 index ebee0d7..0000000 --- a/plugins/ts404/.github/workflows/readme-macOS.txt +++ /dev/null @@ -1,10 +0,0 @@ -To install the VST3 plugins, copy the .vst3 bundles to: -~/Library/Audio/Plug-Ins/VST3 - -To install the CLAP plugins, copy the .clap bundles to: -~/Library/Audio/Plug-Ins/CLAP - -You will need to create these directories yourself it they do not yet exist. - -See https://github.com/free-audio/clap#hosts for instructions on how to enable -CLAP support in your DAW. From 9c26b00f25df8b3f810bb18536b08f8aab8fc8e5 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 09:49:26 +0200 Subject: [PATCH 38/51] chore(ide): setup Python facet --- .idea/valib.iml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.idea/valib.iml b/.idea/valib.iml index d844b6c..f19c036 100644 --- a/.idea/valib.iml +++ b/.idea/valib.iml @@ -1,5 +1,10 @@ + + + + + @@ -32,5 +37,6 @@ + \ No newline at end of file From 068285be1ddd70b91bc40e7745b13004cde707f8 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 14:28:19 +0200 Subject: [PATCH 39/51] docs(core): add missing documentation --- crates/valib-core/src/benchmarking.rs | 12 + crates/valib-core/src/dsp/blocks.rs | 119 +++++++- crates/valib-core/src/dsp/buffer.rs | 170 ++++++++++- crates/valib-core/src/dsp/mod.rs | 23 +- crates/valib-core/src/dsp/parameter.rs | 76 ++++- crates/valib-core/src/lib.rs | 44 ++- crates/valib-core/src/math/interpolation.rs | 8 + crates/valib-core/src/math/lut.rs | 30 ++ crates/valib-core/src/math/mod.rs | 60 +++- crates/valib-core/src/math/nr.rs | 53 +++- crates/valib-core/src/util.rs | 296 ++++++++------------ crates/valib-core/src/util/tests.rs | 190 +++++++++++++ 12 files changed, 859 insertions(+), 222 deletions(-) create mode 100644 crates/valib-core/src/util/tests.rs diff --git a/crates/valib-core/src/benchmarking.rs b/crates/valib-core/src/benchmarking.rs index a14a01c..de36d0d 100644 --- a/crates/valib-core/src/benchmarking.rs +++ b/crates/valib-core/src/benchmarking.rs @@ -1,7 +1,19 @@ +//! Module for benchmarking utilies. + use crate::dsp::DSPProcess; use num_traits::Zero; use std::hint::black_box; +/// Benchmark a DSP process by sending it a zeroed stream `amount` times. This automatically +/// blackboxes the process and input to ensure benchmarking provides relevant results. +/// +/// # Arguments +/// +/// * `amount`: Number of samples to process +/// * `dsp`: DSP process to benchmark +/// +/// returns: () +#[inline] pub fn benchmark_dsp, const I: usize, const O: usize>( amount: usize, mut dsp: P, diff --git a/crates/valib-core/src/dsp/blocks.rs b/crates/valib-core/src/dsp/blocks.rs index 6025661..1f8b427 100644 --- a/crates/valib-core/src/dsp/blocks.rs +++ b/crates/valib-core/src/dsp/blocks.rs @@ -111,16 +111,20 @@ where } } +/// Parameter type for one-pole filters #[derive(Debug, Clone, Copy, PartialEq, Eq, ParamName)] pub enum P1Params { + /// Change the frequency cutoff (in Hz) of the filter Cutoff, } /// 6 dB/oct one-pole filter (fig. 3.31, eq. 3.32). -/// Outputs modes as follows: [LP, HP, AP]. +/// Implements [`DSPProcess`] with up to 3 outputs, in order: LP, HP, AP #[derive(Debug, Copy, Clone)] pub struct P1 { + /// Cutoff frequency of the filter, in Hz pub fc: T, + /// Inner state of the filter (can be set arbitrarily to avoid pops at the start of processing) pub s: T, w_step: T, } @@ -166,6 +170,15 @@ where } impl P1 { + /// Create a new one-pole filter. + /// + /// # Arguments + /// + /// * `samplerate`: Sample rate at which the filter will run + /// * `fc`: Cutoff frequency in Hz + /// + /// returns: P1 + /// pub fn new(samplerate: T, fc: T) -> Self { Self { w_step: T::simd_pi() / samplerate, @@ -174,16 +187,70 @@ impl P1 { } } + /// Returns a modified one-pole filter with the given state set. + /// + /// # Arguments + /// + /// * `state`: New value for the state of the filter + /// + /// returns: P1 pub fn with_state(mut self, state: T) -> Self { self.s = state; self } + /// Set the filter cutoff. + /// + /// # Arguments + /// + /// * `fc`: New cutoff frequency in Hz. + /// + /// returns: () pub fn set_fc(&mut self, fc: T) { self.fc = fc; } } +#[profiling::all_functions] +impl DSPProcess<1, 1> for P1 +where + Self: DSPMeta, +{ + #[inline(always)] + #[replace_float_literals(T::from_f64(literal))] + fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 1] { + // One-sample feedback tick over a transposed integrator, implementation following + // eq (3.32), page 77 + let g = self.w_step * self.fc; + let k = g / (1. + g); + let v = k * (x[0] - self.s); + let lp = v + self.s; + self.s = lp + v; + [lp] + } +} + +#[profiling::all_functions] +impl DSPProcess<1, 2> for P1 +where + Self: DSPMeta, +{ + #[inline(always)] + #[replace_float_literals(T::from_f64(literal))] + fn process(&mut self, x: [Self::Sample; 1]) -> [Self::Sample; 2] { + // One-sample feedback trick over a transposed integrator, implementation following + // eq (3.32), page 77 + let g = self.w_step * self.fc; + let k = g / (1. + g); + let v = k * (x[0] - self.s); + let lp = v + self.s; + self.s = lp + v; + + let hp = x[0] - lp; + [lp, hp] + } +} + #[profiling::all_functions] impl DSPProcess<1, 3> for P1 where @@ -212,6 +279,7 @@ pub struct Series(pub T); macro_rules! series_tuple { ($params_name:ident: $count:literal; $($p:ident),*) => { + #[allow(missing_docs)] #[derive(Debug, Copy, Clone)] pub enum $params_name<$($p),*> { $($p($p)),* @@ -325,6 +393,7 @@ series_tuple!(Tuple6Params: 6; A, B, C, D, E, F); series_tuple!(Tuple7Params: 7; A, B, C, D, E, F, G); series_tuple!(Tuple8Params: 8; A, B, C, D, E, F, G, H); +/// Parameter type for Series/Parallel blocks having N elements #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct TupleArrayParams(pub ParamId, pub Name); @@ -387,8 +456,9 @@ where { #[profiling::function] fn process(&mut self, x: [Self::Sample; N]) -> [Self::Sample; N] { - self.0.iter_mut().enumerate().fold(x, |x, (_i, dsp)| { - profiling::scope!("Series", &format!("{_i}")); + self.0.iter_mut().enumerate().fold(x, |x, (i, dsp)| { + let _ = i; // Needed to suppress warnings when the profiling macro evaluates to noop + profiling::scope!("Series", &format!("{i}")); dsp.process(x) }) } @@ -667,6 +737,7 @@ where } } +/// Parameter type for a parameter update within a mod matrix #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct ModMatrixParams(pub ParamId, pub ParamId); @@ -741,10 +812,14 @@ where } } +/// Parameter type for param changes within the [`Feedback`] processor. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum FeedbackParams { + /// Param change in the feed-forward processor Feedforward(FF), + /// Param change in the feedback processor Feedback(FB), + /// Param change is the mix factor Mix(Dynamic), } @@ -788,8 +863,9 @@ where FF: DSPMeta, { memory: [FF::Sample; N], - /// Inner DSP instance + /// Inner feed-forward DSP instance pub feedforward: FF, + /// Inner feedback DSP instance pub feedback: FB, /// Mixing vector, which is lanewise-multiplied from the output and summed back to the input at the next sample. pub mix: [SmoothedParam; N], @@ -904,13 +980,26 @@ impl HasParameters for Feedback { + /// First inner processor pub a: A, + /// Second inner processor pub b: B, switch: SmoothedParam, } impl SwitchAB { + /// Create a new crossfade switch processor + /// + /// # Arguments + /// + /// * `samplerate`: Sample rate at which the processor will run + /// * `a`: First inner processor + /// * `b`: Second inner processor + /// * `b_active`: Is B active ? (If false, A is set active) + /// + /// returns: SwitchAB pub fn new(samplerate: f32, a: A, b: B, b_active: bool) -> Self { Self { a, @@ -919,26 +1008,36 @@ impl SwitchAB { } } + /// Returns true if A is currently active (and processing audio). pub fn is_a_active(&self) -> bool { self.switch.current_value() < 0.995 } + /// Returns true if B is currently active (and processing audio). pub fn is_b_active(&self) -> bool { self.switch.current_value() > 0.005 } + /// Returns true if the switch is currently crossfading between the two processors. pub fn is_transitioning(&self) -> bool { self.switch.is_changing() } + /// Switch to the A processor. pub fn switch_to_a(&mut self) { self.switch.param = 0.; } + /// Switch to the B procesor. pub fn switch_to_b(&mut self) { self.switch.param = 1.; } + /// Switch to A or B depending on the value of `shoult_switch`. + /// + /// # Arguments + /// + /// `should_switch`: When false, switch to A. When true, switch to B. pub fn should_switch_to_b(&mut self, should_switch: bool) { if should_switch { self.switch_to_b() @@ -951,6 +1050,12 @@ impl SwitchAB { impl> DSPMeta for SwitchAB { type Sample = A::Sample; + fn set_samplerate(&mut self, samplerate: f32) { + self.switch.set_samplerate(samplerate); + self.a.set_samplerate(samplerate); + self.b.set_samplerate(samplerate); + } + fn latency(&self) -> usize { let la = if self.is_a_active() { self.a.latency() @@ -965,12 +1070,6 @@ impl> DSPMeta for SwitchAB { la.max(lb) } - fn set_samplerate(&mut self, samplerate: f32) { - self.switch.set_samplerate(samplerate); - self.a.set_samplerate(samplerate); - self.b.set_samplerate(samplerate); - } - fn reset(&mut self) { self.switch.reset(); self.a.reset(); diff --git a/crates/valib-core/src/dsp/buffer.rs b/crates/valib-core/src/dsp/buffer.rs index 42a86fc..0f72eb0 100644 --- a/crates/valib-core/src/dsp/buffer.rs +++ b/crates/valib-core/src/dsp/buffer.rs @@ -1,3 +1,8 @@ +//! # Audio buffers +//! +//! This module contains an audio buffer type that is container agnostic. A "container" here is +//! defined to be any type that derefs into `[T]`. + use num_traits::Zero; use std::collections::Bound; use std::ops::{Deref, DerefMut, Index, IndexMut, Range, RangeBounds}; @@ -82,6 +87,13 @@ fn bounds_into_range( } impl AudioBuffer<[T; LENGTH], CHANNELS> { + /// Create a new audio buffer, backed by a static array. + /// + /// # Arguments + /// + /// * `containers`: Containers of audio data to use in this buffer + /// + /// returns: AudioBuffer<[T; LENGTH], { CHANNELS }> pub const fn const_new(containers: [[T; LENGTH]; CHANNELS]) -> Self { Self { containers, @@ -89,6 +101,22 @@ impl AudioBuffer<[T; LENGTH], CHA } } + /// Slice the audio buffer, returning a new audio buffer referencing the data of this one at the + /// given range. + /// + /// # Arguments + /// + /// * `bounds`: Per-channel bounds to restrict the buffer view with + /// + /// returns: AudioBuffer<&[T], { CHANNELS }> + /// + /// # Examples + /// + /// ``` + /// use valib_core::dsp::buffer::AudioBufferBox; + /// let buffer = AudioBufferBox::::zeroed(64); + /// let slice = buffer.array_slice(16..32); + /// ``` pub fn array_slice(&self, bounds: impl RangeBounds) -> AudioBufferRef { let range = bounds_into_range(bounds, 0..self.inner_size); AudioBuffer { @@ -97,6 +125,22 @@ impl AudioBuffer<[T; LENGTH], CHA } } + /// Slice the audio buffer, returning a new audio buffer referencing the data of this one at the + /// given range. + /// + /// # Arguments + /// + /// * `bounds`: Per-channel bounds to restrict the buffer mutable view with + /// + /// returns: AudioBuffer<&[T], { CHANNELS }> + /// + /// # Examples + /// + /// ``` + /// use valib_core::dsp::buffer::AudioBufferBox; + /// let mut buffer = AudioBufferBox::::zeroed(64); + /// let mut slice = buffer.array_slice_mut(16..32); + /// ``` pub fn array_slice_mut( &mut self, bounds: impl RangeBounds, @@ -138,11 +182,45 @@ impl, const CHANNELS: usize> AudioBuffer } } + /// Read a frame (array of a single sample for each channel) at the specified index and return a + /// reference to the audio samples. + /// + /// Panics if the index is out of bounds. + /// + /// # Arguments + /// + /// * `index`: Buffer index. + /// + /// returns: [&T; CHANNELS] + /// + /// # Examples + /// + /// ``` + /// use valib_core::dsp::buffer::AudioBufferBox; + /// let stereo_buffer = AudioBufferBox::::zeroed(64); + /// let [left, right] = stereo_buffer.frame_ref(0); + /// ``` pub fn frame_ref(&self, index: usize) -> [&T; CHANNELS] { std::array::from_fn(|ch| &self.containers[ch][index]) } - /// Get a multi-channel sample at the given index. + /// Get a multichannel sample at the given index. Returns a copy of the audio samples. + /// + /// Panics if the index is out of bounds. + /// + /// # Arguments + /// + /// * `index`: Index into the buffer. + /// + /// returns: [T; CHANNELS] + /// + /// # Examples + /// + /// ``` + /// use valib_core::dsp::buffer::AudioBufferBox; + /// let stereo_buffer = AudioBufferBox::::zeroed(64); + /// let [left, right] = stereo_buffer.frame_ref(0); + /// ``` pub fn get_frame(&self, index: usize) -> [T; CHANNELS] where T: Clone, @@ -150,6 +228,7 @@ impl, const CHANNELS: usize> AudioBuffer std::array::from_fn(|ch| self.containers[ch][index].clone()) } + /// Return an iterator of frames in this buffer. pub fn iter<'a>(&'a self) -> impl 'a + Iterator where T: 'a, @@ -165,6 +244,22 @@ impl, const CHANNELS: usize> AudioBuffer } } + /// Slice the audio buffer, returning a new audio buffer referencing the data of this one at the + /// given range. + /// + /// # Arguments + /// + /// * `bounds`: Per-channel bounds to restrict the buffer view with + /// + /// returns: AudioBuffer<&[T], { CHANNELS }> + /// + /// # Examples + /// + /// ``` + /// use valib_core::dsp::buffer::AudioBufferBox; + /// let buffer = AudioBufferBox::::zeroed(64); + /// let slice = buffer.array_slice(16..32); + /// ``` pub fn slice(&self, bounds: impl RangeBounds) -> AudioBufferRef { let range = bounds_into_range(bounds, 0..self.inner_size); AudioBuffer { @@ -210,6 +305,13 @@ impl, const CHANNELS: usize> AudioBuffer, const CHANNELS: usize> AudioBuffer T) { for container in &mut self.containers { container.fill_with(&mut fill); } } + /// Slice the audio buffer, returning a new audio buffer referencing the data of this one at the + /// given range. + /// + /// # Arguments + /// + /// * `bounds`: Per-channel bounds to restrict the buffer mutable view with + /// + /// returns: AudioBuffer<&[T], { CHANNELS }> + /// + /// # Examples + /// + /// ``` + /// use valib_core::dsp::buffer::AudioBufferBox; + /// let mut buffer = AudioBufferBox::::zeroed(64); + /// let mut slice = buffer.array_slice_mut(16..32); + /// ``` pub fn slice_mut(&mut self, bounds: impl RangeBounds) -> AudioBufferMut { let range = bounds_into_range(bounds, 0..self.inner_size); AudioBuffer { @@ -280,6 +407,25 @@ impl, const CHANNELS: usize> AudioBuffer AudioBuffer { + /// Creates a 0-channel empty buffer with the specified buffer size. This constructor is + /// required to provide a non-zero block size that matches the companion buffer passed into + /// `process_block`. + /// + /// Better API design is needed to remove this need. + /// + /// # Arguments + /// + /// `block_size`: Size of the audio buffer + pub fn empty(block_size: usize) -> Self { + Self { + containers: [], + inner_size: block_size, + } + } +} + +/// Type alias for audio buffers which have non-owning storage (i.e. a slice). pub type AudioBufferRef<'a, T, const CHANNELS: usize> = AudioBuffer<&'a [T], CHANNELS>; impl<'a, T> From<&'a [T]> for AudioBufferRef<'a, T, 1> { @@ -292,19 +438,7 @@ impl<'a, T> From<&'a [T]> for AudioBufferRef<'a, T, 1> { } } -impl AudioBuffer { - /// Creates a 0-channel empty buffer with the specified buffer size. This constructor is required to provide a non- - /// zero block size that matches the companion buffer passed into `process_block`. - /// - /// Better API design is needed to remove this need. - pub fn empty(block_size: usize) -> Self { - Self { - containers: [], - inner_size: block_size, - } - } -} - +/// Type alias for audio buffers which have non-owned mutable storage (i.e. a mut slice). pub type AudioBufferMut<'a, T, const CHANNELS: usize> = AudioBuffer<&'a mut [T], CHANNELS>; impl<'a, T> From<&'a mut [T]> for AudioBufferMut<'a, T, 1> { @@ -317,6 +451,7 @@ impl<'a, T> From<&'a mut [T]> for AudioBufferMut<'a, T, 1> { } } +/// Type alias for audio buffers which have owned storage (i.e. a `Box<[T]>`). pub type AudioBufferBox = AudioBuffer, CHANNELS>; impl FromIterator for AudioBufferBox { @@ -331,6 +466,13 @@ impl FromIterator for AudioBufferBox { } impl AudioBufferBox { + /// Allocate a new audio buffer with zeroed out contents. + /// + /// # Arguments + /// + /// * `size`: Block size of the buffer + /// + /// returns: AudioBuffer, { CHANNELS }> pub fn zeroed(size: usize) -> Self { Self { containers: std::array::from_fn(|_| { diff --git a/crates/valib-core/src/dsp/mod.rs b/crates/valib-core/src/dsp/mod.rs index df0b824..f504245 100644 --- a/crates/valib-core/src/dsp/mod.rs +++ b/crates/valib-core/src/dsp/mod.rs @@ -73,6 +73,7 @@ pub trait DSPProcessBlock: DSPMeta { } } +/// Adapter for per-sample processes implementing [`DSPProcess`], so that they work as a [`DSPProcessBlock`]. #[derive(Debug, Copy, Clone)] pub struct BlockAdapter

(pub P); @@ -122,12 +123,13 @@ pub struct SampleAdapter where P: DSPProcessBlock, { + /// Size of the buffers passed into the inner block processor. + pub buffer_size: usize, input_buffer: AudioBufferBox, input_filled: usize, output_buffer: AudioBufferBox, output_filled: usize, inner: P, - pub buffer_size: usize, } impl std::ops::Deref for SampleAdapter @@ -154,11 +156,29 @@ impl SampleAdapter where P: DSPProcessBlock, { + /// Default buffer size used without constraints from the inner processor or explicit size given + /// by the user. pub const DEFAULT_BUFFER_SIZE: usize = 64; + + /// Create a new adapter for block processes to be used per-sample. + /// + /// # Arguments + /// + /// * `dsp_block`: Block process to adapt + /// + /// returns: SampleAdapter pub fn new(dsp_block: P) -> Self { Self::new_with_max_buffer_size(dsp_block, Self::DEFAULT_BUFFER_SIZE) } + /// Create a new per-sample adaptor with the given buffer size for the inner block processor + /// + /// # Arguments + /// + /// * `dsp_block`: Block process to adapt + /// * `max_buffer_size`: Maximum buffer size to be passed to the buffer. + /// + /// returns: SampleAdapter pub fn new_with_max_buffer_size(dsp_block: P, max_buffer_size: usize) -> Self { let buffer_size = dsp_block .max_block_size() @@ -174,6 +194,7 @@ where } } + /// Drop this per-sample adapter, and return the inner block process pub fn into_inner(self) -> P { self.inner } diff --git a/crates/valib-core/src/dsp/parameter.rs b/crates/valib-core/src/dsp/parameter.rs index e47abf1..5d6f15d 100644 --- a/crates/valib-core/src/dsp/parameter.rs +++ b/crates/valib-core/src/dsp/parameter.rs @@ -26,7 +26,9 @@ use crate::Scalar; /// Filtered parameter value, useful with any DSP<1, 1, Sample=f32> algorithm. pub struct FilteredParam

{ + /// Raw parameter value. This can be set directly to update the parameter. pub param: f32, + /// Process which will take in the raw value and filter it. pub dsp: P, } @@ -110,6 +112,7 @@ impl DSPProcess<1, 1> for Smoothing { /// Smoothed parameter. Smoothing can be applied exponentially or linearly. #[derive(Debug, Copy, Clone)] pub struct SmoothedParam { + /// Raw parameter value; can be set directly to change the target of the smoothed parameter. pub param: f32, smoothing: Smoothing, } @@ -167,6 +170,7 @@ impl SmoothedParam { } } + /// Returns the current smoothed value of the parameter. pub fn current_value(&self) -> f32 { match self.smoothing { Smoothing::Linear { last_out, .. } => last_out, @@ -174,14 +178,17 @@ impl SmoothedParam { } } + /// Computes the next sample of the smoother. pub fn next_sample(&mut self) -> f32 { self.process([])[0] } + /// Computes the next sample of the smoother, casting it into a `T`. pub fn next_sample_as(&mut self) -> T { T::from_f64(self.next_sample() as _) } + /// Returns true when the smoother is still in the process of smoothing the change to the raw value. pub fn is_changing(&self) -> bool { self.smoothing.is_changing(self.param) } @@ -238,15 +245,20 @@ pub trait HasParameters { fn set_parameter(&mut self, param: Self::Name, value: f32); } +/// Extension trait for types which have parameters. pub trait HasParametersExt: HasParameters { + /// Set the parameter as a boolean value. It will be encoded such that `value > 0.5` decodes + /// back to the input boolean value. + /// + /// # Arguments + /// + /// * `param`: Name of the parameter to change + /// * `value`: Boolean value to set + /// + /// returns: () fn set_parameter_bool(&mut self, param: Self::Name, value: bool) { self.set_parameter(param, if value { 1.0 } else { 0.0 }); } - - fn set_parameter_discrete(&mut self, param: Self::Name, num_values: usize, value: usize) { - let value = value as f32 / num_values as f32; - self.set_parameter(param, value); - } } impl<'a, P: HasParameters> HasParameters for &'a mut P { @@ -265,10 +277,18 @@ impl HasParameters for Box

{ } } +/// Dynamic parameter type which advertises as having `N` possible names. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Dynamic(ParamId); impl Dynamic { + /// Create a new `Dynamic` parameter name, checking the passed in ID for validity. + /// + /// # Arguments + /// + /// * `value`: Raw ID to use for this parameter type. The parameter is valid when `value < N`. + /// + /// returns: Option> pub fn new(value: ParamId) -> Option { (value < N).then_some(Self(value)) } @@ -305,6 +325,7 @@ impl Default for ParamMap { } } +/// Type which implements [`Iterator`] listing the parameters and their associated value. pub struct ParamMapIntoIter { data: std::vec::IntoIter, item: u64, @@ -375,6 +396,13 @@ impl ops::IndexMut<&P> for ParamMap { } impl ParamMap { + /// Create a new parameter map, filled in by the provided closure. + /// + /// # Arguments + /// + /// * `fill_fn`: Closure which is called for each parameter, and returns the associated value. + /// + /// returns: ParamMap pub fn new(fill_fn: impl FnMut(P) -> T) -> Self { Self { data: Vec::from_iter(P::iter().map(fill_fn)), @@ -382,6 +410,7 @@ impl ParamMap { } } + /// Iterate over parameters and references to their values. pub fn iter(&self) -> impl '_ + Iterator { self.data .iter() @@ -389,6 +418,7 @@ impl ParamMap { .map(|(i, x)| (P::from_id(i as _), x)) } + /// Iterate over parameters and mutable references to their values. pub fn iter_mut(&mut self) -> impl '_ + Iterator { self.data .iter_mut() @@ -397,18 +427,31 @@ impl ParamMap { } } +/// Object-safe trait for types with parameters. pub trait HasParametersErased { + /// Set a parameter value by its raw param ID. + /// + /// # Arguments + /// + /// * `param_id`: Raw param ID to set. + /// * `value`: Value to set the param ID with. + /// + /// returns: () fn set_parameter_raw(&mut self, param_id: ParamId, value: f32); } +/// Proxy parameter updates to another type. This allows thread-safe control of processors via their +/// parameters. pub struct ParamsProxy { params: ParamMap>, param_changed: ParamMap>, } +/// Type alias for the type that allows remote control of processors via their parameters. pub type RemoteControl

= Arc>; impl ParamsProxy

{ + /// Create a new param proxy. pub fn new() -> Arc { let params = ParamMap::new(|_| Arc::new(AtomicF32::new(0.0))); let param_changed = ParamMap::new(|_| Arc::new(AtomicBool::new(false))); @@ -418,6 +461,14 @@ impl ParamsProxy

{ }) } + /// Set a parameter for a remote type. + /// + /// # Arguments + /// + /// * `param`: Parameter to set + /// * `value`: Value to set + /// + /// returns: () pub fn set_parameter(&self, param: P, value: f32) { self.param_changed[param].store(true, Ordering::SeqCst); self.params[param].store(value, Ordering::SeqCst); @@ -434,8 +485,11 @@ impl ParamsProxy

{ } } +/// Type which remote controls the type `P` through its [`RemoteControlled::proxy`]. pub struct RemoteControlled { + /// Remote-controlled type pub inner: P, + /// Remote control proxy, which you can clone and send to another thread. pub proxy: RemoteControl, update_params_phase: f32, update_params_step: f32, @@ -482,6 +536,16 @@ impl, const I: usize, const O: usize> D } impl RemoteControlled

{ + /// Create a new remote, controlling the passed in processor. + /// + /// # Arguments + /// + /// * `samplerate`: Sample rate at which the processor and remote control will run + /// * `update_frequency`: Frequency (in Hz) at which the remote control will check for updated + /// parameters, and transfer them to the inner processor. + /// * `inner`: Inner processor, that is going to be controlled by this. + /// + /// returns: RemoteControlled

pub fn new(samplerate: f32, update_frequency: f32, inner: P) -> Self { Self { inner, @@ -494,6 +558,8 @@ impl RemoteControlled

{ #[profiling::all_functions] impl RemoteControlled

{ + /// Check for update on all parameters, and transmit them to the inner processor if they have + /// changed. pub fn update_parameters(&mut self) { for param in P::Name::iter() { if let Some(value) = self.proxy.get_update(param) { diff --git a/crates/valib-core/src/lib.rs b/crates/valib-core/src/lib.rs index 6e27d97..ab4a59b 100644 --- a/crates/valib-core/src/lib.rs +++ b/crates/valib-core/src/lib.rs @@ -1,3 +1,7 @@ +//! # `valib_core` +//! +//! Provides the basic definitions for all of `valib`. Contains basic DSP definitions and useful math +//! constructs. #![warn(missing_docs)] #![feature(generic_const_exprs)] @@ -13,13 +17,22 @@ pub mod dsp; pub mod math; pub mod util; +/// Scalar trait. All of `valib` uses this trait as bound for scalar values. +/// +/// A scalar is defined here to mean the value which is used as an audio sample. It very often is `f32`, +/// but can also be any SIMD type, where the values within the SIMD (also called scalars but for a +/// different reason) pub trait Scalar: Copy + SimdRealField { + /// Create a new [`Scalar`] from a single `f64` value. The resulting type, if it is a SIMD with + /// multiple lanes, should have all lanes being this value. fn from_f64(value: f64) -> Self; + /// Create a new [`Scalar`] containing the values passed in the array. fn from_values(values: [Self::Element; ::LANES]) -> Self where [Self::Element; ::LANES]:; + /// Return the array of elements contained in this [`Scalar`]. fn values(self) -> [Self::Element; ::LANES] where [Self::Element; ::LANES]:, @@ -27,6 +40,7 @@ pub trait Scalar: Copy + SimdRealField { std::array::from_fn(|i| self.extract(i)) } + /// Return an iterator of the elements contained in this scalar. fn into_iter(self) -> impl ExactSizeIterator { (0..Self::LANES).map(move |i| self.extract(i)) } @@ -40,6 +54,7 @@ where Self::from_subset(&value) } + #[allow(clippy::needless_range_loop)] fn from_values(values: [Self::Element; ::LANES]) -> Self where [Self::Element; ::LANES]:, @@ -54,11 +69,20 @@ where } } +/// Trait for SIMD values which can be cast. pub trait SimdCast: SimdValue { + /// Output type. This should be an SIMD value containing the same number of lanes as the input. type Output: SimdValue; + + /// Perform the cast. fn cast(self) -> Self::Output; } +/// Shortcut method for casing a SIMD value into another one. +pub fn simd_cast>(value: In) -> In::Output { + value.cast() +} + impl SimdCast for AutoSimd<[E1; N]> where Self: SimdValue, @@ -127,25 +151,35 @@ impl_simdcast_wide!(simd::WideF32x4 : [f32; 4]); impl_simdcast_wide!(simd::WideF32x8 : [f32; 8]); impl_simdcast_wide!(simd::WideF64x4 : [f64; 4]); -pub trait SimdFromSlice: Scalar { +/// Trait for SIMD values which have a transparent repr with arrays, and as such can be directly +/// transmuted from them. +/// +/// # Safety +/// +/// This trait should **only** be implemented on types which are `#[repr(transparent)]` to a +/// `[Self::Element; Self::LANES]` array. +pub unsafe trait SimdFromSlice: Scalar { + /// Transmutes a slice into a slice of [`Self`]. fn from_slice(data: &[Self::Element]) -> (&[Self], &[Self::Element]); + + /// Transmutes a slice into a mut slice of [`Self`]. fn from_slice_mut(data: &mut [Self::Element]) -> (&mut [Self], &mut [Self::Element]); } -impl SimdFromSlice for Simd<[T; N]> +unsafe impl SimdFromSlice for Simd<[T; N]> where - Self: Scalar, + Self: Scalar, { fn from_slice(data: &[Self::Element]) -> (&[Self], &[Self::Element]) { let (inner, remaining) = as_nested_arrays::<_, N>(data); // Satefy: Simd is repr(transparent) - let ret = unsafe { std::mem::transmute(inner) }; + let ret = unsafe { std::mem::transmute::<&[[T; N]], &[Simd<[T; N]>]>(inner) }; (ret, remaining) } fn from_slice_mut(data: &mut [Self::Element]) -> (&mut [Self], &mut [Self::Element]) { let (inner, remaining) = as_nested_arrays_mut::<_, N>(data); // Satefy: Simd is repr(transparent) - let ret = unsafe { std::mem::transmute(inner) }; + let ret = unsafe { std::mem::transmute::<&mut [[T; N]], &mut [Simd<[T; N]>]>(inner) }; (ret, remaining) } } diff --git a/crates/valib-core/src/math/interpolation.rs b/crates/valib-core/src/math/interpolation.rs index 0c16ba2..14b6107 100644 --- a/crates/valib-core/src/math/interpolation.rs +++ b/crates/valib-core/src/math/interpolation.rs @@ -1,3 +1,5 @@ +//! Abstraction over interpolation methods. + use nalgebra::SimdPartialOrd; use num_traits::{FromPrimitive, NumAssignOps, NumOps}; use numeric_literals::replace_float_literals; @@ -6,6 +8,7 @@ use simba::simd::SimdValue; use crate::util::simd_index_simd; use crate::{Scalar, SimdCast}; +/// Trait for SIMD values which can be used as indices into an array. pub trait SimdIndex: Copy + NumAssignOps + NumOps + SimdPartialOrd + SimdValue { @@ -16,10 +19,13 @@ impl where >::Output: SimdIndex, { + /// Returns the SIMD index from a non-SIMD scalar index fn index_from_usize(value: usize) -> Self::Output { Self::Output::splat(value) } @@ -127,6 +133,7 @@ impl Interpolate for Linear { #[derive(Debug, Copy, Clone)] pub struct MappedLinear(pub F); +/// Returns an interpolator that performs sine interpolation. pub fn sine_interpolation() -> MappedLinear T> { MappedLinear(|t| T::simd_cos(t * T::simd_pi())) } @@ -183,6 +190,7 @@ impl Interpolate for Hermite { } } +/// Lanczos interpolation method. #[derive(Debug, Copy, Clone)] pub struct Lanczos; diff --git a/crates/valib-core/src/math/lut.rs b/crates/valib-core/src/math/lut.rs index 2cc23bc..72fe4fe 100644 --- a/crates/valib-core/src/math/lut.rs +++ b/crates/valib-core/src/math/lut.rs @@ -1,3 +1,5 @@ +//! Types providing Lookup Tables + use std::ops::Range; use crate::{Scalar, SimdCast}; @@ -5,6 +7,7 @@ use numeric_literals::replace_float_literals; use super::interpolation::{Interpolate, SimdIndex, SimdInterpolatable}; +/// Lookup table storing a static array of `N` points of type `T`. #[derive(Debug, Clone)] pub struct Lut { array: [T; N], @@ -12,10 +15,26 @@ pub struct Lut { } impl Lut { + /// Construct a new lookup table with the given data and range of values. + /// + /// # Arguments + /// + /// * `array`: + /// * `range`: + /// + /// returns: Lut pub const fn new(array: [T; N], range: Range) -> Self { Self { array, range } } + /// Get the value at the given index, performing the given interpolation. + /// + /// # Arguments + /// + /// * `interp`: Interpolation method to use + /// * `index`: Input value for the LUT + /// + /// returns: T #[profiling::function] pub fn get(&self, interp: &Interp, index: T) -> T where @@ -30,6 +49,15 @@ impl Lut { } impl Lut { + /// Construct a new lookup table from the provided range and function. This computes the + /// function at each point in the LUT once, and stores it. + /// + /// # Arguments + /// + /// * `range`: Input range of the LUT + /// * `f`: Function to map + /// + /// returns: Lut pub fn from_fn(range: Range, f: impl Fn(T) -> T) -> Self { let start = range.start; let r = range.end - range.start; @@ -41,11 +69,13 @@ impl Lut { Self::new(array, range) } + /// Generate a LUT for the tanh function. #[replace_float_literals(T::from_f64(literal))] pub fn tanh() -> Self { Self::from_fn(-19.0..19.0, |x| x.simd_tanh()) } + /// Generate a LUT for the atanh function. #[replace_float_literals(T::from_f64(literal))] pub fn atanh() -> Self { Self::from_fn(-1.0..1.0, |x| x.simd_atanh()) diff --git a/crates/valib-core/src/math/mod.rs b/crates/valib-core/src/math/mod.rs index 1b07ece..82af633 100644 --- a/crates/valib-core/src/math/mod.rs +++ b/crates/valib-core/src/math/mod.rs @@ -1,3 +1,7 @@ +//! # Math +//! +//! Functions implementing mathematical constructs, as used by the rest of `valib`. + use nalgebra::{Complex, Dim, OVector}; use numeric_literals::replace_float_literals; use simba::simd::{SimdBool, SimdComplexField}; @@ -10,6 +14,15 @@ pub mod nr; #[cfg(feature = "math-polynom")] pub mod polynom; +/// Return the complex number in the z-plane corresponding to the frequency `f` at sample rate +/// `samplerate`. +/// +/// # Arguments +/// +/// * `samplerate`: Sample rate of the z-plane +/// * `f`: Frequency in Hz +/// +/// returns: Complex #[replace_float_literals(Complex::from(T::from_f64(literal)))] pub fn freq_to_z(samplerate: T, f: T) -> Complex where @@ -27,20 +40,48 @@ where value.map(|v| v.simd_powi(2)).sum().simd_sqrt() } +/// Returns the pre-warped pulsation (radian frequency) such that the frequency of a bilinear +/// discrete process matches the frequency of its analog counterpart. +/// +/// # Arguments +/// +/// `samplerate`: Sample rate of the discrete process +/// `wc`: Radian frequency (in Hz/rad) input +/// +/// +/// returns: `T` #[replace_float_literals(T::from_f64(literal))] pub fn bilinear_prewarming(samplerate: T, wc: T) -> T { 2.0 * samplerate * T::simd_tan(wc / (2.0 * samplerate)) } +/// Returns the pre-warped pulsation (radian frequency) such that the frequency of a bilinear +/// discrete process matches the frequency of its analog counterpart. Bound the pre-warping to the +/// point at which the pre-warped and raw frequencies match, and only pre-warp frequencies below. +/// +/// # Arguments +/// +/// `samplerate`: Sample rate of the discrete process +/// `wc`: Radian frequency (in Hz/rad) input +/// +/// returns `T` pub fn bilinear_prewarming_bounded(samplerate: T, wc: T) -> T { let wmax = samplerate * T::simd_frac_pi_2(); wc.simd_lt(wmax).if_else( || bilinear_prewarming(samplerate, wc), - || (wc * bilinear_prewarming(samplerate, wmax) / wmax), + || wc * bilinear_prewarming(samplerate, wmax) / wmax, ) } /// Exponential smooth minimum +/// +/// # Arguments +/// +/// `t`: Smoothing factor, where 0 is equivalent to a regular min. +/// `a`: Value 1 +/// `b`: Value 2 +/// +/// returns: `T` #[replace_float_literals(T::from_f64(literal))] #[inline] pub fn smooth_min(t: T, a: T, b: T) -> T { @@ -49,12 +90,29 @@ pub fn smooth_min(t: T, a: T, b: T) -> T { } /// Exponential smooth maximum +/// +/// # Arguments +/// +/// `t`: Smoothing factor, where 0 is equivalent to a regular max. +/// `a`: Value 1 +/// `b`: Value 2 +/// +/// returns: `T` #[inline] pub fn smooth_max(t: T, a: T, b: T) -> T { -smooth_min(t, -a, -b) } /// Exponential smooth clamping +/// +/// # Arguments +/// +/// `t`: Smoothing factor, where 0 is equivalent to a regular clamp. +/// `x`: Input value +/// `min`: Minimum value on the output +/// `max`: Maximum value on the output +/// +/// returns: `T` #[inline] pub fn smooth_clamp(t: T, x: T, min: T, max: T) -> T { smooth_max(t, min, smooth_min(t, x, max)) diff --git a/crates/valib-core/src/math/nr.rs b/crates/valib-core/src/math/nr.rs index c9ca888..3c7b5a3 100644 --- a/crates/valib-core/src/math/nr.rs +++ b/crates/valib-core/src/math/nr.rs @@ -1,8 +1,9 @@ +//! Module for working with numerical root finding, using the Newton-Rhapson method. use crate::math; use crate::Scalar; use nalgebra::{SMatrix, SVector}; -use num_traits::{Float, Zero}; -use simba::simd::{SimdBool, SimdPartialOrd, SimdValue}; +use num_traits::Float; +use simba::simd::SimdBool; use std::hint; /// Trait desciring a multivariate root equation. Root equations are solved with numerical methods such as @@ -15,7 +16,15 @@ pub trait RootEq { fn j_inv(&self, input: &SVector) -> Option>; } -/// Perform a single step of the Newton-Rhapson algorithm. This takes the inverse jabobian and computes the differential to the next step. +/// Perform a single step of the Newton-Rhapson algorithm. This takes the inverse jabobian and +/// computes the differential to the next step. +/// +/// # Arguments +/// +/// * `eq`: Equation to solve +/// * `input`: Pre-iteration value. +/// +/// returns: Option, Const<1>, ArrayStorage>> #[cfg_attr(test, inline(never))] #[cfg_attr(not(test), inline)] pub fn nr_step( @@ -36,6 +45,16 @@ where } /// Solve the given root equation using Newton-Rhapson for a specified number of setps. +/// +/// Returns the root-mean-square error after the last iteration. +/// +/// # Arguments +/// +/// * `eq`: Equation to solve +/// * `value`: Initial guess and output value +/// * `iter`: Number of iterations to perform +/// +/// returns: T #[inline] #[profiling::function] pub fn newton_rhapson_steps( @@ -60,7 +79,16 @@ where math::rms(&step) } -/// Solve the given root equation using Newton-Rhapson until the RMS of the differential is lesser than the given tolerance. +/// Solve the given root equation using Newton-Rhapson until the RMS of the differential is lesser +/// than the given tolerance. +/// +/// # Arguments +/// +/// * `eq`: Equation to solve +/// * `value`: Initial guess and output value +/// * `tol`: Maximum tolerance for the output. +/// +/// returns: usize #[cfg_attr(test, inline(never))] #[cfg_attr(not(test), inline)] #[profiling::function] @@ -88,8 +116,19 @@ where i } -/// Solve the given root equation using Newton-Rhapson, until either the RMS of the differential is less than the -/// given tolerances, or the specified max number of steps has been taken. +/// Solve the given root equation using Newton-Rhapson, until either the RMS of the differential is +/// less than the given tolerances, or the specified max number of steps has been taken. +/// +/// Returns the number of iterations performed. +/// +/// # Arguments +/// +/// * `eq`: Equation to solve +/// * `value`: Initial guess and output value +/// * `tol`: Maximum tolerance for the output. +/// * `max_iter`: Maximum number of iterations to perform. +/// +/// returns: usize #[cfg_attr(test, inline(never))] #[cfg_attr(not(test), inline)] #[profiling::function] @@ -113,7 +152,7 @@ where return i; } } - return max_iter; + max_iter } #[cfg(test)] diff --git a/crates/valib-core/src/util.rs b/crates/valib-core/src/util.rs index e856760..02f8a2c 100644 --- a/crates/valib-core/src/util.rs +++ b/crates/valib-core/src/util.rs @@ -1,8 +1,29 @@ +//! Utilities for all of `valib`. + +use crate::math::interpolation::{Cubic, Interpolate}; use crate::{Scalar, SimdCast}; use num_traits::{AsPrimitive, Float, FromPrimitive, Num, One, Zero}; use numeric_literals::replace_float_literals; use simba::simd::{SimdPartialOrd, SimdValue}; +/// Transmutes a slice into a slice of static arrays, putting the remainder of the slice not fitting +/// as a separate slice. +/// +/// # Arguments +/// +/// * `data`: Slice to transmute +/// +/// returns: (&[[T; N]], &[T]) +/// +/// # Examples +/// +/// ``` +/// use valib_core::util::as_nested_arrays; +/// let array = vec![0, 1, 2, 3, 4, 5, 6, 7]; +/// let (arrays, remainder) = as_nested_arrays(&array); +/// assert_eq!(&[[0,1,2],[3,4,5]], arrays); +/// assert_eq!(&[6,7], remainder); +/// ``` pub fn as_nested_arrays(data: &[T]) -> (&[[T; N]], &[T]) { let rem = data.len() % N; let last = data.len() - rem; @@ -14,6 +35,27 @@ pub fn as_nested_arrays(data: &[T]) -> (&[[T; N]], &[T]) { (result, remaining) } +/// Transmutes a mutable slice into a slice of static arrays, putting the remainder of the slice not +/// fitting as a separate slice. +/// +/// # Arguments +/// +/// * `data`: Slice to transmute +/// +/// returns: (&mut [[T; N]], &mut [T]) +/// +/// # Examples +/// +/// ``` +/// use valib_core::util::as_nested_arrays_mut; +/// let mut array = vec![0, 1, 2, 3, 4, 5, 6, 7]; +/// let (arrays, remainder) = as_nested_arrays_mut(&mut array); +/// assert_eq!(&[[0,1,2],[3,4,5]], arrays); +/// assert_eq!(&[6,7], remainder); +/// +/// arrays[1][0] = 10; +/// assert_eq!(vec![0, 1, 2, 10, 4, 5, 6, 7], array); +/// ``` pub fn as_nested_arrays_mut(data: &mut [T]) -> (&mut [[T; N]], &mut [T]) { let rem = data.len() % N; let last = data.len() - rem; @@ -26,6 +68,26 @@ pub fn as_nested_arrays_mut(data: &mut [T]) -> (&mut [[T; N]] (result, remaining) } +/// Index a slice of scalars with a SIMD index, returning a SIMD with the corresponding scalar values +/// on each lane. +/// +/// # Arguments +/// +/// * `values`: Slice to index +/// * `index`: Index SIMD value +/// +/// returns: Simd +/// +/// # Examples +/// +/// ``` +/// use simba::simd::{AutoF32x4, AutoUsizex4}; +/// use valib_core::util::simd_index_scalar; +/// let data = [0.0, 0.1, 0.2, 0.3]; +/// let index = AutoUsizex4::new(0, 1, 2, 3); +/// let ret = simd_index_scalar::(&data, index); +/// assert_eq!(AutoF32x4::new(0.0, 0.1, 0.2, 0.3), ret); +/// ``` pub fn simd_index_scalar>( values: &[Simd::Element], index: Index, @@ -41,6 +103,26 @@ where ret } +/// Index a slice of SIMD values with a SIMD index, returning a new SIMD values corresponding to +/// each lane of the values for each index. +/// +/// # Arguments +/// +/// * `values`: Slice to index +/// * `index`: Index SIMD value +/// +/// returns: Simd +/// +/// # Examples +/// +/// ``` +/// use simba::simd::{AutoF32x2, AutoUsizex2}; +/// use valib_core::util::simd_index_simd; +/// let data = [AutoF32x2::new(0.0, 0.1), AutoF32x2::new(1.0, 1.1)]; +/// let index = AutoUsizex2::new(1, 0); +/// let ret = simd_index_simd(&data, index); +/// assert_eq!(AutoF32x2::new(1.0, 0.1), ret); +/// ``` pub fn simd_index_simd( values: &[Simd], index: Index, @@ -56,6 +138,24 @@ where ret } +/// Generic method for checking if a SIMD float is finie or not. Returns a SIMD mask where the lanes +/// are finite. +/// +/// # Arguments +/// +/// * `value`: Value to check +/// +/// returns: ::SimdBool +/// +/// # Examples +/// +/// ``` +/// use simba::simd::{AutoF32x4, AutoBoolx4}; +/// use valib_core::util::simd_is_finite; +/// let value = AutoF32x4::new(0.0, f32::INFINITY, f32::NAN, f32::EPSILON); +/// let ret = simd_is_finite(value); +/// assert_eq!(Auto) +/// ``` pub fn simd_is_finite< Simd: SimdValue>, >( @@ -68,198 +168,36 @@ pub fn simd_is_finite< mask } -#[replace_float_literals(T::from_f64(literal))] -#[deprecated = "Use math::interpolators"] -pub fn lerp_block>(out: &mut [T], inp: &[T]) -where - >::Output: Copy + Num + FromPrimitive + SimdPartialOrd, -{ - let ix_max = >::Output::from_usize(inp.len() - 1).unwrap(); - let rate = T::from_f64(inp.len() as f64) / T::from_f64(out.len() as f64); - - for (i, y) in out.iter_mut().enumerate() { - let j = T::from_f64(i as f64) * rate; - let f = j.simd_fract(); - let j = j.simd_floor().cast(); - let jp1 = (j + >::Output::one()).simd_min(ix_max); - let a = simd_index_simd(inp, j); - let b = simd_index_simd(inp, jp1); - *y = lerp(f, a, b); - } -} - +/// Shortcut function to perform linear interpolation. Uses the interpolation module. pub fn lerp(t: T, a: T, b: T) -> T { use crate::math::interpolation::{Interpolate, Linear}; Linear.interpolate(t, [a, b]) } +/// Computes the frequency of a MIDI note number, assuming 12TET and A4 = 440 Hz +/// +/// # Arguments +/// +/// * `midi_note`: MIDI note number +/// +/// returns: T #[replace_float_literals(T::from_f64(literal))] pub fn midi_to_freq(midi_note: u8) -> T { 440.0 * semitone_to_ratio(T::from_f64(midi_note as _) - 69.0) } +/// Compute the ratio corresponding to the given semitone change, such that multiplying a frequency +/// by this value changes it by the given semitones. +/// +/// # Arguments +/// +/// * `semi`: Semitone change +/// +/// returns: T #[replace_float_literals(T::from_f64(literal))] pub fn semitone_to_ratio(semi: T) -> T { 2.0.simd_powf(semi / 12.0) } #[cfg(feature = "test-utils")] -pub mod tests { - use std::{ops::Range, path::Path}; - - use plotters::coord::{self, ranged1d::ValueFormatter}; - use plotters::{chart::SeriesAnno, prelude::*}; - - use crate::math::interpolation::{Interpolate, Linear}; - - fn assert_ok(res: Result<(), impl std::fmt::Display>) { - match res { - Ok(()) => {} - Err(value) => panic!("Not OK: {value}"), - } - } - - pub struct Series<'a> { - pub label: &'a str, - pub samplerate: f32, - pub series: &'a [f32], - pub color: &'a RGBColor, - } - - impl<'a> Series<'a> { - pub fn validate(&self) -> Result<(), String> { - if self.samplerate <= 0. { - return Err(format!("Series: {:?}: Samplerate is negative", self.label)); - } - if self.series.is_empty() { - return Err(format!("Series: {:?}: No data", self.label)); - } - - Ok(()) - } - - pub fn timescale(&self, bode: bool) -> Range { - assert_ok(self.validate()); - if bode { - 0.0..self.samplerate / 2.0 - } else { - let tmax = self.series.len() as f32 / self.samplerate; - 0.0..tmax - } - } - - pub fn y_range(&self) -> Range { - assert_ok(self.validate()); - let min = self.series.iter().copied().min_by(f32::total_cmp).unwrap(); - let max = self.series.iter().copied().max_by(f32::total_cmp).unwrap(); - min..max - } - - fn as_series(&self, bode: bool) -> LineSeries { - LineSeries::new( - self.series.iter().copied().enumerate().map(|(i, y)| { - let x = if bode { - i as f32 - } else { - i as f32 / self.samplerate - }; - (x, y) - }), - self.color, - ) - } - - fn apply_legend(&self, ann: &mut SeriesAnno) { - let color = *self.color; - ann.label(self.label); - ann.legend(move |(x, y)| PathElement::new([(x, y), (x + 20, y)], color)); - } - } - - pub struct Plot<'a> { - pub title: &'a str, - pub bode: bool, - pub series: &'a [Series<'a>], - } - - impl<'a> Plot<'a> { - pub fn validate(&self) -> Result<(), String> { - if self.series.is_empty() { - return Err(format!("Plot {:?}: no series", self.title)); - } - self.series.iter().try_for_each(|s| s.validate())?; - Ok(()) - } - - pub fn render_into(&self, output: &DrawingArea) { - use plotters::prelude::*; - assert_ok(self.validate()); - - let timescale = self - .series - .iter() - .map(|s| s.timescale(self.bode)) - .reduce(|l, r| { - let start = l.start.min(r.start); - let end = l.end.max(r.end); - start..end - }) - .unwrap(); - let timescale = if self.bode { - timescale.start * 2.0..timescale.end * 2.0 - } else { - timescale - }; - - let yrange = self - .series - .iter() - .map(|s| s.y_range()) - .reduce(|l, r| { - let start = l.start.min(r.start); - let end = l.end.max(r.end); - start..end - }) - .unwrap(); - - let mut ctx = ChartBuilder::on(output); - ctx.set_label_area_size(LabelAreaPosition::Left, 40) - .set_label_area_size(LabelAreaPosition::Bottom, 40) - .caption(self.title, ("sans-serif", 40)); - if self.bode { - let ctx = ctx - .build_cartesian_2d(timescale.log_scale(), yrange.log_scale()) - .unwrap(); - self.render(ctx); - } else { - let ctx = ctx.build_cartesian_2d(timescale, yrange).unwrap(); - self.render(ctx); - } - } - - fn render<'ctx, T: 'ctx + Ranged + ValueFormatter>( - &self, - mut ctx: ChartContext<'ctx, impl 'ctx + DrawingBackend, Cartesian2d>, - ) { - ctx.configure_mesh().draw().unwrap(); - - for series in self.series { - let ann = ctx.draw_series(series.as_series(self.bode)).unwrap(); - series.apply_legend(ann); - } - - ctx.configure_series_labels() - .background_style(WHITE.mix(0.8)) - .draw() - .unwrap(); - } - - pub fn create_svg(&self, filename: impl AsRef) { - let path = filename.as_ref(); - let _ = std::fs::create_dir_all(path.parent().expect("Filename is empty")); - let root = SVGBackend::new(path, (600, 400)).into_drawing_area(); - root.fill(&WHITE).unwrap(); - self.render_into(&root); - } - } -} +pub mod tests; diff --git a/crates/valib-core/src/util/tests.rs b/crates/valib-core/src/util/tests.rs new file mode 100644 index 0000000..46ceee3 --- /dev/null +++ b/crates/valib-core/src/util/tests.rs @@ -0,0 +1,190 @@ +//! Test utilities. Needs the `test-utils` feature to enable this module. +use std::{ops::Range, path::Path}; + +use plotters::coord::{self, ranged1d::ValueFormatter}; +use plotters::{chart::SeriesAnno, prelude::*}; + +fn assert_ok(res: Result<(), impl std::fmt::Display>) { + match res { + Ok(()) => {} + Err(value) => panic!("Not OK: {value}"), + } +} + +/// Single time/frequency series +pub struct Series<'a> { + /// Label of the series + pub label: &'a str, + /// Sample rate of the time series + pub samplerate: f32, + /// Y-values of the series + pub series: &'a [f32], + /// Display color, + pub color: &'a RGBColor, +} + +impl<'a> Series<'a> { + /// Validate that the series is well-formed + pub fn validate(&self) -> Result<(), String> { + if self.samplerate <= 0. { + return Err(format!("Series: {:?}: Samplerate is negative", self.label)); + } + if self.series.is_empty() { + return Err(format!("Series: {:?}: No data", self.label)); + } + + Ok(()) + } + + /// Compute the range of x values spanning this series. + /// + /// # Arguments + /// + /// * `bode`: The series represent frequency data as opposed to time data. + /// + /// returns: Range + pub fn timescale(&self, bode: bool) -> Range { + assert_ok(self.validate()); + if bode { + 0.0..self.samplerate / 2.0 + } else { + let tmax = self.series.len() as f32 / self.samplerate; + 0.0..tmax + } + } + + /// Return the y-axis range that this series span + pub fn y_range(&self) -> Range { + assert_ok(self.validate()); + let min = self.series.iter().copied().min_by(f32::total_cmp).unwrap(); + let max = self.series.iter().copied().max_by(f32::total_cmp).unwrap(); + min..max + } + + fn as_series(&self, bode: bool) -> LineSeries { + LineSeries::new( + self.series.iter().copied().enumerate().map(|(i, y)| { + let x = if bode { + i as f32 + } else { + i as f32 / self.samplerate + }; + (x, y) + }), + self.color, + ) + } + + fn apply_legend(&self, ann: &mut SeriesAnno) { + let color = *self.color; + ann.label(self.label); + ann.legend(move |(x, y)| PathElement::new([(x, y), (x + 20, y)], color)); + } +} + +/// Simple, high-level abstraction to plotting time/frequency series +pub struct Plot<'a> { + /// Title of the graph + pub title: &'a str, + /// Is the graph a Bode plot (plotting frequencies) or a time plot ? + pub bode: bool, + /// List of series to plot + pub series: &'a [Series<'a>], +} + +impl<'a> Plot<'a> { + /// Validate that the plot is well-formed. + pub fn validate(&self) -> Result<(), String> { + if self.series.is_empty() { + return Err(format!("Plot {:?}: no series", self.title)); + } + self.series.iter().try_for_each(|s| s.validate())?; + Ok(()) + } + + /// Render the plot into the provided drawing area. This is a lower-level method that allows you + /// to direct rendering wherever you want. + /// + /// # Arguments + /// + /// * `output`: Output drawing area, on which the plot will be drawn. + /// + /// returns: () + pub fn render_into(&self, output: &DrawingArea) { + use plotters::prelude::*; + assert_ok(self.validate()); + + let timescale = self + .series + .iter() + .map(|s| s.timescale(self.bode)) + .reduce(|l, r| { + let start = l.start.min(r.start); + let end = l.end.max(r.end); + start..end + }) + .unwrap(); + let timescale = if self.bode { + timescale.start * 2.0..timescale.end * 2.0 + } else { + timescale + }; + + let yrange = self + .series + .iter() + .map(|s| s.y_range()) + .reduce(|l, r| { + let start = l.start.min(r.start); + let end = l.end.max(r.end); + start..end + }) + .unwrap(); + + let mut ctx = ChartBuilder::on(output); + ctx.set_label_area_size(LabelAreaPosition::Left, 40) + .set_label_area_size(LabelAreaPosition::Bottom, 40) + .caption(self.title, ("sans-serif", 40)); + if self.bode { + let ctx = ctx + .build_cartesian_2d(timescale.log_scale(), yrange.log_scale()) + .unwrap(); + self.render(ctx); + } else { + let ctx = ctx.build_cartesian_2d(timescale, yrange).unwrap(); + self.render(ctx); + } + } + + fn render<'ctx, T: 'ctx + Ranged + ValueFormatter>( + &self, + mut ctx: ChartContext<'ctx, impl 'ctx + DrawingBackend, Cartesian2d>, + ) { + ctx.configure_mesh().draw().unwrap(); + + for series in self.series { + let ann = ctx.draw_series(series.as_series(self.bode)).unwrap(); + series.apply_legend(ann); + } + + ctx.configure_series_labels() + .background_style(WHITE.mix(0.8)) + .draw() + .unwrap(); + } + + /// Create an SVG file in which this plot is going to be rendered. + /// + /// # Arguments + /// + /// * `filename`: Filename pointing to the generated SVG file + /// + /// returns: () + pub fn create_svg(&self, filename: impl AsRef) { + let path = filename.as_ref(); + let _ = std::fs::create_dir_all(path.parent().expect("Filename is empty")); + let root = SVGBackend::new(path, (600, 400)).into_drawing_area(); + root.fill(&WHITE).unwrap(); + self.render_into(&root); + } +} From 7e051e4c396bb979b5049b9c446d3d034a565186 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 14:49:44 +0200 Subject: [PATCH 40/51] docs(filters): add missing documentation --- crates/valib-core/src/util.rs | 9 ++++----- crates/valib-filters/Cargo.toml | 1 + crates/valib-filters/src/biquad/mod.rs | 4 ---- crates/valib-filters/src/fir.rs | 1 + crates/valib-filters/src/halfband.rs | 3 +++ crates/valib-filters/src/ladder.rs | 14 ++++++++++++-- crates/valib-filters/src/lib.rs | 2 ++ crates/valib-filters/src/specialized.rs | 9 +++++++++ crates/valib-filters/src/statespace.rs | 17 +++++++++++++++++ crates/valib-filters/src/svf.rs | 15 +++++++++++---- 10 files changed, 60 insertions(+), 15 deletions(-) diff --git a/crates/valib-core/src/util.rs b/crates/valib-core/src/util.rs index 02f8a2c..f98afcc 100644 --- a/crates/valib-core/src/util.rs +++ b/crates/valib-core/src/util.rs @@ -1,10 +1,9 @@ //! Utilities for all of `valib`. -use crate::math::interpolation::{Cubic, Interpolate}; -use crate::{Scalar, SimdCast}; -use num_traits::{AsPrimitive, Float, FromPrimitive, Num, One, Zero}; +use crate::Scalar; +use num_traits::{AsPrimitive, Float, One, Zero}; use numeric_literals::replace_float_literals; -use simba::simd::{SimdPartialOrd, SimdValue}; +use simba::simd::SimdValue; /// Transmutes a slice into a slice of static arrays, putting the remainder of the slice not fitting /// as a separate slice. @@ -154,7 +153,7 @@ where /// use valib_core::util::simd_is_finite; /// let value = AutoF32x4::new(0.0, f32::INFINITY, f32::NAN, f32::EPSILON); /// let ret = simd_is_finite(value); -/// assert_eq!(Auto) +/// assert_eq!(AutoBoolx4::new(true, false, false, true), ret); /// ``` pub fn simd_is_finite< Simd: SimdValue>, diff --git a/crates/valib-filters/Cargo.toml b/crates/valib-filters/Cargo.toml index 188ebf5..e2ce599 100644 --- a/crates/valib-filters/Cargo.toml +++ b/crates/valib-filters/Cargo.toml @@ -19,6 +19,7 @@ numeric_literals.workspace = true profiling.workspace = true [dev-dependencies] +valib-core = { path = "../valib-core", features = ["test-utils"] } rstest.workspace = true insta.workspace = true plotters.workspace = true diff --git a/crates/valib-filters/src/biquad/mod.rs b/crates/valib-filters/src/biquad/mod.rs index 6d5f294..5e04ee1 100644 --- a/crates/valib-filters/src/biquad/mod.rs +++ b/crates/valib-filters/src/biquad/mod.rs @@ -218,10 +218,6 @@ impl Biquad { Self::new([b0, b1, b2].map(|b| b / a0), [a1, a2].map(|a| a / a0)) } - - pub fn reset(&mut self) { - self.s.fill(T::zero()); - } } impl> DSPMeta for Biquad { diff --git a/crates/valib-filters/src/fir.rs b/crates/valib-filters/src/fir.rs index 2ed656c..39db32e 100644 --- a/crates/valib-filters/src/fir.rs +++ b/crates/valib-filters/src/fir.rs @@ -1,3 +1,4 @@ +//! Module implementing FIR filters by way of convolution. use std::{collections::VecDeque, ops}; use crate::dsp::DSPMeta; diff --git a/crates/valib-filters/src/halfband.rs b/crates/valib-filters/src/halfband.rs index 372585e..318cce6 100644 --- a/crates/valib-filters/src/halfband.rs +++ b/crates/valib-filters/src/halfband.rs @@ -57,6 +57,7 @@ impl Allpass { } } +/// Half-band filter of order `2*ORDER`. #[derive(Debug, Clone, Copy)] pub struct HalfbandFilter { filter_a: Series<[Allpass; ORDER]>, @@ -91,6 +92,7 @@ impl HalfbandFilter { } } +/// Construct a steep half-band filter of order 12 #[rustfmt::skip] pub fn steep_order12() -> HalfbandFilter { HalfbandFilter::from_coeffs( @@ -111,6 +113,7 @@ pub fn steep_order12() -> HalfbandFilter { ) } +/// Construct a steep half-band filter of order 10 #[rustfmt::skip] pub fn steep_order10() -> HalfbandFilter { HalfbandFilter::from_coeffs( diff --git a/crates/valib-filters/src/ladder.rs b/crates/valib-filters/src/ladder.rs index 3245377..b2b985a 100644 --- a/crates/valib-filters/src/ladder.rs +++ b/crates/valib-filters/src/ladder.rs @@ -97,9 +97,12 @@ impl> LadderTopology for Transistor { } } +/// Parameter type for the ladder filter #[derive(Debug, Clone, Copy, PartialEq, Eq, ParamName)] pub enum LadderParams { + /// Cutoff (Hz) Cutoff, + /// Resonance Resonance, } @@ -165,6 +168,13 @@ impl> Ladder { this } + /// Set the topology of this ladder filter + /// + /// # Arguments + /// + /// * `topology`: Topology instance + /// + /// returns: Ladder pub fn with_topology(self, topology: T2) -> Ladder { let Self { inv_2fs, @@ -321,13 +331,13 @@ mod tests { Series { label: "Input", samplerate: samplerate as f32, - series: &*inp_f32, + series: &inp_f32, color: &BLUE, }, Series { label: "Output", samplerate: samplerate as f32, - series: &*out_f32, + series: &out_f32, color: &RED, }, ], diff --git a/crates/valib-filters/src/lib.rs b/crates/valib-filters/src/lib.rs index 12a42fa..f0b276c 100644 --- a/crates/valib-filters/src/lib.rs +++ b/crates/valib-filters/src/lib.rs @@ -1,3 +1,5 @@ +#![warn(missing_docs)] + pub mod biquad; pub mod halfband; pub mod ladder; diff --git a/crates/valib-filters/src/specialized.rs b/crates/valib-filters/src/specialized.rs index f5939b7..af2d235 100644 --- a/crates/valib-filters/src/specialized.rs +++ b/crates/valib-filters/src/specialized.rs @@ -3,11 +3,20 @@ use valib_core::dsp::{DSPMeta, DSPProcess}; use valib_core::Scalar; use valib_saturators::Linear; +/// Specialized filter that removes DC offsets by applying a 5 Hz biquad highpass filter pub struct DcBlocker(Biquad); impl DcBlocker { const CUTOFF_HZ: f32 = 5.0; const Q: f32 = 0.707; + + /// Create a new DC Blocker filter at the given sample rate + /// + /// # Arguments + /// + /// * `samplerate`: Sample rate at which the filter is going to run + /// + /// returns: DcBlocker pub fn new(samplerate: f32) -> Self where T: Scalar, diff --git a/crates/valib-filters/src/statespace.rs b/crates/valib-filters/src/statespace.rs index d461c0f..1b9beef 100644 --- a/crates/valib-filters/src/statespace.rs +++ b/crates/valib-filters/src/statespace.rs @@ -38,9 +38,13 @@ pub struct StateSpace< const OUT: usize, S: MultiSaturator = Linear, > { + /// Internal state matrix pub a: SMatrix, + /// Input -> state matrix pub b: SMatrix, + /// State -> output matrix pub c: SMatrix, + /// Input -> Output matriw pub d: SMatrix, state: SVector, saturators: S, @@ -123,6 +127,19 @@ impl< self.d = other.d; } + /// Replace the state saturators with the given ones + /// + /// # Arguments + /// + /// * `saturators`: New multi-saturator + /// + /// returns: StateSpace + /// + /// # Examples + /// + /// ``` + /// + /// ``` pub fn with_saturators>( self, saturators: S2, diff --git a/crates/valib-filters/src/svf.rs b/crates/valib-filters/src/svf.rs index eb71974..5d7133a 100644 --- a/crates/valib-filters/src/svf.rs +++ b/crates/valib-filters/src/svf.rs @@ -14,9 +14,12 @@ use valib_core::dsp::{ use valib_core::Scalar; use valib_saturators::{Linear, Saturator}; +/// Parameter type for the SVF filter #[derive(Debug, Clone, Copy, PartialEq, Eq, ParamName)] pub enum SvfParams { + /// Cutoff frequency (Hz) Cutoff, + /// Resonance Resonance, } @@ -53,6 +56,14 @@ impl> DSPMeta for Svf { self.w_step = T::simd_pi() / T::from_f64(samplerate as _); self.update_coefficients(); } + + fn latency(&self) -> usize { + 2 + } + + fn reset(&mut self) { + self.s.fill(T::zero()); + } } #[profiling::all_functions] @@ -116,10 +127,6 @@ impl Svf { } impl Svf { - pub fn reset(&mut self) { - self.s.fill(T::zero()); - } - /// Set the new filter cutoff frequency (in Hz). pub fn set_cutoff(&mut self, freq: T) { self.fc = freq; From 8270cbf4dbc0919a4b9b85eb6b00107885a7e5f5 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 15:17:11 +0200 Subject: [PATCH 41/51] docs(contrib): add missing documentation --- crates/valib-fundsp/src/lib.rs | 3 +++ crates/valib-nih-plug/src/lib.rs | 14 ++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/crates/valib-fundsp/src/lib.rs b/crates/valib-fundsp/src/lib.rs index 6b1a7d6..acddd23 100644 --- a/crates/valib-fundsp/src/lib.rs +++ b/crates/valib-fundsp/src/lib.rs @@ -1,4 +1,6 @@ +#![warn(missing_docs)] #![feature(generic_const_exprs)] +//! # `fundsp` integration into `valib` //! fundsp integration for statically-defined graphs. //! //! The integration provides impls for `An` objects, taking their defined input and output counts as the number of @@ -15,6 +17,7 @@ use valib_core::dsp::analysis::DspAnalysis; use valib_core::dsp::{DSPMeta, DSPProcess}; use valib_core::simd::SimdComplexField; +/// Wrapper DSP processor for FunDSP nodes pub struct FunDSP(pub An); impl DSPMeta for FunDSP { diff --git a/crates/valib-nih-plug/src/lib.rs b/crates/valib-nih-plug/src/lib.rs index 910a7a0..41f5338 100644 --- a/crates/valib-nih-plug/src/lib.rs +++ b/crates/valib-nih-plug/src/lib.rs @@ -1,3 +1,8 @@ +#![warn(missing_docs)] +//! # `nih-plug` integration into `valib` +//! +//! This crates provides integrations of `valib`'s parameters into `nih-plug` parameter system, as +//! well as functions to drive processors with `nih-plug`'s [`Buffer`] type. use std::sync::Arc; use nih_plug::buffer::Buffer; @@ -10,14 +15,7 @@ use valib_core::dsp::parameter::{ParamName, RemoteControl}; use valib_core::dsp::DSPProcessBlock; use valib_core::Scalar; -pub fn enum_int_param( - param_name: impl Into, - default_value: E, -) -> EnumParam { - EnumParam::new(param_name, default_value) -} - -/// Bind a [`valib`] [`Parameter`] to a [`nig_plug`] parameter.. +/// Bind a [`valib`] [`Parameter`] to a [`nig_plug`] parameter. pub trait BindToParameter { /// Bind a [`Parameter`] to a nih-plug [`FloatParam`]. fn bind_to_parameter(self, set: &RemoteControl

, param: P) -> Self; From b9d47171d4c60923063bda9ad0e3fac664c2aa04 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 15:35:32 +0200 Subject: [PATCH 42/51] docs(oscillators): add missing documentation --- crates/valib-oscillators/src/blit.rs | 19 ++++++++++++ crates/valib-oscillators/src/lib.rs | 22 ++++++++++++++ crates/valib-oscillators/src/wavetable.rs | 37 ++++++++++++++++++----- 3 files changed, 70 insertions(+), 8 deletions(-) diff --git a/crates/valib-oscillators/src/blit.rs b/crates/valib-oscillators/src/blit.rs index 013b547..5158d51 100644 --- a/crates/valib-oscillators/src/blit.rs +++ b/crates/valib-oscillators/src/blit.rs @@ -1,3 +1,6 @@ +//! # Band-limited Impulse Train oscillators +//! +//! Provides oscillators which are generated from integrating BLITs, or Band-Limited Impulse Trains. use numeric_literals::replace_float_literals; use valib_core::dsp::DSPMeta; use valib_core::dsp::DSPProcess; @@ -6,6 +9,7 @@ use valib_core::Scalar; /// Raw Band-Limited Impulse Train output. To be fed to leaky integrators to reconstruct the oscillator shape. #[derive(Debug, Clone, Copy)] pub struct Blit { + /// Current phase. Can be changed to perform phase modulation, at the cost of aliasing. pub p: T, dp: T, pmax: T, @@ -46,6 +50,7 @@ impl DSPProcess<0, 1> for Blit { } impl Blit { + /// Maximum phase value #[inline(always)] pub fn pmax(&self) -> T { self.pmax @@ -74,11 +79,25 @@ impl Blit { self.update_coefficients(); } + /// Set the current position of the oscillator. + /// + /// # Arguments + /// + /// * `pos`: New position of the oscillator, normalized + /// + /// returns: () pub fn set_position(&mut self, pos: T) { let delta = pos - self.p; self.p += delta * self.pmax; } + /// Return a modified oscillator with the position set to the given value. + /// + /// # Arguments + /// + /// * `pos`: New position of the oscillator, normalized + /// + /// returns: Blit pub fn with_position(mut self, pos: T) -> Self { self.set_position(pos); self diff --git a/crates/valib-oscillators/src/lib.rs b/crates/valib-oscillators/src/lib.rs index ee3adee..76c665b 100644 --- a/crates/valib-oscillators/src/lib.rs +++ b/crates/valib-oscillators/src/lib.rs @@ -1,3 +1,7 @@ +#![warn(missing_docs)] +//! # Oscillators +//! +//! This module provides oscillators for `valib`. use numeric_literals::replace_float_literals; use valib_core::dsp::DSPMeta; use valib_core::dsp::DSPProcess; @@ -6,6 +10,8 @@ use valib_core::Scalar; pub mod blit; pub mod wavetable; +/// Tracks normalized phase for a given frequency. Phase is smooth even when frequency changes, so +/// it is suitable for driving oscillators. #[derive(Debug, Clone, Copy)] pub struct Phasor { phase: T, @@ -28,6 +34,14 @@ impl DSPProcess<0, 1> for Phasor { } impl Phasor { + /// Create a new phasor. + /// + /// # Arguments + /// + /// * `samplerate`: Sample rate the phasor will run at + /// * `freq`: Frequency of the phasor. + /// + /// returns: Phasor #[replace_float_literals(T::from_f64(literal))] pub fn new(samplerate: T, freq: T) -> Self { Self { @@ -36,6 +50,14 @@ impl Phasor { } } + /// Sets the frequency of this phasor. Phase is not reset, which means the phase remains + /// continuous. + /// # Arguments + /// + /// * `samplerate`: New sample rate + /// * `freq`: New frequency + /// + /// returns: () pub fn set_frequency(&mut self, samplerate: T, freq: T) { self.step = freq / samplerate; } diff --git a/crates/valib-oscillators/src/wavetable.rs b/crates/valib-oscillators/src/wavetable.rs index 4354444..afdcb38 100644 --- a/crates/valib-oscillators/src/wavetable.rs +++ b/crates/valib-oscillators/src/wavetable.rs @@ -1,3 +1,7 @@ +//! # Wavetables +//! +//! Provides oscillators which work by interpolating a single-cycle waveform defined as a set of +//! samples. use std::ops::Range; use valib_core::dsp::DSPMeta; use valib_core::math::interpolation::{SimdIndex, SimdInterpolatable}; @@ -34,6 +38,14 @@ where } impl Wavetable { + /// Create a new wavetable oscillator, given the interpolation method and data. + /// + /// # Arguments + /// + /// * `interpolation`: Interpolation method + /// * `array`: Wavetable data + /// + /// returns: Wavetable pub const fn new(interpolation: Interp, array: [T; N]) -> Self { Self { array, @@ -43,6 +55,16 @@ impl Wavetable { } impl Wavetable { + /// Create a new wavetable oscillator given the closure, which will sample it N times over the + /// provided range. + /// + /// # Arguments + /// + /// * `interpolation`: Interpolation method + /// * `range`: Input range + /// * `f`: Closure to sample + /// + /// returns: Wavetable pub fn from_fn(interpolation: Interp, range: Range, f: impl Fn(T) -> T) -> Self { let r = range.end - range.start; let step = T::from_f64(N as f64) / r; @@ -55,15 +77,14 @@ impl Wavetable { ) } + /// Create a new sine wavetable oscillator by sampling the sine function over one period. + /// + /// # Arguments + /// + /// * `interpolation`: Interpolation method + /// + /// returns: Wavetable pub fn sin(interpolation: Interp) -> Self { Self::from_fn(interpolation, T::zero()..T::simd_two_pi(), |x| x.simd_sin()) } - - pub fn cos(interpolation: Interp) -> Self { - Self::from_fn(interpolation, T::zero()..T::simd_two_pi(), |x| x.simd_cos()) - } - - pub fn tan(interpolation: Interp) -> Self { - Self::from_fn(interpolation, T::zero()..T::simd_two_pi(), |x| x.simd_tan()) - } } From ade3be58676b8db9398bc7190e6a70aebe4c06af Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 15:58:32 +0200 Subject: [PATCH 43/51] docs(oversample): add missing documentation --- crates/valib-oversample/Cargo.toml | 1 + crates/valib-oversample/src/lib.rs | 82 +++++++++++++++++++++++------- 2 files changed, 65 insertions(+), 18 deletions(-) diff --git a/crates/valib-oversample/Cargo.toml b/crates/valib-oversample/Cargo.toml index fe13d48..0ca32e0 100644 --- a/crates/valib-oversample/Cargo.toml +++ b/crates/valib-oversample/Cargo.toml @@ -19,6 +19,7 @@ profiling.workspace = true num-complex.workspace = true [dev-dependencies] +valib-core = { path = "../valib-core", features = ["test-utils"] } rstest.workspace = true insta.workspace = true nalgebra.workspace = true diff --git a/crates/valib-oversample/src/lib.rs b/crates/valib-oversample/src/lib.rs index 710c485..4ec7705 100644 --- a/crates/valib-oversample/src/lib.rs +++ b/crates/valib-oversample/src/lib.rs @@ -1,3 +1,9 @@ +#![warn(missing_docs)] +//! # Oversampling +//! +//! This crate provides oversampling capabilities, allowing you to oversample any block processor. +//! +//! Available here is a polyphase-based oversampling method, with more to come in the future. use std::borrow::{Borrow, BorrowMut}; use std::ops::{Deref, DerefMut}; @@ -82,6 +88,7 @@ impl PingPongBuffer { self.input_is_left = !self.input_is_left; } + #[allow(dead_code)] fn is_empty(&self) -> bool { self.left.is_empty() } @@ -139,6 +146,10 @@ impl ResampleStage { } } +/// Raw oversampling type. Works by taking a block of audio, processing it and returning a slice to +/// an internal buffer containing the upsampled audio data you should process in place. Once done, +/// call `.finish(output)` on the slice to downsample the internal buffer again, and output it to +/// `output`. #[derive(Debug, Clone)] pub struct Oversample { max_factor: usize, @@ -148,7 +159,48 @@ pub struct Oversample { downsample: Box<[ResampleStage]>, } +impl Oversample { + /// Returns the current oversampling amount. + pub fn oversampling_amount(&self) -> usize { + usize::pow(2, self.num_stages_active as _) + } + + /// Sets the oversampling amount. + /// + /// Only square numbers are supported; otherwise the next power of two from the given factor + /// will be used. + /// + /// # Arguments + /// + /// `amt`: Oversampling amount. Needs to be less than or equal to the maximum oversampling rate + /// configured when constructed with [`Oversample::new`]. + pub fn set_oversampling_amount(&mut self, amt: usize) { + assert!(amt <= self.max_factor); + self.num_stages_active = amt.next_power_of_two().ilog2() as _; + } + + /// Maximum block size supported at the current oversampling factor. + pub fn max_block_size(&self) -> usize { + self.os_buffer.len() / usize::pow(2, self.num_stages_active as _) + } + + /// Return the length of the oversampled buffer. + pub fn get_os_len(&self, input_len: usize) -> usize { + input_len * usize::pow(2, self.num_stages_active as _) + } +} + impl Oversample { + /// Create a new oversampling filter. + /// + /// # Arguments + /// + /// * `max_os_factor`: Maximum oversampling factor supported by this instance. The actual + /// oversampling can be changed after creation, but will need to always be less than or equal + /// to this factor. + /// * `max_block_size`: Maximum block size that will be expected to be processed. + /// + /// returns: Oversample pub fn new(max_os_factor: usize, max_block_size: usize) -> Self where Complex: SimdComplexField, @@ -169,29 +221,14 @@ impl Oversample { } } - pub fn oversampling_amount(&self) -> usize { - usize::pow(2, self.num_stages_active as _) - } - - pub fn set_oversampling_amount(&mut self, amt: usize) { - assert!(amt <= self.max_factor); - self.num_stages_active = amt.next_power_of_two().ilog2() as _; - } - + /// Returns the latency of the filter. This includes both upsampling and downsampling. pub fn latency(&self) -> usize { let upsample_latency = self.upsample.iter().map(|p| p.latency()).sum::(); let downsample_latency = self.downsample.iter().map(|p| p.latency()).sum::(); 2 * self.num_stages_active + upsample_latency + downsample_latency } - pub fn max_block_size(&self) -> usize { - self.os_buffer.len() / usize::pow(2, self.num_stages_active as _) - } - - pub fn get_os_len(&self, input_len: usize) -> usize { - input_len * usize::pow(2, self.num_stages_active as _) - } - + /// Reset the state of this oversampling filter. pub fn reset(&mut self) { self.os_buffer.fill(T::zero()); for stage in &mut self.upsample { @@ -202,6 +239,7 @@ impl Oversample { } } + /// Construct an [`Oversampled`] given this oversample instance and a block processor to wrap. pub fn with_dsp>( self, samplerate: f32, @@ -263,18 +301,24 @@ impl Oversample { } } +/// Wraps a block processor to orversample it, and allow using it within other DSP blocks. +/// +/// Oversampling is transparently performed over the inner block processor. pub struct Oversampled { oversampling: Oversample, staging_buffer: Box<[T]>, + /// Inner processor pub inner: P, base_samplerate: f32, } impl Oversampled { + /// Return the current oversampling factor pub fn os_factor(&self) -> usize { - usize::pow(2, self.oversampling.num_stages_active as _) + self.oversampling.oversampling_amount() } + /// Drops the oversampling filter, returning the inner processor. pub fn into_inner(self) -> P { self.inner } @@ -285,12 +329,14 @@ where T: Scalar, P: DSPProcessBlock<1, 1, Sample = T>, { + /// Sets the oversampling amount. See [`Oversample::set_oversampling_amount`] for more details. pub fn set_oversampling_amount(&mut self, amt: usize) { assert!(amt >= 1); self.oversampling.set_oversampling_amount(amt); self.set_samplerate(self.base_samplerate); } + /// Returns the sample rate of the oversampled buffer. pub fn inner_samplerate(&self) -> f32 { self.base_samplerate * self.oversampling.oversampling_amount() as f32 } From 813e8f78f54e060a550406fde35a7f7368855613 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 17:52:37 +0200 Subject: [PATCH 44/51] docs(saturators): add missing documentation --- crates/valib-saturators/Cargo.toml | 1 + crates/valib-saturators/src/adaa.rs | 87 +++++++++++++++++++ crates/valib-saturators/src/bjt.rs | 7 ++ .../src/clippers/diode_clipper_model_data.rs | 24 +++++ crates/valib-saturators/src/clippers/mod.rs | 53 +++++++++++ crates/valib-saturators/src/lib.rs | 83 ++++++++++++++++-- 6 files changed, 250 insertions(+), 5 deletions(-) diff --git a/crates/valib-saturators/Cargo.toml b/crates/valib-saturators/Cargo.toml index 95d8d32..980d584 100644 --- a/crates/valib-saturators/Cargo.toml +++ b/crates/valib-saturators/Cargo.toml @@ -20,6 +20,7 @@ profiling.workspace = true paste = "1.0.15" [dev-dependencies] +valib-core = { path = "../valib-core", features = ["test-utils"] } rstest.workspace = true insta.workspace = true plotters.workspace = true diff --git a/crates/valib-saturators/src/adaa.rs b/crates/valib-saturators/src/adaa.rs index 9eaa718..36dab2c 100644 --- a/crates/valib-saturators/src/adaa.rs +++ b/crates/valib-saturators/src/adaa.rs @@ -1,3 +1,6 @@ +//! # Antiderivative Anti-Aliasing +//! +//! Methods which suppresses aliasing by relying on 1st and 2nd order antiderivatives use numeric_literals::replace_float_literals; use valib_core::simd::SimdBool; @@ -7,12 +10,34 @@ use valib_core::Scalar; /// Trait for functions that have antiderivatives. pub trait Antiderivative { + /// Evaluate the function itself. + /// + /// # Arguments + /// + /// * `x`: Input to the function + /// + /// returns: T fn evaluate(&self, x: T) -> T; + /// Evaluate the antiderivative of the function. The extra constant is assumed to be zero. + /// + /// # Arguments + /// + /// * `x`: Input value + /// + /// returns: T fn antiderivative(&self, x: T) -> T; } +/// Trait for functions which have a 2nd-order antiderivative. pub trait Antiderivative2: Antiderivative { + /// Evaluate the 2nd-order antiderivative. The additional constants are assumed to be zero. + /// + /// # Arguments + /// + /// * `x`: Function input + /// + /// returns: T fn antiderivative2(&self, x: T) -> T; } @@ -97,14 +122,22 @@ impl> Antiderivative2 for Blend { } } +/// Antiderivative Anti-Aliasing implementation #[derive(Debug, Copy, Clone)] pub struct Adaa { + /// Minimum input difference to use the antiderivative instead of calling the saturator directly pub epsilon: T, + /// Inner saturator pub inner: S, memory: [T; ORDER], } impl Adaa { + /// Create a new ADAA saturator, wrapping an inner saturator. + /// + /// # Arguments + /// + /// * `inner`: Inner saturator pub fn new(inner: S) -> Self { Self { epsilon: T::from_f64(1e-3), @@ -121,6 +154,15 @@ impl Default for Adaa { } impl> Adaa { + /// Compute the next sample, without updating the inner saturator state. + /// + /// Uses the 1st order antiderivative of the inner saturator. + /// + /// # Arguments + /// + /// * `x`: Function input + /// + /// returns: T #[replace_float_literals(T::from_f64(literal))] pub fn next_sample_immutable(&self, x: T) -> T { let den = x - self.memory[0]; @@ -134,10 +176,28 @@ impl> Adaa { ) } + /// Commit the input sample. + /// + /// Uses the 1st order antiderivative of the inner saturator. + /// + /// # Arguments + /// + /// * `x`: Input sample + /// + /// returns: () pub fn commit_sample(&mut self, x: T) { self.memory = [x]; } + /// Shortcut for calling [`Sample::next_sample_immutable`], then [`Sample::commit_sample`]. + /// + /// Uses the 1st order antiderivative of the inner saturator. + /// + /// # Arguments + /// + /// * `x`: Input sample + /// + /// returns: T pub fn next_sample(&mut self, x: T) -> T { let y = self.next_sample_immutable(x); self.commit_sample(x); @@ -146,6 +206,15 @@ impl> Adaa { } impl> Adaa { + /// Compute the next sample, without updating the inner saturator state. + /// + /// Uses the 1st order antiderivative of the inner saturator. + /// + /// # Arguments + /// + /// * `x`: Function input + /// + /// returns: T #[replace_float_literals(T::from_f64(literal))] #[profiling::function] pub fn next_sample_immutable(&self, x: T) -> T { @@ -166,11 +235,29 @@ impl> Adaa { ) } + /// Commit the input sample. + /// + /// Uses the 1st order antiderivative of the inner saturator. + /// + /// # Arguments + /// + /// * `x`: Input sample + /// + /// returns: () pub fn commit_sample(&mut self, x: T) { self.memory.swap(0, 1); self.memory[0] = x; } + /// Shortcut for calling [`Sample::next_sample_immutable`], then [`Sample::commit_sample`]. + /// + /// Uses the 1st order antiderivative of the inner saturator. + /// + /// # Arguments + /// + /// * `x`: Input sample + /// + /// returns: T pub fn next_sample(&mut self, x: T) -> T { let y = self.next_sample_immutable(x); self.commit_sample(x); diff --git a/crates/valib-saturators/src/bjt.rs b/crates/valib-saturators/src/bjt.rs index 334346b..b0a1e7c 100644 --- a/crates/valib-saturators/src/bjt.rs +++ b/crates/valib-saturators/src/bjt.rs @@ -1,3 +1,6 @@ +//! # BJT saturators +//! +//! Provides saturators for BJT transistors in various configurations. use crate::Saturator; use numeric_literals::replace_float_literals; use valib_core::dsp::{DSPMeta, DSPProcess}; @@ -9,9 +12,13 @@ use valib_core::Scalar; /// signal before and after the saturation. #[derive(Debug, Copy, Clone)] pub struct CommonCollector { + /// Positive rail (positive input supply) voltage pub vcc: T, + /// Negative rail (negative input supply) voltage pub vee: T, + /// X-axis bias at the input pub xbias: T, + /// Y-axis bias at the output. pub ybias: T, } diff --git a/crates/valib-saturators/src/clippers/diode_clipper_model_data.rs b/crates/valib-saturators/src/clippers/diode_clipper_model_data.rs index 5a4645d..0c107e8 100644 --- a/crates/valib-saturators/src/clippers/diode_clipper_model_data.rs +++ b/crates/valib-saturators/src/clippers/diode_clipper_model_data.rs @@ -8,6 +8,14 @@ use valib_core::Scalar; // // See the `clippers.ipynb` Notebook to see the rationale and working out process. impl DiodeClipperModel { + /// Create a new instance of the diode clipper model, made of silicon. + /// + /// # Arguments + /// + /// * `nf`: Number of diode in the forward direction (up to 5) + /// * `nb`: Number of diode in the backward direction (up to 5) + /// + /// returns: DiodeClipperModel #[replace_float_literals(T::from_f64(literal))] pub fn new_silicon(nf: u8, nb: u8) -> Self { let [a, b, si, so] = match (nf, nb) { @@ -192,6 +200,14 @@ impl DiodeClipperModel { Self { a, b, si, so } } + /// Create a new instance of the diode clipper model, made of germanium. + /// + /// # Arguments + /// + /// * `nf`: Number of diode in the forward direction (up to 5) + /// * `nb`: Number of diode in the backward direction (up to 5) + /// + /// returns: DiodeClipperModel #[replace_float_literals(T::from_f64(literal))] pub fn new_germanium(nf: u8, nb: u8) -> Self { let [a, b, si, so] = match (nf, nb) { @@ -376,6 +392,14 @@ impl DiodeClipperModel { Self { a, b, si, so } } + /// Create a new instance of the diode clipper model, made of LEDs. + /// + /// # Arguments + /// + /// * `nf`: Number of diode in the forward direction (up to 5) + /// * `nb`: Number of diode in the backward direction (up to 5) + /// + /// returns: DiodeClipperModel #[replace_float_literals(T::from_f64(literal))] pub fn new_led(nf: u8, nb: u8) -> Self { let [a, b, si, so] = match (nf, nb) { diff --git a/crates/valib-saturators/src/clippers/mod.rs b/crates/valib-saturators/src/clippers/mod.rs index 6fe6322..03074b2 100644 --- a/crates/valib-saturators/src/clippers/mod.rs +++ b/crates/valib-saturators/src/clippers/mod.rs @@ -1,3 +1,6 @@ +//! # Diode clipper +//! +//! Saturators for emulating a diode clipper. use super::adaa::Antiderivative; use crate::MultiSaturator; use crate::Saturator; @@ -12,26 +15,37 @@ use valib_core::Scalar; mod diode_clipper_model_data; +/// Diode clipper evaluated with the Newton-Rhapson method. #[derive(Debug, Copy, Clone)] pub struct DiodeClipper { + /// Reverse saturation current of the diode pub isat: T, + /// Ideality coefficient of the diode pub n: T, + /// Thermal voltage pub vt: T, + /// Input voltage pub vin: T, + /// Number of diodes in the forward direction pub num_diodes_fwd: T, + /// Number of diodes in the backward direction pub num_diodes_bwd: T, + /// Simulation tolerance pub sim_tol: T, + /// Maximum number of iterations pub max_iter: usize, last_vout: T, } impl DiodeClipper { + /// Return the last output of the clipper. pub fn last_output(&self) -> T { self.last_vout } } impl DiodeClipper { + /// Reset the state of the clipper pub fn reset(&mut self) { self.last_vout = self.vin; } @@ -69,6 +83,15 @@ impl RootEq for DiodeClipper { } impl DiodeClipper { + /// New diode clipper made of silicon. + /// + /// # Arguments + /// + /// * `fwd`: Number of diodes in the forward direction + /// * `bwd`: Number of diodes in the backward direction + /// * `vin`: Input voltage + /// + /// returns: DiodeClipper #[replace_float_literals(T::from_f64(literal))] pub fn new_silicon(fwd: usize, bwd: usize, vin: T) -> Self { Self { @@ -84,6 +107,15 @@ impl DiodeClipper { } } + /// New diode clipper made of germanium. + /// + /// # Arguments + /// + /// * `fwd`: Number of diodes in the forward direction + /// * `bwd`: Number of diodes in the backward direction + /// * `vin`: Input voltage + /// + /// returns: DiodeClipper #[replace_float_literals(T::from_f64(literal))] pub fn new_germanium(fwd: usize, bwd: usize, vin: T) -> Self { Self { @@ -99,6 +131,15 @@ impl DiodeClipper { } } + /// New diode clipper made of LEDs. + /// + /// # Arguments + /// + /// * `fwd`: Number of diodes in the forward direction + /// * `bwd`: Number of diodes in the backward direction + /// * `vin`: Input voltage + /// + /// returns: DiodeClipper #[replace_float_literals(T::from_f64(literal))] pub fn new_led(nf: usize, nb: usize, vin: T) -> DiodeClipper { Self { @@ -135,11 +176,16 @@ where } } +/// Analytical model of the diode clipper, described in the clippers notebook. #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct DiodeClipperModel { + /// A parameter pub a: T, + /// B parameter pub b: T, + /// Input scaling pub si: T, + /// Output scaling pub so: T, } @@ -148,6 +194,13 @@ impl DSPMeta for DiodeClipperModel { } impl DiodeClipperModel { + /// Evaluate the saturator + /// + /// # Arguments + /// + /// * `x`: Input value + /// + /// returns: T #[replace_float_literals(T::from_f64(literal))] #[inline] pub fn eval(&self, x: T) -> T { diff --git a/crates/valib-saturators/src/lib.rs b/crates/valib-saturators/src/lib.rs index 501f3c5..eb6ce53 100644 --- a/crates/valib-saturators/src/lib.rs +++ b/crates/valib-saturators/src/lib.rs @@ -1,3 +1,12 @@ +#![warn(missing_docs)] +//! # Saturators +//! +//! This crate provides abstractions over saturators, as well as several standard saturator +//! functions. +//! +//! Saturators are set up so that their processing and their updating are separate; this allows +//! setting up iterative methods to improve accuracy. They should also provide a differentiation +//! function for more complex iteration schemes and feedback processing. use num_traits::One; use numeric_literals::replace_float_literals; use std::ops; @@ -5,22 +14,27 @@ use std::ops; use clippers::DiodeClipperModel; use valib_core::dsp::{DSPMeta, DSPProcess}; -use valib_core::math::nr::RootEq; use valib_core::Scalar; pub mod adaa; pub mod bjt; pub mod clippers; +/// Trait for types which are saturators. +/// +/// Saturators are single-sample processors can have state, however the state must be updated after +/// the fact. This allows evaluating saturators with multistep methods or iterative schemes, i.e. to +/// resolve instantaneous feedback. #[allow(unused_variables)] pub trait Saturator { /// Saturate an input with a frozen state. fn saturate(&self, x: T) -> T; - /// Update the state given an input and the output of [`Self::saturate`]. + /// Update the state given an input and the output of [`Self::saturate`] for that input. #[inline(always)] fn update_state(&mut self, x: T, y: T) {} + /// Differentiate the saturator at the given input. #[inline(always)] #[replace_float_literals(T::from_f64(literal))] fn sat_diff(&self, x: T) -> T { @@ -28,11 +42,17 @@ pub trait Saturator { } } +/// Trait for types which are multi-saturators. +/// +/// Multi-saturators are a generalization of saturators which are N-dimensional. pub trait MultiSaturator { + /// Saturate the inputs with a frozen state. fn multi_saturate(&self, x: [T; N]) -> [T; N]; + /// Update the state given an input and the output of [`Self::saturate`] for that input. fn update_state_multi(&mut self, x: [T; N], y: [T; N]); + /// Differentiate the saturator at the given input. fn sat_jacobian(&self, x: [T; N]) -> [T; N]; } @@ -86,6 +106,7 @@ impl_multisat_tuples!(10; A, B, C, D, E, F, G, H, I, J); impl_multisat_tuples!(11; A, B, C, D, E, F, G, H, I, J, K); impl_multisat_tuples!(12; A, B, C, D, E, F, G, H, I, J, K, L); +/// Linear "saturator", a noop saturator which can be used when wanting no saturation. #[derive(Debug, Copy, Clone, Default, Eq, PartialEq)] pub struct Linear; @@ -117,6 +138,7 @@ impl MultiSaturator for Linear { } } +/// The `tanh` function as a saturator. #[derive(Debug, Copy, Clone, Default, Eq, PartialEq)] pub struct Tanh; @@ -134,6 +156,7 @@ impl Saturator for Tanh { } } +/// The `asinh` function as a saturator. #[derive(Debug, Copy, Clone, Eq, PartialEq, Default)] pub struct Asinh; @@ -149,9 +172,12 @@ impl Saturator for Asinh { } } +/// Hard-clipper saturator, keeping the output within the provided bounds. #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct Clipper { + /// Minimum bound pub min: T, + /// Maximum bound pub max: T, } @@ -192,9 +218,11 @@ impl MultiSaturator for Clipper { } } +/// Blend the output of a saturator with its input by the given amount. #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct Blend { - amt: T, + /// Amount of blending of the input to add to the output. The output will be scaled down to keep + pub amt: T, inner: S, } @@ -225,13 +253,20 @@ impl Default for Blend { } } +/// Runtime-switchable dynamic saturator #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub enum Dynamic { + /// Linear "saturator". No saturation. Linear, + /// `tanh` function Tanh, + /// `asinh` function Asinh, + /// Hard clipping between -1 and 1 HardClipper, + /// Diode clipper model DiodeClipper(DiodeClipperModel), + /// "Overdrive" clipper model SoftClipper(Blend>), } @@ -268,19 +303,27 @@ impl Default for Dynamic { } } +/// Slew rate saturator. Only allows the signal to change up to a maximum speed. #[derive(Debug, Clone, Copy)] pub struct Slew { + /// Maximum difference between two consecutive samples. pub max_diff: T, last_out: T, } impl Slew { + /// Returns true if the signal is being rate-limited by the slew. + /// + /// # Arguments + /// + /// `target`: Target value pub fn is_changing(&self, target: T) -> T::SimdBool { (target - self.last_out) .simd_abs() .simd_gt(T::from_f64(1e-6)) } + /// Returns the last output. pub fn current_value(&self) -> T { self.last_out } @@ -317,6 +360,14 @@ impl DSPProcess<1, 1> for Slew { } impl Slew { + /// Create a new slew rate limiter. + /// + /// # Arguments + /// + /// * `samplerate`: Sample rate the limiter will be running at + /// * `max_diff`: Maximum speed in units/s + /// + /// returns: Slew pub fn new(samplerate: T, max_diff: T) -> Self { Self { max_diff: max_diff / samplerate, @@ -324,11 +375,26 @@ impl Slew { } } + /// Sets the current state of the slew limiter. + /// + /// # Arguments + /// + /// * `state`: New state ("last output") of the slew limiter. + /// + /// returns: Slew pub fn with_state(mut self, state: T) -> Self { self.last_out = state; self } + /// Set the maximum difference within a second that the signal will be able to change. + /// + /// # Arguments + /// + /// * `max`: Maximum difference (units/s) + /// * `samplerate`: Sample rate of the slew limiter + /// + /// returns: () pub fn set_max_diff(&mut self, max: T, samplerate: T) { self.max_diff = max / samplerate; } @@ -358,9 +424,16 @@ impl Saturator for Slew { } } +/// Boost the input to the saturator, then reduce the saturator output by the same amount. +/// +/// Also biases the inputs and corrects at the output. #[derive(Debug, Clone, Copy)] pub struct Driven { + /// Drive amount pub drive: T, + /// Bias amount + pub bias: T, + /// Inner saturator pub saturator: S, } @@ -372,8 +445,8 @@ impl> Saturator for Driven { #[inline(always)] fn update_state(&mut self, x: T, y: T) { - let x = x / self.drive; - let y = self.drive * y; + let x = x * self.drive; + let y = self.drive / y; self.saturator.update_state(x, y); } From 60b2b77242865607af845c3db659fafb276769c0 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 22:14:26 +0200 Subject: [PATCH 45/51] docs(voice): add missing documentation --- crates/valib-voice/src/lib.rs | 66 +++++++++++++++++++++++++++- crates/valib-voice/src/monophonic.rs | 42 ++++++++++++------ crates/valib-voice/src/polyphonic.rs | 28 ++++++++++++ 3 files changed, 121 insertions(+), 15 deletions(-) diff --git a/crates/valib-voice/src/lib.rs b/crates/valib-voice/src/lib.rs index 8f9fd93..475af22 100644 --- a/crates/valib-voice/src/lib.rs +++ b/crates/valib-voice/src/lib.rs @@ -1,18 +1,31 @@ +#![warn(missing_docs)] +//! # Voice abstractions +//! +//! This crate provides abstractions around voice processing and voice management. use valib_core::dsp::DSPMeta; use valib_core::simd::SimdRealField; use valib_core::Scalar; pub mod monophonic; pub mod polyphonic; +#[cfg(feature = "resampled")] +pub mod upsample; +/// Trait for types which process a synth voice. pub trait Voice: DSPMeta { + /// Returns true if this voice is currently active. fn active(&self) -> bool; + /// Return a reference to the voice's note data fn note_data(&self) -> &NoteData; + /// Return a mutable reference to the voice's note data fn note_data_mut(&mut self) -> &mut NoteData; + /// Release the note (corresponding to a note off) fn release(&mut self); + /// Reuse the note (corresponding to a soft reset) fn reuse(&mut self); } +/// Value representing velocity. The square root is precomputed to be used in voices directly. #[derive(Debug, Copy, Clone)] pub struct Velocity { value: T, @@ -20,16 +33,25 @@ pub struct Velocity { } impl Velocity { + /// Linear value of the velocity. pub fn value(&self) -> T { self.value } + /// Square root of the velocity. Useful for voices so that volume feels more natural. pub fn sqrt(&self) -> T { self.sqrt } } impl Velocity { + /// Create a new `Velocity` value with the linear velocity value. + /// + /// # Arguments + /// + /// * `value`: Linear velocity value + /// + /// returns: Velocity pub fn new(value: T) -> Self { Self { value, @@ -38,6 +60,7 @@ impl Velocity { } } +/// Gain type, with precomputed linear and decibel values #[derive(Debug, Copy, Clone)] pub struct Gain { linear: T, @@ -45,16 +68,25 @@ pub struct Gain { } impl Gain { + /// Return the linear gain value pub fn linear(&self) -> T { self.linear } + /// Return the decibel gain value pub fn db(&self) -> T { self.db } } impl Gain { + /// Create a `Gain` type from a linear gain value + /// + /// # Arguments + /// + /// * `value`: Linear gain value + /// + /// returns: Gain pub fn from_linear(value: T) -> Self { Self { linear: value, @@ -62,6 +94,13 @@ impl Gain { } } + /// Create a `Gain` type from a decibel gain value + /// + /// # Arguments + /// + /// * `value`: Decibel gain value + /// + /// returns: Gain pub fn from_db(value: T) -> Self { Self { db: value, @@ -70,46 +109,71 @@ impl Gain { } } +/// Note data type containing major data about voice expression #[derive(Debug, Copy, Clone)] pub struct NoteData { + /// Note frequency pub frequency: T, + /// Note velocity pub velocity: Velocity, + /// Note gain pub gain: Gain, + /// Note pan pub pan: T, + /// Note pressure pub pressure: T, } +/// Trait for types which manage voices. #[allow(unused_variables)] pub trait VoiceManager: DSPMeta { - type ID: Copy + Eq + Ord; + /// Type for the voice ID. + type ID: Copy; + /// Number of voices available in this voice manager fn capacity(&self) -> usize; + /// Get the voice by its ID fn get_voice(&self, id: Self::ID) -> Option<&V>; + /// Get the voice mutably by its ID fn get_voice_mut(&mut self, id: Self::ID) -> Option<&mut V>; + /// Return true if the voice referred by the given ID is currently active fn is_voice_active(&self, id: Self::ID) -> bool { self.get_voice(id).is_some_and(|v| v.active()) } + /// Return all the voice IDs that this type manages. fn all_voices(&self) -> impl Iterator; + + /// Count the number of active voices. fn active(&self) -> usize { self.all_voices() .filter(|id| self.is_voice_active(*id)) .count() } + /// Indicate a note on event, with the given note data to instanciate the voice. fn note_on(&mut self, note_data: NoteData) -> Self::ID; + /// Indicate a note off event on the given voice ID. fn note_off(&mut self, id: Self::ID); + /// Choke the voice, causing all processing on that voice to stop. fn choke(&mut self, id: Self::ID); + /// Choke all the notes. fn panic(&mut self); // Channel modulation + /// Set the pitch bend amount on the channel fn pitch_bend(&mut self, amount: f64) {} + /// Set the channel aftertouch fn aftertouch(&mut self, amount: f64) {} // MPE extensions + /// Note pressure fn pressure(&mut self, id: Self::ID, pressure: f32) {} + /// Note glide fn glide(&mut self, id: Self::ID, semitones: f32) {} + /// Note pan fn pan(&mut self, id: Self::ID, pan: f32) {} + /// Note gain fn gain(&mut self, id: Self::ID, gain: f32) {} } diff --git a/crates/valib-voice/src/monophonic.rs b/crates/valib-voice/src/monophonic.rs index 449473f..ae72283 100644 --- a/crates/valib-voice/src/monophonic.rs +++ b/crates/valib-voice/src/monophonic.rs @@ -1,11 +1,18 @@ +//! # Monophonic voice manager +//! +//! Provides a monophonic voice manager which can optionally do legato. + use crate::{NoteData, Voice, VoiceManager}; use num_traits::zero; use valib_core::dsp::buffer::{AudioBufferMut, AudioBufferRef}; use valib_core::dsp::{DSPMeta, DSPProcess, DSPProcessBlock}; +/// Monophonic voice manager over a single voice. pub struct Monophonic { create_voice: Box) -> V>, voice: Option, + base_frequency: f32, + pitch_bend: f32, released: bool, legato: bool, samplerate: f32, @@ -31,6 +38,15 @@ impl DSPMeta for Monophonic { } impl Monophonic { + /// Create a new monophonic voice manager. + /// + /// # Arguments + /// + /// * `samplerate`: Sample rate of the voices + /// * `create_voice`: Closure to create the voice from the note data + /// * `legato`: Whether to make the voice legato (don't reset the voice) or not + /// + /// returns: Monophonic pub fn new( samplerate: f32, create_voice: impl Fn(f32, NoteData) -> V + 'static, @@ -40,28 +56,27 @@ impl Monophonic { create_voice: Box::new(create_voice), voice: None, released: false, + base_frequency: 440., + pitch_bend: 0., legato, samplerate, } } + /// Whether the monophonic voice manager pub fn legato(&self) -> bool { self.legato } + /// Set the monophonic voice manager is in legato mode or not pub fn set_legato(&mut self, legato: bool) { self.legato = legato; } } -#[derive(Debug, Default, Copy, Clone, Ord, PartialOrd, Eq, PartialEq)] -pub enum MonophonicVoiceId { - #[default] - Mono, -} - impl VoiceManager for Monophonic { - type ID = MonophonicVoiceId; + type ID = (); + fn capacity(&self) -> usize { 1 } @@ -75,15 +90,15 @@ impl VoiceManager for Monophonic { } fn all_voices(&self) -> impl Iterator { - [MonophonicVoiceId::Mono].into_iter() + [()].into_iter() } fn active(&self) -> usize { - self.voice - .as_ref() - .is_some_and(|v| v.active()) - .then_some(1) - .unwrap_or(0) + if self.voice.as_ref().is_some_and(|v| v.active()) { + 1 + } else { + 0 + } } fn note_on(&mut self, note_data: NoteData) -> Self::ID { @@ -95,7 +110,6 @@ impl VoiceManager for Monophonic { } else { self.voice = Some((self.create_voice)(self.samplerate, note_data)); } - MonophonicVoiceId::Mono } fn note_off(&mut self, _id: Self::ID) { diff --git a/crates/valib-voice/src/polyphonic.rs b/crates/valib-voice/src/polyphonic.rs index 54e1e7b..b9b1f89 100644 --- a/crates/valib-voice/src/polyphonic.rs +++ b/crates/valib-voice/src/polyphonic.rs @@ -1,7 +1,11 @@ +//! # Polyphonic voice manager +//! +//! Provides a polyphonic voice manager with rotating voice allocation. use crate::{NoteData, Voice, VoiceManager}; use num_traits::zero; use valib_core::dsp::{DSPMeta, DSPProcess}; +/// Polyphonic voice manager with rotating voice allocation pub struct Polyphonic { create_voice: Box) -> V>, voice_pool: Box<[Option]>, @@ -9,6 +13,30 @@ pub struct Polyphonic { samplerate: f32, } +impl Polyphonic { + /// Create a new polyphonice voice manager. + /// + /// # Arguments + /// + /// * `samplerate`: Sample rate the voices will run at + /// * `voice_capacity`: Maximum voice capacity + /// * `create_voice`: Closure to create a voice given the given note data + /// + /// returns: Polyphonic + pub fn new( + samplerate: f32, + voice_capacity: usize, + create_voice: impl Fn(f32, NoteData) -> V + 'static, + ) -> Self { + Self { + create_voice: Box::new(create_voice), + next_voice: 0, + voice_pool: (0..voice_capacity).map(|_| None).collect(), + samplerate, + } + } +} + impl DSPMeta for Polyphonic { type Sample = V::Sample; From a7d6ad06913cd9b1e5e590d4ce65f6016f20ba33 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 22:14:41 +0200 Subject: [PATCH 46/51] feat(voice): upsampled voice type --- Cargo.lock | 1 + crates/valib-core/src/dsp/buffer.rs | 2 +- crates/valib-oversample/src/lib.rs | 85 ++++++++++++++++++---- crates/valib-voice/Cargo.toml | 6 +- crates/valib-voice/src/upsample.rs | 109 ++++++++++++++++++++++++++++ 5 files changed, 185 insertions(+), 18 deletions(-) create mode 100644 crates/valib-voice/src/upsample.rs diff --git a/Cargo.lock b/Cargo.lock index f4a34cb..70899ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5110,6 +5110,7 @@ dependencies = [ "rstest", "valib-core", "valib-filters", + "valib-oversample", "valib-saturators", ] diff --git a/crates/valib-core/src/dsp/buffer.rs b/crates/valib-core/src/dsp/buffer.rs index 0f72eb0..268827d 100644 --- a/crates/valib-core/src/dsp/buffer.rs +++ b/crates/valib-core/src/dsp/buffer.rs @@ -417,7 +417,7 @@ impl AudioBuffer { /// # Arguments /// /// `block_size`: Size of the audio buffer - pub fn empty(block_size: usize) -> Self { + pub const fn empty(block_size: usize) -> Self { Self { containers: [], inner_size: block_size, diff --git a/crates/valib-oversample/src/lib.rs b/crates/valib-oversample/src/lib.rs index 4ec7705..b2562e4 100644 --- a/crates/valib-oversample/src/lib.rs +++ b/crates/valib-oversample/src/lib.rs @@ -4,8 +4,6 @@ //! This crate provides oversampling capabilities, allowing you to oversample any block processor. //! //! Available here is a polyphase-based oversampling method, with more to come in the future. -use std::borrow::{Borrow, BorrowMut}; -use std::ops::{Deref, DerefMut}; use num_complex::Complex; @@ -18,15 +16,24 @@ use valib_core::Scalar; use valib_filters::halfband; use valib_filters::halfband::HalfbandFilter; +/// Ping-pong buffer. Allows processing of effect chains operating on buffers, by allowing the input +/// and output buffers be swapped after each effect. #[derive(Debug, Clone)] -struct PingPongBuffer { +pub struct PingPongBuffer { left: Box<[T]>, right: Box<[T]>, input_is_left: bool, } impl PingPongBuffer { - fn new>(contents: I) -> Self + /// Create a new ping-pong buffer + /// + /// # Arguments + /// + /// * `contents`: Initial contents of the buffers + /// + /// returns: PingPongBuffer + pub fn new>(contents: I) -> Self where I::IntoIter: Clone, { @@ -38,7 +45,20 @@ impl PingPongBuffer { } } - fn fill(&mut self, value: T) + /// Fill the buffers + /// + /// # Arguments + /// + /// * `value`: + /// + /// returns: () + /// + /// # Examples + /// + /// ``` + /// + /// ``` + pub fn fill(&mut self, value: T) where T: Copy, { @@ -46,7 +66,14 @@ impl PingPongBuffer { self.right.fill(value); } - fn get_io_buffers(&mut self, index: I) -> (&[T], &mut [T]) + /// Get the input and output buffers. + /// + /// # Arguments + /// + /// * `index`: Value to slice the indices with, or .. to get the entire buffer at once. + /// + /// returns: (&[T], &mut [T]) + pub fn get_io_buffers(&mut self, index: I) -> (&[T], &mut [T]) where [T]: std::ops::IndexMut, { @@ -61,7 +88,14 @@ impl PingPongBuffer { } } - fn get_output_ref(&self, index: I) -> &[T] + /// Get an immutable reference to the output buffer + /// + /// # Arguments + /// + /// * `index`: Index value to slice the buffer with, or .. to get the entire buffer at once + /// + /// returns: &[T] + pub fn get_output_ref(&self, index: I) -> &[T] where [T]: std::ops::Index, { @@ -72,7 +106,14 @@ impl PingPongBuffer { } } - fn copy_into(&self, output: &mut [T]) + /// Copy the output buffer of this ping-pong buffer into the provided output buffer. + /// + /// # Arguments + /// + /// * `output`: Output buffer into which the inner output buffer will be copied into. + /// + /// returns: () + pub fn copy_into(&self, output: &mut [T]) where T: Copy, { @@ -84,22 +125,26 @@ impl PingPongBuffer { output.copy_from_slice(slice); } - fn switch(&mut self) { + /// Switch the buffers around. + pub fn switch(&mut self) { self.input_is_left = !self.input_is_left; } + /// Returns true if the ping-pong buffers are empty. #[allow(dead_code)] - fn is_empty(&self) -> bool { + pub fn is_empty(&self) -> bool { self.left.is_empty() } - fn len(&self) -> usize { + /// Returns the ping-pong buffer length. + pub fn len(&self) -> usize { self.left.len() } } +/// Single resample stage. #[derive(Debug, Clone, Copy)] -struct ResampleStage { +pub struct ResampleStage { filter: HalfbandFilter, } @@ -112,18 +157,23 @@ impl Default for ResampleStage { } impl ResampleStage { - fn latency(&self) -> usize { + /// Latency of the resample stage + pub fn latency(&self) -> usize { self.filter.latency() } - fn reset(&mut self) { + /// Reset the resample stage + pub fn reset(&mut self) { self.filter.reset(); } } impl ResampleStage { + /// Upsample the input buffer by a factor of 2. + /// + /// The output slice should be twice the length of the input slice. #[allow(clippy::identity_op)] - fn process_block(&mut self, input: &[T], output: &mut [T]) { + pub fn process_block(&mut self, input: &[T], output: &mut [T]) { assert_eq!(input.len() * 2, output.len()); for (i, s) in input.iter().copied().enumerate() { let [x0] = self.filter.process([s + s]); @@ -135,8 +185,11 @@ impl ResampleStage { } impl ResampleStage { + /// Downsample the input buffer by a factor of 2. + /// + /// The output slice should be twice the length of the input slice. #[allow(clippy::identity_op)] - fn process_block(&mut self, input: &[T], output: &mut [T]) { + pub fn process_block(&mut self, input: &[T], output: &mut [T]) { assert_eq!(input.len(), 2 * output.len()); for i in 0..output.len() { let [y] = self.filter.process([input[2 * i + 0]]); diff --git a/crates/valib-voice/Cargo.toml b/crates/valib-voice/Cargo.toml index b2bd13e..6e9424c 100644 --- a/crates/valib-voice/Cargo.toml +++ b/crates/valib-voice/Cargo.toml @@ -13,6 +13,7 @@ keywords.workspace = true valib-core = { path = "../valib-core" } valib-filters = { path = "../valib-filters" } valib-saturators = { path = "../valib-saturators" } +valib-oversample = { path = "../valib-oversample", optional = true } num-traits.workspace = true numeric_literals.workspace = true @@ -22,4 +23,7 @@ profiling.workspace = true rstest.workspace = true insta.workspace = true nalgebra.workspace = true -plotters.workspace = true \ No newline at end of file +plotters.workspace = true + +[features] +resampled = ["dep:valib-oversample"] \ No newline at end of file diff --git a/crates/valib-voice/src/upsample.rs b/crates/valib-voice/src/upsample.rs new file mode 100644 index 0000000..75d46c0 --- /dev/null +++ b/crates/valib-voice/src/upsample.rs @@ -0,0 +1,109 @@ +use num_traits::zero; +use valib_core::dsp::buffer::{AudioBufferBox, AudioBufferMut, AudioBufferRef}; +use valib_core::dsp::{DSPMeta, DSPProcessBlock}; +use valib_oversample::{PingPongBuffer, ResampleStage}; + +/// Upsampled voice adapter +pub struct UpsampledVoice { + /// Inner voice + pub inner: P, + downsample_stages: Box<[ResampleStage]>, + ping_pong_buffer: PingPongBuffer, + num_active_stages: usize, +} + +impl> DSPProcessBlock<0, 1> for UpsampledVoice

{ + fn process_block( + &mut self, + _: AudioBufferRef, + mut outputs: AudioBufferMut, + ) { + let out_len = outputs.samples(); + let inner_len = out_len * self.upsampling_amount(); + let (_, input) = self.ping_pong_buffer.get_io_buffers(..inner_len); + self.inner.process_block( + AudioBufferBox::empty(input.len()).as_ref(), + AudioBufferMut::from(input), + ); + self.ping_pong_buffer.switch(); + let mut length = inner_len; + for stage in &mut self.downsample_stages[..self.num_active_stages] { + let (input, output) = self.ping_pong_buffer.get_io_buffers(..length); + stage.process_block(input, output); + self.ping_pong_buffer.switch(); + length /= 2; + } + let (input, _) = self.ping_pong_buffer.get_io_buffers(..out_len); + outputs.copy_from_slice(0, input); + } +} + +impl DSPMeta for UpsampledVoice

{ + type Sample = P::Sample; + + fn set_samplerate(&mut self, samplerate: f32) { + self.inner + .set_samplerate(self.upsampling_amount() as f32 * samplerate); + } + + fn latency(&self) -> usize { + self.downsample_stages[..self.num_active_stages] + .iter() + .map(|s| s.latency()) + .sum::() + + self.inner.latency() + } + + fn reset(&mut self) { + for stage in &mut self.downsample_stages { + stage.reset(); + } + self.inner.reset(); + } +} + +impl UpsampledVoice { + /// Create a new upsampled voice + /// + /// # Arguments + /// + /// * `max_upsample_amount`: Maximum upsampling amount + /// * `inner`: Inner voice processor + /// + /// returns: UpsampledVoice + pub fn new(max_upsample_amount: usize, max_buffer_size: usize, inner: V) -> Self { + let max_stages = max_upsample_amount.next_power_of_two().ilog2() as usize; + let max_os_buffer_len = max_upsample_amount * max_buffer_size; + Self { + inner, + downsample_stages: (0..max_stages).map(|_| ResampleStage::default()).collect(), + ping_pong_buffer: PingPongBuffer::new( + std::iter::repeat_with(zero).take(max_os_buffer_len), + ), + num_active_stages: max_stages, + } + } + + /// Current upsampling amount + pub fn upsampling_amount(&self) -> usize { + 2usize.pow(self.num_active_stages as _) + } + + /// Set the upsampling amount. + /// + /// # Arguments + /// + /// * `amt`: Upsampling amount. Will be set to the next power of two if it isn't already. + /// + /// returns: () + pub fn set_upsampling_amount(&mut self, amt: usize) { + let num_stages = amt.next_power_of_two().ilog2() as usize; + assert!(num_stages <= self.downsample_stages.len()); + self.num_active_stages = num_stages; + } + + /// Drop the upsampled voice, returning the inner voice + pub fn into_inner(self) -> V { + self.inner + } +} From 4e05309a52900ab3086d1bf880491f2b464bedde Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 22:59:14 +0200 Subject: [PATCH 47/51] docs(wdf): add missing documentation --- crates/valib-wdf/Cargo.toml | 1 + crates/valib-wdf/src/adapters.rs | 36 +++++++++++++ crates/valib-wdf/src/diode.rs | 81 +++++++++++++++++++++++++++- crates/valib-wdf/src/dsl.rs | 57 +++++++++++++++++++- crates/valib-wdf/src/leaves.rs | 57 +++++++++++++++++++- crates/valib-wdf/src/lib.rs | 87 ++++++++++++++++++++++++++----- crates/valib-wdf/src/module.rs | 27 ++++++++++ crates/valib-wdf/src/unadapted.rs | 47 +++++++++++++++++ 8 files changed, 378 insertions(+), 15 deletions(-) diff --git a/crates/valib-wdf/Cargo.toml b/crates/valib-wdf/Cargo.toml index 78f8e2e..755dcb5 100644 --- a/crates/valib-wdf/Cargo.toml +++ b/crates/valib-wdf/Cargo.toml @@ -21,6 +21,7 @@ numeric_literals.workspace = true profiling.workspace = true [dev-dependencies] +valib-core = { path = "../valib-core", features = ["test-utils"] } rstest.workspace = true insta.workspace = true nalgebra.workspace = true diff --git a/crates/valib-wdf/src/adapters.rs b/crates/valib-wdf/src/adapters.rs index 4c452fb..ab6c4e5 100644 --- a/crates/valib-wdf/src/adapters.rs +++ b/crates/valib-wdf/src/adapters.rs @@ -1,17 +1,31 @@ +//! # WDF adapters +//! +//! Nodes which can take other nodes, and "adapt them" in some fashion. use crate::dsl::{node_mut, node_ref}; use crate::{AdaptedWdf, Node, Wave, Wdf}; use num_traits::Zero; use valib_core::simd::SimdComplexField; +/// WDF adapter which makes its children be connected in series with each other. #[derive(Debug, Clone)] pub struct Series> { + /// Left inner node pub left: Node, + /// Right inner node pub right: Node, a: A::Scalar, b: A::Scalar, } impl> Series { + /// Create a new series adapter WDF node. + /// + /// # Arguments + /// + /// * `left`: Left inner node + /// * `right`: Right inner node + /// + /// returns: Series pub fn new(left: Node, right: Node) -> Self { Self { left, @@ -76,8 +90,11 @@ impl> AdaptedWdf for Series> { + /// Left inner node pub left: Node, + /// Right inner node pub right: Node, a: A::Scalar, b: A::Scalar, @@ -86,6 +103,14 @@ pub struct Parallel> { } impl> Parallel { + /// Create a new parallel adapter node. + /// + /// # Arguments + /// + /// * `left`: Left inner node + /// * `right`: Right inner node + /// + /// returns: Parallel pub fn new(left: Node, right: Node) -> Self { Self { left, @@ -154,13 +179,24 @@ impl> AdaptedWdf for Parallel Parallel converter. pub struct Inverter { + /// Inner node pub inner: Node, a: A::Scalar, b: A::Scalar, } impl Inverter { + /// Create a new polarity inverter node adapter. + /// + /// # Arguments + /// + /// * `inner`: Inner node + /// + /// returns: Inverter pub fn new(inner: Node) -> Self { Self { inner, diff --git a/crates/valib-wdf/src/diode.rs b/crates/valib-wdf/src/diode.rs index 4c254f2..066632d 100644 --- a/crates/valib-wdf/src/diode.rs +++ b/crates/valib-wdf/src/diode.rs @@ -1,3 +1,6 @@ +//! # WDF Diode +//! +//! Implementations of arbitrary-count parallel diode setups in forward-backward configurations. use crate::unadapted::WdfDsp; use crate::{Wave, Wdf}; use nalgebra::{SMatrix, SVector}; @@ -26,13 +29,20 @@ fn lambdertw(x: T) -> T { / (2.0 + pexpminusw * (2.0 - minusw)) } +/// Type alias for the analytical approximation model of the diode clipper, using the +/// [`DiodeClipperModel`] saturator. pub type DiodeModel = WdfDsp>; +/// Diode clipper WDF node using the Lambert W function as analytical solution to the wave equation. #[derive(Debug, Copy, Clone)] pub struct DiodeLambert { + /// Reverse saturation current of the diode. pub isat: T, + /// n*vt, where n is the ideality factor of the diode, and vt is the thermal voltage pub nvt: T, + /// Number of forward diodes pub nf: T, + /// Number of backward diodes pub nb: T, r: T, a: T, @@ -82,6 +92,13 @@ impl Wdf for DiodeLambert { } impl DiodeLambert { + /// Create a new lambert W function-based diode clipper node. + /// + /// # Arguments + /// + /// * `data`: Diode clipper data used to build this node + /// + /// returns: DiodeLambert pub fn new(data: DiodeClipper) -> Self { Self { isat: data.isat, @@ -94,6 +111,13 @@ impl DiodeLambert { } } + /// Sets the configuration of the diode + /// + /// # Arguments + /// + /// * `data`: Diode clipper data used to build this node + /// + /// returns: () pub fn set_configuration(&mut self, data: DiodeClipper) { self.isat = data.isat; self.nvt = data.n * data.vt; @@ -103,20 +127,42 @@ impl DiodeLambert { } impl DiodeLambert { + /// Sets the number of forward diodes in this clipper node. + /// + /// # Arguments + /// + /// * `nf`: Number of forward diodes + /// + /// returns: () pub fn set_num_forward(&mut self, nf: usize) { self.nf = T::from_f64(nf as _); } + /// Sets the number of backward diodes in this clipper node. + /// + /// # Arguments + /// + /// * `nb`: Number of backward diodes + /// + /// returns: () pub fn set_num_backward(&mut self, nf: usize) { self.nb = T::from_f64(nf as _); } } -struct DiodeRootEq { +/// Root equation type of the diode clipper wave equation. +/// +/// This contains the relevant values to tweak the diode clipper configuration. +pub struct DiodeRootEq { + /// Reverse saturation current pub isat: T, + /// Ideality factor pub n: T, + /// Thermal voltage pub vt: T, + /// Number of diodes in forward direction pub nf: T, + /// Number of diodes in backward direction pub nb: T, r: T, a: T, @@ -151,14 +197,26 @@ impl RootEq for DiodeRootEq { } } +/// Diode clipper WDF node using the implicit wave equation and Newton's method to solve it. pub struct DiodeNR { + /// Inner root equation type. This is where you can change the diode configuration. pub root_eq: DiodeRootEq, + /// Maximum error allowed in Newton's method. pub max_tolerance: T, + /// Maximum number of iterations of Newton's method before force-stopping. pub max_iter: usize, b: T, } impl DiodeNR { + /// Create a new Newton-Rhapson-based diode clipper WDF node based on the provided diode clipper + /// data. + /// + /// # Arguments + /// + /// * `data`: Diode clipper data used to create this node. + /// + /// returns: DiodeNR pub fn from_data(data: DiodeClipper) -> Self { Self { root_eq: DiodeRootEq { @@ -176,6 +234,13 @@ impl DiodeNR { } } + /// Sets the diode configuration from the provided diode clipper data. + /// + /// # Arguments + /// + /// * `data`: Diode clipper data used to create this node. + /// + /// returns: DiodeNR pub fn set_configuration(&mut self, data: DiodeClipper) { self.root_eq.isat = data.isat; self.root_eq.n = data.n; @@ -184,10 +249,24 @@ impl DiodeNR { self.root_eq.nb = data.num_diodes_bwd; } + /// sets the number of forward diodes in this clipper node. + /// + /// # arguments + /// + /// * `nf`: number of forward diodes + /// + /// returns: () pub fn set_num_forward(&mut self, nf: usize) { self.root_eq.nf = T::from_f64(nf as _); } + /// sets the number of backward diodes in this clipper node. + /// + /// # arguments + /// + /// * `nb`: number of backward diodes + /// + /// returns: () pub fn set_num_backward(&mut self, nf: usize) { self.root_eq.nb = T::from_f64(nf as _); } diff --git a/crates/valib-wdf/src/dsl.rs b/crates/valib-wdf/src/dsl.rs index 93b16b6..681bbb7 100644 --- a/crates/valib-wdf/src/dsl.rs +++ b/crates/valib-wdf/src/dsl.rs @@ -1,80 +1,119 @@ +//! # WDF DSL utilities +//! +//! Utility module exposing the WDF node constructors as freestanding functions, allowing one to +//! quickly compose a WDF tree together. use crate::*; use atomic_refcell::AtomicRefCell; use std::sync::Arc; use valib_core::Scalar; use valib_saturators::clippers::{DiodeClipper, DiodeClipperModel}; +/// Create a new node by wrapping the raw node data into a shared node. #[inline] pub fn node(value: T) -> Node { Arc::new(AtomicRefCell::new(value)) } +/// Return a reference to the node data by borrowing the contents. #[inline] pub fn node_ref(value: &Node) -> NodeRef { value.borrow() } +/// Return a mutable reference to the node data by borrowing the contents. #[inline] pub fn node_mut(value: &Node) -> NodeMut { value.borrow_mut() } +/// Compute the voltage at the upper facing port of the provided node. #[inline] pub fn voltage(node: &Node>) -> T { node_ref(node).wave().voltage() } +/// Compute the current at the upper facing port of the provided node. #[inline] pub fn current(node: &Node>) -> T { let n = node_ref(node); n.wave().current(n.impedance()) } +/// Create a new resistor. +/// +/// See [`Resistor::new`] for more details. #[inline] pub fn resistor(r: T) -> Node> { node(Resistor::new(r)) } +/// Create a new capacitor. +/// +/// See [`Capacitor::new`] for more details. #[inline] pub fn capacitor(fs: T, c: T) -> Node> { node(Capacitor::new(fs, c)) } +/// Create a new resistive voltage source. +/// +/// See [`ResistiveVoltageSource::new`] for more details. #[inline] pub fn rvsource(r: T, vs: T) -> Node> { node(ResistiveVoltageSource::new(r, vs)) } +/// Create a new ideal voltage source. +/// +/// See [`IdealVoltageSource::new`] for more details. #[inline] pub fn ivsource(vs: T) -> Node> { node(IdealVoltageSource::new(vs)) } +/// Create a new resistive current source. +/// +/// See [`ResistiveCurrentSource::new`] for more details. #[inline] pub fn rcsource(r: T, j: T) -> Node> { - node(ResistiveCurrentSource::new(j, r)) + node(ResistiveCurrentSource::new(r, j)) } +/// Create a new ideal current source. +/// +/// See [`IdealCurrentSource::new`] for more details. #[inline] pub fn icsource(j: T) -> Node> { node(IdealCurrentSource::new(j)) } +/// Create a new short circuit node. +/// +/// See [`ShortCircuit::new`] for more details. #[inline] pub fn short_circuit() -> Node> { node(ShortCircuit::default()) } +/// Create a new open circuit node. +/// +/// See [`OpenCircuit::new`] for more details. #[inline] pub fn open_circuit() -> Node> { node(OpenCircuit::default()) } +/// Create a new dsp wdf node. +/// +/// See [`WdfDsp::new`] for more details. #[inline] pub fn dsp>(dsp: P) -> Node> { node(WdfDsp::new(dsp)) } +/// Create a new series wdf adapter node. +/// +/// See [`Series::new`] for more details. #[inline] pub fn series>( left: Node, @@ -83,6 +122,9 @@ pub fn series>( node(Series::new(left, right)) } +/// Create a new parallel wdf adapter node. +/// +/// See [`Parallel::new`] for more details. #[inline] pub fn parallel>( left: Node, @@ -91,26 +133,39 @@ pub fn parallel>( node(Parallel::new(left, right)) } +/// Create a new polarity inverter wdf adapter node. +/// +/// See [`Inverter::new`] for more details. #[inline] pub fn inverter(inner: Node) -> Node> { node(Inverter::new(inner)) } +/// Create a new Lambert W function-based diode clipper node. +/// +/// See [`DiodeLambert::new`] for more details. #[inline] pub fn diode_lambert(data: DiodeClipper) -> Node> { node(DiodeLambert::new(data)) } +/// Create a new analytical model-based diode clipper node. #[inline] pub fn diode_model(model: DiodeClipperModel) -> Node> { dsp(model) } +/// Create a new Newton-Rhapson-based diode clipper node. +/// +/// See [`DiodeNR::new`] for more details. #[inline] pub fn diode_nr(data: DiodeClipper) -> Node> { node(DiodeNR::from_data(data)) } +/// Create a new WDF module with the provided node and leaf types. +/// +/// See [`WdfModule::new`] for more details. #[inline] pub fn module>( root: Node, diff --git a/crates/valib-wdf/src/leaves.rs b/crates/valib-wdf/src/leaves.rs index 912c13a..4ef51ee 100644 --- a/crates/valib-wdf/src/leaves.rs +++ b/crates/valib-wdf/src/leaves.rs @@ -1,11 +1,19 @@ +//! # WDF leaves +//! +//! Provides nodes which only have one port. use num_traits::Zero; use crate::{AdaptedWdf, Wave, Wdf}; use valib_core::Scalar; +/// Resistive voltage source leaf. +/// +/// This node can be adapter thanks to the resistance running in series to the voltage source. #[derive(Debug, Copy, Clone)] pub struct ResistiveVoltageSource { + /// Voltage source value (V) pub vs: T, + /// Series resistance value (Ohm) pub r: T, a: T, b: T, @@ -43,6 +51,14 @@ impl AdaptedWdf for ResistiveVoltageSource { } impl ResistiveVoltageSource { + /// Create a new resistive voltage source node. + /// + /// # Arguments + /// + /// * `r`: Resistance value (Ohm) + /// * `vs`: Voltage source value (V) + /// + /// returns: ResistiveVoltageSource pub fn new(r: T, vs: T) -> Self { Self { vs, @@ -53,16 +69,35 @@ impl ResistiveVoltageSource { } } +/// Resistive current source leaf. +/// +/// This node can be adapter thanks to the resistance running in parallel to the voltage source. #[derive(Debug, Copy, Clone)] pub struct ResistiveCurrentSource { + /// Current source value (A) pub j: T, + /// Resistance value (Ohm) pub r: T, a: T, b: T, } impl ResistiveCurrentSource { - pub fn new(j: T, r: T) -> Self { + /// Create a new resistive current source node. + /// + /// # Arguments + /// + /// * `r`: Resistance value (Ohm) + /// * `j`: Current source value (A) + /// + /// returns: ResistiveCurrentSource + /// + /// # Examples + /// + /// ``` + /// + /// ``` + pub fn new(r: T, j: T) -> Self { Self { j, r, @@ -103,8 +138,10 @@ impl AdaptedWdf for ResistiveCurrentSource { } } +/// Resistor node. #[derive(Debug, Copy, Clone)] pub struct Resistor { + /// Resistance value (Ohm) pub r: T, a: T, } @@ -139,20 +176,38 @@ impl AdaptedWdf for Resistor { } impl Resistor { + /// Create a new resistor node. + /// + /// # Arguments + /// + /// * `r`: Resistance value + /// + /// returns: Resistor pub fn new(r: T) -> Self { Self { r, a: T::zero() } } } +/// Capacitor leaf node. #[derive(Debug, Copy, Clone)] pub struct Capacitor { + /// Sample rate (Hz) pub fs: T, + /// Capacitance (F) pub c: T, a: T, b: T, } impl Capacitor { + /// Create a new capacitor leaf node. + /// + /// # Arguments + /// + /// * `fs`: Sample rate (Hz) + /// * `c`: Capacitance (F) + /// + /// returns: Capacitor pub fn new(fs: T, c: T) -> Self { Self { fs, diff --git a/crates/valib-wdf/src/lib.rs b/crates/valib-wdf/src/lib.rs index 6463253..3fd4d8c 100644 --- a/crates/valib-wdf/src/lib.rs +++ b/crates/valib-wdf/src/lib.rs @@ -1,13 +1,31 @@ +#![warn(missing_docs)] +//! # Wave Digital Filters +//! +//! This crate provides an implementation of wave digital filters as a tree of adapted nodes, with a +//! module type for assembling an adapted tree with an unadaptable root. +/// +/// Waves in this WDF implementation are voltage wave, which is the most common kind. Wave variables +/// are defined with the following equation: +/// +/// $$ a = v + R_P * i \\ b = v - R_P * i $$ +/// +/// Conversely, Kirchhoff variables are defined in terns of wave variables as follows: +/// +/// $$ v = \frac{a + b}{2} || i = \frac{a - b}{2 R_P} $$ +/// +/// WDF Trees are defined with a single upward facing port, which is the one that gets adapted. Trees +/// are combined by plugging their upward facing ports into any of the downward facing ports of +/// adapters. One-port are put at the leaves of the tree, and represent 2-port components like +/// resistors or capacitors. pub use adapters::*; use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut}; pub use diode::*; pub use leaves::*; pub use module::*; use num_traits::Zero; -use std::any::Any; use std::sync::Arc; pub use unadapted::*; -use valib_core::dsp::{DSPMeta, DSPProcess}; +use valib_core::dsp::DSPMeta; use valib_core::simd::SimdComplexField; use valib_core::Scalar; @@ -19,36 +37,80 @@ pub mod module; pub mod unadapted; //mod v2; +/// Type definition of nodes of the WDF tree. pub type Node = Arc>; +/// Type definition of node references. pub type NodeRef<'a, T> = AtomicRef<'a, T>; +/// Type definition of mutable node references. pub type NodeMut<'a, T> = AtomicRefMut<'a, T>; +/// Electrical value in the wave domain. #[derive(Debug, Copy, Clone)] pub struct Wave { + /// A value, corresponding to V + I * R in the Kirchhoff domain. pub a: T, + /// B value, corresponding to V - I * R in the Kirchhoff domain. pub b: T, } impl Wave { + /// Compute the voltage value of the wave. pub fn voltage(&self) -> T { (self.a + self.b) / T::from_f64(2.0) } + /// Compute the current value of the wave, given a port resistance. + /// + /// # Arguments + /// + /// * `resistance`: Port resistance to use in computing the current. + /// + /// returns: T pub fn current(&self, resistance: T) -> T { (self.a - self.b) / (T::from_f64(2.0) * resistance) } } +/// Wave Digital Filter type trait. +/// +/// All WDF nodes must implement this trait. There is no restriction on the adaptability of the node +/// here, only that it must receive an incident wave (variable $a$), and reflect it back (variable +/// $b$). #[allow(unused)] pub trait Wdf { + /// Scalar type used within this node. type Scalar: Scalar; + /// Wave variables at the upward facing port of this node. fn wave(&self) -> Wave; - fn incident(&mut self, x: Self::Scalar); + /// Update the internal state of this node given the incident wave (variable $a$). + /// + /// # Arguments + /// + /// * `a`: Incident wave + /// + /// returns: () + fn incident(&mut self, a: Self::Scalar); + /// Update the internal state of this node and output the reflected wave (variable $b$). fn reflected(&mut self) -> Self::Scalar; + /// Set the sample rate of this node + /// + /// # Arguments + /// + /// * `samplerate`: New sample rate + /// + /// returns: () fn set_samplerate(&mut self, samplerate: f64) {} + /// Update the port resistance of other port that is plugged into this node's upward facing port. + /// + /// # Arguments + /// + /// * `resistance`: Port resistance + /// + /// returns: () fn set_port_resistance(&mut self, resistance: Self::Scalar) {} + /// Reset the internal state of this node. fn reset(&mut self); } @@ -76,10 +138,18 @@ impl<'a, T: Wdf> Wdf for &'a mut T { } } +/// Adapted WDF node. Nodes which can set a specific port resistance to prevent delay-free loops +/// (where $b$ immediately depends on $a$ without unit delays) can be adapted, making them composable. +/// +/// **Implementation note**: One of [`Self::impedance`] or [`Self::admittance`] (or both) must be +/// implemented. By default the methods call each other (to allow the user to choose which one to +/// implement), however, failure to do so will result in stack overflow from infinite recursion. pub trait AdaptedWdf: Wdf { + /// Return the impedance of the upward facing port. fn impedance(&self) -> Self::Scalar { self.admittance().simd_recip() } + /// Return the admittance of the upward facing port. fn admittance(&self) -> Self::Scalar { self.impedance().simd_recip() } @@ -97,17 +167,10 @@ impl<'a, T: AdaptedWdf> AdaptedWdf for &'a mut T { #[cfg(test)] mod tests { - use super::*; - use crate::adapters::{Inverter, Parallel, Series}; use crate::dsl::*; - use crate::leaves::{Capacitor, ResistiveVoltageSource, Resistor}; - use crate::module::WdfModule; - use crate::unadapted::{IdealVoltageSource, OpenCircuit}; - use valib_core::util::tests::Plot; - - use plotters::prelude::{BLUE, GREEN, RED}; + use plotters::prelude::{BLUE, RED}; use std::f32::consts::TAU; - use valib_core::Scalar; + use valib_core::util::tests::Plot; #[test] fn test_voltage_divider() { diff --git a/crates/valib-wdf/src/module.rs b/crates/valib-wdf/src/module.rs index ab72456..a875798 100644 --- a/crates/valib-wdf/src/module.rs +++ b/crates/valib-wdf/src/module.rs @@ -1,16 +1,41 @@ +//! # WDF module +//! +//! Provides a module which can drive the entire WDF tree for each sample. use crate::dsl::node_mut; use crate::{AdaptedWdf, Node, Wdf}; +/// WDF Module type. This type takes care of processing the whole tree when processing a sample. +/// +/// It does not take care of inputs and outputs; they should be manually set and manually read by +/// cloning relevant nodes and reading/mutating them. pub struct WdfModule> { + /// Root of the tree. Can be unadaptable. pub root: Node, + /// Leaf of the tree. Has to be adaptable. pub leaf: Node, } impl> WdfModule { + /// Create a new WDF module. + /// + /// # Arguments + /// + /// * `root`: Root of the tree. Can be unadaptable. + /// * `leaf`: Leaf of the tree. Has to be adaptable. + /// + /// returns: WdfModule pub fn new(root: Node, leaf: Node) -> Self { Self { root, leaf } } + /// Sets the sample rate of the whole module. Calls [`Wdf::set_samplerate`] on both the root and + /// the leaf. + /// + /// # Arguments + /// + /// * `samplerate`: New sample rate (Hz) + /// + /// returns: () pub fn set_samplerate(&mut self, samplerate: f64) { let mut root = node_mut(&self.root); let mut leaf = node_mut(&self.leaf); @@ -18,6 +43,7 @@ impl> WdfModule { leaf.set_samplerate(samplerate); } + /// Process a single sample, propagating all waves downwards and back up. pub fn process_sample(&mut self) { let mut root = node_mut(&self.root); let mut leaf = node_mut(&self.leaf); @@ -26,6 +52,7 @@ impl> WdfModule { leaf.incident(root.reflected()); } + /// Reset the entire module. Calls [`Wdf::reset`] on both the root and the leaf. pub fn reset(&mut self) { node_mut(&self.root).reset(); node_mut(&self.leaf).reset(); diff --git a/crates/valib-wdf/src/unadapted.rs b/crates/valib-wdf/src/unadapted.rs index c6dcea9..2650a21 100644 --- a/crates/valib-wdf/src/unadapted.rs +++ b/crates/valib-wdf/src/unadapted.rs @@ -1,17 +1,29 @@ +//! # WDF unadapted nodes +//! +//! Provides nodes which cannot be adapted anywhere in the tree, and have to sit at the root. use crate::{Wave, Wdf}; use num_traits::Zero; use valib_core::dsp::{DSPMeta, DSPProcess}; use valib_core::simd::SimdBool; use valib_core::Scalar; +/// Ideal voltage source WDF node. #[derive(Debug, Copy, Clone)] pub struct IdealVoltageSource { + /// Voltage source value (V) pub vs: T, a: T, b: T, } impl IdealVoltageSource { + /// Create a new ideal voltage source node. + /// + /// # Arguments + /// + /// * `vs`: Voltage source value (V) + /// + /// returns: IdealVoltageSource pub fn new(vs: T) -> Self { Self { vs, @@ -46,8 +58,10 @@ impl Wdf for IdealVoltageSource { } } +/// Ideal current source WDF node. #[derive(Debug, Copy, Clone)] pub struct IdealCurrentSource { + /// Current source value (A) pub j: T, r: T, a: T, @@ -55,6 +69,13 @@ pub struct IdealCurrentSource { } impl IdealCurrentSource { + /// Create a new ideal current source node. + /// + /// # Arguments + /// + /// * `j`: Current source value (A) + /// + /// returns: IdealCurrentSource pub fn new(j: T) -> Self { Self { j, @@ -101,6 +122,7 @@ impl Wdf for IdealCurrentSource { } } +/// Short circuit WDF node. #[derive(Debug, Copy, Clone)] pub struct ShortCircuit { a: T, @@ -135,6 +157,7 @@ impl Wdf for ShortCircuit { } } +/// Open circuit WDF node. #[derive(Debug, Copy, Clone)] pub struct OpenCircuit { a: T, @@ -169,7 +192,9 @@ impl Wdf for OpenCircuit { } } +/// Switch WDF node. pub struct Switch { + /// State of the switch pub closed: T::SimdBool, a: T, b: T, @@ -202,6 +227,13 @@ impl Wdf for Switch { } impl Switch { + /// Create a new switch node. + /// + /// # Arguments + /// + /// * `closed`: When true, the switch starts closed. + /// + /// returns: Switch pub fn new(closed: T::SimdBool) -> Self { Self { closed, @@ -211,14 +243,29 @@ impl Switch { } } +/// Arbitrary DSP WDF node. +/// +/// Arbitrary filters can be run as an unadapted WDF node with the following equation: +/// +/// $$ b = 2*f(a) - a $$ +/// +/// Where $f$ is the function which is run on the incident wave. #[derive(Debug, Copy, Clone)] pub struct WdfDsp { + /// Inner DSP process pub dsp: P, a: P::Sample, b: P::Sample, } impl> WdfDsp

{ + /// Create a new DSP WDF node. + /// + /// # Arguments + /// + /// * `dsp`: Inner DSP process to run. Must be a `DSPProcess<1, 1>`. + /// + /// returns: WdfDsp

pub fn new(dsp: P) -> Self { Self { dsp, From b6778c771daaaf8d5768e6486f3f7504943d2bbd Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 23:18:43 +0200 Subject: [PATCH 48/51] chore: linting --- crates/valib-core/src/util.rs | 2 +- crates/valib-filters/src/biquad/mod.rs | 7 ++++ crates/valib-filters/src/lib.rs | 3 ++ crates/valib-filters/src/specialized.rs | 3 ++ crates/valib-fundsp/src/lib.rs | 3 -- crates/valib-voice/src/monophonic.rs | 41 +++++++++++++++++++-- crates/valib-voice/src/upsample.rs | 3 ++ examples/dirty-biquad/src/dsp.rs | 4 +- examples/wdfclipper/src/dsp.rs | 2 - examples/wdfclipper/src/lib.rs | 2 +- plugins/ts404/src/dsp/clipping.rs | 6 +-- plugins/ts404/src/editor/components/knob.rs | 1 - plugins/ts404/src/editor/mod.rs | 1 + plugins/ts404/src/lib.rs | 1 - 14 files changed, 61 insertions(+), 18 deletions(-) diff --git a/crates/valib-core/src/util.rs b/crates/valib-core/src/util.rs index f98afcc..8a9a151 100644 --- a/crates/valib-core/src/util.rs +++ b/crates/valib-core/src/util.rs @@ -1,7 +1,7 @@ //! Utilities for all of `valib`. use crate::Scalar; -use num_traits::{AsPrimitive, Float, One, Zero}; +use num_traits::{AsPrimitive, Float, Zero}; use numeric_literals::replace_float_literals; use simba::simd::SimdValue; diff --git a/crates/valib-filters/src/biquad/mod.rs b/crates/valib-filters/src/biquad/mod.rs index 5e04ee1..f4b6263 100644 --- a/crates/valib-filters/src/biquad/mod.rs +++ b/crates/valib-filters/src/biquad/mod.rs @@ -51,6 +51,13 @@ impl Biquad { } impl Biquad { + /// Update the coefficients from another [`Biquad`] instance. + /// + /// # Arguments + /// + /// * `other`: Biquad instance to copy the coefficients from. + /// + /// returns: () pub fn update_coefficients(&mut self, other: &Biquad) { self.na = other.na; self.b = other.b; diff --git a/crates/valib-filters/src/lib.rs b/crates/valib-filters/src/lib.rs index f0b276c..49963b0 100644 --- a/crates/valib-filters/src/lib.rs +++ b/crates/valib-filters/src/lib.rs @@ -1,4 +1,7 @@ #![warn(missing_docs)] +//! # Filters for `valib` +//! +//! This module provides various filter implementations using `valib` process definitions. pub mod biquad; pub mod halfband; diff --git a/crates/valib-filters/src/specialized.rs b/crates/valib-filters/src/specialized.rs index af2d235..2930083 100644 --- a/crates/valib-filters/src/specialized.rs +++ b/crates/valib-filters/src/specialized.rs @@ -1,3 +1,6 @@ +//! # Specialized filters +//! +//! Provides specialized filters for specific use-cases. use crate::biquad::Biquad; use valib_core::dsp::{DSPMeta, DSPProcess}; use valib_core::Scalar; diff --git a/crates/valib-fundsp/src/lib.rs b/crates/valib-fundsp/src/lib.rs index acddd23..06fbcff 100644 --- a/crates/valib-fundsp/src/lib.rs +++ b/crates/valib-fundsp/src/lib.rs @@ -10,12 +10,9 @@ use fundsp::audionode::{AudioNode, Frame}; use fundsp::combinator::An; -use num_complex::Complex; use numeric_array::ArrayLength; use typenum::{Const, ToUInt, Unsigned, U}; -use valib_core::dsp::analysis::DspAnalysis; use valib_core::dsp::{DSPMeta, DSPProcess}; -use valib_core::simd::SimdComplexField; /// Wrapper DSP processor for FunDSP nodes pub struct FunDSP(pub An); diff --git a/crates/valib-voice/src/monophonic.rs b/crates/valib-voice/src/monophonic.rs index ae72283..86f43f5 100644 --- a/crates/valib-voice/src/monophonic.rs +++ b/crates/valib-voice/src/monophonic.rs @@ -6,13 +6,19 @@ use crate::{NoteData, Voice, VoiceManager}; use num_traits::zero; use valib_core::dsp::buffer::{AudioBufferMut, AudioBufferRef}; use valib_core::dsp::{DSPMeta, DSPProcess, DSPProcessBlock}; +use valib_core::util::lerp; +use valib_core::Scalar; /// Monophonic voice manager over a single voice. pub struct Monophonic { + /// Minimum pitch bend amount (semitones) + pub pitch_bend_min_st: V::Sample, + /// Maximum pitch bend amount (semitones) + pub pitch_bend_max_st: V::Sample, create_voice: Box) -> V>, voice: Option, - base_frequency: f32, - pitch_bend: f32, + base_frequency: V::Sample, + pitch_bend_st: V::Sample, released: bool, legato: bool, samplerate: f32, @@ -53,11 +59,13 @@ impl Monophonic { legato: bool, ) -> Self { Self { + pitch_bend_min_st: V::Sample::from_f64(-2.), + pitch_bend_max_st: V::Sample::from_f64(2.), create_voice: Box::new(create_voice), voice: None, released: false, - base_frequency: 440., - pitch_bend: 0., + base_frequency: V::Sample::from_f64(440.), + pitch_bend_st: zero(), legato, samplerate, } @@ -102,6 +110,8 @@ impl VoiceManager for Monophonic { } fn note_on(&mut self, note_data: NoteData) -> Self::ID { + self.base_frequency = note_data.frequency; + self.pitch_bend_st = zero(); if let Some(voice) = &mut self.voice { *voice.note_data_mut() = note_data; if self.released || !self.legato { @@ -125,6 +135,29 @@ impl VoiceManager for Monophonic { fn panic(&mut self) { self.voice.take(); } + + fn pitch_bend(&mut self, amount: f64) { + self.pitch_bend_st = lerp( + V::Sample::from_f64(0.5 + amount / 2.), + self.pitch_bend_min_st, + self.pitch_bend_max_st, + ); + } + + fn aftertouch(&mut self, amount: f64) { + if let Some(voice) = &mut self.voice { + voice.note_data_mut().pressure = V::Sample::from_f64(amount); + } + } + + fn pressure(&mut self, _: Self::ID, pressure: f32) { + if let Some(voice) = &mut self.voice { + voice.note_data_mut().pressure = V::Sample::from_f64(pressure as _); + } + } + fn glide(&mut self, _: Self::ID, semitones: f32) { + self.pitch_bend_st = V::Sample::from_f64(semitones as _); + } } impl> DSPProcess<0, 1> for Monophonic { diff --git a/crates/valib-voice/src/upsample.rs b/crates/valib-voice/src/upsample.rs index 75d46c0..71384b4 100644 --- a/crates/valib-voice/src/upsample.rs +++ b/crates/valib-voice/src/upsample.rs @@ -1,3 +1,6 @@ +//! # Upsampled voices +//! +//! Provides upsampling for DSP process which are generators (0 input channels). use num_traits::zero; use valib_core::dsp::buffer::{AudioBufferBox, AudioBufferMut, AudioBufferRef}; use valib_core::dsp::{DSPMeta, DSPProcessBlock}; diff --git a/examples/dirty-biquad/src/dsp.rs b/examples/dirty-biquad/src/dsp.rs index f218c89..03c914a 100644 --- a/examples/dirty-biquad/src/dsp.rs +++ b/examples/dirty-biquad/src/dsp.rs @@ -93,7 +93,7 @@ pub struct DspInner { fc: SmoothedParam, resonance: SmoothedParam, ftype: FilterType, - saturator: SaturatorType, + // saturator: SaturatorType, biquad: Biquad>, } @@ -172,7 +172,7 @@ pub fn create(samplerate: f32) -> RemoteControlled { fc: SmoothedParam::exponential(3000.0, samplerate, 50.0), resonance: SmoothedParam::linear(0.5, samplerate, 10.0), ftype: FilterType::Lowpass, - saturator: SaturatorType::Linear, + //saturator: SaturatorType::Linear, biquad: Biquad::lowpass(Sample::splat(3000.0 / samplerate), Sample::splat(0.5)) .with_saturators(Dynamic::default(), Dynamic::default()), }; diff --git a/examples/wdfclipper/src/dsp.rs b/examples/wdfclipper/src/dsp.rs index 128557c..94550fd 100644 --- a/examples/wdfclipper/src/dsp.rs +++ b/examples/wdfclipper/src/dsp.rs @@ -5,11 +5,9 @@ use valib::dsp::buffer::{AudioBufferMut, AudioBufferRef}; use valib::dsp::parameter::ParamId; use valib::dsp::parameter::{HasParameters, ParamName, RemoteControlled, SmoothedParam}; use valib::dsp::{BlockAdapter, DSPMeta, DSPProcess, DSPProcessBlock}; -use valib::filters::biquad::Biquad; use valib::filters::specialized::DcBlocker; use valib::oversample::{Oversample, Oversampled}; use valib::saturators::clippers::DiodeClipper; -use valib::saturators::Linear; use valib::simd::{AutoF32x2, AutoF64x2, SimdComplexField}; use valib::wdf; use valib::wdf::adapters::Parallel; diff --git a/examples/wdfclipper/src/lib.rs b/examples/wdfclipper/src/lib.rs index fab35ae..348ac20 100644 --- a/examples/wdfclipper/src/lib.rs +++ b/examples/wdfclipper/src/lib.rs @@ -4,7 +4,7 @@ use nih_plug::prelude::*; use nih_plug::util::db_to_gain; use dsp::Dsp; -use valib::contrib::nih_plug::{enum_int_param, process_buffer_simd, BindToParameter}; +use valib::contrib::nih_plug::{process_buffer_simd, BindToParameter}; use valib::dsp::parameter::{RemoteControl, RemoteControlled}; use valib::dsp::DSPMeta; diff --git a/plugins/ts404/src/dsp/clipping.rs b/plugins/ts404/src/dsp/clipping.rs index 6b400da..3605662 100644 --- a/plugins/ts404/src/dsp/clipping.rs +++ b/plugins/ts404/src/dsp/clipping.rs @@ -7,7 +7,7 @@ use std::sync::{atomic::Ordering, Arc}; use valib::math::smooth_clamp; use valib::saturators::clippers::DiodeClipper; use valib::saturators::{Saturator, Slew}; -use valib::simd::{SimdComplexField, SimdValue}; +use valib::simd::SimdValue; use valib::wdf::dsl::*; use valib::{ dsp::{DSPMeta, DSPProcess}, @@ -16,14 +16,14 @@ use valib::{ }; struct CrossoverDistortion { - pub t: T, + // pub t: T, pub drift: T, } impl CrossoverDistortion { pub fn new(drift: T) -> Self { Self { - t: T::from_f64(1e-1), + // t: T::from_f64(1e-1), drift, } } diff --git a/plugins/ts404/src/editor/components/knob.rs b/plugins/ts404/src/editor/components/knob.rs index 7828974..b4379f6 100644 --- a/plugins/ts404/src/editor/components/knob.rs +++ b/plugins/ts404/src/editor/components/knob.rs @@ -181,7 +181,6 @@ pub struct Knob { impl Knob { pub fn new( cx: &mut Context, - bipolar: bool, params: impl Lens, get_param: impl 'static + Copy + Fn(&Params) -> &P, ) -> Handle { diff --git a/plugins/ts404/src/editor/mod.rs b/plugins/ts404/src/editor/mod.rs index fa19e89..6fa635d 100644 --- a/plugins/ts404/src/editor/mod.rs +++ b/plugins/ts404/src/editor/mod.rs @@ -113,6 +113,7 @@ where }) } +#[cfg(never)] fn labelled_node_enum( cx: &mut Context, params: impl Lens>, diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index fb63667..4f5cd93 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -20,7 +20,6 @@ mod util; const TARGET_SAMPLERATE: f32 = 192000.; type Sample = AutoF64x2; -type Sample32 = AutoF32x2; pub struct Ts404 { params: Arc, From aa404b2af7bd05363fa953f65adc6bfb8b3564a7 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 23:19:43 +0200 Subject: [PATCH 49/51] ide: python facet --- .idea/misc.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .idea/misc.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..916893f --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file From 0b2ad2b7c47b218d4ead0db564d4b3d52c596d7a Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 23:19:56 +0200 Subject: [PATCH 50/51] chore: clippy --- plugins/ts404/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/ts404/src/lib.rs b/plugins/ts404/src/lib.rs index 4f5cd93..752b5a3 100644 --- a/plugins/ts404/src/lib.rs +++ b/plugins/ts404/src/lib.rs @@ -4,7 +4,7 @@ use nih_plug::prelude::*; use valib::contrib::nih_plug::process_buffer_simd64; use valib::dsp::parameter::RemoteControlled; use valib::dsp::DSPMeta; -use valib::simd::{AutoF32x2, AutoF64x2}; +use valib::simd::AutoF64x2; use dsp::MAX_BLOCK_SIZE; use params::Ts404Params; From f8e81ca9a6b64469e3d00f42cae681679a7bdfe0 Mon Sep 17 00:00:00 2001 From: Nathan Graule Date: Fri, 13 Sep 2024 23:43:50 +0200 Subject: [PATCH 51/51] test: make them pass --- crates/valib-core/src/dsp/buffer.rs | 12 +- ...404__dsp__clipping__tests__drive_test.snap | 8194 ++++++++--------- 2 files changed, 4103 insertions(+), 4103 deletions(-) diff --git a/crates/valib-core/src/dsp/buffer.rs b/crates/valib-core/src/dsp/buffer.rs index 268827d..0744913 100644 --- a/crates/valib-core/src/dsp/buffer.rs +++ b/crates/valib-core/src/dsp/buffer.rs @@ -113,8 +113,8 @@ impl AudioBuffer<[T; LENGTH], CHA /// # Examples /// /// ``` - /// use valib_core::dsp::buffer::AudioBufferBox; - /// let buffer = AudioBufferBox::::zeroed(64); + /// use valib_core::dsp::buffer::{AudioBuffer, AudioBufferBox}; + /// let buffer = AudioBuffer::const_new([[0f32; 64]; 2]); /// let slice = buffer.array_slice(16..32); /// ``` pub fn array_slice(&self, bounds: impl RangeBounds) -> AudioBufferRef { @@ -137,8 +137,8 @@ impl AudioBuffer<[T; LENGTH], CHA /// # Examples /// /// ``` - /// use valib_core::dsp::buffer::AudioBufferBox; - /// let mut buffer = AudioBufferBox::::zeroed(64); + /// use valib_core::dsp::buffer::{AudioBuffer, AudioBufferBox}; + /// let mut buffer = AudioBuffer::const_new([[0f32; 64]; 2]); /// let mut slice = buffer.array_slice_mut(16..32); /// ``` pub fn array_slice_mut( @@ -258,7 +258,7 @@ impl, const CHANNELS: usize> AudioBuffer /// ``` /// use valib_core::dsp::buffer::AudioBufferBox; /// let buffer = AudioBufferBox::::zeroed(64); - /// let slice = buffer.array_slice(16..32); + /// let slice = buffer.slice(16..32); /// ``` pub fn slice(&self, bounds: impl RangeBounds) -> AudioBufferRef { let range = bounds_into_range(bounds, 0..self.inner_size); @@ -350,7 +350,7 @@ impl, const CHANNELS: usize> AudioBuffer::zeroed(64); - /// let mut slice = buffer.array_slice_mut(16..32); + /// let mut slice = buffer.slice_mut(16..32); /// ``` pub fn slice_mut(&mut self, bounds: impl RangeBounds) -> AudioBufferMut { let range = bounds_into_range(bounds, 0..self.inner_size); diff --git a/plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__drive_test.snap b/plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__drive_test.snap index c4231b8..de4fbb3 100644 --- a/plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__drive_test.snap +++ b/plugins/ts404/src/dsp/snapshots/ts404__dsp__clipping__tests__drive_test.snap @@ -1,4100 +1,4100 @@ --- -source: src/dsp/clipping.rs +source: plugins/ts404/src/dsp/clipping.rs expression: "&assert as &[_]" --- -4.5,0.0 -5.475,0.0095 -6.4407,0.0191 -7.388,0.0286 -8.3077,0.0381 -9.1911,0.0477 -10.0298,0.0572 -10.8158,0.0668 -11.5417,0.0763 -12.2004,0.0858 -12.7858,0.0954 -13.2922,0.1049 -13.7148,0.1144 -14.0496,0.124 -14.2934,0.1335 -14.4439,0.1431 -14.4997,0.1526 -14.4601,0.1621 -14.3256,0.1717 -14.0975,0.1812 -13.778,0.1907 -13.37,0.2003 -12.8775,0.2098 -12.3052,0.2193 -11.6585,0.2289 -10.9436,0.2384 -10.1673,0.248 -9.337,0.2575 -8.4606,0.267 -7.5464,0.2766 -6.6032,0.2861 -5.64,0.2956 -4.6659,0.3052 -3.6903,0.3147 -2.7223,0.3242 -1.7713,0.3338 -0.8463,0.3433 --0.0439,0.3529 --0.8908,0.3624 --1.6863,0.3719 --2.4229,0.3815 --3.0935,0.3719 --3.6917,0.3624 --4.2119,0.3529 --4.6491,0.3433 --4.9991,0.3338 --5.2585,0.3242 --5.425,0.3147 --5.4969,0.3052 --5.4735,0.2956 --5.3551,0.3052 --5.1428,0.3147 --4.8386,0.3242 --4.4454,0.3338 --3.967,0.3433 --3.4079,0.3529 --2.7734,0.3624 --2.0696,0.3719 --1.3032,0.3815 --0.4815,0.391 -0.3876,0.4005 -1.296,0.4101 -2.2349,0.4196 -3.1953,0.4292 -4.1682,0.4387 -5.1443,0.4482 -6.1142,0.4578 -7.0687,0.4673 -7.9988,0.4768 -8.8955,0.4864 -9.7503,0.4959 -10.5551,0.5054 -11.3022,0.515 -11.9845,0.5245 -12.5955,0.5341 -13.1293,0.5436 -13.5809,0.5531 -13.9459,0.5627 -14.221,0.5722 -14.4034,0.5817 -14.4914,0.5913 -14.4842,0.6008 -14.3819,0.6104 -14.1854,0.6199 -13.8967,0.6294 -13.5183,0.639 -13.0541,0.6485 -12.5083,0.658 -11.8862,0.6676 -11.1938,0.6771 -10.4375,0.6866 -9.6247,0.6962 -8.763,0.7057 -7.8608,0.7153 -6.9264,0.7248 -5.969,0.7343 -4.9976,0.7439 -4.0214,0.7534 -3.0498,0.7629 -2.092,0.7725 -1.1571,0.782 -0.2542,0.7915 --0.6084,0.8011 --1.4222,0.8106 --2.1797,0.8202 --2.8734,0.8106 --3.4969,0.8011 --4.0442,0.7915 --4.5101,0.782 --4.8901,0.7725 --5.1807,0.7629 --5.379,0.7534 --5.4831,0.7439 --5.4922,0.7343 --5.406,0.7248 --5.2254,0.7343 --4.9521,0.7439 --4.5888,0.7534 --4.1389,0.7629 --3.6066,0.7725 --2.9971,0.782 --2.3161,0.7915 --1.5702,0.8011 --0.7665,0.8106 -0.0875,0.8202 -0.9834,0.8297 -1.9129,0.8392 -2.8671,0.8488 -3.8368,0.8583 -4.8128,0.8678 -5.7858,0.8774 -6.7466,0.8869 -7.686,0.8965 -8.595,0.906 -9.465,0.9155 -10.2877,0.9251 -11.0553,0.9346 -11.7603,0.9441 -12.3962,0.9537 -12.9569,0.9632 -13.4369,0.9727 -13.8318,0.9823 -14.1378,0.9918 -14.3519,1.0014 -14.4721,1.0109 -14.4974,1.0204 -14.4273,1.03 -14.2627,1.0395 -14.005,1.049 -13.6567,1.0586 -13.2212,1.0681 -12.7026,1.0777 -12.1058,1.0872 -11.4366,1.0967 -10.7012,1.1063 -9.9068,1.1158 -9.0608,1.1253 -8.1714,1.1349 -7.247,1.1444 -6.2964,1.1539 -5.3287,1.1635 -4.3531,1.173 -3.3789,1.1826 -2.4153,1.1921 -1.4717,1.2016 -0.5569,1.2112 --0.3203,1.2207 --1.1516,1.2112 --1.9291,1.2016 --2.6452,1.1921 --3.2933,1.1826 --3.8671,1.173 --4.3612,1.1635 --4.7709,1.1539 --5.0922,1.1444 --5.3221,1.1349 --5.4584,1.1253 --5.4998,1.1158 --5.4459,1.1063 --5.2973,1.0967 --5.0552,1.0872 --4.7222,1.0967 --4.3012,1.1063 --3.7964,1.1158 --3.2125,1.1253 --2.5552,1.1349 --1.8306,1.1444 --1.0456,1.1539 --0.2079,1.1635 -0.6748,1.173 -1.5939,1.1826 -2.5406,1.1921 -3.5061,1.2016 -4.481,1.2112 -5.4561,1.2207 -6.4221,1.2302 -7.3698,1.2398 -8.2901,1.2493 -9.1743,1.2589 -10.014,1.2684 -10.8011,1.2779 -11.5282,1.2875 -12.1883,1.297 -12.7751,1.3065 -13.2831,1.3161 -13.7074,1.3256 -14.044,1.3351 -14.2896,1.3447 -14.4419,1.3542 -14.4995,1.3638 -14.4618,1.3733 -14.3291,1.3828 -14.1029,1.3924 -13.7851,1.4019 -13.3788,1.4114 -12.8879,1.421 -12.3171,1.4305 -11.6718,1.44 -10.9581,1.4496 -10.1829,1.4591 -9.3536,1.4687 -8.478,1.4782 -7.5645,1.4877 -6.6218,1.4973 -5.6589,1.5068 -4.6849,1.5163 -3.7092,1.5259 -2.741,1.5354 -1.7896,1.545 -0.864,1.5545 --0.027,1.545 --0.8748,1.5354 --1.6714,1.5259 --2.4092,1.5163 --3.0811,1.5068 --3.6808,1.4973 --4.2026,1.4877 --4.6414,1.4782 --4.9931,1.4687 --5.2544,1.4591 --5.4227,1.4496 --5.4964,1.44 --5.4749,1.4305 --5.3583,1.421 --5.1478,1.4114 --4.8454,1.4019 --4.4539,1.3924 --3.9771,1.4019 --3.4195,1.4114 --2.7864,1.421 --2.0839,1.4305 --1.3187,1.44 --0.498,1.4496 -0.3703,1.4591 -1.278,1.4687 -2.2164,1.4782 -3.1765,1.4877 -4.1492,1.4973 -5.1253,1.5068 -6.0954,1.5163 -7.0503,1.5259 -7.981,1.5354 -8.8784,1.545 -9.7341,1.5545 -10.54,1.564 -11.2883,1.5736 -11.9719,1.5831 -12.5843,1.5926 -13.1197,1.6022 -13.5729,1.6117 -13.9397,1.6212 -14.2165,1.6308 -14.4007,1.6403 -14.4906,1.6499 -14.4853,1.6594 -14.3848,1.6689 -14.1901,1.6785 -13.9031,1.688 -13.5265,1.6975 -13.0639,1.7071 -12.5197,1.7166 -11.899,1.7262 -11.2079,1.7357 -10.4528,1.7452 -9.641,1.7548 -8.7802,1.7643 -7.8786,1.7738 -6.9449,1.7834 -5.9878,1.7929 -5.0165,1.8024 -4.0404,1.812 -3.0686,1.8215 -2.1104,1.8311 -1.1751,1.8215 -0.2714,1.812 --0.592,1.8024 --1.4069,1.7929 --2.1655,1.7834 --2.8606,1.7738 --3.4855,1.7643 --4.0344,1.7548 --4.5019,1.7452 --4.8836,1.7357 --5.1759,1.7262 --5.376,1.7166 --5.482,1.7071 --5.4929,1.6975 --5.4086,1.688 --5.2298,1.6785 --4.9583,1.6689 --4.5967,1.6594 --4.1484,1.6689 --3.6177,1.6785 --3.0096,1.688 --2.33,1.6975 --1.5853,1.7071 --0.7826,1.7166 -0.0704,1.7262 -0.9657,1.7357 -1.8946,1.7452 -2.8483,1.7548 -3.8178,1.7643 -4.7938,1.7738 -5.767,1.7834 -6.7281,1.7929 -7.668,1.8024 -8.5777,1.812 -9.4485,1.8215 -10.2722,1.8311 -11.0409,1.8406 -11.7473,1.8501 -12.3845,1.8597 -12.9467,1.8692 -13.4284,1.8787 -13.825,1.8883 -14.1327,1.8978 -14.3486,1.9073 -14.4707,1.9169 -14.4978,1.9264 -14.4296,1.936 -14.2668,1.9455 -14.0109,1.955 -13.6644,1.9646 -13.2305,1.9741 -12.7135,1.9836 -12.1182,1.9932 -11.4503,2.0027 -10.7161,2.0123 -9.9228,2.0218 -9.0777,2.0313 -8.1891,2.0409 -7.2652,2.0504 -6.3151,2.0599 -5.3476,2.0695 -4.3721,2.079 -3.3977,2.0885 -2.4339,2.0981 -1.4898,2.0885 -0.5744,2.079 --0.3037,2.0695 --1.1359,2.0599 --1.9145,2.0504 --2.6319,2.0409 --3.2814,2.0313 --3.8567,2.0218 --4.3524,2.0123 --4.7637,2.0027 --5.0868,1.9932 --5.3185,1.9836 --5.4566,1.9741 --5.4999,1.9646 --5.4479,1.955 --5.301,1.9455 --5.0608,1.936 --4.7295,1.9264 --4.3102,1.9169 --3.807,1.9073 --3.2246,1.9169 --2.5686,1.9264 --1.8452,1.936 --1.0614,1.9455 --0.2246,1.955 -0.6572,1.9646 -1.5757,1.9741 -2.522,1.9836 -3.4872,1.9932 -4.462,2.0027 -5.4372,2.0123 -6.4034,2.0218 -7.3516,2.0313 -8.2725,2.0409 -9.1575,2.0504 -9.9981,2.0599 -10.7863,2.0695 -11.5146,2.079 -12.1761,2.0885 -12.7644,2.0981 -13.274,2.1076 -13.7,2.1172 -14.0383,2.1267 -14.2857,2.1362 -14.4398,2.1458 -14.4993,2.1553 -14.4634,2.1648 -14.3326,2.1744 -14.1081,2.1839 -13.7921,2.1935 -13.3875,2.203 -12.8982,2.2125 -12.3289,2.2221 -11.685,2.2316 -10.9726,2.2411 -10.1986,2.2507 -9.3702,2.2602 -8.4954,2.2697 -7.5826,2.2793 -6.6404,2.2888 -5.6777,2.2984 -4.7039,2.3079 -3.7281,2.3174 -2.7597,2.327 -1.8079,2.3365 -0.8817,2.327 --0.01,2.3174 --0.8588,2.3079 --1.6564,2.2984 --2.3954,2.2888 --3.0687,2.2793 --3.6699,2.2697 --4.1932,2.2602 --4.6337,2.2507 --4.9871,2.2411 --5.2502,2.2316 --5.4203,2.2221 --5.4959,2.2125 --5.4762,2.203 --5.3615,2.1935 --5.1528,2.1839 --4.8521,2.1744 --4.4623,2.1648 --3.9871,2.1553 --3.4311,2.1458 --2.7994,2.1553 --2.0982,2.1648 --1.3341,2.1744 --0.5144,2.1839 -0.353,2.1935 -1.26,2.203 -2.1979,2.2125 -3.1577,2.2221 -4.1302,2.2316 -5.1063,2.2411 -6.0767,2.2507 -7.032,2.2602 -7.9632,2.2697 -8.8613,2.2793 -9.7179,2.2888 -10.5248,2.2984 -11.2743,2.3079 -11.9592,2.3174 -12.5731,2.327 -13.11,2.3365 -13.5649,2.346 -13.9334,2.3556 -14.212,2.3651 -14.398,2.3746 -14.4897,2.3842 -14.4863,2.3937 -14.3877,2.4033 -14.1948,2.4128 -13.9096,2.4223 -13.5347,2.4319 -13.0737,2.4414 -12.531,2.4509 -11.9118,2.4605 -11.222,2.47 -10.4681,2.4796 -9.6573,2.4891 -8.7974,2.4986 -7.8965,2.5082 -6.9633,2.5177 -6.0066,2.5272 -5.0355,2.5368 -4.0594,2.5463 -3.0874,2.5368 -2.1289,2.5463 -1.193,2.5368 -0.2886,2.5272 --0.5757,2.5177 --1.3916,2.5082 --2.1513,2.4986 --2.8477,2.4891 --3.4741,2.4796 --4.0244,2.47 --4.4936,2.4605 --4.877,2.4509 --5.1711,2.4414 --5.373,2.4319 --5.4809,2.4223 --5.4936,2.4128 --5.4111,2.4033 --5.2342,2.3937 --4.9645,2.3842 --4.6046,2.3746 --4.1579,2.3651 --3.6288,2.3556 --3.0222,2.3651 --2.3439,2.3746 --1.6004,2.3842 --0.7987,2.3937 -0.0534,2.4033 -0.9479,2.4128 -1.8763,2.4223 -2.8296,2.4319 -3.7989,2.4414 -4.7748,2.4509 -5.7482,2.4605 -6.7096,2.47 -7.65,2.4796 -8.5604,2.4891 -9.432,2.4986 -10.2567,2.5082 -11.0265,2.5177 -11.7342,2.5272 -12.3728,2.5368 -12.9365,2.5463 -13.4198,2.5558 -13.8181,2.5654 -14.1276,2.5749 -14.3453,2.5845 -14.4692,2.594 -14.4982,2.6035 -14.4318,2.6131 -14.2708,2.6226 -14.0167,2.6321 -13.6719,2.6417 -13.2398,2.6512 -12.7243,2.6608 -12.1305,2.6703 -11.4639,2.6798 -10.731,2.6894 -9.9387,2.6989 -9.0946,2.7084 -8.2067,2.718 -7.2835,2.7275 -6.3338,2.737 -5.3665,2.7466 -4.3911,2.7561 -3.4166,2.7466 -2.4525,2.7561 -1.5079,2.7466 -0.5918,2.737 --0.287,2.7275 --1.1202,2.718 --1.8999,2.7084 --2.6186,2.6989 --3.2695,2.6894 --3.8463,2.6798 --4.3436,2.6703 --4.7566,2.6608 --5.0814,2.6512 --5.3149,2.6417 --5.4549,2.6321 --5.5,2.6226 --5.4498,2.6131 --5.3048,2.6035 --5.0664,2.594 --4.7368,2.5845 --4.3192,2.5749 --3.8175,2.5654 --3.2366,2.5558 --2.582,2.5654 --1.8599,2.5558 --1.0772,2.5654 --0.2413,2.5749 -0.6397,2.5845 -1.5575,2.594 -2.5034,2.6035 -3.4683,2.6131 -4.443,2.6226 -5.4183,2.6321 -6.3848,2.6417 -7.3333,2.6512 -8.2549,2.6608 -9.1407,2.6703 -9.9822,2.6798 -10.7715,2.6894 -11.5011,2.6989 -12.1639,2.7084 -12.7537,2.718 -13.2649,2.7275 -13.6925,2.737 -14.0326,2.7466 -14.2817,2.7561 -14.4377,2.7657 -14.499,2.7752 -14.465,2.7847 -14.3361,2.7943 -14.1134,2.8038 -13.7991,2.8133 -13.3962,2.8229 -12.9085,2.8324 -12.3407,2.8419 -11.6982,2.8515 -10.9871,2.861 -10.2142,2.8706 -9.3868,2.8801 -8.5128,2.8896 -7.6006,2.8992 -6.6589,2.9087 -5.6966,2.9182 -4.7229,2.9278 -3.7471,2.9182 -2.7784,2.9278 -1.8262,2.9182 -0.8994,2.9087 -0.0069,2.8992 --0.8427,2.8896 --1.6414,2.8801 --2.3817,2.8706 --3.0563,2.861 --3.6589,2.8515 --4.1838,2.8419 --4.6259,2.8324 --4.9811,2.8229 --5.2459,2.8133 --5.4179,2.8038 --5.4953,2.7943 --5.4775,2.7847 --5.3646,2.7752 --5.1578,2.7657 --4.8588,2.7561 --4.4707,2.7466 --3.9972,2.737 --3.4426,2.7275 --2.8124,2.718 --2.1125,2.7084 --1.3495,2.718 --0.5309,2.7275 -0.3358,2.737 -1.242,2.7466 -2.1794,2.7561 -3.1388,2.7657 -4.1113,2.7752 -5.0874,2.7847 -6.0579,2.7943 -7.0136,2.8038 -7.9453,2.8133 -8.8442,2.8229 -9.7017,2.8324 -10.5097,2.8419 -11.2603,2.8515 -11.9466,2.861 -12.5619,2.8706 -13.1003,2.8801 -13.5568,2.8896 -13.927,2.8992 -14.2074,2.9087 -14.3953,2.9182 -14.4889,2.9278 -14.4873,2.9373 -14.3905,2.9469 -14.1995,2.9564 -13.916,2.9659 -13.5428,2.9755 -13.0835,2.985 -12.5423,2.9945 -11.9245,3.0041 -11.236,3.0136 -10.4833,3.0231 -9.6736,3.0327 -8.8145,3.0422 -7.9144,3.0518 -6.9817,3.0613 -6.0254,3.0708 -5.0545,3.0804 -4.0783,3.0708 -3.1062,3.0804 -2.1473,3.0708 -1.2109,3.0613 -0.3058,3.0518 --0.5593,3.0422 --1.3762,3.0327 --2.1371,3.0231 --2.8348,3.0136 --3.4626,3.0041 --4.0145,2.9945 --4.4853,2.985 --4.8704,2.9755 --5.1662,2.9659 --5.37,2.9564 --5.4797,2.9469 --5.4943,2.9373 --5.4136,2.9278 --5.2385,2.9182 --4.9706,2.9087 --4.6124,2.8992 --4.1674,2.8896 --3.6398,2.8801 --3.0347,2.8706 --2.3577,2.861 --1.6154,2.8706 --0.8148,2.8801 -0.0364,2.8896 -0.9301,2.8992 -1.8579,2.9087 -2.8109,2.9182 -3.7799,2.9278 -4.7558,2.9373 -5.7293,2.9469 -6.6911,2.9564 -7.6319,2.9659 -8.543,2.9755 -9.4155,2.985 -10.2412,2.9945 -11.0121,3.0041 -11.721,3.0136 -12.3611,3.0231 -12.9263,3.0327 -13.4112,3.0422 -13.8112,3.0518 -14.1224,3.0613 -14.342,3.0708 -14.4677,3.0804 -14.4985,3.0899 -14.434,3.0994 -14.2749,3.109 -14.0225,3.1185 -13.6795,3.1281 -13.249,3.1376 -12.7351,3.1471 -12.1427,3.1567 -11.4775,3.1662 -10.7458,3.1757 -9.9546,3.1853 -9.1115,3.1948 -8.2243,3.2043 -7.3017,3.2139 -6.3524,3.2234 -5.3855,3.233 -4.4101,3.2234 -3.4355,3.233 -2.4711,3.2234 -1.5261,3.2139 -0.6093,3.2043 --0.2703,3.1948 --1.1045,3.1853 --1.8853,3.1757 --2.6052,3.1662 --3.2575,3.1567 --3.8358,3.1471 --4.3347,3.1376 --4.7494,3.1281 --5.0759,3.1185 --5.3112,3.109 --5.453,3.0994 --5.5,3.0899 --5.4517,3.0804 --5.3085,3.0708 --5.0719,3.0613 --4.7441,3.0518 --4.3281,3.0422 --3.8281,3.0327 --3.2487,3.0231 --2.5954,3.0136 --1.8746,3.0231 --1.093,3.0136 --0.2581,3.0231 -0.6222,3.0327 -1.5394,3.0422 -2.4848,3.0518 -3.4494,3.0613 -4.424,3.0708 -5.3994,3.0804 -6.3661,3.0899 -7.3151,3.0994 -8.2373,3.109 -9.1238,3.1185 -9.9663,3.1281 -10.7567,3.1376 -11.4875,3.1471 -12.1517,3.1567 -12.743,3.1662 -13.2557,3.1757 -13.685,3.1853 -14.0268,3.1948 -14.2778,3.2043 -14.4356,3.2139 -14.4987,3.2234 -14.4666,3.233 -14.3395,3.2425 -14.1186,3.252 -13.8061,3.2616 -13.4049,3.2711 -12.9188,3.2806 -12.3525,3.2902 -11.7114,3.2997 -11.0015,3.3093 -10.2297,3.3188 -9.4033,3.3283 -8.5302,3.3379 -7.6187,3.3474 -6.6775,3.3569 -5.7155,3.3665 -4.7419,3.3569 -3.766,3.3665 -2.7971,3.3569 -1.8445,3.3474 -0.9171,3.3379 -0.0239,3.3283 --0.8266,3.3188 --1.6264,3.3093 --2.3679,3.2997 --3.0438,3.2902 --3.6479,3.2806 --4.1744,3.2711 --4.6182,3.2616 --4.975,3.252 --5.2417,3.2425 --5.4154,3.233 --5.4947,3.2234 --5.4788,3.2139 --5.3677,3.2043 --5.1627,3.1948 --4.8655,3.1853 --4.4791,3.1757 --4.0072,3.1662 --3.4541,3.1567 --2.8253,3.1471 --2.1267,3.1376 --1.3649,3.1281 --0.5473,3.1376 -0.3185,3.1471 -1.2241,3.1567 -2.1609,3.1662 -3.12,3.1757 -4.0923,3.1853 -5.0684,3.1948 -6.0391,3.2043 -6.9952,3.2139 -7.9275,3.2234 -8.8271,3.233 -9.6855,3.2425 -10.4945,3.252 -11.2463,3.2616 -11.9339,3.2711 -12.5506,3.2806 -13.0906,3.2902 -13.5488,3.2997 -13.9207,3.3093 -14.2028,3.3188 -14.3925,3.3283 -14.488,3.3379 -14.4882,3.3474 -14.3933,3.3569 -14.2041,3.3665 -13.9224,3.376 -13.5509,3.3855 -13.0932,3.3951 -12.5536,3.4046 -11.9373,3.4142 -11.25,3.4237 -10.4985,3.4332 -9.6898,3.4428 -8.8317,3.4523 -7.9322,3.4618 -7.0001,3.4714 -6.0441,3.4809 -5.0735,3.4714 -4.0973,3.4809 -3.125,3.4714 -2.1658,3.4618 -1.2289,3.4523 -0.3231,3.4428 --0.5429,3.4332 --1.3608,3.4237 --2.1229,3.4142 --2.8219,3.4046 --3.4511,3.3951 --4.0045,3.3855 --4.4769,3.376 --4.8637,3.3665 --5.1614,3.3569 --5.3669,3.3474 --5.4784,3.3379 --5.4949,3.3283 --5.4161,3.3188 --5.2428,3.3093 --4.9767,3.2997 --4.6202,3.2902 --4.1769,3.2806 --3.6508,3.2711 --3.0471,3.2616 --2.3715,3.252 --1.6304,3.2425 --0.8309,3.233 -0.0194,3.2425 -0.9124,3.252 -1.8396,3.2616 -2.7922,3.2711 -3.761,3.2806 -4.7368,3.2902 -5.7105,3.2997 -6.6725,3.3093 -7.6139,3.3188 -8.5256,3.3283 -9.3989,3.3379 -10.2256,3.3474 -10.9977,3.3569 -11.7079,3.3665 -12.3494,3.376 -12.9161,3.3855 -13.4026,3.3951 -13.8042,3.4046 -14.1172,3.4142 -14.3386,3.4237 -14.4662,3.4332 -14.4988,3.4428 -14.4362,3.4523 -14.2788,3.4618 -14.0283,3.4714 -13.687,3.4809 -13.2582,3.4904 -12.7458,3.5 -12.155,3.5095 -11.4911,3.5191 -10.7607,3.5286 -9.9706,3.5381 -9.1283,3.5477 -8.242,3.5572 -7.32,3.5667 -6.3711,3.5763 -5.4044,3.5858 -4.4291,3.5763 -3.4544,3.5667 -2.4897,3.5572 -1.5442,3.5477 -0.6268,3.5381 --0.2536,3.5286 --1.0888,3.5191 --1.8707,3.5095 --2.5919,3.5 --3.2455,3.4904 --3.8253,3.4809 --4.3258,3.4714 --4.7421,3.4618 --5.0704,3.4523 --5.3075,3.4428 --5.4512,3.4332 --5.5,3.4237 --5.4535,3.4142 --5.3122,3.4046 --5.0774,3.3951 --4.7513,3.3855 --4.337,3.376 --3.8386,3.3665 --3.2607,3.3569 --2.6088,3.3474 --1.8892,3.3379 --1.1087,3.3283 --0.2748,3.3379 -0.6047,3.3474 -1.5212,3.3569 -2.4662,3.3665 -3.4305,3.376 -4.405,3.3855 -5.3804,3.3951 -6.3475,3.4046 -7.2969,3.4142 -8.2197,3.4237 -9.107,3.4332 -9.9504,3.4428 -10.7419,3.4523 -11.4739,3.4618 -12.1395,3.4714 -12.7322,3.4809 -13.2465,3.4904 -13.6775,3.5 -14.021,3.5095 -14.2738,3.5191 -14.4334,3.5286 -14.4984,3.5381 -14.4681,3.5477 -14.3429,3.5572 -14.1238,3.5667 -13.813,3.5763 -13.4135,3.5858 -12.929,3.5954 -12.3642,3.6049 -11.7245,3.6144 -11.0159,3.624 -10.2453,3.6335 -9.4199,3.643 -8.5476,3.6526 -7.6367,3.6621 -6.696,3.6716 -5.7343,3.6812 -4.7609,3.6716 -3.785,3.6621 -2.8158,3.6526 -1.8628,3.643 -0.9349,3.6335 -0.0409,3.624 --0.8106,3.6144 --1.6114,3.6049 --2.354,3.5954 --3.0314,3.5858 --3.6369,3.5763 --4.1649,3.5667 --4.6103,3.5572 --4.969,3.5477 --5.2373,3.5381 --5.4129,3.5286 --5.4941,3.5191 --5.48,3.5095 --5.3708,3.5 --5.1675,3.4904 --4.8722,3.4809 --4.4875,3.4714 --4.0171,3.4618 --3.4656,3.4523 --2.8382,3.4428 --2.1409,3.4332 --1.3803,3.4237 --0.5637,3.4332 -0.3012,3.4428 -1.2061,3.4523 -2.1424,3.4618 -3.1012,3.4714 -4.0733,3.4809 -5.0494,3.4904 -6.0204,3.5 -6.9768,3.5095 -7.9096,3.5191 -8.81,3.5286 -9.6692,3.5381 -10.4793,3.5477 -11.2323,3.5572 -11.9212,3.5667 -12.5393,3.5763 -13.0809,3.5858 -13.5407,3.5954 -13.9143,3.6049 -14.1982,3.6144 -14.3897,3.624 -14.487,3.6335 -14.4891,3.643 -14.396,3.6526 -14.2086,3.6621 -13.9287,3.6716 -13.559,3.6812 -13.1029,3.6907 -12.5648,3.7003 -11.9499,3.7098 -11.264,3.7193 -10.5137,3.7289 -9.706,3.7384 -8.8488,3.7479 -7.9501,3.7575 -7.0185,3.767 -6.0629,3.7766 -5.0924,3.767 -4.1163,3.7575 -3.1438,3.7479 -2.1843,3.7384 -1.2468,3.7289 -0.3403,3.7193 --0.5265,3.7098 --1.3454,3.7003 --2.1087,3.6907 --2.8089,3.6812 --3.4395,3.6716 --3.9945,3.6621 --4.4685,3.6526 --4.8571,3.643 --5.1564,3.6335 --5.3638,3.624 --5.4772,3.6144 --5.4955,3.6049 --5.4185,3.5954 --5.2471,3.5858 --4.9827,3.5763 --4.628,3.5667 --4.1863,3.5572 --3.6618,3.5477 --3.0596,3.5381 --2.3853,3.5286 --1.6454,3.5191 --0.847,3.5095 -0.0024,3.5191 -0.8947,3.5286 -1.8213,3.5381 -2.7734,3.5477 -3.742,3.5572 -4.7179,3.5667 -5.6916,3.5763 -6.654,3.5858 -7.5958,3.5954 -8.5082,3.6049 -9.3824,3.6144 -10.21,3.624 -10.9832,3.6335 -11.6947,3.643 -12.3376,3.6526 -12.9058,3.6621 -13.3939,3.6716 -13.7972,3.6812 -14.112,3.6907 -14.3352,3.7003 -14.4646,3.7098 -14.4991,3.7193 -14.4383,3.7289 -14.2828,3.7384 -14.0341,3.7479 -13.6945,3.7575 -13.2673,3.767 -12.7566,3.7766 -12.1672,3.7861 -11.5047,3.7956 -10.7755,3.8052 -9.9865,3.8147 -9.1451,3.8242 -8.2596,3.8338 -7.3382,3.8433 -6.3897,3.8528 -5.4233,3.8433 -4.4481,3.8338 -3.4733,3.8242 -2.5083,3.8147 -1.5623,3.8052 -0.6444,3.7956 --0.2369,3.7861 --1.073,3.7766 --1.856,3.767 --2.5785,3.7575 --3.2335,3.7479 --3.8147,3.7384 --4.3168,3.7289 --4.7349,3.7193 --5.0649,3.7098 --5.3038,3.7003 --5.4493,3.6907 --5.5,3.6812 --5.4553,3.6716 --5.3158,3.6621 --5.0828,3.6526 --4.7585,3.643 --4.3459,3.6335 --3.8491,3.624 --3.2726,3.6144 --2.6221,3.6049 --1.9038,3.5954 --1.1244,3.5858 --0.2914,3.5763 -0.5872,3.5858 -1.5031,3.5954 -2.4476,3.6049 -3.4116,3.6144 -4.386,3.624 -5.3615,3.6335 -6.3288,3.643 -7.2786,3.6526 -8.202,3.6621 -9.0901,3.6716 -9.9345,3.6812 -10.7271,3.6907 -11.4603,3.7003 -12.1272,3.7098 -12.7214,3.7193 -13.2373,3.7289 -13.6699,3.7384 -14.0152,3.7479 -14.2697,3.7575 -14.4312,3.767 -14.4981,3.7766 -14.4696,3.7861 -14.3462,3.7956 -14.1289,3.8052 -13.8199,3.8147 -13.4221,3.8242 -12.9392,3.8338 -12.376,3.8433 -11.7376,3.8528 -11.0303,3.8624 -10.2608,3.8719 -9.4364,3.8815 -8.565,3.891 -7.6548,3.9005 -6.7145,3.9101 -5.7532,3.9005 -4.7799,3.891 -3.8039,3.8815 -2.8346,3.8719 -1.8811,3.8624 -0.9526,3.8528 -0.0579,3.8433 --0.7945,3.8338 --1.5964,3.8242 --2.3402,3.8147 --3.0188,3.8052 --3.6258,3.7956 --4.1554,3.7861 --4.6025,3.7766 --4.9628,3.767 --5.233,3.7575 --5.4104,3.7479 --5.4934,3.7384 --5.4812,3.7289 --5.3738,3.7193 --5.1724,3.7098 --4.8788,3.7003 --4.4958,3.6907 --4.0271,3.6812 --3.4771,3.6716 --2.8511,3.6621 --2.1551,3.6526 --1.3957,3.643 --0.58,3.6335 -0.284,3.643 -1.1882,3.6526 -2.124,3.6621 -3.0824,3.6716 -4.0543,3.6812 -5.0305,3.6907 -6.0016,3.7003 -6.9584,3.7098 -7.8918,3.7193 -8.7928,3.7289 -9.653,3.7384 -10.464,3.7479 -11.2182,3.7575 -11.9084,3.767 -12.528,3.7766 -13.0711,3.7861 -13.5325,3.7956 -13.9079,3.8052 -14.1936,3.8147 -14.3869,3.8242 -14.486,3.8338 -14.49,3.8433 -14.3987,3.8528 -14.2132,3.8624 -13.935,3.8719 -13.567,3.8815 -13.1126,3.891 -12.5761,3.9005 -11.9626,3.9101 -11.278,3.9196 -10.5289,3.9291 -9.7222,3.9387 -8.8659,3.9482 -7.9679,3.9577 -7.0369,3.9673 -6.0817,3.9577 -5.1114,3.9482 -4.1353,3.9387 -3.1627,3.9291 -2.2028,3.9196 -1.2648,3.9101 -0.3576,3.9005 --0.5101,3.891 --1.33,3.8815 --2.0944,3.8719 --2.796,3.8624 --3.428,3.8528 --3.9845,3.8433 --4.4601,3.8338 --4.8503,3.8242 --5.1515,3.8147 --5.3607,3.8052 --5.4759,3.7956 --5.496,3.7861 --5.4209,3.7766 --5.2513,3.767 --4.9887,3.7575 --4.6357,3.7479 --4.1957,3.7384 --3.6728,3.7289 --3.072,3.7193 --2.3991,3.7098 --1.6604,3.7003 --0.863,3.6907 --0.0145,3.7003 -0.877,3.7098 -1.803,3.7193 -2.7547,3.7289 -3.7231,3.7384 -4.6989,3.7479 -5.6727,3.7575 -6.6354,3.767 -7.5778,3.7766 -8.4908,3.7861 -9.3658,3.7956 -10.1944,3.8052 -10.9688,3.8147 -11.6815,3.8242 -12.3258,3.8338 -12.8955,3.8433 -13.3852,3.8528 -13.7902,3.8624 -14.1067,3.8719 -14.3317,3.8815 -14.463,3.891 -14.4993,3.9005 -14.4404,3.9101 -14.2867,3.9196 -14.0398,3.9291 -13.702,3.9387 -13.2764,3.9482 -12.7673,3.9577 -12.1794,3.9673 -11.5182,3.9768 -10.7903,3.9864 -10.0023,3.9959 -9.162,4.0054 -8.2772,4.015 -7.3564,4.0245 -6.4084,4.034 -5.4422,4.0285 -4.4671,4.0189 -3.4922,4.0094 -2.527,3.9999 -1.5805,3.9903 -0.6619,3.9808 --0.2202,3.9713 --1.0572,3.9617 --1.8413,3.9522 --2.565,3.9427 --3.2214,3.9331 --3.8042,3.9236 --4.3078,3.914 --4.7276,3.9045 --5.0593,3.895 --5.3,3.8854 --5.4474,3.8759 --5.4999,3.8664 --5.4571,3.8568 --5.3195,3.8473 --5.0882,3.8378 --4.7656,3.8282 --4.3548,3.8187 --3.8595,3.8091 --3.2846,3.7996 --2.6355,3.7901 --1.9184,3.7805 --1.1401,3.771 --0.3081,3.7805 -0.5697,3.7901 -1.485,3.7996 -2.429,3.8091 -3.3927,3.8187 -4.367,3.8282 -5.3426,3.8378 -6.3101,3.8473 -7.2604,3.8568 -8.1844,3.8664 -9.0732,3.8759 -9.9185,3.8854 -10.7122,3.895 -11.4466,3.9045 -12.1149,3.914 -12.7106,3.9236 -13.2281,3.9331 -13.6623,3.9427 -14.0093,3.9522 -14.2657,3.9617 -14.429,3.9713 -14.4977,3.9808 -14.4711,3.9903 -14.3495,3.9999 -14.134,4.0094 -13.8268,4.0189 -13.4306,4.0285 -12.9494,4.038 -12.3876,4.0476 -11.7507,4.0571 -11.0447,4.0666 -10.2763,4.0762 -9.4529,4.0857 -8.5823,4.0952 -7.6728,4.1048 -6.733,4.1143 -5.772,4.1239 -4.7989,4.1143 -3.8229,4.1048 -2.8533,4.0952 -1.8995,4.0857 -0.9704,4.0762 -0.0749,4.0666 --0.7783,4.0571 --1.5813,4.0476 --2.3263,4.038 --3.0063,4.0285 --3.6148,4.0189 --4.1459,4.0094 --4.5946,3.9999 --4.9567,3.9903 --5.2286,3.9808 --5.4079,3.9713 --5.4927,3.9617 --5.4823,3.9522 --5.3768,3.9427 --5.1772,3.9331 --4.8853,3.9236 --4.5041,3.914 --4.037,3.9045 --3.4885,3.895 --2.864,3.8854 --2.1693,3.8759 --1.411,3.8664 --0.5964,3.8568 -0.2668,3.8664 -1.1703,3.8568 -2.1055,3.8664 -3.0636,3.8759 -4.0353,3.8854 -5.0115,3.895 -5.9828,3.9045 -6.94,3.914 -7.8739,3.9236 -8.7757,3.9331 -9.6367,3.9427 -10.4488,3.9522 -11.2041,3.9617 -11.8956,3.9713 -12.5167,3.9808 -13.0613,3.9903 -13.5244,3.9999 -13.9014,4.0094 -14.1889,4.0189 -14.384,4.0285 -14.485,4.038 -14.4908,4.0476 -14.4014,4.0571 -14.2177,4.0666 -13.9413,4.0762 -13.575,4.0857 -13.1222,4.0952 -12.5873,4.1048 -11.9752,4.1143 -11.292,4.1239 -10.544,4.1334 -9.7384,4.1429 -8.8829,4.1525 -7.9857,4.162 -7.0552,4.1715 -6.1004,4.1811 -5.1303,4.1715 -4.1543,4.162 -3.1815,4.1525 -2.2213,4.1429 -1.2828,4.1334 -0.3749,4.1239 --0.4936,4.1143 --1.3146,4.1048 --2.0801,4.0952 --2.783,4.0857 --3.4164,4.0762 --3.9744,4.0666 --4.4516,4.0571 --4.8436,4.0476 --5.1465,4.038 --5.3575,4.0285 --5.4745,4.0189 --5.4965,4.0094 --5.4233,3.9999 --5.2555,3.9903 --4.9947,3.9808 --4.6434,3.9713 --4.2051,3.9617 --3.6837,3.9522 --3.0844,3.9427 --2.4128,3.9331 --1.6754,3.9236 --0.879,3.914 --0.0315,3.9045 -0.8593,3.914 -1.7847,3.9236 -2.736,3.9331 -3.7042,3.9427 -4.6799,3.9522 -5.6539,3.9617 -6.6169,3.9713 -7.5597,3.9808 -8.4734,3.9903 -9.3492,3.9999 -10.1788,4.0094 -10.9543,4.0189 -11.6682,4.0285 -12.3139,4.038 -12.8851,4.0476 -13.3765,4.0571 -13.7832,4.0666 -14.1014,4.0762 -14.3282,4.0857 -14.4613,4.0952 -14.4995,4.1048 -14.4424,4.1143 -14.2906,4.1239 -14.0455,4.1334 -13.7094,4.1429 -13.2855,4.1525 -12.778,4.162 -12.1915,4.1715 -11.5318,4.1811 -10.805,4.1906 -10.0182,4.2001 -9.1788,4.2097 -8.2948,4.2192 -7.3746,4.2288 -6.427,4.2383 -5.4611,4.2288 -4.486,4.2192 -3.5111,4.2097 -2.5456,4.2001 -1.5987,4.1906 -0.6794,4.1811 --0.2034,4.1715 --1.0414,4.162 --1.8266,4.1525 --2.5516,4.1429 --3.2093,4.1334 --3.7936,4.1239 --4.2988,4.1143 --4.7202,4.1048 --5.0537,4.0952 --5.2962,4.0857 --5.4454,4.0762 --5.4998,4.0666 --5.4588,4.0571 --5.323,4.0476 --5.0936,4.038 --4.7728,4.0285 --4.3636,4.0189 --3.8699,4.0094 --3.2965,3.9999 --2.6488,3.9903 --1.9329,3.9808 --1.1558,3.9713 --0.3248,3.9617 -0.5523,3.9713 -1.4669,3.9808 -2.4104,3.9903 -3.3739,3.9999 -4.348,4.0094 -5.3237,4.0189 -6.2914,4.0285 -7.2421,4.038 -8.1667,4.0476 -9.0563,4.0571 -9.9026,4.0666 -10.6973,4.0762 -11.433,4.0857 -12.1026,4.0952 -12.6997,4.1048 -13.2188,4.1143 -13.6547,4.1239 -14.0034,4.1334 -14.2616,4.1429 -14.4267,4.1525 -14.4972,4.162 -14.4725,4.1715 -14.3528,4.1811 -14.1391,4.1906 -13.8336,4.2001 -13.4392,4.2097 -12.9595,4.2192 -12.3993,4.2288 -11.7638,4.2383 -11.0591,4.2478 -10.2918,4.2574 -9.4694,4.2669 -8.5996,4.2764 -7.6908,4.286 -6.7516,4.2955 -5.7909,4.286 -4.8178,4.2764 -3.8418,4.2669 -2.8721,4.2574 -1.9178,4.2478 -0.9882,4.2383 -0.092,4.2288 --0.7622,4.2192 --1.5662,4.2097 --2.3124,4.2001 --2.9937,4.1906 --3.6036,4.1811 --4.1363,4.1715 --4.5867,4.162 --4.9505,4.1525 --5.2242,4.1429 --5.4053,4.1334 --5.492,4.1239 --5.4834,4.1143 --5.3798,4.1048 --5.182,4.0952 --4.8919,4.0857 --4.5123,4.0762 --4.0469,4.0666 --3.5,4.0571 --2.8768,4.0476 --2.1834,4.038 --1.4263,4.0285 --0.6127,4.0189 -0.2496,4.0285 -1.1524,4.038 -2.0871,4.0476 -3.0448,4.0571 -4.0164,4.0666 -4.9925,4.0762 -5.964,4.0857 -6.9215,4.0952 -7.856,4.1048 -8.7585,4.1143 -9.6204,4.1239 -10.4335,4.1334 -11.19,4.1429 -11.8828,4.1525 -12.5053,4.162 -13.0515,4.1715 -13.5162,4.1811 -13.8949,4.1906 -14.1842,4.2001 -14.3811,4.2097 -14.4839,4.2192 -14.4916,4.2288 -14.4041,4.2383 -14.2221,4.2478 -13.9476,4.2574 -13.583,4.2669 -13.1318,4.2764 -12.5984,4.286 -11.9878,4.2955 -11.3059,4.3051 -10.5591,4.3146 -9.7546,4.3241 -8.9,4.3337 -8.0035,4.3432 -7.0736,4.3527 -6.1192,4.3432 -5.1493,4.3337 -4.1732,4.3241 -3.2003,4.3146 -2.2398,4.3051 -1.3008,4.2955 -0.3922,4.286 --0.4771,4.2764 --1.2991,4.2669 --2.0658,4.2574 --2.7699,4.2478 --3.4048,4.2383 --3.9643,4.2288 --4.4432,4.2192 --4.8368,4.2097 --5.1415,4.2001 --5.3543,4.1906 --5.4732,4.1811 --5.497,4.1715 --5.4256,4.162 --5.2596,4.1525 --5.0006,4.1429 --4.6511,4.1334 --4.2144,4.1239 --3.6946,4.1143 --3.0968,4.1048 --2.4265,4.0952 --1.6903,4.0857 --0.8951,4.0762 --0.0484,4.0666 -0.8416,4.0762 -1.7664,4.0666 -2.7173,4.0762 -3.6852,4.0857 -4.6609,4.0952 -5.635,4.1048 -6.5983,4.1143 -7.5416,4.1239 -8.4559,4.1334 -9.3326,4.1429 -10.1631,4.1525 -10.9397,4.162 -11.655,4.1715 -12.3021,4.1811 -12.8748,4.1906 -13.3677,4.2001 -13.7761,4.2097 -14.0961,4.2192 -14.3247,4.2288 -14.4596,4.2383 -14.4997,4.2478 -14.4445,4.2574 -14.2945,4.2669 -14.0511,4.2764 -13.7168,4.286 -13.2946,4.2955 -12.7886,4.3051 -12.2036,4.3146 -11.5453,4.3241 -10.8197,4.3337 -10.034,4.3432 -9.1955,4.3527 -8.3123,4.3623 -7.3928,4.3527 -6.4457,4.3623 -5.48,4.3527 -4.505,4.3432 -3.53,4.3337 -2.5642,4.3241 -1.6169,4.3146 -0.697,4.3051 --0.1866,4.2955 --1.0256,4.286 --1.8119,4.2764 --2.5381,4.2669 --3.1972,4.2574 --3.783,4.2478 --4.2898,4.2383 --4.7128,4.2288 --5.0481,4.2192 --5.2924,4.2097 --5.4434,4.2001 --5.4996,4.1906 --5.4605,4.1811 --5.3266,4.1715 --5.099,4.162 --4.7799,4.1525 --4.3723,4.1429 --3.8803,4.1334 --3.3084,4.1239 --2.662,4.1143 --1.9475,4.1048 --1.1714,4.0952 --0.3414,4.0857 -0.5348,4.0952 -1.4488,4.0857 -2.3918,4.0952 -3.355,4.1048 -4.329,4.1143 -5.3047,4.1239 -6.2727,4.1334 -7.2239,4.1429 -8.149,4.1525 -9.0394,4.162 -9.8866,4.1715 -10.6824,4.1811 -11.4193,4.1906 -12.0902,4.2001 -12.6888,4.2097 -13.2094,4.2192 -13.6471,4.2288 -13.9975,4.2383 -14.2574,4.2478 -14.4244,4.2574 -14.4968,4.2669 -14.4739,4.2764 -14.356,4.286 -14.1441,4.2955 -13.8404,4.3051 -13.4477,4.3146 -12.9697,4.3241 -12.4109,4.3337 -11.7768,4.3432 -11.0734,4.3527 -10.3073,4.3623 -9.4859,4.3718 -8.617,4.3813 -7.7088,4.3863 -6.7701,4.3959 -5.8097,4.3863 -4.8368,4.3768 -3.8608,4.3673 -2.8908,4.3577 -1.9362,4.3482 -1.006,4.3387 -0.109,4.3291 --0.746,4.3196 --1.5511,4.31 --2.2985,4.3005 --2.9811,4.291 --3.5925,4.2814 --4.1267,4.2719 --4.5787,4.2624 --4.9443,4.2528 --5.2198,4.2433 --5.4027,4.2337 --5.4912,4.2242 --5.4845,4.2147 --5.3827,4.2051 --5.1867,4.1956 --4.8984,4.1861 --4.5205,4.1765 --4.0567,4.167 --3.5113,4.1575 --2.8896,4.1479 --2.1975,4.1384 --1.4416,4.1288 --0.629,4.1193 -0.2324,4.122 -1.1345,4.1125 -2.0687,4.122 -3.026,4.1315 -3.9974,4.1411 -4.9736,4.1506 -5.9452,4.1602 -6.9031,4.1697 -7.8381,4.1792 -8.7413,4.1888 -9.604,4.1983 -10.4182,4.2078 -11.1759,4.2174 -11.87,4.2269 -12.4939,4.2364 -13.0416,4.246 -13.5079,4.2555 -13.8884,4.2651 -14.1794,4.2746 -14.3782,4.2841 -14.4828,4.2937 -14.4924,4.3032 -14.4067,4.3127 -14.2266,4.3223 -13.9538,4.3318 -13.5909,4.3414 -13.1414,4.3509 -12.6095,4.3604 -12.0004,4.37 -11.3198,4.3795 -10.5742,4.389 -9.7708,4.3986 -8.9171,4.4081 -8.0213,4.4176 -7.0919,4.4272 -6.1379,4.4176 -5.1683,4.4081 -4.1922,4.3986 -3.2192,4.389 -2.2583,4.3795 -1.3188,4.37 -0.4096,4.3604 --0.4607,4.3509 --1.2836,4.3414 --2.0515,4.3318 --2.7569,4.3223 --3.3931,4.3127 --3.9542,4.3032 --4.4346,4.2937 --4.83,4.2841 --5.1364,4.2746 --5.351,4.2651 --5.4718,4.2555 --5.4975,4.246 --5.4279,4.2364 --5.2638,4.2269 --5.0066,4.2174 --4.6588,4.2078 --4.2237,4.1983 --3.7055,4.1888 --3.1091,4.1792 --2.4402,4.1697 --1.7052,4.1602 --0.911,4.1506 --0.0653,4.1411 -0.8239,4.1506 -1.7482,4.1602 -2.6986,4.1697 -3.6663,4.1792 -4.6419,4.1888 -5.6161,4.1983 -6.5797,4.2078 -7.5235,4.2174 -8.4385,4.2269 -9.3159,4.2364 -10.1475,4.246 -10.9252,4.2555 -11.6417,4.2651 -12.2902,4.2746 -12.8644,4.2841 -13.3589,4.2937 -13.769,4.3032 -14.0908,4.3127 -14.3211,4.3223 -14.4579,4.3318 -14.4998,4.3414 -14.4464,4.3509 -14.2983,4.3604 -14.0567,4.37 -13.7241,4.3795 -13.3036,4.389 -12.7992,4.3986 -12.2157,4.4081 -11.5587,4.4176 -10.8345,4.4272 -10.0498,4.4367 -9.2123,4.4463 -8.3299,4.4558 -7.411,4.4653 -6.4643,4.4664 -5.4989,4.4568 -4.524,4.4473 -3.5489,4.4378 -2.5829,4.4282 -1.6351,4.4187 -0.7146,4.4092 --0.1698,4.3996 --1.0098,4.3901 --1.7972,4.3806 --2.5246,4.371 --3.1851,4.3615 --3.7723,4.3519 --4.2807,4.3424 --4.7054,4.3329 --5.0425,4.3233 --5.2885,4.3138 --5.4414,4.3043 --5.4994,4.2947 --5.4622,4.2852 --5.3301,4.2756 --5.1043,4.2661 --4.7869,4.2566 --4.3811,4.247 --3.8906,4.2375 --3.3202,4.228 --2.6753,4.2184 --1.962,4.2089 --1.1871,4.1994 --0.358,4.1898 -0.5174,4.1994 -1.4307,4.2089 -2.3733,4.2184 -3.3361,4.228 -4.31,4.2375 -5.2858,4.247 -6.254,4.2566 -7.2056,4.2661 -8.1313,4.2756 -9.0225,4.2852 -9.8705,4.2947 -10.6674,4.3043 -11.4055,4.3138 -12.0778,4.3233 -12.6779,4.3329 -13.2001,4.3424 -13.6394,4.3519 -13.9915,4.3615 -14.2533,4.371 -14.422,4.3806 -14.4963,4.3901 -14.4753,4.3996 -14.3592,4.4092 -14.1492,4.4187 -13.8472,4.4282 -13.4561,4.4378 -12.9797,4.4473 -12.4225,4.4568 -11.7899,4.4664 -11.0877,4.4759 -10.3228,4.4855 -9.5024,4.495 -8.6343,4.5045 -7.7268,4.5141 -6.7886,4.5236 -5.8285,4.5141 -4.8558,4.5045 -3.8797,4.495 -2.9096,4.4855 -1.9545,4.4759 -1.0238,4.4664 -0.1261,4.4568 --0.7298,4.4473 --1.536,4.4378 --2.2846,4.4282 --2.9685,4.4187 --3.5813,4.4092 --4.1171,4.3996 --4.5708,4.3901 --4.938,4.3806 --5.2153,4.371 --5.4,4.3615 --5.4904,4.3519 --5.4855,4.3424 --5.3856,4.3329 --5.1914,4.3233 --4.9049,4.3138 --4.5287,4.3043 --4.0665,4.2947 --3.5227,4.2852 --2.9024,4.2756 --2.2116,4.2661 --1.4569,4.2566 --0.6453,4.247 -0.2152,4.2375 -1.1166,4.247 -2.0502,4.2375 -3.0072,4.247 -3.9784,4.2566 -4.9546,4.2661 -5.9264,4.2756 -6.8847,4.2852 -7.8202,4.2947 -8.7241,4.3043 -9.5877,4.3138 -10.4028,4.3233 -11.1617,4.3329 -11.8572,4.3424 -12.4825,4.3519 -13.0317,4.3615 -13.4997,4.371 -13.8819,4.3806 -14.1746,4.3901 -14.3752,4.3996 -14.4817,4.4092 -14.4931,4.4187 -14.4092,4.4282 -14.231,4.4378 -13.9599,4.4473 -13.5988,4.4568 -13.1509,4.4664 -12.6206,4.4759 -12.013,4.4855 -11.3337,4.495 -10.5893,4.5045 -9.7869,4.5141 -8.9341,4.5236 -8.0391,4.5331 -7.1103,4.5427 -6.1566,4.5331 -5.1872,4.5236 -4.2112,4.5141 -3.238,4.5045 -2.2768,4.495 -1.3368,4.4855 -0.4269,4.4759 --0.4442,4.4664 --1.2681,4.4568 --2.0371,4.4473 --2.7438,4.4378 --3.3814,4.4282 --3.944,4.4187 --4.4261,4.4092 --4.8231,4.3996 --5.1313,4.3901 --5.3477,4.3806 --5.4703,4.371 --5.4979,4.3615 --5.4302,4.3519 --5.2678,4.3424 --5.0124,4.3329 --4.6664,4.3233 --4.233,4.3138 --3.7164,4.3043 --3.1214,4.2947 --2.4539,4.2852 --1.7201,4.2756 --0.927,4.2661 --0.0822,4.2566 -0.8063,4.2661 -1.7299,4.2566 -2.68,4.2661 -3.6474,4.2756 -4.6229,4.2852 -5.5972,4.2947 -6.5611,4.3043 -7.5054,4.3138 -8.421,4.3233 -9.2993,4.3329 -10.1318,4.3424 -10.9106,4.3519 -11.6284,4.3615 -12.2782,4.371 -12.854,4.3806 -13.3501,4.3901 -13.7618,4.3996 -14.0854,4.4092 -14.3175,4.4187 -14.4562,4.4282 -14.4999,4.4378 -14.4484,4.4473 -14.302,4.4568 -14.0623,4.4664 -13.7314,4.4759 -13.3126,4.4855 -12.8098,4.495 -12.2278,4.5045 -11.5722,4.5141 -10.8491,4.5236 -10.0656,4.5331 -9.2291,4.5427 -8.3474,4.5522 -7.4291,4.5427 -6.4829,4.5522 -5.5178,4.5427 -4.543,4.5331 -3.5678,4.5236 -2.6015,4.5141 -1.6533,4.5045 -0.7322,4.495 --0.153,4.4855 --0.9939,4.4759 --1.7824,4.4664 --2.5111,4.4568 --3.1729,4.4473 --3.7616,4.4378 --4.2716,4.4282 --4.698,4.4187 --5.0368,4.4092 --5.2846,4.3996 --5.4393,4.3901 --5.4992,4.3806 --5.4638,4.371 --5.3335,4.3615 --5.1095,4.3519 --4.794,4.3424 --4.3898,4.3329 --3.901,4.3233 --3.332,4.3138 --2.6885,4.3043 --1.9765,4.2947 --1.2027,4.2852 --0.3746,4.2756 -0.5,4.2661 -1.4126,4.2566 -2.3547,4.2661 -3.3172,4.2756 -4.2911,4.2852 -5.2668,4.2947 -6.2353,4.3043 -7.1873,4.3138 -8.1136,4.3233 -9.0055,4.3329 -9.8545,4.3424 -10.6525,4.3519 -11.3918,4.3615 -12.0654,4.371 -12.667,4.3806 -13.1907,4.3901 -13.6316,4.3996 -13.9855,4.4092 -14.249,4.4187 -14.4197,4.4282 -14.4957,4.4378 -14.4766,4.4473 -14.3623,4.4568 -14.1541,4.4664 -13.8539,4.4759 -13.4646,4.4855 -12.9898,4.495 -12.4341,4.5045 -11.8028,4.5141 -11.102,4.5236 -10.3382,4.5331 -9.5188,4.5427 -8.6516,4.5522 -7.7448,4.5427 -6.807,4.5522 -5.8473,4.5427 -4.8748,4.5331 -3.8987,4.5236 -2.9283,4.5141 -1.9729,4.5045 -1.0416,4.495 -0.1432,4.4855 --0.7136,4.4759 --1.5208,4.4664 --2.2706,4.4568 --2.9559,4.4473 --3.5701,4.4378 --4.1074,4.4282 --4.5627,4.4187 --4.9317,4.4092 --5.2108,4.3996 --5.3973,4.3901 --5.4895,4.3806 --5.4866,4.371 --5.3884,4.3615 --5.1961,4.3519 --4.9113,4.3424 --4.5369,4.3329 --4.0763,4.3233 --3.534,4.3138 --2.9152,4.3043 --2.2257,4.2947 --1.4721,4.2852 --0.6616,4.2756 -0.1981,4.2661 -1.0987,4.2566 -2.0318,4.2661 -2.9884,4.2756 -3.9594,4.2852 -4.9356,4.2947 -5.9076,4.3043 -6.8662,4.3138 -7.8023,4.3233 -8.7068,4.3329 -9.5713,4.3424 -10.3875,4.3519 -11.1476,4.3615 -11.8443,4.371 -12.471,4.3806 -13.0218,4.3901 -13.4914,4.3996 -13.8753,4.4092 -14.1698,4.4187 -14.3722,4.4282 -14.4806,4.4378 -14.4938,4.4473 -14.4118,4.4568 -14.2353,4.4664 -13.9661,4.4759 -13.6067,4.4855 -13.1605,4.495 -12.6317,4.5045 -12.0255,4.5141 -11.3476,4.5236 -10.6044,4.5331 -9.803,4.5427 -8.9511,4.5522 -8.0568,4.5451 -7.1286,4.5547 -6.1754,4.5451 -5.2062,4.5356 -4.2302,4.5261 -3.2568,4.5165 -2.2953,4.507 -1.3548,4.4975 -0.4443,4.4879 --0.4276,4.4784 --1.2526,4.4689 --2.0227,4.4593 --2.7307,4.4498 --3.3697,4.4402 --3.9338,4.4307 --4.4175,4.4212 --4.8162,4.4116 --5.1262,4.4021 --5.3444,4.3926 --5.4688,4.383 --5.4983,4.3735 --5.4324,4.364 --5.2719,4.3544 --5.0183,4.3449 --4.674,4.3353 --4.2422,4.3258 --3.7272,4.3163 --3.1337,4.3067 --2.4675,4.2972 --1.7349,4.2877 --0.9429,4.2781 --0.0991,4.2686 -0.7886,4.2781 -1.7117,4.2877 -2.6613,4.2972 -3.6284,4.3067 -4.6039,4.3163 -5.5784,4.3258 -6.5425,4.3353 -7.4873,4.3449 -8.4035,4.3544 -9.2826,4.364 -10.1161,4.3735 -10.896,4.383 -11.6151,4.3926 -12.2663,4.4021 -12.8435,4.4116 -13.3412,4.4212 -13.7547,4.4307 -14.0799,4.4402 -14.3139,4.4498 -14.4544,4.4593 -14.5,4.4689 -14.4503,4.4784 -14.3058,4.4879 -14.0678,4.4975 -13.7387,4.507 -13.3216,4.5165 -12.8203,4.5261 -12.2398,4.5356 -11.5856,4.5451 -10.8638,4.5547 -10.0814,4.5642 -9.2458,4.5738 -8.365,4.5833 -7.4473,4.5928 -6.5015,4.5833 -5.5367,4.5738 -4.562,4.5642 -3.5867,4.5547 -2.6202,4.5451 -1.6715,4.5356 -0.7498,4.5261 --0.1362,4.5165 --0.978,4.507 --1.7676,4.4975 --2.4975,4.4879 --3.1607,4.4784 --3.7509,4.4689 --4.2625,4.4593 --4.6905,4.4498 --5.031,4.4402 --5.2807,4.4307 --5.4372,4.4212 --5.4989,4.4116 --5.4654,4.4021 --5.337,4.3926 --5.1148,4.383 --4.8009,4.3735 --4.3985,4.364 --3.9112,4.3544 --3.3438,4.3449 --2.7017,4.3353 --1.9909,4.3258 --1.2183,4.3163 --0.3912,4.3067 -0.4826,4.2972 -1.3946,4.3067 -2.3362,4.2972 -3.2984,4.3067 -4.2721,4.3163 -5.2479,4.3258 -6.2166,4.3353 -7.169,4.3449 -8.0959,4.3544 -8.9886,4.364 -9.8385,4.3735 -10.6375,4.383 -11.378,4.3926 -12.053,4.4021 -12.656,4.4116 -13.1813,4.4212 -13.6239,4.4307 -13.9795,4.4402 -14.2448,4.4498 -14.4172,4.4593 -14.4952,4.4689 -14.4779,4.4784 -14.3655,4.4879 -14.1591,4.4975 -13.8606,4.507 -13.473,4.5165 -12.9998,4.5261 -12.4457,4.5356 -11.8158,4.5451 -11.1162,4.5547 -10.3536,4.5642 -9.5352,4.5738 -8.6688,4.5833 -7.7627,4.5928 -6.8255,4.6024 -5.8662,4.5928 -4.8938,4.5833 -3.9177,4.5738 -2.9471,4.5642 -1.9913,4.5547 -1.0594,4.5451 -0.1603,4.5356 --0.6974,4.5261 --1.5056,4.5165 --2.2566,4.507 --2.9432,4.4975 --3.5589,4.4879 --4.0978,4.4784 --4.5547,4.4689 --4.9254,4.4593 --5.2062,4.4498 --5.3946,4.4402 --5.4886,4.4307 --5.4875,4.4212 --5.3912,4.4116 --5.2007,4.4021 --4.9177,4.3926 --4.545,4.383 --4.0861,4.3735 --3.5453,4.364 --2.9279,4.3544 --2.2397,4.3449 --1.4873,4.3353 --0.6779,4.3258 -0.1809,4.3163 -1.0809,4.3258 -2.0134,4.3163 -2.9697,4.3258 -3.9405,4.3353 -4.9166,4.3449 -5.8888,4.3544 -6.8478,4.364 -7.7843,4.3735 -8.6896,4.383 -9.555,4.3926 -10.3721,4.4021 -11.1334,4.4116 -11.8314,4.4212 -12.4595,4.4307 -13.0118,4.4402 -13.483,4.4498 -13.8686,4.4593 -14.165,4.4689 -14.3692,4.4784 -14.4793,4.4879 -14.4944,4.4975 -14.4143,4.507 -14.2396,4.5165 -13.9722,4.5261 -13.6145,4.5356 -13.1699,4.5451 -12.6428,4.5547 -12.038,4.5642 -11.3614,4.5738 -10.6194,4.5833 -9.8191,4.5928 -8.9681,4.6024 -8.0746,4.6119 -7.1469,4.6214 -6.1941,4.6119 -5.2251,4.6024 -4.2492,4.5928 -3.2757,4.5833 -2.3139,4.5738 -1.3728,4.5642 -0.4616,4.5547 --0.4111,4.5451 --1.237,4.5356 --2.0083,4.5261 --2.7175,4.5165 --3.358,4.507 --3.9236,4.4975 --4.4089,4.4879 --4.8093,4.4784 --5.121,4.4689 --5.3411,4.4593 --5.4673,4.4498 --5.4986,4.4402 --5.4346,4.4307 --5.2759,4.4212 --5.0241,4.4116 --4.6815,4.4021 --4.2514,4.3926 --3.7379,4.383 --3.146,4.3735 --2.4811,4.364 --1.7498,4.3544 --0.9589,4.3449 --0.1159,4.3353 -0.771,4.3449 -1.6934,4.3353 -2.6426,4.3449 -3.6095,4.3544 -4.5849,4.364 -5.5595,4.3735 -6.5239,4.383 -7.4691,4.3926 -8.386,4.4021 -9.2659,4.4116 -10.1003,4.4212 -10.8814,4.4307 -11.6017,4.4402 -12.2543,4.4498 -12.833,4.4593 -13.3323,4.4689 -13.7474,4.4784 -14.0745,4.4879 -14.3102,4.4975 -14.4525,4.507 -14.5,4.5165 -14.4522,4.5261 -14.3095,4.5356 -14.0733,4.5451 -13.746,4.5547 -13.3305,4.5642 -12.8309,4.5738 -12.2519,4.5833 -11.599,4.5928 -10.8784,4.6024 -10.0971,4.6119 -9.2625,4.6214 -8.3825,4.631 -7.4654,4.6214 -6.5202,4.631 -5.5556,4.6214 -4.581,4.6119 -3.6057,4.6024 -2.6388,4.5928 -1.6897,4.5833 -0.7674,4.5738 --0.1194,4.5642 --0.9621,4.5547 --1.7528,4.5451 --2.4839,4.5356 --3.1485,4.5261 --3.7401,4.5165 --4.2533,4.507 --4.683,4.4975 --5.0253,4.4879 --5.2767,4.4784 --5.435,4.4689 --5.4987,4.4593 --5.467,4.4498 --5.3404,4.4402 --5.12,4.4307 --4.8079,4.4212 --4.4071,4.4116 --3.9215,4.4021 --3.3556,4.3926 --2.7149,4.383 --2.0054,4.3735 --1.2339,4.364 --0.4077,4.3544 -0.4652,4.3449 -1.3765,4.3353 -2.3176,4.3449 -3.2795,4.3544 -4.2531,4.364 -5.229,4.3735 -6.1979,4.383 -7.1507,4.3926 -8.0782,4.4021 -8.9716,4.4116 -9.8224,4.4212 -10.6225,4.4307 -11.3642,4.4402 -12.0405,4.4498 -12.645,4.4593 -13.1719,4.4689 -13.6161,4.4784 -13.9734,4.4879 -14.2405,4.4975 -14.4148,4.507 -14.4946,4.5165 -14.4791,4.5261 -14.3685,4.5356 -14.164,4.5451 -13.8673,4.5547 -13.4813,4.5642 -13.0098,4.5738 -12.4572,4.5833 -11.8288,4.5928 -11.1305,4.6024 -10.369,4.6119 -9.5516,4.6214 -8.6861,4.631 -7.7807,4.6214 -6.844,4.631 -5.885,4.6214 -4.9128,4.6119 -3.9366,4.6024 -2.9658,4.5928 -2.0097,4.5833 -1.0773,4.5738 -0.1774,4.5642 --0.6812,4.5547 --1.4904,4.5451 --2.2426,4.5356 --2.9305,4.5261 --3.5476,4.5165 --4.088,4.507 --4.5466,4.4975 --4.919,4.4879 --5.2016,4.4784 --5.3918,4.4689 --5.4877,4.4593 --5.4884,4.4498 --5.394,4.4402 --5.2053,4.4307 --4.9241,4.4212 --4.5531,4.4116 --4.0958,4.4021 --3.5566,4.3926 --2.9406,4.383 --2.2538,4.3735 --1.5025,4.364 --0.6941,4.3544 -0.1638,4.3449 -1.063,4.3353 -1.995,4.3258 -2.9509,4.3353 -3.9215,4.3449 -4.8976,4.3544 -5.87,4.364 -6.8293,4.3735 -7.7664,4.383 -8.6723,4.3926 -9.5386,4.4021 -10.3568,4.4116 -11.1191,4.4212 -11.8184,4.4307 -12.448,4.4402 -13.0019,4.4498 -13.4747,4.4593 -13.862,4.4689 -14.1601,4.4784 -14.3661,4.4879 -14.4781,4.4975 -14.495,4.507 -14.4167,4.5165 -14.2439,4.5261 -13.9783,4.5356 -13.6223,4.5451 -13.1794,4.5547 -12.6538,4.5642 -12.0505,4.5738 -11.3752,4.5833 -10.6344,4.5928 -9.8352,4.6024 -8.9851,4.6119 -8.0923,4.6024 -7.1653,4.6119 -6.2128,4.6024 -5.244,4.5928 -4.2682,4.5833 -3.2946,4.5738 -2.3324,4.5642 -1.3909,4.5547 -0.479,4.5451 --0.3945,4.5356 --1.2215,4.5261 --1.9939,4.5165 --2.7044,4.507 --3.3462,4.4975 --3.9133,4.4879 --4.4003,4.4784 --4.8024,4.4689 --5.1158,4.4593 --5.3377,4.4498 --5.4658,4.4402 --5.4989,4.4307 --5.4367,4.4212 --5.2799,4.4116 --5.0299,4.4021 --4.689,4.3926 --4.2606,4.383 --3.7487,4.3735 --3.1582,4.364 --2.4947,4.3544 --1.7646,4.3449 --0.9748,4.3353 --0.1328,4.3258 -0.7534,4.3353 -1.6752,4.3449 -2.624,4.3544 -3.5906,4.364 -4.5659,4.3735 -5.5406,4.383 -6.5053,4.3926 -7.451,4.4021 -8.3685,4.4116 -9.2492,4.4212 -10.0846,4.4307 -10.8668,4.4402 -11.5883,4.4498 -12.2423,4.4593 -12.8225,4.4689 -13.3234,4.4784 -13.7402,4.4879 -14.069,4.4975 -14.3065,4.507 -14.4507,4.5165 -14.5,4.5261 -14.454,4.5356 -14.3132,4.5451 -14.0788,4.5547 -13.7532,4.5642 -13.3394,4.5738 -12.8414,4.5833 -12.2638,4.5928 -11.6123,4.6024 -10.8931,4.6119 -10.1129,4.6214 -9.2792,4.631 -8.4,4.6405 -7.4836,4.6501 -6.5388,4.6405 -5.5745,4.631 -4.6,4.6214 -3.6246,4.6119 -2.6575,4.6024 -1.708,4.5928 -0.785,4.5833 --0.1025,4.5738 --0.9462,4.5642 --1.738,4.5547 --2.4703,4.5451 --3.1362,4.5356 --3.7294,4.5261 --4.2441,4.5165 --4.6755,4.507 --5.0195,4.4975 --5.2727,4.4879 --5.4328,4.4784 --5.4983,4.4689 --5.4685,4.4593 --5.3437,4.4498 --5.1251,4.4402 --4.8148,4.4307 --4.4158,4.4212 --3.9317,4.4116 --3.3673,4.4021 --2.728,4.3926 --2.0198,4.383 --1.2494,4.3735 --0.4243,4.364 -0.4478,4.3544 -1.3585,4.364 -2.2991,4.3544 -3.2607,4.364 -4.2341,4.3735 -5.21,4.383 -6.1792,4.3926 -7.1323,4.4021 -8.0604,4.4116 -8.9546,4.4212 -9.8063,4.4307 -10.6074,4.4402 -11.3504,4.4498 -12.028,4.4593 -12.634,4.4689 -13.1624,4.4784 -13.6083,4.4879 -13.9673,4.4975 -14.2362,4.507 -14.4123,4.5165 -14.4939,4.5261 -14.4803,4.5356 -14.3716,4.5451 -14.1688,4.5547 -13.8739,4.5642 -13.4897,4.5738 -13.0198,4.5833 -12.4687,4.5928 -11.8417,4.6024 -11.1447,4.6119 -10.3844,4.6214 -9.568,4.631 -8.7033,4.6405 -7.7986,4.6501 -6.8625,4.6405 -5.9038,4.631 -4.9317,4.6214 -3.9556,4.6119 -2.9846,4.6024 -2.0281,4.5928 -1.0951,4.5833 -0.1946,4.5738 --0.6649,4.5642 --1.4752,4.5547 --2.2286,4.5451 --2.9178,4.5356 --3.5363,4.5261 --4.0783,4.5165 --4.5385,4.507 --4.9126,4.4975 --5.197,4.4879 --5.389,4.4784 --5.4867,4.4689 --5.4893,4.4593 --5.3967,4.4498 --5.2098,4.4402 --4.9304,4.4307 --4.5611,4.4212 --4.1055,4.4116 --3.5678,4.4021 --2.9533,4.3926 --2.2678,4.383 --1.5177,4.3735 --0.7103,4.364 -0.1467,4.3544 -1.0452,4.364 -1.9766,4.3544 -2.9321,4.364 -3.9025,4.3735 -4.8787,4.383 -5.8512,4.3926 -6.8108,4.4021 -7.7484,4.4116 -8.6551,4.4212 -9.5221,4.4307 -10.3413,4.4402 -11.1049,4.4498 -11.8055,4.4593 -12.4365,4.4689 -12.9918,4.4784 -13.4663,4.4879 -13.8553,4.4975 -14.1551,4.507 -14.363,4.5165 -14.4768,4.5261 -14.4956,4.5356 -14.4192,4.5451 -14.2482,4.5547 -13.9843,4.5642 -13.6301,4.5738 -13.1888,4.5833 -12.6648,4.5928 -12.0629,4.6024 -11.389,4.6119 -10.6494,4.6214 -9.8512,4.631 -9.0021,4.6405 -8.11,4.6501 -7.1836,4.6596 -6.2315,4.6501 -5.263,4.6405 -4.2872,4.631 -3.3134,4.6214 -2.3509,4.6119 -1.409,4.6024 -0.4964,4.5928 --0.378,4.5833 --1.2059,4.5738 --1.9794,4.5642 --2.6912,4.5547 --3.3344,4.5451 --3.903,4.5356 --4.3916,4.5261 --4.7954,4.5165 --5.1106,4.507 --5.3342,4.4975 --5.4642,4.4879 --5.4992,4.4784 --5.4389,4.4689 --5.2838,4.4593 --5.0356,4.4498 --4.6965,4.4402 --4.2697,4.4307 --3.7594,4.4212 --3.1704,4.4116 --2.5083,4.4021 --1.7794,4.3926 --0.9907,4.383 --0.1496,4.3735 -0.7357,4.364 -1.657,4.3544 -2.6053,4.364 -3.5717,4.3735 -4.5469,4.383 -5.5217,4.3926 -6.4867,4.4021 -7.4328,4.4116 -8.351,4.4212 -9.2325,4.4307 -10.0688,4.4402 -10.8521,4.4498 -11.5749,4.4593 -12.2303,4.4689 -12.8119,4.4784 -13.3144,4.4879 -13.7329,4.4975 -14.0634,4.507 -14.3028,4.5165 -14.4488,4.5261 -14.4999,4.5356 -14.4558,4.5451 -14.3168,4.5547 -14.0843,4.5642 -13.7604,4.5738 -13.3483,4.5833 -12.8518,4.5928 -12.2758,4.6024 -11.6257,4.6119 -10.9077,4.6214 -10.1286,4.631 -9.2959,4.6405 -8.4175,4.6501 -7.5017,4.6405 -6.5574,4.6501 -5.5934,4.6405 -4.619,4.631 -3.6435,4.6214 -2.6762,4.6119 -1.7262,4.6024 -0.8027,4.5928 --0.0856,4.5833 --0.9302,4.5738 --1.7231,4.5642 --2.4567,4.5547 --3.1239,4.5451 --3.7186,4.5356 --4.2349,4.5261 --4.6679,4.5165 --5.0136,4.507 --5.2687,4.4975 --5.4306,4.4879 --5.498,4.4784 --5.47,4.4689 --5.3471,4.4593 --5.1303,4.4498 --4.8217,4.4402 --4.4244,4.4307 --3.9419,4.4212 --3.3791,4.4116 --2.7411,4.4021 --2.0342,4.3926 --1.2649,4.383 --0.4408,4.3735 -0.4304,4.364 -1.3404,4.3544 -2.2806,4.364 -3.2418,4.3735 -4.2151,4.383 -5.1911,4.3926 -6.1604,4.4021 -7.114,4.4116 -8.0427,4.4212 -8.9376,4.4307 -9.7902,4.4402 -10.5924,4.4498 -11.3365,4.4593 -12.0155,4.4689 -12.6229,4.4784 -13.1529,4.4879 -13.6004,4.4975 -13.9612,4.507 -14.2318,4.5165 -14.4098,4.5261 -14.4932,4.5356 -14.4815,4.5451 -14.3746,4.5547 -14.1737,4.5642 -13.8805,4.5738 -13.498,4.5833 -13.0297,4.5928 -12.4801,4.6024 -11.8545,4.6119 -11.1589,4.6214 -10.3997,4.631 -9.5844,4.6405 -8.7206,4.6501 -7.8165,4.6405 -6.8809,4.6501 -5.9226,4.6405 -4.9507,4.631 -3.9746,4.6214 -3.0034,4.6119 -2.0465,4.6024 -1.113,4.5928 -0.2117,4.5833 --0.6486,4.5738 --1.46,4.5642 --2.2145,4.5547 --2.905,4.5451 --3.525,4.5356 --4.0685,4.5261 --4.5304,4.5165 --4.9062,4.507 --5.1923,4.4975 --5.3862,4.4879 --5.4858,4.4784 --5.4902,4.4689 --5.3995,4.4593 --5.2144,4.4498 --4.9367,4.4402 --4.5691,4.4307 --4.1151,4.4212 --3.579,4.4116 --2.966,4.4021 --2.2817,4.3926 --1.5329,4.383 --0.7265,4.3735 -0.1296,4.364 -1.0274,4.3544 -1.9583,4.3449 -2.9134,4.3544 -3.8836,4.364 -4.8597,4.3735 -5.8323,4.383 -6.7923,4.3926 -7.7304,4.4021 -8.6378,4.4116 -9.5057,4.4212 -10.3259,4.4307 -11.0906,4.4402 -11.7925,4.4498 -12.4249,4.4593 -12.9818,4.4689 -13.4579,4.4784 -13.8486,4.4879 -14.1502,4.4975 -14.3598,4.507 -14.4755,4.5165 -14.4962,4.5261 -14.4216,4.5356 -14.2524,4.5451 -13.9903,4.5547 -13.6378,4.5642 -13.1982,4.5738 -12.6757,4.5833 -12.0753,4.5928 -11.4027,4.6024 -10.6644,4.6119 -9.8673,4.6214 -9.019,4.631 -8.1277,4.6214 -7.2019,4.631 -6.2502,4.6214 -5.2819,4.6119 -4.3062,4.6024 -3.3323,4.5928 -2.3695,4.5833 -1.427,4.5738 -0.5138,4.5642 --0.3614,4.5547 --1.1903,4.5451 --1.9649,4.5356 --2.678,4.5261 --3.3226,4.5165 --3.8927,4.507 --4.3829,4.4975 --4.7884,4.4879 --5.1053,4.4784 --5.3308,4.4689 --5.4626,4.4593 --5.4994,4.4498 --5.4409,4.4402 --5.2878,4.4307 --5.0413,4.4212 --4.7039,4.4116 --4.2789,4.4021 --3.7701,4.3926 --3.1826,4.383 --2.5218,4.3735 --1.7942,4.364 --1.0065,4.3544 --0.1664,4.3449 -0.7182,4.3544 -1.6388,4.364 -2.5867,4.3552 -3.5528,4.3648 -4.5279,4.3743 -5.5028,4.3838 -6.4681,4.3934 -7.4147,4.4029 -8.3335,4.4124 -9.2157,4.422 -10.053,4.4315 -10.8374,4.4411 -11.5615,4.4506 -12.2182,4.4601 -12.8014,4.4697 -13.3054,4.4792 -13.7256,4.4887 -14.0579,4.4983 -14.299,4.5078 -14.4468,4.5173 -14.4998,4.5269 -14.4576,4.5364 -14.3204,4.546 -14.0897,4.5555 -13.7675,4.565 -13.3571,4.5746 -12.8623,4.5841 -12.2877,4.5936 -11.639,4.6032 -10.9222,4.6127 -10.1443,4.6223 -9.3125,4.6318 -8.4349,4.6413 -7.5198,4.6509 -6.5759,4.6413 -5.6123,4.6318 -4.638,4.6223 -3.6624,4.6127 -2.6948,4.6032 -1.7445,4.5936 -0.8203,4.5841 --0.0688,4.5746 --0.9143,4.565 --1.7082,4.5555 --2.443,4.546 --3.1116,4.5364 --3.7077,4.5269 --4.2256,4.5173 --4.6603,4.5078 --5.0078,4.4983 --5.2646,4.4887 --5.4284,4.4792 --5.4976,4.4697 --5.4715,4.4601 --5.3504,4.4506 --5.1354,4.4411 --4.8286,4.4315 --4.4329,4.422 --3.9521,4.4124 --3.3907,4.4029 --2.7542,4.3934 --2.0485,4.3838 --1.2805,4.3743 --0.4573,4.3648 -0.4131,4.3552 -1.3224,4.3648 -2.262,4.3552 -3.223,4.3648 -4.1961,4.3743 -5.1721,4.3838 -6.1417,4.3934 -7.0957,4.4029 -8.0249,4.4124 -8.9205,4.422 -9.774,4.4315 -10.5773,4.4411 -11.3226,4.4506 -12.003,4.4601 -12.6118,4.4697 -13.1433,4.4792 -13.5925,4.4887 -13.955,4.4983 -14.2275,4.5078 -14.4072,4.5173 -14.4925,4.5269 -14.4826,4.5364 -14.3776,4.546 -14.1785,4.5555 -13.8871,4.565 -13.5063,4.5746 -13.0396,4.5841 -12.4916,4.5936 -11.8674,4.6032 -11.173,4.6127 -10.4151,4.6223 -9.6007,4.6318 -8.7378,4.6413 -7.8345,4.6509 -6.8994,4.6497 -5.9414,4.6402 -4.9697,4.6306 -3.9935,4.6211 -3.0222,4.6115 -2.0649,4.602 -1.1309,4.5925 -0.2289,4.5829 --0.6324,4.5734 --1.4447,4.5639 --2.2004,4.5543 --2.8922,4.5448 --3.5137,4.5353 --4.0587,4.5257 --4.5222,4.5162 --4.8997,4.5066 --5.1876,4.4971 --5.3833,4.4876 --5.4847,4.478 --5.491,4.4685 --5.4021,4.459 --5.2189,4.4494 --4.943,4.4399 --4.5771,4.4303 --4.1248,4.4208 --3.5902,4.4113 --2.9786,4.4017 --2.2957,4.3922 --1.548,4.3827 --0.7427,4.3731 -0.1125,4.3636 -1.0096,4.3731 -1.9399,4.3636 -2.8946,4.3731 -3.8646,4.3827 -4.8407,4.3922 -5.8135,4.4017 -6.7738,4.4113 -7.7125,4.4208 -8.6205,4.4303 -9.4892,4.4399 -10.3105,4.4494 -11.0763,4.459 -11.7795,4.4685 -12.4133,4.478 -12.9717,4.4876 -13.4494,4.4971 -13.8418,4.5066 -14.1452,4.5162 -14.3566,4.5257 -14.4742,4.5353 -14.4967,4.5448 -14.4239,4.5543 -14.2566,4.5639 -13.9963,4.5734 -13.6455,4.5829 -13.2075,4.5925 -12.6866,4.602 -12.0877,4.6115 -11.4165,4.6211 -10.6793,4.6306 -9.8833,4.6402 -9.036,4.6497 -8.1454,4.6592 -7.2201,4.6688 -6.2689,4.6592 -5.3009,4.6497 -4.3252,4.6402 -3.3511,4.6306 -2.3881,4.6211 -1.4451,4.6115 -0.5313,4.602 --0.3448,4.5925 --1.1746,4.5829 --1.9504,4.5734 --2.6647,4.5639 --3.3108,4.5543 --3.8824,4.5448 --4.3741,4.5353 --4.7813,4.5257 --5.1,4.5162 --5.3273,4.5066 --5.4609,4.4971 --5.4996,4.4876 --5.443,4.478 --5.2916,4.4685 --5.047,4.459 --4.7113,4.4494 --4.2879,4.4399 --3.7808,4.4303 --3.1947,4.4208 --2.5353,4.4113 --1.8089,4.4017 --1.0224,4.3922 --0.1832,4.3827 -0.7006,4.3731 -1.6206,4.3636 -2.568,4.3731 -3.5339,4.3827 -4.5089,4.3922 -5.4839,4.4017 -6.4495,4.4113 -7.3965,4.4208 -8.3159,4.4303 -9.199,4.4399 -10.0372,4.4494 -10.8227,4.459 -11.548,4.4685 -12.2061,4.478 -12.7908,4.4876 -13.2964,4.4971 -13.7183,4.5066 -14.0523,4.5162 -14.2952,4.5257 -14.4449,4.5353 -14.4997,4.5448 -14.4593,4.5543 -14.324,4.5639 -14.095,4.5734 -13.7747,4.5829 -13.3659,4.5925 -12.8727,4.602 -12.2996,4.6115 -11.6523,4.6211 -10.9368,4.6306 -10.1599,4.6402 -9.3292,4.6497 -8.4524,4.6592 -7.5379,4.6497 -6.5945,4.6592 -5.6312,4.6497 -4.657,4.6402 -3.6814,4.6306 -2.7135,4.6211 -1.7627,4.6115 -0.838,4.602 --0.0518,4.5925 --0.8983,4.5829 --1.6933,4.5734 --2.4293,4.5639 --3.0993,4.5543 --3.6968,4.5448 --4.2163,4.5353 --4.6527,4.5257 --5.0019,4.5162 --5.2605,4.5066 --5.4261,4.4971 --5.4971,4.4876 --5.4729,4.478 --5.3536,4.4685 --5.1404,4.459 --4.8354,4.4494 --4.4414,4.4399 --3.9622,4.4303 --3.4024,4.4208 --2.7673,4.4113 --2.0629,4.4017 --1.296,4.3922 --0.4738,4.3827 -0.3958,4.3731 -1.3044,4.3636 -2.2435,4.3731 -3.2041,4.3827 -4.1771,4.3922 -5.1532,4.4017 -6.123,4.4113 -7.0773,4.4208 -8.0071,4.4303 -8.9035,4.4399 -9.7579,4.4494 -10.5622,4.459 -11.3087,4.4685 -11.9904,4.478 -12.6007,4.4876 -13.1338,4.4971 -13.5846,4.5066 -13.9488,4.5162 -14.223,4.5257 -14.4046,4.5353 -14.4918,4.5448 -14.4837,4.5543 -14.3805,4.5639 -14.1832,4.5734 -13.8936,4.5829 -13.5145,4.5925 -13.0495,4.602 -12.503,4.6115 -11.8802,4.6211 -11.1872,4.6306 -10.4304,4.6402 -9.6171,4.6497 -8.755,4.6592 -7.8524,4.6497 -6.9178,4.6592 -5.9602,4.6497 -4.9887,4.6402 -4.0125,4.6306 -3.041,4.6211 -2.0833,4.6115 -1.1487,4.602 -0.2461,4.5925 --0.616,4.5829 --1.4294,4.5734 --2.1863,4.5639 --2.8794,4.5543 --3.5023,4.5448 --4.0489,4.5353 --4.514,4.5257 --4.8932,4.5162 --5.1829,4.5066 --5.3804,4.4971 --5.4837,4.4876 --5.4918,4.478 --5.4048,4.4685 --5.2233,4.459 --4.9492,4.4494 --4.5851,4.4399 --4.1344,4.4303 --3.6014,4.4208 --2.9912,4.4113 --2.3096,4.4017 --1.5631,4.3922 --0.7589,4.3827 -0.0955,4.3731 -0.9918,4.3636 -1.9215,4.3541 -2.8759,4.3636 -3.8457,4.3731 -4.8217,4.3827 -5.7947,4.3922 -6.7553,4.4017 -7.6945,4.4113 -8.6032,4.4208 -9.4728,4.4303 -10.295,4.4399 -11.062,4.4494 -11.7665,4.459 -12.4017,4.4685 -12.9616,4.478 -13.4409,4.4876 -13.835,4.4971 -14.1401,4.5066 -14.3534,4.5162 -14.4728,4.5257 -14.4971,4.5353 -14.4262,4.5448 -14.2607,4.5543 -14.0022,4.5639 -13.6532,4.5734 -13.2169,4.5829 -12.6975,4.5925 -12.1001,4.602 -11.4302,4.6115 -10.6942,4.6211 -9.8993,4.6306 -9.0529,4.6402 -8.1631,4.6306 -7.2384,4.6402 -6.2876,4.6306 -5.3198,4.6211 -4.3442,4.6115 -3.37,4.602 -2.4066,4.5925 -1.4632,4.5829 -0.5487,4.5734 --0.3281,4.5639 --1.159,4.5543 --1.9359,4.5448 --2.6515,4.5353 --3.2989,4.5257 --3.872,4.5162 --4.3654,4.5066 --4.7742,4.4971 --5.0947,4.4876 --5.3238,4.478 --5.4592,4.4685 --5.4997,4.459 --5.445,4.4494 --5.2955,4.4399 --5.0526,4.4303 --4.7187,4.4208 --4.297,4.4113 --3.7914,4.4017 --3.2068,4.3922 --2.5488,4.3827 --1.8237,4.3731 --1.0382,4.3636 --0.2,4.3541 -0.683,4.3475 -1.6024,4.357 -2.5494,4.3475 -3.5149,4.357 -4.4899,4.3666 -5.465,4.3761 -6.4308,4.3856 -7.3783,4.3952 -8.2983,4.4047 -9.1822,4.4142 -10.0214,4.4238 -10.808,4.4333 -11.5345,4.4429 -12.194,4.4524 -12.7801,4.4619 -13.2874,4.4715 -13.7109,4.481 -14.0466,4.4905 -14.2914,4.5001 -14.4429,4.5096 -14.4996,4.5192 -14.461,4.5287 -14.3275,4.5382 -14.1004,4.5478 -13.7817,4.5573 -13.3747,4.5668 -12.883,4.5764 -12.3115,4.5859 -11.6656,4.5954 -10.9513,4.605 -10.1756,4.6145 -9.3458,4.6241 -8.4698,4.6336 -7.556,4.6431 -6.6131,4.6336 -5.65,4.6241 -4.676,4.6145 -3.7003,4.605 -2.7322,4.5954 -1.781,4.5859 -0.8557,4.5764 --0.0349,4.5668 --0.8823,4.5573 --1.6784,4.5478 --2.4156,4.5382 --3.0869,4.5287 --3.686,4.5192 --4.207,4.5096 --4.645,4.5001 --4.9959,4.4905 --5.2563,4.481 --5.4238,4.4715 --5.4966,4.4619 --5.4743,4.4524 --5.3568,4.4429 --5.1455,4.4333 --4.8422,4.4238 --4.4499,4.4142 --3.9723,4.4047 --3.414,4.3952 --2.7803,4.3856 --2.0772,4.3761 --1.3114,4.3666 --0.4903,4.357 -0.3784,4.3475 -1.2864,4.357 -2.225,4.3475 -3.1853,4.357 -4.1581,4.3666 -5.1342,4.3761 -6.1042,4.3856 -7.059,4.3952 -7.9893,4.4047 -8.8864,4.4142 -9.7417,4.4238 -10.5471,4.4333 -11.2948,4.4429 -11.9778,4.4524 -12.5895,4.4619 -13.1242,4.4715 -13.5766,4.481 -13.9426,4.4905 -14.2186,4.5001 -14.402,4.5096 -14.491,4.5192 -14.4848,4.5287 -14.3835,4.5382 -14.1879,4.5478 -13.9001,4.5573 -13.5227,4.5668 -13.0593,4.5764 -12.5144,4.5859 -11.893,4.5954 -11.2013,4.605 -10.4456,4.6145 -9.6334,4.6241 -8.7722,4.6336 -7.8703,4.6431 -6.9362,4.6527 -5.979,4.6431 -5.0076,4.6336 -4.0315,4.6241 -3.0598,4.6145 -2.1018,4.605 -1.1667,4.5954 -0.2633,4.5859 --0.5997,4.5764 --1.4141,4.5668 --2.1721,4.5573 --2.8666,4.5478 --3.4909,4.5382 --4.039,4.5287 --4.5057,4.5192 --4.8867,4.5096 --5.1782,4.5001 --5.3774,4.4905 --5.4826,4.481 --5.4926,4.4715 --5.4074,4.4619 --5.2277,4.4524 --4.9554,4.4429 --4.593,4.4333 --4.1439,4.4238 --3.6125,4.4142 --3.0038,4.4047 --2.3235,4.3952 --1.5782,4.3856 --0.775,4.3761 -0.0784,4.3666 -0.974,4.3761 -1.9032,4.3666 -2.8571,4.3761 -3.8267,4.3856 -4.8027,4.3952 -5.7758,4.4047 -6.7368,4.4142 -7.6765,4.4238 -8.5858,4.4333 -9.4563,4.4429 -10.2795,4.4524 -11.0476,4.4619 -11.7534,4.4715 -12.39,4.481 -12.9515,4.4905 -13.4324,4.5001 -13.8282,4.5096 -14.1351,4.5192 -14.3502,4.5287 -14.4714,4.5382 -14.4976,4.5478 -14.4285,4.5573 -14.2648,4.5668 -14.0081,4.5764 -13.6608,4.5859 -13.2262,4.5954 -12.7084,4.605 -12.1124,4.6145 -11.4439,4.6241 -10.7092,4.6336 -9.9153,4.6431 -9.0698,4.6527 -8.1808,4.6622 -7.2567,4.6717 -6.3063,4.6622 -5.3387,4.6527 -4.3632,4.6431 -3.3889,4.6336 -2.4252,4.6241 -1.4813,4.6145 -0.5662,4.605 --0.3115,4.5954 --1.1433,4.5859 --1.9213,4.5764 --2.6382,4.5668 --3.287,4.5573 --3.8616,4.5478 --4.3566,4.5382 --4.7671,4.5287 --5.0893,4.5192 --5.3202,4.5096 --5.4575,4.5001 --5.4999,4.4905 --5.447,4.481 --5.2993,4.4715 --5.0582,4.4619 --4.7261,4.4524 --4.306,4.4429 --3.802,4.4333 --3.2189,4.4238 --2.5623,4.4142 --1.8384,4.4047 --1.054,4.3952 --0.2168,4.3856 -0.6655,4.3761 -1.5842,4.3666 -2.5307,4.3761 -3.496,4.3856 -4.4709,4.3952 -5.4461,4.4047 -6.4122,4.4142 -7.3601,4.4238 -8.2808,4.4333 -9.1654,4.4429 -10.0056,4.4524 -10.7933,4.4619 -11.521,4.4715 -12.1818,4.481 -12.7695,4.4905 -13.2783,4.5001 -13.7035,4.5096 -14.0409,4.5192 -14.2875,4.5287 -14.4408,4.5382 -14.4994,4.5478 -14.4627,4.5573 -14.331,4.5668 -14.1057,4.5764 -13.7888,4.5859 -13.3834,4.5954 -12.8934,4.605 -12.3234,4.6145 -11.6788,4.6241 -10.9658,4.6336 -10.1912,4.6431 -9.3624,4.6527 -8.4872,4.6622 -7.5741,4.6527 -6.6317,4.6622 -5.6689,4.6527 -4.695,4.6431 -3.7192,4.6336 -2.7509,4.6241 -1.7993,4.6145 -0.8734,4.605 --0.018,4.5954 --0.8663,4.5859 --1.6634,4.5764 --2.4019,4.5668 --3.0745,4.5573 --3.675,4.5478 --4.1976,4.5382 --4.6373,4.5287 --4.9899,4.5192 --5.2521,4.5096 --5.4214,4.5001 --5.4961,4.4905 --5.4756,4.481 --5.36,4.4715 --5.1505,4.4619 --4.849,4.4524 --4.4584,4.4429 --3.9824,4.4333 --3.4256,4.4238 --2.7933,4.4142 --2.0915,4.4047 --1.3269,4.3952 --0.5067,4.3856 -0.3611,4.3761 -1.2684,4.3666 -2.2065,4.3761 -3.1665,4.3856 -4.1391,4.3952 -5.1152,4.4047 -6.0855,4.4142 -7.0406,4.4238 -7.9715,4.4333 -8.8693,4.4429 -9.7255,4.4524 -10.5319,4.4619 -11.2809,4.4715 -11.9652,4.481 -12.5783,4.4905 -13.1145,4.5001 -13.5686,4.5096 -13.9363,4.5192 -14.2141,4.5287 -14.3993,4.5382 -14.4901,4.5478 -14.4858,4.5573 -14.3863,4.5668 -14.1926,4.5764 -13.9066,4.5859 -13.5309,4.5954 -13.0691,4.605 -12.5257,4.6145 -11.9058,4.6241 -11.2154,4.6336 -10.4609,4.6431 -9.6497,4.6527 -8.7893,4.6622 -7.8881,4.6527 -6.9546,4.6622 -5.9978,4.6527 -5.0266,4.6431 -4.0505,4.6336 -3.0786,4.6241 -2.1202,4.6145 -1.1846,4.605 -0.2805,4.5954 --0.5834,4.5859 --1.3988,4.5764 --2.158,4.5668 --2.8537,4.5573 --3.4794,4.5478 --4.0291,4.5382 --4.4975,4.5287 --4.8801,4.5192 --5.1734,4.5096 --5.3744,4.5001 --5.4814,4.4905 --5.4933,4.481 --5.4099,4.4715 --5.2321,4.4619 --4.9616,4.4524 --4.6009,4.4429 --4.1535,4.4333 --3.6236,4.4238 --3.0163,4.4142 --2.3374,4.4047 --1.5933,4.3952 --0.7912,4.3856 -0.0614,4.3761 -0.9562,4.3666 -1.8848,4.357 -2.8384,4.3666 -3.8078,4.3761 -4.7837,4.3856 -5.757,4.3952 -6.7183,4.4047 -7.6584,4.4142 -8.5685,4.4238 -9.4398,4.4333 -10.264,4.4429 -11.0333,4.4524 -11.7403,4.4619 -12.3783,4.4715 -12.9413,4.481 -13.4238,4.4905 -13.8213,4.5001 -14.13,4.5096 -14.3469,4.5192 -14.4699,4.5287 -14.498,4.5382 -14.4308,4.5478 -14.2689,4.5573 -14.014,4.5668 -13.6684,4.5764 -13.2354,4.5859 -12.7192,4.5954 -12.1247,4.605 -11.4575,4.6145 -10.724,4.6241 -9.9312,4.6336 -9.0867,4.6431 -8.1984,4.6336 -7.2749,4.6431 -6.325,4.6336 -5.3577,4.6241 -4.3822,4.6145 -3.4078,4.605 -2.4438,4.5954 -1.4994,4.5859 -0.5836,4.5764 --0.2948,4.5668 --1.1276,4.5573 --1.9068,4.5478 --2.6249,4.5382 --3.2751,4.5287 --3.8512,4.5192 --4.3477,4.5096 --4.7599,4.5001 --5.0839,4.4905 --5.3166,4.481 --5.4557,4.4715 --5.4999,4.4619 --5.4489,4.4524 --5.303,4.4429 --5.0638,4.4333 --4.7334,4.4238 --4.315,4.4142 --3.8126,4.4047 --3.231,4.3952 --2.5757,4.3856 --1.853,4.3761 --1.0698,4.3666 --0.2335,4.357 -0.6479,4.3475 -1.566,4.357 -2.5121,4.3475 -3.4771,4.357 -4.4519,4.3666 -5.4271,4.3761 -6.3935,4.3856 -7.3419,4.3952 -8.2632,4.4047 -9.1486,4.4142 -9.9897,4.4238 -10.7785,4.4333 -11.5075,4.4429 -12.1697,4.4524 -12.7588,4.4619 -13.2692,4.4715 -13.696,4.481 -14.0352,4.4905 -14.2836,4.5001 -14.4387,4.5096 -14.4991,4.5192 -14.4643,4.5287 -14.3345,4.5382 -14.1109,4.5478 -13.7958,4.5573 -13.3921,4.5668 -12.9037,4.5764 -12.3352,4.5859 -11.692,4.5954 -10.9803,4.605 -10.2068,4.6145 -9.379,4.6241 -8.5047,4.6336 -7.5922,4.6431 -6.6502,4.6336 -5.6878,4.6241 -4.714,4.6145 -3.7382,4.605 -2.7696,4.5954 -1.8176,4.5859 -0.8911,4.5764 --0.001,4.5668 --0.8502,4.5573 --1.6485,4.5478 --2.3881,4.5382 --3.0621,4.5287 --3.6641,4.5192 --4.1882,4.5096 --4.6296,4.5001 --4.9839,4.4905 --5.2479,4.481 --5.419,4.4715 --5.4956,4.4619 --5.4769,4.4524 --5.3632,4.4429 --5.1554,4.4333 --4.8557,4.4238 --4.4668,4.4142 --3.9925,4.4047 --3.4372,4.3952 --2.8063,4.3856 --2.1058,4.3761 --1.3423,4.3666 --0.5232,4.357 -0.3439,4.3475 -1.2505,4.357 -2.188,4.3475 -3.1477,4.357 -4.1202,4.3666 -5.0963,4.3761 -6.0667,4.3856 -7.0222,4.3952 -7.9537,4.4047 -8.8522,4.4142 -9.7093,4.4238 -10.5168,4.4333 -11.2669,4.4429 -11.9525,4.4524 -12.5671,4.4619 -13.1049,4.4715 -13.5606,4.481 -13.93,4.4905 -14.2096,4.5001 -14.3966,4.5096 -14.4893,4.5192 -14.4868,4.5287 -14.3892,4.5382 -14.1973,4.5478 -13.913,4.5573 -13.539,4.5668 -13.0789,4.5764 -12.537,4.5859 -11.9186,4.5954 -11.2294,4.605 -10.4762,4.6145 -9.6659,4.6241 -8.8065,4.6336 -7.906,4.6431 -6.9731,4.6527 -6.0165,4.6431 -5.0456,4.6336 -4.0694,4.6241 -3.0974,4.6145 -2.1387,4.605 -1.2025,4.5954 -0.2977,4.5859 --0.567,4.5764 --1.3834,4.5668 --2.1438,4.5573 --2.8409,4.5478 --3.468,4.5382 --4.0192,4.5287 --4.4892,4.5192 --4.8735,4.5096 --5.1685,4.5001 --5.3714,4.4905 --5.4802,4.481 --5.494,4.4715 --5.4124,4.4619 --5.2365,4.4524 --4.9677,4.4429 --4.6087,4.4333 --4.163,4.4238 --3.6346,4.4142 --3.0288,4.4047 --2.3512,4.3952 --1.6084,4.3856 --0.8073,4.3761 -0.0444,4.3666 -0.9385,4.3761 -1.8665,4.3666 -2.8197,4.3761 -3.7888,4.3856 -4.7647,4.3952 -5.7382,4.4047 -6.6998,4.4142 -7.6404,4.4238 -8.5511,4.4333 -9.4232,4.4429 -10.2485,4.4524 -11.0189,4.4619 -11.7272,4.4715 -12.3666,4.481 -12.9311,4.4905 -13.4152,4.5001 -13.8144,4.5096 -14.1248,4.5192 -14.3435,4.5287 -14.4684,4.5382 -14.4983,4.5478 -14.433,4.5573 -14.273,4.5668 -14.0198,4.5764 -13.676,4.5859 -13.2447,4.5954 -12.73,4.605 -12.137,4.6145 -11.4711,4.6241 -10.7389,4.6336 -9.9472,4.6431 -9.1036,4.6527 -8.2161,4.6431 -7.2932,4.6336 -6.3437,4.6241 -5.3766,4.6145 -4.4012,4.605 -3.4267,4.5954 -2.4624,4.5859 -1.5175,4.5764 -0.6011,4.5668 --0.2782,4.5573 --1.1119,4.5478 --1.8922,4.5382 --2.6115,4.5287 --3.2631,4.5192 --3.8407,4.5096 --4.3388,4.5001 --4.7527,4.4905 --5.0785,4.481 --5.3129,4.4715 --5.4539,4.4619 --5.5,4.4524 --5.4508,4.4429 --5.3068,4.4333 --5.0693,4.4238 --4.7407,4.4142 --4.3239,4.4047 --3.8231,4.3952 --3.243,4.3856 --2.5891,4.3761 --1.8677,4.3666 --1.0856,4.357 --0.2502,4.3475 -0.6304,4.338 -1.5479,4.3284 -2.4935,4.338 -3.4583,4.3475 -4.4329,4.357 -5.4082,4.3666 -6.3749,4.3761 -7.3237,4.3856 -8.2456,4.3952 -9.1317,4.4047 -9.9738,4.4142 -10.7637,4.4238 -11.4939,4.4333 -12.1574,4.4429 -12.748,4.4524 -13.26,4.4619 -13.6885,4.4715 -14.0295,4.481 -14.2796,4.4905 -14.4366,4.5001 -14.4989,4.5096 -14.4659,4.5192 -14.3379,4.5287 -14.1162,4.5382 -13.8028,4.5478 -13.4008,4.5573 -12.914,4.5668 -12.347,4.5764 -11.7052,4.5859 -10.9948,4.5954 -10.2224,4.605 -9.3956,4.6145 -8.5221,4.6241 -7.6102,4.6145 -6.6688,4.6241 -5.7066,4.6145 -4.733,4.605 -3.7571,4.5954 -2.7883,4.5859 -1.8359,4.5764 -0.9088,4.5668 -0.0159,4.5573 --0.8342,4.5478 --1.6335,4.5382 --2.3743,4.5287 --3.0497,4.5192 --3.6531,4.5096 --4.1788,4.5001 --4.6218,4.4905 --4.9779,4.481 --5.2437,4.4715 --5.4166,4.4619 --5.495,4.4524 --5.4782,4.4429 --5.3663,4.4333 --5.1604,4.4238 --4.8624,4.4142 --4.4752,4.4047 --4.0025,4.3952 --3.4487,4.3856 --2.8193,4.3761 --2.12,4.3666 --1.3577,4.357 --0.5396,4.3475 -0.3266,4.338 -1.2325,4.3284 -2.1696,4.338 -3.1288,4.3475 -4.1012,4.357 -5.0773,4.3666 -6.0479,4.3761 -7.0038,4.3856 -7.9359,4.3952 -8.8351,4.4047 -9.6931,4.4142 -10.5016,4.4238 -11.2529,4.4333 -11.9398,4.4429 -12.5559,4.4524 -13.0952,4.4619 -13.5526,4.4715 -13.9237,4.481 -14.205,4.4905 -14.3938,4.5001 -14.4884,4.5096 -14.4878,4.5192 -14.392,4.5287 -14.2019,4.5382 -13.9194,4.5478 -13.5471,4.5573 -13.0886,4.5668 -12.5483,4.5764 -11.9313,4.5859 -11.2435,4.5954 -10.4914,4.605 -9.6822,4.6145 -8.8236,4.6241 -7.9239,4.6145 -6.9915,4.6241 -6.0353,4.6145 -5.0646,4.605 -4.0884,4.5954 -3.1162,4.5859 -2.1572,4.5764 -1.2204,4.5668 -0.315,4.5573 --0.5506,4.5478 --1.3681,4.5382 --2.1296,4.5287 --2.8279,4.5192 --3.4565,4.5096 +4.5,0.0095 +5.475,0.0191 +6.4407,0.0286 +7.388,0.0381 +8.3077,0.0477 +9.1911,0.0572 +10.0298,0.0668 +10.8158,0.0763 +11.5417,0.0858 +12.2004,0.0954 +12.7858,0.1049 +13.2922,0.1144 +13.7148,0.124 +14.0496,0.1335 +14.2934,0.1431 +14.4439,0.1526 +14.4997,0.1621 +14.4601,0.1717 +14.3256,0.1812 +14.0975,0.1907 +13.778,0.2003 +13.37,0.2098 +12.8775,0.2193 +12.3052,0.2289 +11.6585,0.2384 +10.9436,0.248 +10.1673,0.2575 +9.337,0.267 +8.4606,0.2766 +7.5464,0.2861 +6.6032,0.2956 +5.64,0.3052 +4.6659,0.3147 +3.6903,0.3242 +2.7223,0.3338 +1.7713,0.3433 +0.8463,0.3529 +-0.0439,0.3624 +-0.8908,0.3719 +-1.6863,0.3815 +-2.4229,0.391 +-3.0935,0.3815 +-3.6917,0.3719 +-4.2119,0.3624 +-4.6491,0.3529 +-4.9991,0.3433 +-5.2585,0.3338 +-5.425,0.3242 +-5.4969,0.3147 +-5.4735,0.3052 +-5.3551,0.3147 +-5.1428,0.3242 +-4.8386,0.3338 +-4.4454,0.3433 +-3.967,0.3529 +-3.4079,0.3624 +-2.7734,0.3719 +-2.0696,0.3815 +-1.3032,0.391 +-0.4815,0.4005 +0.3876,0.4101 +1.296,0.4196 +2.2349,0.4292 +3.1953,0.4387 +4.1682,0.4482 +5.1443,0.4578 +6.1142,0.4673 +7.0687,0.4768 +7.9988,0.4864 +8.8955,0.4959 +9.7503,0.5054 +10.5551,0.515 +11.3022,0.5245 +11.9845,0.5341 +12.5955,0.5436 +13.1293,0.5531 +13.5809,0.5627 +13.9459,0.5722 +14.221,0.5817 +14.4034,0.5913 +14.4914,0.6008 +14.4842,0.6104 +14.3819,0.6199 +14.1854,0.6294 +13.8967,0.639 +13.5183,0.6485 +13.0541,0.658 +12.5083,0.6676 +11.8862,0.6771 +11.1938,0.6866 +10.4375,0.6962 +9.6247,0.7057 +8.763,0.7153 +7.8608,0.7248 +6.9264,0.7343 +5.969,0.7439 +4.9976,0.7534 +4.0214,0.7629 +3.0498,0.7725 +2.092,0.782 +1.1571,0.7915 +0.2542,0.8011 +-0.6084,0.8106 +-1.4222,0.8202 +-2.1797,0.8297 +-2.8734,0.8202 +-3.4969,0.8106 +-4.0442,0.8011 +-4.5101,0.7915 +-4.8901,0.782 +-5.1807,0.7725 +-5.379,0.7629 +-5.4831,0.7534 +-5.4922,0.7439 +-5.406,0.7343 +-5.2254,0.7439 +-4.9521,0.7534 +-4.5888,0.7629 +-4.1389,0.7725 +-3.6066,0.782 +-2.9971,0.7915 +-2.3161,0.8011 +-1.5702,0.8106 +-0.7665,0.8202 +0.0875,0.8297 +0.9834,0.8392 +1.9129,0.8488 +2.8671,0.8583 +3.8368,0.8678 +4.8128,0.8774 +5.7858,0.8869 +6.7466,0.8965 +7.686,0.906 +8.595,0.9155 +9.465,0.9251 +10.2877,0.9346 +11.0553,0.9441 +11.7603,0.9537 +12.3962,0.9632 +12.9569,0.9727 +13.4369,0.9823 +13.8318,0.9918 +14.1378,1.0014 +14.3519,1.0109 +14.4721,1.0204 +14.4974,1.03 +14.4273,1.0395 +14.2627,1.049 +14.005,1.0586 +13.6567,1.0681 +13.2212,1.0777 +12.7026,1.0872 +12.1058,1.0967 +11.4366,1.1063 +10.7012,1.1158 +9.9068,1.1253 +9.0608,1.1349 +8.1714,1.1444 +7.247,1.1539 +6.2964,1.1635 +5.3287,1.173 +4.3531,1.1826 +3.3789,1.1921 +2.4153,1.2016 +1.4717,1.2112 +0.5569,1.2207 +-0.3203,1.2302 +-1.1516,1.2207 +-1.9291,1.2112 +-2.6452,1.2016 +-3.2933,1.1921 +-3.8671,1.1826 +-4.3612,1.173 +-4.7709,1.1635 +-5.0922,1.1539 +-5.3221,1.1444 +-5.4584,1.1349 +-5.4998,1.1253 +-5.4459,1.1158 +-5.2973,1.1063 +-5.0552,1.0967 +-4.7222,1.1063 +-4.3012,1.1158 +-3.7964,1.1253 +-3.2125,1.1349 +-2.5552,1.1444 +-1.8306,1.1539 +-1.0456,1.1635 +-0.2079,1.173 +0.6748,1.1826 +1.5939,1.1921 +2.5406,1.2016 +3.5061,1.2112 +4.481,1.2207 +5.4561,1.2302 +6.4221,1.2398 +7.3698,1.2493 +8.2901,1.2589 +9.1743,1.2684 +10.014,1.2779 +10.8011,1.2875 +11.5282,1.297 +12.1883,1.3065 +12.7751,1.3161 +13.2831,1.3256 +13.7074,1.3351 +14.044,1.3447 +14.2896,1.3542 +14.4419,1.3638 +14.4995,1.3733 +14.4618,1.3828 +14.3291,1.3924 +14.1029,1.4019 +13.7851,1.4114 +13.3788,1.421 +12.8879,1.4305 +12.3171,1.44 +11.6718,1.4496 +10.9581,1.4591 +10.1829,1.4687 +9.3536,1.4782 +8.478,1.4877 +7.5645,1.4973 +6.6218,1.5068 +5.6589,1.5163 +4.6849,1.5259 +3.7092,1.5354 +2.741,1.545 +1.7896,1.5545 +0.864,1.564 +-0.027,1.5545 +-0.8748,1.545 +-1.6714,1.5354 +-2.4092,1.5259 +-3.0811,1.5163 +-3.6808,1.5068 +-4.2026,1.4973 +-4.6414,1.4877 +-4.9931,1.4782 +-5.2544,1.4687 +-5.4227,1.4591 +-5.4964,1.4496 +-5.4749,1.44 +-5.3583,1.4305 +-5.1478,1.421 +-4.8454,1.4114 +-4.4539,1.421 +-3.9771,1.4305 +-3.4195,1.44 +-2.7864,1.4496 +-2.0839,1.4591 +-1.3187,1.4687 +-0.498,1.4782 +0.3703,1.4877 +1.278,1.4973 +2.2164,1.5068 +3.1765,1.5163 +4.1492,1.5259 +5.1253,1.5354 +6.0954,1.545 +7.0503,1.5545 +7.981,1.564 +8.8784,1.5736 +9.7341,1.5831 +10.54,1.5926 +11.2883,1.6022 +11.9719,1.6117 +12.5843,1.6212 +13.1197,1.6308 +13.5729,1.6403 +13.9397,1.6499 +14.2165,1.6594 +14.4007,1.6689 +14.4906,1.6785 +14.4853,1.688 +14.3848,1.6975 +14.1901,1.7071 +13.9031,1.7166 +13.5265,1.7262 +13.0639,1.7357 +12.5197,1.7452 +11.899,1.7548 +11.2079,1.7643 +10.4528,1.7738 +9.641,1.7834 +8.7802,1.7929 +7.8786,1.8024 +6.9449,1.812 +5.9878,1.8215 +5.0165,1.8311 +4.0404,1.8406 +3.0686,1.8501 +2.1104,1.8597 +1.1751,1.8501 +0.2714,1.8406 +-0.592,1.8311 +-1.4069,1.8215 +-2.1655,1.812 +-2.8606,1.8024 +-3.4855,1.7929 +-4.0344,1.7834 +-4.5019,1.7738 +-4.8836,1.7643 +-5.1759,1.7548 +-5.376,1.7452 +-5.482,1.7357 +-5.4929,1.7262 +-5.4086,1.7166 +-5.2298,1.7071 +-4.9583,1.6975 +-4.5967,1.688 +-4.1484,1.6868 +-3.6177,1.6963 +-3.0096,1.7059 +-2.33,1.7154 +-1.5853,1.7249 +-0.7826,1.7345 +0.0704,1.744 +0.9657,1.7535 +1.8946,1.7631 +2.8483,1.7726 +3.8178,1.7822 +4.7938,1.7917 +5.767,1.8012 +6.7281,1.8108 +7.668,1.8203 +8.5777,1.8298 +9.4485,1.8394 +10.2722,1.8489 +11.0409,1.8584 +11.7473,1.868 +12.3845,1.8775 +12.9467,1.8871 +13.4284,1.8966 +13.825,1.9061 +14.1327,1.9157 +14.3486,1.9252 +14.4707,1.9347 +14.4978,1.9443 +14.4296,1.9538 +14.2668,1.9633 +14.0109,1.9729 +13.6644,1.9824 +13.2305,1.992 +12.7135,2.0015 +12.1182,2.011 +11.4503,2.0206 +10.7161,2.0301 +9.9228,2.0396 +9.0777,2.0492 +8.1891,2.0587 +7.2652,2.0683 +6.3151,2.0778 +5.3476,2.0873 +4.3721,2.0969 +3.3977,2.1064 +2.4339,2.1159 +1.4898,2.1064 +0.5744,2.0969 +-0.3037,2.0873 +-1.1359,2.0778 +-1.9145,2.0683 +-2.6319,2.0587 +-3.2814,2.0492 +-3.8567,2.0396 +-4.3524,2.0301 +-4.7637,2.0206 +-5.0868,2.011 +-5.3185,2.0015 +-5.4566,1.992 +-5.4999,1.9824 +-5.4479,1.9729 +-5.301,1.9633 +-5.0608,1.9538 +-4.7295,1.9443 +-4.3102,1.9347 +-3.807,1.9252 +-3.2246,1.9347 +-2.5686,1.9443 +-1.8452,1.9538 +-1.0614,1.9633 +-0.2246,1.9729 +0.6572,1.9824 +1.5757,1.992 +2.522,2.0015 +3.4872,2.011 +4.462,2.0206 +5.4372,2.0301 +6.4034,2.0396 +7.3516,2.0492 +8.2725,2.0587 +9.1575,2.0683 +9.9981,2.0778 +10.7863,2.0873 +11.5146,2.0969 +12.1761,2.1064 +12.7644,2.1159 +13.274,2.1255 +13.7,2.135 +14.0383,2.1445 +14.2857,2.1541 +14.4398,2.1636 +14.4993,2.1732 +14.4634,2.1827 +14.3326,2.1922 +14.1081,2.2018 +13.7921,2.2113 +13.3875,2.2208 +12.8982,2.2304 +12.3289,2.2399 +11.685,2.2495 +10.9726,2.259 +10.1986,2.2685 +9.3702,2.2781 +8.4954,2.2876 +7.5826,2.2971 +6.6404,2.3067 +5.6777,2.3162 +4.7039,2.3257 +3.7281,2.3353 +2.7597,2.3448 +1.8079,2.3353 +0.8817,2.3257 +-0.01,2.3162 +-0.8588,2.3067 +-1.6564,2.2971 +-2.3954,2.2876 +-3.0687,2.2781 +-3.6699,2.2685 +-4.1932,2.259 +-4.6337,2.2495 +-4.9871,2.2399 +-5.2502,2.2304 +-5.4203,2.2208 +-5.4959,2.2113 +-5.4762,2.2018 +-5.3615,2.1922 +-5.1528,2.1827 +-4.8521,2.1732 +-4.4623,2.1636 +-3.9871,2.1541 +-3.4311,2.1605 +-2.7994,2.17 +-2.0982,2.1795 +-1.3341,2.1891 +-0.5144,2.1986 +0.353,2.2082 +1.26,2.2177 +2.1979,2.2272 +3.1577,2.2368 +4.1302,2.2463 +5.1063,2.2558 +6.0767,2.2654 +7.032,2.2749 +7.9632,2.2844 +8.8613,2.294 +9.7179,2.3035 +10.5248,2.3131 +11.2743,2.3226 +11.9592,2.3321 +12.5731,2.3417 +13.11,2.3512 +13.5649,2.3607 +13.9334,2.3703 +14.212,2.3798 +14.398,2.3894 +14.4897,2.3989 +14.4863,2.4084 +14.3877,2.418 +14.1948,2.4275 +13.9096,2.437 +13.5347,2.4466 +13.0737,2.4561 +12.531,2.4656 +11.9118,2.4752 +11.222,2.4847 +10.4681,2.4943 +9.6573,2.5038 +8.7974,2.5133 +7.8965,2.5229 +6.9633,2.5324 +6.0066,2.5419 +5.0355,2.5515 +4.0594,2.561 +3.0874,2.5515 +2.1289,2.5419 +1.193,2.5324 +0.2886,2.5229 +-0.5757,2.5133 +-1.3916,2.5038 +-2.1513,2.4943 +-2.8477,2.4847 +-3.4741,2.4752 +-4.0244,2.4656 +-4.4936,2.4561 +-4.877,2.4466 +-5.1711,2.437 +-5.373,2.4275 +-5.4809,2.418 +-5.4936,2.4084 +-5.4111,2.3989 +-5.2342,2.3894 +-4.9645,2.3798 +-4.6046,2.3703 +-4.1579,2.3607 +-3.6288,2.3512 +-3.0222,2.3607 +-2.3439,2.3703 +-1.6004,2.3798 +-0.7987,2.3894 +0.0534,2.3989 +0.9479,2.4084 +1.8763,2.418 +2.8296,2.4275 +3.7989,2.437 +4.7748,2.4466 +5.7482,2.4561 +6.7096,2.4656 +7.65,2.4752 +8.5604,2.4847 +9.432,2.4943 +10.2567,2.5038 +11.0265,2.5133 +11.7342,2.5229 +12.3728,2.5324 +12.9365,2.5419 +13.4198,2.5515 +13.8181,2.561 +14.1276,2.5706 +14.3453,2.5801 +14.4692,2.5896 +14.4982,2.5992 +14.4318,2.6087 +14.2708,2.6182 +14.0167,2.6278 +13.6719,2.6373 +13.2398,2.6468 +12.7243,2.6564 +12.1305,2.6659 +11.4639,2.6755 +10.731,2.685 +9.9387,2.6945 +9.0946,2.7041 +8.2067,2.7136 +7.2835,2.7231 +6.3338,2.7327 +5.3665,2.7422 +4.3911,2.7518 +3.4166,2.7422 +2.4525,2.7327 +1.5079,2.7231 +0.5918,2.7136 +-0.287,2.7041 +-1.1202,2.6945 +-1.8999,2.685 +-2.6186,2.6755 +-3.2695,2.6659 +-3.8463,2.6564 +-4.3436,2.6468 +-4.7566,2.6373 +-5.0814,2.6278 +-5.3149,2.6182 +-5.4549,2.6087 +-5.5,2.5992 +-5.4498,2.5896 +-5.3048,2.5801 +-5.0664,2.5706 +-4.7368,2.561 +-4.3192,2.5515 +-3.8175,2.5419 +-3.2366,2.5324 +-2.582,2.5419 +-1.8599,2.5515 +-1.0772,2.561 +-0.2413,2.5706 +0.6397,2.5801 +1.5575,2.5896 +2.5034,2.5992 +3.4683,2.6087 +4.443,2.6182 +5.4183,2.6278 +6.3848,2.6373 +7.3333,2.6468 +8.2549,2.6564 +9.1407,2.6659 +9.9822,2.6755 +10.7715,2.685 +11.5011,2.6945 +12.1639,2.7041 +12.7537,2.7136 +13.2649,2.7231 +13.6925,2.7327 +14.0326,2.7422 +14.2817,2.7518 +14.4377,2.7613 +14.499,2.7708 +14.465,2.7804 +14.3361,2.7899 +14.1134,2.7994 +13.7991,2.809 +13.3962,2.8185 +12.9085,2.828 +12.3407,2.8376 +11.6982,2.8471 +10.9871,2.8567 +10.2142,2.8662 +9.3868,2.8757 +8.5128,2.8853 +7.6006,2.8948 +6.6589,2.9043 +5.6966,2.9139 +4.7229,2.9234 +3.7471,2.9139 +2.7784,2.9043 +1.8262,2.8948 +0.8994,2.8853 +0.0069,2.8757 +-0.8427,2.8662 +-1.6414,2.8567 +-2.3817,2.8471 +-3.0563,2.8376 +-3.6589,2.828 +-4.1838,2.8185 +-4.6259,2.809 +-4.9811,2.7994 +-5.2459,2.7899 +-5.4179,2.7804 +-5.4953,2.7708 +-5.4775,2.7613 +-5.3646,2.7518 +-5.1578,2.7422 +-4.8588,2.7327 +-4.4707,2.7231 +-3.9972,2.7136 +-3.4426,2.7041 +-2.8124,2.6945 +-2.1125,2.7041 +-1.3495,2.7136 +-0.5309,2.7231 +0.3358,2.7327 +1.242,2.7422 +2.1794,2.7518 +3.1388,2.7613 +4.1113,2.7708 +5.0874,2.7804 +6.0579,2.7899 +7.0136,2.7994 +7.9453,2.809 +8.8442,2.8185 +9.7017,2.828 +10.5097,2.8376 +11.2603,2.8471 +11.9466,2.8567 +12.5619,2.8662 +13.1003,2.8757 +13.5568,2.8853 +13.927,2.8948 +14.2074,2.9043 +14.3953,2.9139 +14.4889,2.9234 +14.4873,2.9329 +14.3905,2.9425 +14.1995,2.952 +13.916,2.9616 +13.5428,2.9711 +13.0835,2.9806 +12.5423,2.9902 +11.9245,2.9997 +11.236,3.0092 +10.4833,3.0188 +9.6736,3.0283 +8.8145,3.0379 +7.9144,3.0474 +6.9817,3.0569 +6.0254,3.0665 +5.0545,3.076 +4.0783,3.0665 +3.1062,3.0569 +2.1473,3.0474 +1.2109,3.0379 +0.3058,3.0283 +-0.5593,3.0188 +-1.3762,3.0092 +-2.1371,2.9997 +-2.8348,2.9902 +-3.4626,2.9806 +-4.0145,2.9711 +-4.4853,2.9616 +-4.8704,2.952 +-5.1662,2.9425 +-5.37,2.9329 +-5.4797,2.9234 +-5.4943,2.9139 +-5.4136,2.9043 +-5.2385,2.8948 +-4.9706,2.8853 +-4.6124,2.8757 +-4.1674,2.8662 +-3.6398,2.8567 +-3.0347,2.8471 +-2.3577,2.8376 +-1.6154,2.8471 +-0.8148,2.8567 +0.0364,2.8662 +0.9301,2.8757 +1.8579,2.8853 +2.8109,2.8948 +3.7799,2.9043 +4.7558,2.9139 +5.7293,2.9234 +6.6911,2.9329 +7.6319,2.9425 +8.543,2.952 +9.4155,2.9616 +10.2412,2.9711 +11.0121,2.9806 +11.721,2.9902 +12.3611,2.9997 +12.9263,3.0092 +13.4112,3.0188 +13.8112,3.0283 +14.1224,3.0379 +14.342,3.0474 +14.4677,3.0569 +14.4985,3.0665 +14.434,3.076 +14.2749,3.0855 +14.0225,3.0951 +13.6795,3.1046 +13.249,3.1141 +12.7351,3.1237 +12.1427,3.1332 +11.4775,3.1428 +10.7458,3.1523 +9.9546,3.1618 +9.1115,3.1714 +8.2243,3.1809 +7.3017,3.1904 +6.3524,3.2 +5.3855,3.2095 +4.4101,3.2 +3.4355,3.1904 +2.4711,3.1809 +1.5261,3.1714 +0.6093,3.1618 +-0.2703,3.1523 +-1.1045,3.1428 +-1.8853,3.1332 +-2.6052,3.1237 +-3.2575,3.1141 +-3.8358,3.1046 +-4.3347,3.0951 +-4.7494,3.0855 +-5.0759,3.076 +-5.3112,3.0665 +-5.453,3.0569 +-5.5,3.0474 +-5.4517,3.0379 +-5.3085,3.0283 +-5.0719,3.0188 +-4.7441,3.0092 +-4.3281,2.9997 +-3.8281,2.9902 +-3.2487,2.9806 +-2.5954,2.9711 +-1.8746,2.9806 +-1.093,2.9902 +-0.2581,2.9997 +0.6222,3.0092 +1.5394,3.0188 +2.4848,3.0283 +3.4494,3.0379 +4.424,3.0474 +5.3994,3.0569 +6.3661,3.0665 +7.3151,3.076 +8.2373,3.0855 +9.1238,3.0951 +9.9663,3.1046 +10.7567,3.1141 +11.4875,3.1237 +12.1517,3.1332 +12.743,3.1428 +13.2557,3.1523 +13.685,3.1618 +14.0268,3.1714 +14.2778,3.1809 +14.4356,3.1904 +14.4987,3.2 +14.4666,3.2095 +14.3395,3.2191 +14.1186,3.2286 +13.8061,3.2381 +13.4049,3.2477 +12.9188,3.2572 +12.3525,3.2667 +11.7114,3.2763 +11.0015,3.2858 +10.2297,3.2953 +9.4033,3.3049 +8.5302,3.3144 +7.6187,3.324 +6.6775,3.3335 +5.7155,3.343 +4.7419,3.3335 +3.766,3.324 +2.7971,3.3144 +1.8445,3.3049 +0.9171,3.2953 +0.0239,3.2858 +-0.8266,3.2763 +-1.6264,3.2667 +-2.3679,3.2572 +-3.0438,3.2477 +-3.6479,3.2381 +-4.1744,3.2286 +-4.6182,3.2191 +-4.975,3.2095 +-5.2417,3.2 +-5.4154,3.1904 +-5.4947,3.1809 +-5.4788,3.1714 +-5.3677,3.1618 +-5.1627,3.1523 +-4.8655,3.1428 +-4.4791,3.1332 +-4.0072,3.1237 +-3.4541,3.1141 +-2.8253,3.1046 +-2.1267,3.0951 +-1.3649,3.1046 +-0.5473,3.1141 +0.3185,3.1237 +1.2241,3.1332 +2.1609,3.1428 +3.12,3.1523 +4.0923,3.1618 +5.0684,3.1714 +6.0391,3.1809 +6.9952,3.1904 +7.9275,3.2 +8.8271,3.2095 +9.6855,3.2191 +10.4945,3.2286 +11.2463,3.2381 +11.9339,3.2477 +12.5506,3.2572 +13.0906,3.2667 +13.5488,3.2763 +13.9207,3.2858 +14.2028,3.2953 +14.3925,3.3049 +14.488,3.3144 +14.4882,3.324 +14.3933,3.3335 +14.2041,3.343 +13.9224,3.3526 +13.5509,3.3621 +13.0932,3.3716 +12.5536,3.3812 +11.9373,3.3907 +11.25,3.4002 +10.4985,3.4098 +9.6898,3.4193 +8.8317,3.4289 +7.9322,3.4384 +7.0001,3.4479 +6.0441,3.4575 +5.0735,3.4479 +4.0973,3.4384 +3.125,3.4289 +2.1658,3.4193 +1.2289,3.4098 +0.3231,3.4002 +-0.5429,3.3907 +-1.3608,3.3812 +-2.1229,3.3716 +-2.8219,3.3621 +-3.4511,3.3526 +-4.0045,3.343 +-4.4769,3.3335 +-4.8637,3.324 +-5.1614,3.3144 +-5.3669,3.3049 +-5.4784,3.2953 +-5.4949,3.2858 +-5.4161,3.2763 +-5.2428,3.2667 +-4.9767,3.2572 +-4.6202,3.2477 +-4.1769,3.2381 +-3.6508,3.2286 +-3.0471,3.2191 +-2.3715,3.2095 +-1.6304,3.2 +-0.8309,3.2095 +0.0194,3.2191 +0.9124,3.2286 +1.8396,3.2381 +2.7922,3.2477 +3.761,3.2572 +4.7368,3.2667 +5.7105,3.2763 +6.6725,3.2858 +7.6139,3.2953 +8.5256,3.3049 +9.3989,3.3144 +10.2256,3.324 +10.9977,3.3335 +11.7079,3.343 +12.3494,3.3526 +12.9161,3.3621 +13.4026,3.3716 +13.8042,3.3812 +14.1172,3.3907 +14.3386,3.4002 +14.4662,3.4098 +14.4988,3.4193 +14.4362,3.4289 +14.2788,3.4384 +14.0283,3.4479 +13.687,3.4575 +13.2582,3.467 +12.7458,3.4765 +12.155,3.4861 +11.4911,3.4956 +10.7607,3.5052 +9.9706,3.5147 +9.1283,3.5242 +8.242,3.5338 +7.32,3.5433 +6.3711,3.5528 +5.4044,3.5433 +4.4291,3.5338 +3.4544,3.5242 +2.4897,3.5147 +1.5442,3.5052 +0.6268,3.4956 +-0.2536,3.4861 +-1.0888,3.4765 +-1.8707,3.467 +-2.5919,3.4575 +-3.2455,3.4479 +-3.8253,3.4384 +-4.3258,3.4289 +-4.7421,3.4193 +-5.0704,3.4098 +-5.3075,3.4002 +-5.4512,3.3907 +-5.5,3.3812 +-5.4535,3.3716 +-5.3122,3.3621 +-5.0774,3.3526 +-4.7513,3.343 +-4.337,3.3335 +-3.8386,3.324 +-3.2607,3.3144 +-2.6088,3.3049 +-1.8892,3.2953 +-1.1087,3.3049 +-0.2748,3.3144 +0.6047,3.324 +1.5212,3.3335 +2.4662,3.343 +3.4305,3.3526 +4.405,3.3621 +5.3804,3.3716 +6.3475,3.3812 +7.2969,3.3907 +8.2197,3.4002 +9.107,3.4098 +9.9504,3.4193 +10.7419,3.4289 +11.4739,3.4384 +12.1395,3.4479 +12.7322,3.4575 +13.2465,3.467 +13.6775,3.4765 +14.021,3.4861 +14.2738,3.4956 +14.4334,3.5052 +14.4984,3.5147 +14.4681,3.5242 +14.3429,3.5338 +14.1238,3.5433 +13.813,3.5528 +13.4135,3.5624 +12.929,3.5719 +12.3642,3.5814 +11.7245,3.591 +11.0159,3.6005 +10.2453,3.6101 +9.4199,3.6196 +8.5476,3.6291 +7.6367,3.6387 +6.696,3.6482 +5.7343,3.6387 +4.7609,3.6291 +3.785,3.6196 +2.8158,3.6101 +1.8628,3.6005 +0.9349,3.591 +0.0409,3.5814 +-0.8106,3.5719 +-1.6114,3.5624 +-2.354,3.5528 +-3.0314,3.5433 +-3.6369,3.5338 +-4.1649,3.5242 +-4.6103,3.5147 +-4.969,3.5052 +-5.2373,3.4956 +-5.4129,3.4861 +-5.4941,3.4765 +-5.48,3.467 +-5.3708,3.4575 +-5.1675,3.4479 +-4.8722,3.4384 +-4.4875,3.4289 +-4.0171,3.4193 +-3.4656,3.4098 +-2.8382,3.4002 +-2.1409,3.3907 +-1.3803,3.3812 +-0.5637,3.3907 +0.3012,3.4002 +1.2061,3.4098 +2.1424,3.4193 +3.1012,3.4289 +4.0733,3.4384 +5.0494,3.4479 +6.0204,3.4575 +6.9768,3.467 +7.9096,3.4765 +8.81,3.4861 +9.6692,3.4956 +10.4793,3.5052 +11.2323,3.5147 +11.9212,3.5242 +12.5393,3.5338 +13.0809,3.5433 +13.5407,3.5528 +13.9143,3.5624 +14.1982,3.5719 +14.3897,3.5814 +14.487,3.591 +14.4891,3.6005 +14.396,3.6101 +14.2086,3.6196 +13.9287,3.6291 +13.559,3.6387 +13.1029,3.6482 +12.5648,3.6577 +11.9499,3.6673 +11.264,3.6768 +10.5137,3.6864 +9.706,3.6959 +8.8488,3.7054 +7.9501,3.715 +7.0185,3.7245 +6.0629,3.715 +5.0924,3.7054 +4.1163,3.6959 +3.1438,3.6864 +2.1843,3.6768 +1.2468,3.6673 +0.3403,3.6577 +-0.5265,3.6482 +-1.3454,3.6387 +-2.1087,3.6291 +-2.8089,3.6196 +-3.4395,3.6101 +-3.9945,3.6005 +-4.4685,3.591 +-4.8571,3.5814 +-5.1564,3.5719 +-5.3638,3.5624 +-5.4772,3.5528 +-5.4955,3.5433 +-5.4185,3.5338 +-5.2471,3.5242 +-4.9827,3.5147 +-4.628,3.5052 +-4.1863,3.4956 +-3.6618,3.4861 +-3.0596,3.4765 +-2.3853,3.467 +-1.6454,3.4575 +-0.847,3.467 +0.0024,3.4765 +0.8947,3.4861 +1.8213,3.4956 +2.7734,3.5052 +3.742,3.5147 +4.7179,3.5242 +5.6916,3.5338 +6.654,3.5433 +7.5958,3.5528 +8.5082,3.5624 +9.3824,3.5719 +10.21,3.5814 +10.9832,3.591 +11.6947,3.6005 +12.3376,3.6101 +12.9058,3.6196 +13.3939,3.6291 +13.7972,3.6387 +14.112,3.6482 +14.3352,3.6577 +14.4646,3.6673 +14.4991,3.6768 +14.4383,3.6864 +14.2828,3.6959 +14.0341,3.7054 +13.6945,3.715 +13.2673,3.7245 +12.7566,3.734 +12.1672,3.7436 +11.5047,3.7531 +10.7755,3.7626 +9.9865,3.7722 +9.1451,3.7817 +8.2596,3.7913 +7.3382,3.8008 +6.3897,3.8011 +5.4233,3.7916 +4.4481,3.782 +3.4733,3.7725 +2.5083,3.7629 +1.5623,3.7534 +0.6444,3.7439 +-0.2369,3.7343 +-1.073,3.7248 +-1.856,3.7153 +-2.5785,3.7057 +-3.2335,3.6962 +-3.8147,3.6867 +-4.3168,3.6771 +-4.7349,3.6676 +-5.0649,3.658 +-5.3038,3.6485 +-5.4493,3.639 +-5.5,3.6294 +-5.4553,3.6199 +-5.3158,3.6104 +-5.0828,3.6008 +-4.7585,3.5913 +-4.3459,3.5817 +-3.8491,3.5722 +-3.2726,3.5627 +-2.6221,3.5531 +-1.9038,3.5436 +-1.1244,3.5341 +-0.2914,3.5436 +0.5872,3.5531 +1.5031,3.5627 +2.4476,3.5722 +3.4116,3.5817 +4.386,3.5913 +5.3615,3.6008 +6.3288,3.6104 +7.2786,3.6199 +8.202,3.6294 +9.0901,3.639 +9.9345,3.6485 +10.7271,3.658 +11.4603,3.6676 +12.1272,3.6771 +12.7214,3.6867 +13.2373,3.6962 +13.6699,3.7057 +14.0152,3.7153 +14.2697,3.7248 +14.4312,3.7343 +14.4981,3.7439 +14.4696,3.7534 +14.3462,3.7629 +14.1289,3.7725 +13.8199,3.782 +13.4221,3.7916 +12.9392,3.8011 +12.376,3.8106 +11.7376,3.8202 +11.0303,3.8297 +10.2608,3.8392 +9.4364,3.8488 +8.565,3.8583 +7.6548,3.8679 +6.7145,3.8774 +5.7532,3.8679 +4.7799,3.8583 +3.8039,3.8488 +2.8346,3.8392 +1.8811,3.8297 +0.9526,3.8202 +0.0579,3.8106 +-0.7945,3.8011 +-1.5964,3.7916 +-2.3402,3.782 +-3.0188,3.7725 +-3.6258,3.7629 +-4.1554,3.7534 +-4.6025,3.7439 +-4.9628,3.7343 +-5.233,3.7248 +-5.4104,3.7153 +-5.4934,3.7057 +-5.4812,3.6962 +-5.3738,3.6867 +-5.1724,3.6771 +-4.8788,3.6676 +-4.4958,3.658 +-4.0271,3.6485 +-3.4771,3.639 +-2.8511,3.6294 +-2.1551,3.6199 +-1.3957,3.6104 +-0.58,3.6199 +0.284,3.6294 +1.1882,3.639 +2.124,3.6485 +3.0824,3.658 +4.0543,3.6676 +5.0305,3.6771 +6.0016,3.6867 +6.9584,3.6962 +7.8918,3.7057 +8.7928,3.7153 +9.653,3.7248 +10.464,3.7343 +11.2182,3.7439 +11.9084,3.7534 +12.528,3.7629 +13.0711,3.7725 +13.5325,3.782 +13.9079,3.7916 +14.1936,3.8011 +14.3869,3.8106 +14.486,3.8202 +14.49,3.8297 +14.3987,3.8392 +14.2132,3.8488 +13.935,3.8583 +13.567,3.8679 +13.1126,3.8774 +12.5761,3.8869 +11.9626,3.8965 +11.278,3.906 +10.5289,3.9155 +9.7222,3.9251 +8.8659,3.9346 +7.9679,3.9441 +7.0369,3.9537 +6.0817,3.9441 +5.1114,3.9346 +4.1353,3.9251 +3.1627,3.9155 +2.2028,3.906 +1.2648,3.8965 +0.3576,3.8869 +-0.5101,3.8774 +-1.33,3.8679 +-2.0944,3.8583 +-2.796,3.8488 +-3.428,3.8392 +-3.9845,3.8297 +-4.4601,3.8202 +-4.8503,3.8106 +-5.1515,3.8011 +-5.3607,3.7916 +-5.4759,3.782 +-5.496,3.7725 +-5.4209,3.7629 +-5.2513,3.7534 +-4.9887,3.7439 +-4.6357,3.7343 +-4.1957,3.7248 +-3.6728,3.7153 +-3.072,3.7057 +-2.3991,3.6962 +-1.6604,3.6867 +-0.863,3.6771 +-0.0145,3.6867 +0.877,3.6962 +1.803,3.7057 +2.7547,3.7153 +3.7231,3.7248 +4.6989,3.7343 +5.6727,3.7439 +6.6354,3.7534 +7.5778,3.7629 +8.4908,3.7725 +9.3658,3.782 +10.1944,3.7916 +10.9688,3.8011 +11.6815,3.8106 +12.3258,3.8202 +12.8955,3.8297 +13.3852,3.8392 +13.7902,3.8488 +14.1067,3.8583 +14.3317,3.8679 +14.463,3.8774 +14.4993,3.8869 +14.4404,3.8965 +14.2867,3.906 +14.0398,3.9155 +13.702,3.9251 +13.2764,3.9346 +12.7673,3.9441 +12.1794,3.9537 +11.5182,3.9632 +10.7903,3.9728 +10.0023,3.9823 +9.162,3.9918 +8.2772,4.0014 +7.3564,4.0109 +6.4084,4.0014 +5.4422,3.9918 +4.4671,3.9823 +3.4922,3.9728 +2.527,3.9632 +1.5805,3.9537 +0.6619,3.9441 +-0.2202,3.9346 +-1.0572,3.9251 +-1.8413,3.9155 +-2.565,3.906 +-3.2214,3.8965 +-3.8042,3.8869 +-4.3078,3.8774 +-4.7276,3.8679 +-5.0593,3.8583 +-5.3,3.8488 +-5.4474,3.8392 +-5.4999,3.8297 +-5.4571,3.8202 +-5.3195,3.8106 +-5.0882,3.8011 +-4.7656,3.7916 +-4.3548,3.782 +-3.8595,3.7725 +-3.2846,3.7629 +-2.6355,3.7534 +-1.9184,3.7439 +-1.1401,3.7343 +-0.3081,3.7439 +0.5697,3.7534 +1.485,3.7629 +2.429,3.7725 +3.3927,3.782 +4.367,3.7916 +5.3426,3.8011 +6.3101,3.8106 +7.2604,3.8202 +8.1844,3.8297 +9.0732,3.8392 +9.9185,3.8488 +10.7122,3.8583 +11.4466,3.8679 +12.1149,3.8774 +12.7106,3.8869 +13.2281,3.8965 +13.6623,3.906 +14.0093,3.9155 +14.2657,3.9251 +14.429,3.9346 +14.4977,3.9441 +14.4711,3.9537 +14.3495,3.9632 +14.134,3.9728 +13.8268,3.9823 +13.4306,3.9918 +12.9494,4.0014 +12.3876,4.0109 +11.7507,4.0204 +11.0447,4.03 +10.2763,4.0395 +9.4529,4.049 +8.5823,4.0586 +7.6728,4.0681 +6.733,4.0586 +5.772,4.049 +4.7989,4.0395 +3.8229,4.03 +2.8533,4.0204 +1.8995,4.0109 +0.9704,4.0014 +0.0749,3.9918 +-0.7783,3.9823 +-1.5813,3.9728 +-2.3263,3.9632 +-3.0063,3.9537 +-3.6148,3.9441 +-4.1459,3.9346 +-4.5946,3.9251 +-4.9567,3.9155 +-5.2286,3.906 +-5.4079,3.8965 +-5.4927,3.8869 +-5.4823,3.8774 +-5.3768,3.8679 +-5.1772,3.8583 +-4.8853,3.8488 +-4.5041,3.8392 +-4.037,3.8297 +-3.4885,3.8202 +-2.864,3.8106 +-2.1693,3.8011 +-1.411,3.7916 +-0.5964,3.782 +0.2668,3.7916 +1.1703,3.8011 +2.1055,3.8106 +3.0636,3.8202 +4.0353,3.8297 +5.0115,3.8392 +5.9828,3.8488 +6.94,3.8583 +7.8739,3.8679 +8.7757,3.8774 +9.6367,3.8869 +10.4488,3.8965 +11.2041,3.906 +11.8956,3.9155 +12.5167,3.9251 +13.0613,3.9346 +13.5244,3.9441 +13.9014,3.9537 +14.1889,3.9632 +14.384,3.9728 +14.485,3.9823 +14.4908,3.9918 +14.4014,4.0014 +14.2177,4.0109 +13.9413,4.0204 +13.575,4.03 +13.1222,4.0395 +12.5873,4.049 +11.9752,4.0586 +11.292,4.0681 +10.544,4.0777 +9.7384,4.0872 +8.8829,4.0967 +7.9857,4.1063 +7.0552,4.0967 +6.1004,4.0872 +5.1303,4.0777 +4.1543,4.0681 +3.1815,4.0586 +2.2213,4.049 +1.2828,4.0395 +0.3749,4.03 +-0.4936,4.0204 +-1.3146,4.0109 +-2.0801,4.0014 +-2.783,3.9918 +-3.4164,3.9823 +-3.9744,3.9728 +-4.4516,3.9632 +-4.8436,3.9537 +-5.1465,3.9441 +-5.3575,3.9346 +-5.4745,3.9251 +-5.4965,3.9155 +-5.4233,3.906 +-5.2555,3.8965 +-4.9947,3.8869 +-4.6434,3.8774 +-4.2051,3.8679 +-3.6837,3.8583 +-3.0844,3.8488 +-2.4128,3.8392 +-1.6754,3.8297 +-0.879,3.8202 +-0.0315,3.8297 +0.8593,3.8392 +1.7847,3.8488 +2.736,3.8583 +3.7042,3.8679 +4.6799,3.8774 +5.6539,3.8869 +6.6169,3.8965 +7.5597,3.906 +8.4734,3.9155 +9.3492,3.9251 +10.1788,3.9346 +10.9543,3.9441 +11.6682,3.9537 +12.3139,3.9632 +12.8851,3.9728 +13.3765,3.9823 +13.7832,3.9918 +14.1014,4.0014 +14.3282,4.0109 +14.4613,4.0204 +14.4995,4.03 +14.4424,4.0395 +14.2906,4.049 +14.0455,4.0586 +13.7094,4.0681 +13.2855,4.0777 +12.778,4.0872 +12.1915,4.0967 +11.5318,4.1063 +10.805,4.1158 +10.0182,4.1253 +9.1788,4.1349 +8.2948,4.1444 +7.3746,4.154 +6.427,4.1444 +5.4611,4.1349 +4.486,4.1253 +3.5111,4.1158 +2.5456,4.1063 +1.5987,4.0967 +0.6794,4.0872 +-0.2034,4.0777 +-1.0414,4.0681 +-1.8266,4.0586 +-2.5516,4.049 +-3.2093,4.0395 +-3.7936,4.03 +-4.2988,4.0204 +-4.7202,4.0109 +-5.0537,4.0014 +-5.2962,3.9918 +-5.4454,3.9823 +-5.4998,3.9728 +-5.4588,3.9632 +-5.323,3.9537 +-5.0936,3.9441 +-4.7728,3.9346 +-4.3636,3.9251 +-3.8699,3.9155 +-3.2965,3.906 +-2.6488,3.8965 +-1.9329,3.8869 +-1.1558,3.8774 +-0.3248,3.8679 +0.5523,3.8774 +1.4669,3.8869 +2.4104,3.8965 +3.3739,3.906 +4.348,3.9155 +5.3237,3.9251 +6.2914,3.9346 +7.2421,3.9441 +8.1667,3.9537 +9.0563,3.9632 +9.9026,3.9728 +10.6973,3.9823 +11.433,3.9918 +12.1026,4.0014 +12.6997,4.0109 +13.2188,4.0204 +13.6547,4.03 +14.0034,4.0395 +14.2616,4.049 +14.4267,4.0586 +14.4972,4.0681 +14.4725,4.0777 +14.3528,4.0872 +14.1391,4.0967 +13.8336,4.1063 +13.4392,4.1158 +12.9595,4.1253 +12.3993,4.1349 +11.7638,4.1444 +11.0591,4.154 +10.2918,4.1635 +9.4694,4.173 +8.5996,4.1826 +7.6908,4.1921 +6.7516,4.1826 +5.7909,4.173 +4.8178,4.1635 +3.8418,4.154 +2.8721,4.1444 +1.9178,4.1349 +0.9882,4.1253 +0.092,4.1158 +-0.7622,4.1063 +-1.5662,4.0967 +-2.3124,4.0872 +-2.9937,4.0777 +-3.6036,4.0681 +-4.1363,4.0586 +-4.5867,4.049 +-4.9505,4.0395 +-5.2242,4.03 +-5.4053,4.0204 +-5.492,4.0109 +-5.4834,4.0014 +-5.3798,3.9918 +-5.182,3.9823 +-4.8919,3.9728 +-4.5123,3.9632 +-4.0469,3.9537 +-3.5,3.9441 +-2.8768,3.9346 +-2.1834,3.9251 +-1.4263,3.9155 +-0.6127,3.906 +0.2496,3.9155 +1.1524,3.9251 +2.0871,3.9346 +3.0448,3.9441 +4.0164,3.9537 +4.9925,3.9632 +5.964,3.9728 +6.9215,3.9823 +7.856,3.9918 +8.7585,4.0014 +9.6204,4.0109 +10.4335,4.0204 +11.19,4.03 +11.8828,4.0395 +12.5053,4.049 +13.0515,4.0586 +13.5162,4.0681 +13.8949,4.0777 +14.1842,4.0872 +14.3811,4.0967 +14.4839,4.1063 +14.4916,4.1158 +14.4041,4.1253 +14.2221,4.1349 +13.9476,4.1444 +13.583,4.154 +13.1318,4.1635 +12.5984,4.173 +11.9878,4.1826 +11.3059,4.1921 +10.5591,4.2016 +9.7546,4.2112 +8.9,4.2207 +8.0035,4.2302 +7.0736,4.2207 +6.1192,4.2112 +5.1493,4.2016 +4.1732,4.1921 +3.2003,4.1826 +2.2398,4.173 +1.3008,4.1635 +0.3922,4.154 +-0.4771,4.1444 +-1.2991,4.1349 +-2.0658,4.1253 +-2.7699,4.1158 +-3.4048,4.1063 +-3.9643,4.0967 +-4.4432,4.0872 +-4.8368,4.0777 +-5.1415,4.0681 +-5.3543,4.0586 +-5.4732,4.049 +-5.497,4.0395 +-5.4256,4.03 +-5.2596,4.0204 +-5.0006,4.0109 +-4.6511,4.0014 +-4.2144,3.9918 +-3.6946,3.9823 +-3.0968,3.9728 +-2.4265,3.9632 +-1.6903,3.9537 +-0.8951,3.9441 +-0.0484,3.9537 +0.8416,3.9632 +1.7664,3.9728 +2.7173,3.9823 +3.6852,3.9918 +4.6609,4.0014 +5.635,4.0109 +6.5983,4.0204 +7.5416,4.03 +8.4559,4.0395 +9.3326,4.049 +10.1631,4.0586 +10.9397,4.0681 +11.655,4.0777 +12.3021,4.0872 +12.8748,4.0967 +13.3677,4.1063 +13.7761,4.1158 +14.0961,4.1253 +14.3247,4.1349 +14.4596,4.1444 +14.4997,4.154 +14.4445,4.1635 +14.2945,4.173 +14.0511,4.1826 +13.7168,4.1921 +13.2946,4.2016 +12.7886,4.2112 +12.2036,4.2207 +11.5453,4.2302 +10.8197,4.2398 +10.034,4.2493 +9.1955,4.2589 +8.3123,4.2684 +7.3928,4.2589 +6.4457,4.2493 +5.48,4.2398 +4.505,4.2302 +3.53,4.2207 +2.5642,4.2112 +1.6169,4.2016 +0.697,4.1921 +-0.1866,4.1826 +-1.0256,4.173 +-1.8119,4.1635 +-2.5381,4.154 +-3.1972,4.1444 +-3.783,4.1349 +-4.2898,4.1253 +-4.7128,4.1158 +-5.0481,4.1063 +-5.2924,4.0967 +-5.4434,4.0872 +-5.4996,4.0777 +-5.4605,4.0681 +-5.3266,4.0586 +-5.099,4.049 +-4.7799,4.0395 +-4.3723,4.03 +-3.8803,4.0204 +-3.3084,4.0109 +-2.662,4.0014 +-1.9475,3.9918 +-1.1714,3.9823 +-0.3414,3.9728 +0.5348,3.9823 +1.4488,3.9918 +2.3918,4.0014 +3.355,4.0109 +4.329,4.0204 +5.3047,4.03 +6.2727,4.0395 +7.2239,4.049 +8.149,4.0586 +9.0394,4.0681 +9.8866,4.0777 +10.6824,4.0872 +11.4193,4.0967 +12.0902,4.1063 +12.6888,4.1158 +13.2094,4.1253 +13.6471,4.1349 +13.9975,4.1444 +14.2574,4.154 +14.4244,4.1635 +14.4968,4.173 +14.4739,4.1826 +14.356,4.1921 +14.1441,4.2016 +13.8404,4.2112 +13.4477,4.2207 +12.9697,4.2302 +12.4109,4.2398 +11.7768,4.2493 +11.0734,4.2589 +10.3073,4.2684 +9.4859,4.2779 +8.617,4.2875 +7.7088,4.297 +6.7701,4.2875 +5.8097,4.2779 +4.8368,4.2684 +3.8608,4.2589 +2.8908,4.2493 +1.9362,4.2398 +1.006,4.2302 +0.109,4.2207 +-0.746,4.2112 +-1.5511,4.2016 +-2.2985,4.1921 +-2.9811,4.1826 +-3.5925,4.173 +-4.1267,4.1635 +-4.5787,4.154 +-4.9443,4.1444 +-5.2198,4.1349 +-5.4027,4.1253 +-5.4912,4.1158 +-5.4845,4.1063 +-5.3827,4.0967 +-5.1867,4.0872 +-4.8984,4.0777 +-4.5205,4.0681 +-4.0567,4.0586 +-3.5113,4.049 +-2.8896,4.0395 +-2.1975,4.03 +-1.4416,4.0204 +-0.629,4.0109 +0.2324,4.0204 +1.1345,4.03 +2.0687,4.0395 +3.026,4.049 +3.9974,4.0586 +4.9736,4.0681 +5.9452,4.0777 +6.9031,4.0872 +7.8381,4.0967 +8.7413,4.1063 +9.604,4.1158 +10.4182,4.1253 +11.1759,4.1349 +11.87,4.1444 +12.4939,4.154 +13.0416,4.1635 +13.5079,4.173 +13.8884,4.1826 +14.1794,4.1921 +14.3782,4.2016 +14.4828,4.2112 +14.4924,4.2207 +14.4067,4.2302 +14.2266,4.2398 +13.9538,4.2493 +13.5909,4.2589 +13.1414,4.2684 +12.6095,4.2779 +12.0004,4.2875 +11.3198,4.297 +10.5742,4.3065 +9.7708,4.3161 +8.9171,4.3256 +8.0213,4.3352 +7.0919,4.3256 +6.1379,4.3161 +5.1683,4.3065 +4.1922,4.297 +3.2192,4.2875 +2.2583,4.2779 +1.3188,4.2684 +0.4096,4.2589 +-0.4607,4.2493 +-1.2836,4.2398 +-2.0515,4.2302 +-2.7569,4.2207 +-3.3931,4.2112 +-3.9542,4.2016 +-4.4346,4.1921 +-4.83,4.1826 +-5.1364,4.173 +-5.351,4.1635 +-5.4718,4.154 +-5.4975,4.1444 +-5.4279,4.1349 +-5.2638,4.1253 +-5.0066,4.1158 +-4.6588,4.1063 +-4.2237,4.0967 +-3.7055,4.0872 +-3.1091,4.0777 +-2.4402,4.0681 +-1.7052,4.0586 +-0.911,4.049 +-0.0653,4.0395 +0.8239,4.049 +1.7482,4.0586 +2.6986,4.0681 +3.6663,4.0777 +4.6419,4.0872 +5.6161,4.0967 +6.5797,4.1063 +7.5235,4.1158 +8.4385,4.1253 +9.3159,4.1349 +10.1475,4.1444 +10.9252,4.154 +11.6417,4.1635 +12.2902,4.173 +12.8644,4.1826 +13.3589,4.1921 +13.769,4.2016 +14.0908,4.2112 +14.3211,4.2207 +14.4579,4.2302 +14.4998,4.2398 +14.4464,4.2493 +14.2983,4.2589 +14.0567,4.2684 +13.7241,4.2779 +13.3036,4.2875 +12.7992,4.297 +12.2157,4.3065 +11.5587,4.3161 +10.8345,4.3256 +10.0498,4.3352 +9.2123,4.3447 +8.3299,4.3542 +7.411,4.3447 +6.4643,4.3352 +5.4989,4.3256 +4.524,4.3161 +3.5489,4.3065 +2.5829,4.297 +1.6351,4.2875 +0.7146,4.2779 +-0.1698,4.2684 +-1.0098,4.2589 +-1.7972,4.2493 +-2.5246,4.2398 +-3.1851,4.2302 +-3.7723,4.2207 +-4.2807,4.2112 +-4.7054,4.2016 +-5.0425,4.1921 +-5.2885,4.1826 +-5.4414,4.173 +-5.4994,4.1635 +-5.4622,4.154 +-5.3301,4.1444 +-5.1043,4.1349 +-4.7869,4.1253 +-4.3811,4.1158 +-3.8906,4.1063 +-3.3202,4.0967 +-2.6753,4.0872 +-1.962,4.0777 +-1.1871,4.0681 +-0.358,4.0586 +0.5174,4.0681 +1.4307,4.0777 +2.3733,4.0872 +3.3361,4.0967 +4.31,4.1063 +5.2858,4.1158 +6.254,4.1253 +7.2056,4.1349 +8.1313,4.1444 +9.0225,4.154 +9.8705,4.1635 +10.6674,4.173 +11.4055,4.1826 +12.0778,4.1921 +12.6779,4.2016 +13.2001,4.2112 +13.6394,4.2207 +13.9915,4.2302 +14.2533,4.2398 +14.422,4.2493 +14.4963,4.2589 +14.4753,4.2684 +14.3592,4.2779 +14.1492,4.2875 +13.8472,4.297 +13.4561,4.3065 +12.9797,4.3161 +12.4225,4.3256 +11.7899,4.3352 +11.0877,4.3447 +10.3228,4.3542 +9.5024,4.3638 +8.6343,4.3733 +7.7268,4.3828 +6.7886,4.3733 +5.8285,4.3638 +4.8558,4.3542 +3.8797,4.3447 +2.9096,4.3352 +1.9545,4.3256 +1.0238,4.3161 +0.1261,4.3065 +-0.7298,4.297 +-1.536,4.2875 +-2.2846,4.2779 +-2.9685,4.2684 +-3.5813,4.2589 +-4.1171,4.2493 +-4.5708,4.2398 +-4.938,4.2302 +-5.2153,4.2207 +-5.4,4.2112 +-5.4904,4.2016 +-5.4855,4.1921 +-5.3856,4.1826 +-5.1914,4.173 +-4.9049,4.1635 +-4.5287,4.154 +-4.0665,4.1444 +-3.5227,4.1349 +-2.9024,4.1253 +-2.2116,4.1158 +-1.4569,4.1063 +-0.6453,4.0967 +0.2152,4.1063 +1.1166,4.1158 +2.0502,4.1253 +3.0072,4.1349 +3.9784,4.1444 +4.9546,4.154 +5.9264,4.1635 +6.8847,4.173 +7.8202,4.1826 +8.7241,4.1921 +9.5877,4.2016 +10.4028,4.2112 +11.1617,4.2207 +11.8572,4.2302 +12.4825,4.2398 +13.0317,4.2493 +13.4997,4.2589 +13.8819,4.2684 +14.1746,4.2779 +14.3752,4.2875 +14.4817,4.297 +14.4931,4.3065 +14.4092,4.3161 +14.231,4.3256 +13.9599,4.3352 +13.5988,4.3447 +13.1509,4.3542 +12.6206,4.3638 +12.013,4.3733 +11.3337,4.3828 +10.5893,4.3924 +9.7869,4.4019 +8.9341,4.4114 +8.0391,4.421 +7.1103,4.4114 +6.1566,4.4019 +5.1872,4.3924 +4.2112,4.3828 +3.238,4.3733 +2.2768,4.3638 +1.3368,4.3542 +0.4269,4.3447 +-0.4442,4.3352 +-1.2681,4.3256 +-2.0371,4.3161 +-2.7438,4.3065 +-3.3814,4.297 +-3.944,4.2875 +-4.4261,4.2779 +-4.8231,4.2684 +-5.1313,4.2589 +-5.3477,4.2493 +-5.4703,4.2398 +-5.4979,4.2302 +-5.4302,4.2207 +-5.2678,4.2112 +-5.0124,4.2016 +-4.6664,4.1921 +-4.233,4.1826 +-3.7164,4.173 +-3.1214,4.1635 +-2.4539,4.154 +-1.7201,4.1444 +-0.927,4.1349 +-0.0822,4.1253 +0.8063,4.1349 +1.7299,4.1444 +2.68,4.154 +3.6474,4.1635 +4.6229,4.173 +5.5972,4.1826 +6.5611,4.1921 +7.5054,4.2016 +8.421,4.2112 +9.2993,4.2207 +10.1318,4.2302 +10.9106,4.2398 +11.6284,4.2493 +12.2782,4.2589 +12.854,4.2684 +13.3501,4.2779 +13.7618,4.2875 +14.0854,4.297 +14.3175,4.3065 +14.4562,4.3161 +14.4999,4.3256 +14.4484,4.3352 +14.302,4.3447 +14.0623,4.3542 +13.7314,4.3638 +13.3126,4.3733 +12.8098,4.3828 +12.2278,4.3924 +11.5722,4.4019 +10.8491,4.4114 +10.0656,4.421 +9.2291,4.4305 +8.3474,4.4401 +7.4291,4.4305 +6.4829,4.421 +5.5178,4.4114 +4.543,4.4019 +3.5678,4.3924 +2.6015,4.3828 +1.6533,4.3733 +0.7322,4.3638 +-0.153,4.3542 +-0.9939,4.3447 +-1.7824,4.3352 +-2.5111,4.3256 +-3.1729,4.3161 +-3.7616,4.3065 +-4.2716,4.297 +-4.698,4.2875 +-5.0368,4.2779 +-5.2846,4.2684 +-5.4393,4.2589 +-5.4992,4.2493 +-5.4638,4.2398 +-5.3335,4.2302 +-5.1095,4.2207 +-4.794,4.2112 +-4.3898,4.2016 +-3.901,4.1921 +-3.332,4.1826 +-2.6885,4.173 +-1.9765,4.1635 +-1.2027,4.154 +-0.3746,4.1444 +0.5,4.154 +1.4126,4.1635 +2.3547,4.173 +3.3172,4.1826 +4.2911,4.1921 +5.2668,4.2016 +6.2353,4.2112 +7.1873,4.2207 +8.1136,4.2302 +9.0055,4.2398 +9.8545,4.2493 +10.6525,4.2589 +11.3918,4.2684 +12.0654,4.2779 +12.667,4.2875 +13.1907,4.297 +13.6316,4.3065 +13.9855,4.3161 +14.249,4.3256 +14.4197,4.3352 +14.4957,4.3447 +14.4766,4.3542 +14.3623,4.3638 +14.1541,4.3733 +13.8539,4.3828 +13.4646,4.3924 +12.9898,4.4019 +12.4341,4.4114 +11.8028,4.421 +11.102,4.4305 +10.3382,4.4401 +9.5188,4.4496 +8.6516,4.4591 +7.7448,4.4496 +6.807,4.4401 +5.8473,4.4305 +4.8748,4.421 +3.8987,4.4114 +2.9283,4.4019 +1.9729,4.3924 +1.0416,4.3828 +0.1432,4.3733 +-0.7136,4.3638 +-1.5208,4.3542 +-2.2706,4.3447 +-2.9559,4.3352 +-3.5701,4.3256 +-4.1074,4.3161 +-4.5627,4.3065 +-4.9317,4.297 +-5.2108,4.2875 +-5.3973,4.2779 +-5.4895,4.2684 +-5.4866,4.2589 +-5.3884,4.2493 +-5.1961,4.2398 +-4.9113,4.2302 +-4.5369,4.2207 +-4.0763,4.2112 +-3.534,4.2016 +-2.9152,4.1921 +-2.2257,4.1826 +-1.4721,4.173 +-0.6616,4.1635 +0.1981,4.154 +1.0987,4.1635 +2.0318,4.173 +2.9884,4.1826 +3.9594,4.1921 +4.9356,4.2016 +5.9076,4.2112 +6.8662,4.2207 +7.8023,4.2302 +8.7068,4.2398 +9.5713,4.2493 +10.3875,4.2589 +11.1476,4.2684 +11.8443,4.2779 +12.471,4.2875 +13.0218,4.297 +13.4914,4.3065 +13.8753,4.3161 +14.1698,4.3256 +14.3722,4.3352 +14.4806,4.3447 +14.4938,4.3542 +14.4118,4.3638 +14.2353,4.3733 +13.9661,4.3828 +13.6067,4.3924 +13.1605,4.4019 +12.6317,4.4114 +12.0255,4.421 +11.3476,4.4305 +10.6044,4.4401 +9.803,4.4496 +8.9511,4.4591 +8.0568,4.4687 +7.1286,4.4591 +6.1754,4.4496 +5.2062,4.4401 +4.2302,4.4305 +3.2568,4.421 +2.2953,4.4114 +1.3548,4.4019 +0.4443,4.3924 +-0.4276,4.3828 +-1.2526,4.3733 +-2.0227,4.3638 +-2.7307,4.3542 +-3.3697,4.3447 +-3.9338,4.3352 +-4.4175,4.3256 +-4.8162,4.3161 +-5.1262,4.3065 +-5.3444,4.297 +-5.4688,4.2875 +-5.4983,4.2779 +-5.4324,4.2684 +-5.2719,4.2589 +-5.0183,4.2493 +-4.674,4.2398 +-4.2422,4.2302 +-3.7272,4.2207 +-3.1337,4.2112 +-2.4675,4.2016 +-1.7349,4.1921 +-0.9429,4.1826 +-0.0991,4.173 +0.7886,4.1826 +1.7117,4.1921 +2.6613,4.2016 +3.6284,4.2112 +4.6039,4.2207 +5.5784,4.2302 +6.5425,4.2398 +7.4873,4.2493 +8.4035,4.2589 +9.2826,4.2684 +10.1161,4.2779 +10.896,4.2875 +11.6151,4.297 +12.2663,4.3065 +12.8435,4.3161 +13.3412,4.3256 +13.7547,4.3352 +14.0799,4.3447 +14.3139,4.3542 +14.4544,4.3638 +14.5,4.3733 +14.4503,4.3828 +14.3058,4.3924 +14.0678,4.4019 +13.7387,4.4114 +13.3216,4.421 +12.8203,4.4305 +12.2398,4.4401 +11.5856,4.4496 +10.8638,4.4591 +10.0814,4.4687 +9.2458,4.4782 +8.365,4.4877 +7.4473,4.4782 +6.5015,4.4687 +5.5367,4.4591 +4.562,4.4496 +3.5867,4.4401 +2.6202,4.4305 +1.6715,4.421 +0.7498,4.4114 +-0.1362,4.4019 +-0.978,4.3924 +-1.7676,4.3828 +-2.4975,4.3733 +-3.1607,4.3638 +-3.7509,4.3542 +-4.2625,4.3447 +-4.6905,4.3352 +-5.031,4.3256 +-5.2807,4.3161 +-5.4372,4.3065 +-5.4989,4.297 +-5.4654,4.2875 +-5.337,4.2779 +-5.1148,4.2684 +-4.8009,4.2589 +-4.3985,4.2493 +-3.9112,4.2398 +-3.3438,4.2302 +-2.7017,4.2207 +-1.9909,4.2112 +-1.2183,4.2016 +-0.3912,4.1921 +0.4826,4.2016 +1.3946,4.2112 +2.3362,4.2207 +3.2984,4.2302 +4.2721,4.2398 +5.2479,4.2493 +6.2166,4.2589 +7.169,4.2684 +8.0959,4.2779 +8.9886,4.2875 +9.8385,4.297 +10.6375,4.3065 +11.378,4.3161 +12.053,4.3256 +12.656,4.3352 +13.1813,4.3447 +13.6239,4.3542 +13.9795,4.3638 +14.2448,4.3733 +14.4172,4.3828 +14.4952,4.3924 +14.4779,4.4019 +14.3655,4.4114 +14.1591,4.421 +13.8606,4.4305 +13.473,4.4401 +12.9998,4.4496 +12.4457,4.4591 +11.8158,4.4687 +11.1162,4.4782 +10.3536,4.4877 +9.5352,4.4973 +8.6688,4.5068 +7.7627,4.4973 +6.8255,4.4877 +5.8662,4.4782 +4.8938,4.4687 +3.9177,4.4591 +2.9471,4.4496 +1.9913,4.4401 +1.0594,4.4305 +0.1603,4.421 +-0.6974,4.4114 +-1.5056,4.4019 +-2.2566,4.3924 +-2.9432,4.3828 +-3.5589,4.3733 +-4.0978,4.3638 +-4.5547,4.3542 +-4.9254,4.3447 +-5.2062,4.3352 +-5.3946,4.3256 +-5.4886,4.3161 +-5.4875,4.3065 +-5.3912,4.297 +-5.2007,4.2875 +-4.9177,4.2779 +-4.545,4.2684 +-4.0861,4.2589 +-3.5453,4.2493 +-2.9279,4.2398 +-2.2397,4.2302 +-1.4873,4.2207 +-0.6779,4.2112 +0.1809,4.2016 +1.0809,4.2112 +2.0134,4.2207 +2.9697,4.2302 +3.9405,4.2398 +4.9166,4.2493 +5.8888,4.2589 +6.8478,4.2684 +7.7843,4.2779 +8.6896,4.2875 +9.555,4.297 +10.3721,4.3065 +11.1334,4.3161 +11.8314,4.3256 +12.4595,4.3352 +13.0118,4.3447 +13.483,4.3542 +13.8686,4.3638 +14.165,4.3733 +14.3692,4.3828 +14.4793,4.3924 +14.4944,4.4019 +14.4143,4.4114 +14.2396,4.421 +13.9722,4.4305 +13.6145,4.4401 +13.1699,4.4496 +12.6428,4.4591 +12.038,4.4687 +11.3614,4.4782 +10.6194,4.4877 +9.8191,4.4973 +8.9681,4.5068 +8.0746,4.5164 +7.1469,4.5068 +6.1941,4.4973 +5.2251,4.4877 +4.2492,4.4782 +3.2757,4.4687 +2.3139,4.4591 +1.3728,4.4496 +0.4616,4.4401 +-0.4111,4.4305 +-1.237,4.421 +-2.0083,4.4114 +-2.7175,4.4019 +-3.358,4.3924 +-3.9236,4.3828 +-4.4089,4.3733 +-4.8093,4.3638 +-5.121,4.3542 +-5.3411,4.3447 +-5.4673,4.3352 +-5.4986,4.3256 +-5.4346,4.3161 +-5.2759,4.3065 +-5.0241,4.297 +-4.6815,4.2875 +-4.2514,4.2779 +-3.7379,4.2684 +-3.146,4.2589 +-2.4811,4.2493 +-1.7498,4.2398 +-0.9589,4.2302 +-0.1159,4.2207 +0.771,4.2302 +1.6934,4.2398 +2.6426,4.2493 +3.6095,4.2589 +4.5849,4.2684 +5.5595,4.2779 +6.5239,4.2875 +7.4691,4.297 +8.386,4.3065 +9.2659,4.3161 +10.1003,4.3256 +10.8814,4.3352 +11.6017,4.3447 +12.2543,4.3542 +12.833,4.3638 +13.3323,4.3733 +13.7474,4.3828 +14.0745,4.3924 +14.3102,4.4019 +14.4525,4.4114 +14.5,4.421 +14.4522,4.4305 +14.3095,4.4401 +14.0733,4.4496 +13.746,4.4591 +13.3305,4.4687 +12.8309,4.4782 +12.2519,4.4877 +11.599,4.4973 +10.8784,4.5068 +10.0971,4.5164 +9.2625,4.5259 +8.3825,4.5354 +7.4654,4.5259 +6.5202,4.5164 +5.5556,4.5068 +4.581,4.4973 +3.6057,4.4877 +2.6388,4.4782 +1.6897,4.4687 +0.7674,4.4591 +-0.1194,4.4496 +-0.9621,4.4401 +-1.7528,4.4305 +-2.4839,4.421 +-3.1485,4.4114 +-3.7401,4.4019 +-4.2533,4.3924 +-4.683,4.3828 +-5.0253,4.3733 +-5.2767,4.3638 +-5.435,4.3542 +-5.4987,4.3447 +-5.467,4.3352 +-5.3404,4.3256 +-5.12,4.3161 +-4.8079,4.3065 +-4.4071,4.297 +-3.9215,4.2875 +-3.3556,4.2779 +-2.7149,4.2684 +-2.0054,4.2589 +-1.2339,4.2493 +-0.4077,4.2398 +0.4652,4.2383 +1.3765,4.2479 +2.3176,4.2574 +3.2795,4.267 +4.2531,4.2765 +5.229,4.286 +6.1979,4.2956 +7.1507,4.3051 +8.0782,4.3146 +8.9716,4.3242 +9.8224,4.3337 +10.6225,4.3432 +11.3642,4.3528 +12.0405,4.3623 +12.645,4.3719 +13.1719,4.3814 +13.6161,4.3909 +13.9734,4.4005 +14.2405,4.41 +14.4148,4.4195 +14.4946,4.4291 +14.4791,4.4386 +14.3685,4.4481 +14.164,4.4577 +13.8673,4.4672 +13.4813,4.4768 +13.0098,4.4863 +12.4572,4.4958 +11.8288,4.5054 +11.1305,4.5149 +10.369,4.5244 +9.5516,4.534 +8.6861,4.5435 +7.7807,4.534 +6.844,4.5244 +5.885,4.5149 +4.9128,4.5054 +3.9366,4.4958 +2.9658,4.4863 +2.0097,4.4768 +1.0773,4.4672 +0.1774,4.4577 +-0.6812,4.4481 +-1.4904,4.4386 +-2.2426,4.4291 +-2.9305,4.4195 +-3.5476,4.41 +-4.088,4.4005 +-4.5466,4.3909 +-4.919,4.3814 +-5.2016,4.3719 +-5.3918,4.3623 +-5.4877,4.3528 +-5.4884,4.3432 +-5.394,4.3337 +-5.2053,4.3242 +-4.9241,4.3146 +-4.5531,4.3051 +-4.0958,4.2956 +-3.5566,4.286 +-2.9406,4.2765 +-2.2538,4.267 +-1.5025,4.2574 +-0.6941,4.2479 +0.1638,4.2383 +1.063,4.2479 +1.995,4.2574 +2.9509,4.267 +3.9215,4.2765 +4.8976,4.286 +5.87,4.2956 +6.8293,4.3051 +7.7664,4.3146 +8.6723,4.3242 +9.5386,4.3337 +10.3568,4.3432 +11.1191,4.3528 +11.8184,4.3623 +12.448,4.3719 +13.0019,4.3814 +13.4747,4.3909 +13.862,4.4005 +14.1601,4.41 +14.3661,4.4195 +14.4781,4.4291 +14.495,4.4386 +14.4167,4.4481 +14.2439,4.4577 +13.9783,4.4672 +13.6223,4.4768 +13.1794,4.4863 +12.6538,4.4958 +12.0505,4.5054 +11.3752,4.5149 +10.6344,4.5244 +9.8352,4.534 +8.9851,4.5435 +8.0923,4.5531 +7.1653,4.5435 +6.2128,4.534 +5.244,4.5244 +4.2682,4.5149 +3.2946,4.5054 +2.3324,4.4958 +1.3909,4.4863 +0.479,4.4768 +-0.3945,4.4672 +-1.2215,4.4577 +-1.9939,4.4481 +-2.7044,4.4386 +-3.3462,4.4291 +-3.9133,4.4195 +-4.4003,4.41 +-4.8024,4.4005 +-5.1158,4.3909 +-5.3377,4.3814 +-5.4658,4.3719 +-5.4989,4.3623 +-5.4367,4.3528 +-5.2799,4.3432 +-5.0299,4.3337 +-4.689,4.3242 +-4.2606,4.3146 +-3.7487,4.3051 +-3.1582,4.2956 +-2.4947,4.286 +-1.7646,4.2765 +-0.9748,4.267 +-0.1328,4.2574 +0.7534,4.267 +1.6752,4.2765 +2.624,4.286 +3.5906,4.2956 +4.5659,4.3051 +5.5406,4.3146 +6.5053,4.3242 +7.451,4.3337 +8.3685,4.3432 +9.2492,4.3528 +10.0846,4.3623 +10.8668,4.3719 +11.5883,4.3814 +12.2423,4.3909 +12.8225,4.4005 +13.3234,4.41 +13.7402,4.4195 +14.069,4.4291 +14.3065,4.4386 +14.4507,4.4481 +14.5,4.4577 +14.454,4.4672 +14.3132,4.4768 +14.0788,4.4863 +13.7532,4.4958 +13.3394,4.5054 +12.8414,4.5149 +12.2638,4.5244 +11.6123,4.534 +10.8931,4.5435 +10.1129,4.5531 +9.2792,4.5626 +8.4,4.5721 +7.4836,4.5626 +6.5388,4.5531 +5.5745,4.5435 +4.6,4.534 +3.6246,4.5244 +2.6575,4.5149 +1.708,4.5054 +0.785,4.4958 +-0.1025,4.4863 +-0.9462,4.4768 +-1.738,4.4672 +-2.4703,4.4577 +-3.1362,4.4481 +-3.7294,4.4386 +-4.2441,4.4291 +-4.6755,4.4195 +-5.0195,4.41 +-5.2727,4.4005 +-5.4328,4.3909 +-5.4983,4.3814 +-5.4685,4.3719 +-5.3437,4.3623 +-5.1251,4.3528 +-4.8148,4.3432 +-4.4158,4.3337 +-3.9317,4.3242 +-3.3673,4.3146 +-2.728,4.3051 +-2.0198,4.2956 +-1.2494,4.286 +-0.4243,4.2765 +0.4478,4.267 +1.3585,4.2765 +2.2991,4.286 +3.2607,4.2956 +4.2341,4.3051 +5.21,4.3146 +6.1792,4.3242 +7.1323,4.3337 +8.0604,4.3432 +8.9546,4.3528 +9.8063,4.3623 +10.6074,4.3719 +11.3504,4.3814 +12.028,4.3909 +12.634,4.4005 +13.1624,4.41 +13.6083,4.4195 +13.9673,4.4291 +14.2362,4.4386 +14.4123,4.4481 +14.4939,4.4577 +14.4803,4.4672 +14.3716,4.4768 +14.1688,4.4863 +13.8739,4.4958 +13.4897,4.5054 +13.0198,4.5149 +12.4687,4.5244 +11.8417,4.534 +11.1447,4.5435 +10.3844,4.5531 +9.568,4.5626 +8.7033,4.5721 +7.7986,4.5626 +6.8625,4.5531 +5.9038,4.5435 +4.9317,4.534 +3.9556,4.5244 +2.9846,4.5149 +2.0281,4.5054 +1.0951,4.4958 +0.1946,4.4863 +-0.6649,4.4768 +-1.4752,4.4672 +-2.2286,4.4577 +-2.9178,4.4481 +-3.5363,4.4386 +-4.0783,4.4291 +-4.5385,4.4195 +-4.9126,4.41 +-5.197,4.4005 +-5.389,4.3909 +-5.4867,4.3814 +-5.4893,4.3719 +-5.3967,4.3623 +-5.2098,4.3528 +-4.9304,4.3432 +-4.5611,4.3337 +-4.1055,4.3242 +-3.5678,4.3146 +-2.9533,4.3051 +-2.2678,4.2956 +-1.5177,4.286 +-0.7103,4.2765 +0.1467,4.267 +1.0452,4.2765 +1.9766,4.286 +2.9321,4.2956 +3.9025,4.3051 +4.8787,4.3146 +5.8512,4.3242 +6.8108,4.3337 +7.7484,4.3432 +8.6551,4.3528 +9.5221,4.3623 +10.3413,4.3719 +11.1049,4.3814 +11.8055,4.3909 +12.4365,4.4005 +12.9918,4.41 +13.4663,4.4195 +13.8553,4.4291 +14.1551,4.4386 +14.363,4.4481 +14.4768,4.4577 +14.4956,4.4672 +14.4192,4.4768 +14.2482,4.4863 +13.9843,4.4958 +13.6301,4.5054 +13.1888,4.5149 +12.6648,4.5244 +12.0629,4.534 +11.389,4.5435 +10.6494,4.5531 +9.8512,4.5626 +9.0021,4.5721 +8.11,4.5636 +7.1836,4.5541 +6.2315,4.5445 +5.263,4.535 +4.2872,4.5254 +3.3134,4.5159 +2.3509,4.5064 +1.409,4.4968 +0.4964,4.4873 +-0.378,4.4778 +-1.2059,4.4682 +-1.9794,4.4587 +-2.6912,4.4492 +-3.3344,4.4396 +-3.903,4.4301 +-4.3916,4.4205 +-4.7954,4.411 +-5.1106,4.4015 +-5.3342,4.3919 +-5.4642,4.3824 +-5.4992,4.3729 +-5.4389,4.3633 +-5.2838,4.3538 +-5.0356,4.3442 +-4.6965,4.3347 +-4.2697,4.3252 +-3.7594,4.3156 +-3.1704,4.3061 +-2.5083,4.2966 +-1.7794,4.287 +-0.9907,4.2775 +-0.1496,4.268 +0.7357,4.2775 +1.657,4.287 +2.6053,4.2966 +3.5717,4.3061 +4.5469,4.3156 +5.5217,4.3252 +6.4867,4.3347 +7.4328,4.3442 +8.351,4.3538 +9.2325,4.3633 +10.0688,4.3729 +10.8521,4.3824 +11.5749,4.3919 +12.2303,4.4015 +12.8119,4.411 +13.3144,4.4205 +13.7329,4.4301 +14.0634,4.4396 +14.3028,4.4492 +14.4488,4.4587 +14.4999,4.4682 +14.4558,4.4778 +14.3168,4.4873 +14.0843,4.4968 +13.7604,4.5064 +13.3483,4.5159 +12.8518,4.5254 +12.2758,4.535 +11.6257,4.5445 +10.9077,4.5541 +10.1286,4.5636 +9.2959,4.5731 +8.4175,4.5827 +7.5017,4.5731 +6.5574,4.5636 +5.5934,4.5541 +4.619,4.5445 +3.6435,4.535 +2.6762,4.5254 +1.7262,4.5159 +0.8027,4.5064 +-0.0856,4.4968 +-0.9302,4.4873 +-1.7231,4.4778 +-2.4567,4.4682 +-3.1239,4.4587 +-3.7186,4.4492 +-4.2349,4.4396 +-4.6679,4.4301 +-5.0136,4.4205 +-5.2687,4.411 +-5.4306,4.4015 +-5.498,4.3919 +-5.47,4.3824 +-5.3471,4.3729 +-5.1303,4.3633 +-4.8217,4.3538 +-4.4244,4.3442 +-3.9419,4.3347 +-3.3791,4.3252 +-2.7411,4.3156 +-2.0342,4.3061 +-1.2649,4.2966 +-0.4408,4.287 +0.4304,4.2775 +1.3404,4.287 +2.2806,4.2966 +3.2418,4.3061 +4.2151,4.3156 +5.1911,4.3252 +6.1604,4.3347 +7.114,4.3442 +8.0427,4.3538 +8.9376,4.3633 +9.7902,4.3729 +10.5924,4.3824 +11.3365,4.3919 +12.0155,4.4015 +12.6229,4.411 +13.1529,4.4205 +13.6004,4.4301 +13.9612,4.4396 +14.2318,4.4492 +14.4098,4.4587 +14.4932,4.4682 +14.4815,4.4778 +14.3746,4.4873 +14.1737,4.4968 +13.8805,4.5064 +13.498,4.5159 +13.0297,4.5254 +12.4801,4.535 +11.8545,4.5445 +11.1589,4.5541 +10.3997,4.5636 +9.5844,4.5731 +8.7206,4.5827 +7.8165,4.5731 +6.8809,4.5636 +5.9226,4.5541 +4.9507,4.5445 +3.9746,4.535 +3.0034,4.5254 +2.0465,4.5159 +1.113,4.5064 +0.2117,4.4968 +-0.6486,4.4873 +-1.46,4.4778 +-2.2145,4.4682 +-2.905,4.4587 +-3.525,4.4492 +-4.0685,4.4396 +-4.5304,4.4301 +-4.9062,4.4205 +-5.1923,4.411 +-5.3862,4.4015 +-5.4858,4.3919 +-5.4902,4.3824 +-5.3995,4.3729 +-5.2144,4.3633 +-4.9367,4.3538 +-4.5691,4.3442 +-4.1151,4.3347 +-3.579,4.3252 +-2.966,4.3156 +-2.2817,4.3061 +-1.5329,4.2966 +-0.7265,4.287 +0.1296,4.2775 +1.0274,4.287 +1.9583,4.2966 +2.9134,4.3061 +3.8836,4.3156 +4.8597,4.3252 +5.8323,4.3347 +6.7923,4.3442 +7.7304,4.3538 +8.6378,4.3633 +9.5057,4.3729 +10.3259,4.3824 +11.0906,4.3919 +11.7925,4.4015 +12.4249,4.411 +12.9818,4.4205 +13.4579,4.4301 +13.8486,4.4396 +14.1502,4.4492 +14.3598,4.4587 +14.4755,4.4682 +14.4962,4.4778 +14.4216,4.4873 +14.2524,4.4968 +13.9903,4.5064 +13.6378,4.5159 +13.1982,4.5254 +12.6757,4.535 +12.0753,4.5445 +11.4027,4.5541 +10.6644,4.5636 +9.8673,4.5731 +9.019,4.5827 +8.1277,4.5731 +7.2019,4.5636 +6.2502,4.5541 +5.2819,4.5445 +4.3062,4.535 +3.3323,4.5254 +2.3695,4.5159 +1.427,4.5064 +0.5138,4.4968 +-0.3614,4.4873 +-1.1903,4.4778 +-1.9649,4.4682 +-2.678,4.4587 +-3.3226,4.4492 +-3.8927,4.4396 +-4.3829,4.4301 +-4.7884,4.4205 +-5.1053,4.411 +-5.3308,4.4015 +-5.4626,4.3919 +-5.4994,4.3824 +-5.4409,4.3729 +-5.2878,4.3633 +-5.0413,4.3538 +-4.7039,4.3442 +-4.2789,4.3347 +-3.7701,4.3252 +-3.1826,4.3156 +-2.5218,4.3061 +-1.7942,4.2966 +-1.0065,4.287 +-0.1664,4.2775 +0.7182,4.287 +1.6388,4.2966 +2.5867,4.3061 +3.5528,4.3156 +4.5279,4.3252 +5.5028,4.3347 +6.4681,4.3442 +7.4147,4.3538 +8.3335,4.3633 +9.2157,4.3729 +10.053,4.3824 +10.8374,4.3919 +11.5615,4.4015 +12.2182,4.411 +12.8014,4.4205 +13.3054,4.4301 +13.7256,4.4396 +14.0579,4.4492 +14.299,4.4587 +14.4468,4.4682 +14.4998,4.4778 +14.4576,4.4873 +14.3204,4.4968 +14.0897,4.5064 +13.7675,4.5159 +13.3571,4.5254 +12.8623,4.535 +12.2877,4.5445 +11.639,4.5541 +10.9222,4.5636 +10.1443,4.5731 +9.3125,4.5827 +8.4349,4.5922 +7.5198,4.5827 +6.5759,4.5731 +5.6123,4.5636 +4.638,4.5541 +3.6624,4.5445 +2.6948,4.535 +1.7445,4.5254 +0.8203,4.5159 +-0.0688,4.5064 +-0.9143,4.4968 +-1.7082,4.4873 +-2.443,4.4778 +-3.1116,4.4682 +-3.7077,4.4587 +-4.2256,4.4492 +-4.6603,4.4396 +-5.0078,4.4301 +-5.2646,4.4205 +-5.4284,4.411 +-5.4976,4.4015 +-5.4715,4.3919 +-5.3504,4.3824 +-5.1354,4.3729 +-4.8286,4.3633 +-4.4329,4.3538 +-3.9521,4.3442 +-3.3907,4.3347 +-2.7542,4.3252 +-2.0485,4.3156 +-1.2805,4.3061 +-0.4573,4.2966 +0.4131,4.287 +1.3224,4.2966 +2.262,4.3061 +3.223,4.3156 +4.1961,4.3252 +5.1721,4.3347 +6.1417,4.3442 +7.0957,4.3538 +8.0249,4.3633 +8.9205,4.3729 +9.774,4.3824 +10.5773,4.3919 +11.3226,4.4015 +12.003,4.411 +12.6118,4.4205 +13.1433,4.4301 +13.5925,4.4396 +13.955,4.4492 +14.2275,4.4587 +14.4072,4.4682 +14.4925,4.4778 +14.4826,4.4873 +14.3776,4.4968 +14.1785,4.5064 +13.8871,4.5159 +13.5063,4.5254 +13.0396,4.535 +12.4916,4.5445 +11.8674,4.5541 +11.173,4.5636 +10.4151,4.5731 +9.6007,4.5827 +8.7378,4.5922 +7.8345,4.5827 +6.8994,4.5731 +5.9414,4.5636 +4.9697,4.5541 +3.9935,4.5445 +3.0222,4.535 +2.0649,4.5254 +1.1309,4.5159 +0.2289,4.5064 +-0.6324,4.4968 +-1.4447,4.4873 +-2.2004,4.4778 +-2.8922,4.4682 +-3.5137,4.4587 +-4.0587,4.4492 +-4.5222,4.4396 +-4.8997,4.4301 +-5.1876,4.4205 +-5.3833,4.411 +-5.4847,4.4015 +-5.491,4.3919 +-5.4021,4.3824 +-5.2189,4.3729 +-4.943,4.3633 +-4.5771,4.3538 +-4.1248,4.3442 +-3.5902,4.3347 +-2.9786,4.3252 +-2.2957,4.3156 +-1.548,4.3061 +-0.7427,4.2966 +0.1125,4.287 +1.0096,4.2966 +1.9399,4.3061 +2.8946,4.3156 +3.8646,4.3252 +4.8407,4.3347 +5.8135,4.3442 +6.7738,4.3538 +7.7125,4.3633 +8.6205,4.3729 +9.4892,4.3824 +10.3105,4.3919 +11.0763,4.4015 +11.7795,4.411 +12.4133,4.4205 +12.9717,4.4301 +13.4494,4.4396 +13.8418,4.4492 +14.1452,4.4587 +14.3566,4.4682 +14.4742,4.4778 +14.4967,4.4873 +14.4239,4.4968 +14.2566,4.5064 +13.9963,4.5159 +13.6455,4.5254 +13.2075,4.535 +12.6866,4.5445 +12.0877,4.5541 +11.4165,4.5636 +10.6793,4.5731 +9.8833,4.5827 +9.036,4.5922 +8.1454,4.5827 +7.2201,4.5731 +6.2689,4.5636 +5.3009,4.5541 +4.3252,4.5445 +3.3511,4.535 +2.3881,4.5254 +1.4451,4.5159 +0.5313,4.5064 +-0.3448,4.4968 +-1.1746,4.4873 +-1.9504,4.4778 +-2.6647,4.4682 +-3.3108,4.4587 +-3.8824,4.4492 +-4.3741,4.4396 +-4.7813,4.4301 +-5.1,4.4205 +-5.3273,4.411 +-5.4609,4.4015 +-5.4996,4.3919 +-5.443,4.3824 +-5.2916,4.3729 +-5.047,4.3633 +-4.7113,4.3538 +-4.2879,4.3442 +-3.7808,4.3347 +-3.1947,4.3252 +-2.5353,4.3156 +-1.8089,4.3061 +-1.0224,4.2966 +-0.1832,4.287 +0.7006,4.2966 +1.6206,4.3061 +2.568,4.3156 +3.5339,4.3252 +4.5089,4.3347 +5.4839,4.3442 +6.4495,4.3538 +7.3965,4.3633 +8.3159,4.3729 +9.199,4.3824 +10.0372,4.3919 +10.8227,4.4015 +11.548,4.411 +12.2061,4.4205 +12.7908,4.4301 +13.2964,4.4396 +13.7183,4.4492 +14.0523,4.4587 +14.2952,4.4682 +14.4449,4.4778 +14.4997,4.4873 +14.4593,4.4968 +14.324,4.5064 +14.095,4.5159 +13.7747,4.5254 +13.3659,4.535 +12.8727,4.5445 +12.2996,4.5541 +11.6523,4.5636 +10.9368,4.5731 +10.1599,4.5827 +9.3292,4.5922 +8.4524,4.6017 +7.5379,4.5922 +6.5945,4.5827 +5.6312,4.5731 +4.657,4.5636 +3.6814,4.5541 +2.7135,4.5445 +1.7627,4.535 +0.838,4.5254 +-0.0518,4.5159 +-0.8983,4.5064 +-1.6933,4.4968 +-2.4293,4.4873 +-3.0993,4.4778 +-3.6968,4.4682 +-4.2163,4.4587 +-4.6527,4.4492 +-5.0019,4.4396 +-5.2605,4.4301 +-5.4261,4.4205 +-5.4971,4.411 +-5.4729,4.4015 +-5.3536,4.3919 +-5.1404,4.3824 +-4.8354,4.3729 +-4.4414,4.3633 +-3.9622,4.3538 +-3.4024,4.3442 +-2.7673,4.3347 +-2.0629,4.3252 +-1.296,4.3156 +-0.4738,4.3061 +0.3958,4.2966 +1.3044,4.3061 +2.2435,4.3156 +3.2041,4.3252 +4.1771,4.3347 +5.1532,4.3442 +6.123,4.3538 +7.0773,4.3633 +8.0071,4.3729 +8.9035,4.3824 +9.7579,4.3919 +10.5622,4.4015 +11.3087,4.411 +11.9904,4.4205 +12.6007,4.4301 +13.1338,4.4396 +13.5846,4.4492 +13.9488,4.4587 +14.223,4.4682 +14.4046,4.4778 +14.4918,4.4873 +14.4837,4.4968 +14.3805,4.5064 +14.1832,4.5159 +13.8936,4.5254 +13.5145,4.535 +13.0495,4.5445 +12.503,4.5541 +11.8802,4.5636 +11.1872,4.5731 +10.4304,4.5827 +9.6171,4.5922 +8.755,4.6017 +7.8524,4.5922 +6.9178,4.5827 +5.9602,4.5731 +4.9887,4.5636 +4.0125,4.5541 +3.041,4.5445 +2.0833,4.535 +1.1487,4.5254 +0.2461,4.5159 +-0.616,4.5064 +-1.4294,4.4968 +-2.1863,4.4873 +-2.8794,4.4778 +-3.5023,4.4682 +-4.0489,4.4587 +-4.514,4.4492 +-4.8932,4.4396 +-5.1829,4.4301 +-5.3804,4.4205 +-5.4837,4.411 +-5.4918,4.4015 +-5.4048,4.3919 +-5.2233,4.3824 +-4.9492,4.3729 +-4.5851,4.3633 +-4.1344,4.3538 +-3.6014,4.3442 +-2.9912,4.3347 +-2.3096,4.3252 +-1.5631,4.3156 +-0.7589,4.3061 +0.0955,4.2966 +0.9918,4.3061 +1.9215,4.3156 +2.8759,4.3252 +3.8457,4.3347 +4.8217,4.3442 +5.7947,4.3538 +6.7553,4.3633 +7.6945,4.3729 +8.6032,4.3824 +9.4728,4.3919 +10.295,4.4015 +11.062,4.411 +11.7665,4.4205 +12.4017,4.4301 +12.9616,4.4396 +13.4409,4.4492 +13.835,4.4587 +14.1401,4.4682 +14.3534,4.4778 +14.4728,4.4873 +14.4971,4.4968 +14.4262,4.5064 +14.2607,4.5159 +14.0022,4.5254 +13.6532,4.535 +13.2169,4.5445 +12.6975,4.5541 +12.1001,4.5636 +11.4302,4.5731 +10.6942,4.5827 +9.8993,4.5922 +9.0529,4.6017 +8.1631,4.5922 +7.2384,4.5827 +6.2876,4.5731 +5.3198,4.5636 +4.3442,4.5541 +3.37,4.5445 +2.4066,4.535 +1.4632,4.5254 +0.5487,4.5159 +-0.3281,4.5064 +-1.159,4.4968 +-1.9359,4.4873 +-2.6515,4.4778 +-3.2989,4.4682 +-3.872,4.4587 +-4.3654,4.4492 +-4.7742,4.4396 +-5.0947,4.4301 +-5.3238,4.4205 +-5.4592,4.411 +-5.4997,4.4015 +-5.445,4.3919 +-5.2955,4.3824 +-5.0526,4.3729 +-4.7187,4.3633 +-4.297,4.3538 +-3.7914,4.3442 +-3.2068,4.3347 +-2.5488,4.3252 +-1.8237,4.3156 +-1.0382,4.3061 +-0.2,4.2966 +0.683,4.3061 +1.6024,4.3156 +2.5494,4.3252 +3.5149,4.3347 +4.4899,4.3442 +5.465,4.3538 +6.4308,4.3633 +7.3783,4.3729 +8.2983,4.3824 +9.1822,4.3919 +10.0214,4.4015 +10.808,4.411 +11.5345,4.4205 +12.194,4.4301 +12.7801,4.4396 +13.2874,4.4492 +13.7109,4.4587 +14.0466,4.4682 +14.2914,4.4778 +14.4429,4.4873 +14.4996,4.4968 +14.461,4.5064 +14.3275,4.5159 +14.1004,4.5254 +13.7817,4.535 +13.3747,4.5445 +12.883,4.5541 +12.3115,4.5636 +11.6656,4.5731 +10.9513,4.5827 +10.1756,4.5922 +9.3458,4.6017 +8.4698,4.6113 +7.556,4.6017 +6.6131,4.5922 +5.65,4.5827 +4.676,4.5731 +3.7003,4.5636 +2.7322,4.5541 +1.781,4.5445 +0.8557,4.535 +-0.0349,4.5254 +-0.8823,4.5159 +-1.6784,4.5064 +-2.4156,4.4968 +-3.0869,4.4873 +-3.686,4.4778 +-4.207,4.4682 +-4.645,4.4587 +-4.9959,4.4492 +-5.2563,4.4396 +-5.4238,4.4301 +-5.4966,4.4205 +-5.4743,4.411 +-5.3568,4.4015 +-5.1455,4.3919 +-4.8422,4.3824 +-4.4499,4.3729 +-3.9723,4.3633 +-3.414,4.3538 +-2.7803,4.3442 +-2.0772,4.3347 +-1.3114,4.3252 +-0.4903,4.3156 +0.3784,4.3061 +1.2864,4.3156 +2.225,4.3252 +3.1853,4.3347 +4.1581,4.3442 +5.1342,4.3538 +6.1042,4.3633 +7.059,4.3729 +7.9893,4.3824 +8.8864,4.3919 +9.7417,4.4015 +10.5471,4.411 +11.2948,4.4205 +11.9778,4.4301 +12.5895,4.4396 +13.1242,4.4492 +13.5766,4.4587 +13.9426,4.4682 +14.2186,4.4778 +14.402,4.4873 +14.491,4.4968 +14.4848,4.5064 +14.3835,4.5159 +14.1879,4.5254 +13.9001,4.535 +13.5227,4.5445 +13.0593,4.5541 +12.5144,4.5636 +11.893,4.5731 +11.2013,4.5827 +10.4456,4.5922 +9.6334,4.6017 +8.7722,4.6113 +7.8703,4.6017 +6.9362,4.5922 +5.979,4.5827 +5.0076,4.5731 +4.0315,4.5636 +3.0598,4.5541 +2.1018,4.5445 +1.1667,4.535 +0.2633,4.5254 +-0.5997,4.5159 +-1.4141,4.5064 +-2.1721,4.4968 +-2.8666,4.4873 +-3.4909,4.4778 +-4.039,4.4682 +-4.5057,4.4587 +-4.8867,4.4492 +-5.1782,4.4396 +-5.3774,4.4301 +-5.4826,4.4205 +-5.4926,4.411 +-5.4074,4.4015 +-5.2277,4.3919 +-4.9554,4.3824 +-4.593,4.3729 +-4.1439,4.3633 +-3.6125,4.3538 +-3.0038,4.3442 +-2.3235,4.3347 +-1.5782,4.3252 +-0.775,4.3156 +0.0784,4.3061 +0.974,4.3156 +1.9032,4.3252 +2.8571,4.3347 +3.8267,4.3442 +4.8027,4.3538 +5.7758,4.3633 +6.7368,4.3729 +7.6765,4.3824 +8.5858,4.3919 +9.4563,4.4015 +10.2795,4.411 +11.0476,4.4205 +11.7534,4.4301 +12.39,4.4396 +12.9515,4.4492 +13.4324,4.4587 +13.8282,4.4682 +14.1351,4.4778 +14.3502,4.4873 +14.4714,4.4968 +14.4976,4.5064 +14.4285,4.5159 +14.2648,4.5254 +14.0081,4.535 +13.6608,4.5445 +13.2262,4.5541 +12.7084,4.5636 +12.1124,4.5731 +11.4439,4.5827 +10.7092,4.5922 +9.9153,4.6017 +9.0698,4.6113 +8.1808,4.6017 +7.2567,4.5922 +6.3063,4.5827 +5.3387,4.5731 +4.3632,4.5636 +3.3889,4.5541 +2.4252,4.5445 +1.4813,4.535 +0.5662,4.5254 +-0.3115,4.5159 +-1.1433,4.5064 +-1.9213,4.4968 +-2.6382,4.4873 +-3.287,4.4778 +-3.8616,4.4682 +-4.3566,4.4587 +-4.7671,4.4492 +-5.0893,4.4396 +-5.3202,4.4301 +-5.4575,4.4205 +-5.4999,4.411 +-5.447,4.4015 +-5.2993,4.3919 +-5.0582,4.3824 +-4.7261,4.3729 +-4.306,4.3633 +-3.802,4.3538 +-3.2189,4.3442 +-2.5623,4.3347 +-1.8384,4.3252 +-1.054,4.3156 +-0.2168,4.3061 +0.6655,4.3156 +1.5842,4.3252 +2.5307,4.3347 +3.496,4.3442 +4.4709,4.3538 +5.4461,4.3633 +6.4122,4.3729 +7.3601,4.3824 +8.2808,4.3919 +9.1654,4.4015 +10.0056,4.411 +10.7933,4.4205 +11.521,4.4301 +12.1818,4.4396 +12.7695,4.4492 +13.2783,4.4587 +13.7035,4.4682 +14.0409,4.4778 +14.2875,4.4873 +14.4408,4.4968 +14.4994,4.5064 +14.4627,4.5159 +14.331,4.5254 +14.1057,4.535 +13.7888,4.5445 +13.3834,4.5541 +12.8934,4.5636 +12.3234,4.5731 +11.6788,4.5827 +10.9658,4.5922 +10.1912,4.6017 +9.3624,4.6113 +8.4872,4.6208 +7.5741,4.6113 +6.6317,4.6017 +5.6689,4.5922 +4.695,4.5827 +3.7192,4.5731 +2.7509,4.5636 +1.7993,4.5541 +0.8734,4.5445 +-0.018,4.535 +-0.8663,4.5254 +-1.6634,4.5159 +-2.4019,4.5064 +-3.0745,4.4968 +-3.675,4.4873 +-4.1976,4.4778 +-4.6373,4.4682 +-4.9899,4.4587 +-5.2521,4.4492 +-5.4214,4.4396 +-5.4961,4.4301 +-5.4756,4.4205 +-5.36,4.411 +-5.1505,4.4015 +-4.849,4.3919 +-4.4584,4.3824 +-3.9824,4.3729 +-3.4256,4.3633 +-2.7933,4.3538 +-2.0915,4.3442 +-1.3269,4.3347 +-0.5067,4.3252 +0.3611,4.3156 +1.2684,4.3252 +2.2065,4.3347 +3.1665,4.3442 +4.1391,4.3538 +5.1152,4.3633 +6.0855,4.3729 +7.0406,4.3824 +7.9715,4.3919 +8.8693,4.4015 +9.7255,4.411 +10.5319,4.4205 +11.2809,4.4301 +11.9652,4.4396 +12.5783,4.4492 +13.1145,4.4587 +13.5686,4.4682 +13.9363,4.4778 +14.2141,4.4873 +14.3993,4.4968 +14.4901,4.5064 +14.4858,4.5159 +14.3863,4.5254 +14.1926,4.535 +13.9066,4.5445 +13.5309,4.5541 +13.0691,4.5636 +12.5257,4.5731 +11.9058,4.5827 +11.2154,4.5922 +10.4609,4.6017 +9.6497,4.6113 +8.7893,4.6208 +7.8881,4.6113 +6.9546,4.6017 +5.9978,4.5922 +5.0266,4.5827 +4.0505,4.5731 +3.0786,4.5636 +2.1202,4.5541 +1.1846,4.5445 +0.2805,4.535 +-0.5834,4.5254 +-1.3988,4.5159 +-2.158,4.5064 +-2.8537,4.4968 +-3.4794,4.4873 +-4.0291,4.4778 +-4.4975,4.4682 +-4.8801,4.4587 +-5.1734,4.4492 +-5.3744,4.4396 +-5.4814,4.4301 +-5.4933,4.4205 +-5.4099,4.411 +-5.2321,4.4015 +-4.9616,4.3919 +-4.6009,4.3824 +-4.1535,4.3729 +-3.6236,4.3633 +-3.0163,4.3538 +-2.3374,4.3442 +-1.5933,4.3347 +-0.7912,4.3252 +0.0614,4.3156 +0.9562,4.3252 +1.8848,4.3347 +2.8384,4.3442 +3.8078,4.3538 +4.7837,4.3633 +5.757,4.3729 +6.7183,4.3824 +7.6584,4.3919 +8.5685,4.4015 +9.4398,4.411 +10.264,4.4205 +11.0333,4.4301 +11.7403,4.4396 +12.3783,4.4492 +12.9413,4.4587 +13.4238,4.4682 +13.8213,4.4778 +14.13,4.4873 +14.3469,4.4968 +14.4699,4.5064 +14.498,4.5159 +14.4308,4.5254 +14.2689,4.535 +14.014,4.5445 +13.6684,4.5541 +13.2354,4.5636 +12.7192,4.5731 +12.1247,4.5827 +11.4575,4.5922 +10.724,4.6017 +9.9312,4.6113 +9.0867,4.6208 +8.1984,4.6113 +7.2749,4.6017 +6.325,4.5922 +5.3577,4.5827 +4.3822,4.5731 +3.4078,4.5636 +2.4438,4.5541 +1.4994,4.5445 +0.5836,4.535 +-0.2948,4.5254 +-1.1276,4.5159 +-1.9068,4.5064 +-2.6249,4.4968 +-3.2751,4.4873 +-3.8512,4.4778 +-4.3477,4.4682 +-4.7599,4.4587 +-5.0839,4.4492 +-5.3166,4.4396 +-5.4557,4.4301 +-5.4999,4.4205 +-5.4489,4.411 +-5.303,4.4015 +-5.0638,4.3919 +-4.7334,4.3824 +-4.315,4.3729 +-3.8126,4.3633 +-3.231,4.3538 +-2.5757,4.3442 +-1.853,4.3347 +-1.0698,4.3252 +-0.2335,4.3156 +0.6479,4.3241 +1.566,4.3336 +2.5121,4.3431 +3.4771,4.3527 +4.4519,4.3622 +5.4271,4.3717 +6.3935,4.3813 +7.3419,4.3908 +8.2632,4.4004 +9.1486,4.4099 +9.9897,4.4194 +10.7785,4.429 +11.5075,4.4385 +12.1697,4.448 +12.7588,4.4576 +13.2692,4.4671 +13.696,4.4766 +14.0352,4.4862 +14.2836,4.4957 +14.4387,4.5053 +14.4991,4.5148 +14.4643,4.5243 +14.3345,4.5339 +14.1109,4.5434 +13.7958,4.5529 +13.3921,4.5625 +12.9037,4.572 +12.3352,4.5816 +11.692,4.5911 +10.9803,4.6006 +10.2068,4.6102 +9.379,4.6197 +8.5047,4.6292 +7.5922,4.6197 +6.6502,4.6102 +5.6878,4.6006 +4.714,4.5911 +3.7382,4.5816 +2.7696,4.572 +1.8176,4.5625 +0.8911,4.5529 +-0.001,4.5434 +-0.8502,4.5339 +-1.6485,4.5243 +-2.3881,4.5148 +-3.0621,4.5053 +-3.6641,4.4957 +-4.1882,4.4862 +-4.6296,4.4766 +-4.9839,4.4671 +-5.2479,4.4576 +-5.419,4.448 +-5.4956,4.4385 +-5.4769,4.429 +-5.3632,4.4194 +-5.1554,4.4099 +-4.8557,4.4004 +-4.4668,4.3908 +-3.9925,4.3813 +-3.4372,4.3717 +-2.8063,4.3622 +-2.1058,4.3527 +-1.3423,4.3431 +-0.5232,4.3336 +0.3439,4.3241 +1.2505,4.3336 +2.188,4.3431 +3.1477,4.3527 +4.1202,4.3622 +5.0963,4.3717 +6.0667,4.3813 +7.0222,4.3908 +7.9537,4.4004 +8.8522,4.4099 +9.7093,4.4194 +10.5168,4.429 +11.2669,4.4385 +11.9525,4.448 +12.5671,4.4576 +13.1049,4.4671 +13.5606,4.4766 +13.93,4.4862 +14.2096,4.4957 +14.3966,4.5053 +14.4893,4.5148 +14.4868,4.5243 +14.3892,4.5339 +14.1973,4.5434 +13.913,4.5529 +13.539,4.5625 +13.0789,4.572 +12.537,4.5816 +11.9186,4.5911 +11.2294,4.6006 +10.4762,4.6102 +9.6659,4.6197 +8.8065,4.6292 +7.906,4.6197 +6.9731,4.6102 +6.0165,4.6006 +5.0456,4.5911 +4.0694,4.5816 +3.0974,4.572 +2.1387,4.5625 +1.2025,4.5529 +0.2977,4.5434 +-0.567,4.5339 +-1.3834,4.5243 +-2.1438,4.5148 +-2.8409,4.5053 +-3.468,4.4957 +-4.0192,4.4862 +-4.4892,4.4766 +-4.8735,4.4671 +-5.1685,4.4576 +-5.3714,4.448 +-5.4802,4.4385 +-5.494,4.429 +-5.4124,4.4194 +-5.2365,4.4099 +-4.9677,4.4004 +-4.6087,4.3908 +-4.163,4.3813 +-3.6346,4.3717 +-3.0288,4.3622 +-2.3512,4.3527 +-1.6084,4.3431 +-0.8073,4.3336 +0.0444,4.3241 +0.9385,4.3336 +1.8665,4.3431 +2.8197,4.3527 +3.7888,4.3622 +4.7647,4.3717 +5.7382,4.3813 +6.6998,4.3908 +7.6404,4.4004 +8.5511,4.4099 +9.4232,4.4194 +10.2485,4.429 +11.0189,4.4385 +11.7272,4.448 +12.3666,4.4576 +12.9311,4.4671 +13.4152,4.4766 +13.8144,4.4862 +14.1248,4.4957 +14.3435,4.5053 +14.4684,4.5148 +14.4983,4.5243 +14.433,4.5339 +14.273,4.5434 +14.0198,4.5529 +13.676,4.5625 +13.2447,4.572 +12.73,4.5816 +12.137,4.5911 +11.4711,4.6006 +10.7389,4.6102 +9.9472,4.6197 +9.1036,4.6292 +8.2161,4.6197 +7.2932,4.6102 +6.3437,4.6006 +5.3766,4.5911 +4.4012,4.5816 +3.4267,4.572 +2.4624,4.5625 +1.5175,4.5529 +0.6011,4.5434 +-0.2782,4.5339 +-1.1119,4.5243 +-1.8922,4.5148 +-2.6115,4.5053 +-3.2631,4.4957 +-3.8407,4.4862 +-4.3388,4.4766 +-4.7527,4.4671 +-5.0785,4.4576 +-5.3129,4.448 +-5.4539,4.4385 +-5.5,4.429 +-5.4508,4.4194 +-5.3068,4.4099 +-5.0693,4.4004 +-4.7407,4.3908 +-4.3239,4.3813 +-3.8231,4.3717 +-3.243,4.3622 +-2.5891,4.3527 +-1.8677,4.3431 +-1.0856,4.3336 +-0.2502,4.3241 +0.6304,4.3159 +1.5479,4.3254 +2.4935,4.3349 +3.4583,4.3445 +4.4329,4.354 +5.4082,4.3636 +6.3749,4.3731 +7.3237,4.3826 +8.2456,4.3922 +9.1317,4.4017 +9.9738,4.4112 +10.7637,4.4208 +11.4939,4.4303 +12.1574,4.4399 +12.748,4.4494 +13.26,4.4589 +13.6885,4.4685 +14.0295,4.478 +14.2796,4.4875 +14.4366,4.4971 +14.4989,4.5066 +14.4659,4.5161 +14.3379,4.5257 +14.1162,4.5352 +13.8028,4.5448 +13.4008,4.5543 +12.914,4.5638 +12.347,4.5734 +11.7052,4.5829 +10.9948,4.5924 +10.2224,4.602 +9.3956,4.6115 +8.5221,4.621 +7.6102,4.6115 +6.6688,4.602 +5.7066,4.5924 +4.733,4.5829 +3.7571,4.5734 +2.7883,4.5638 +1.8359,4.5543 +0.9088,4.5448 +0.0159,4.5352 +-0.8342,4.5257 +-1.6335,4.5161 +-2.3743,4.5066 +-3.0497,4.4971 +-3.6531,4.4875 +-4.1788,4.478 +-4.6218,4.4685 +-4.9779,4.4589 +-5.2437,4.4494 +-5.4166,4.4399 +-5.495,4.4303 +-5.4782,4.4208 +-5.3663,4.4112 +-5.1604,4.4017 +-4.8624,4.3922 +-4.4752,4.3826 +-4.0025,4.3731 +-3.4487,4.3636 +-2.8193,4.354 +-2.12,4.3445 +-1.3577,4.3349 +-0.5396,4.3254 +0.3266,4.3159 +1.2325,4.3254 +2.1696,4.3349 +3.1288,4.3445 +4.1012,4.354 +5.0773,4.3636 +6.0479,4.3731 +7.0038,4.3826 +7.9359,4.3922 +8.8351,4.4017 +9.6931,4.4112 +10.5016,4.4208 +11.2529,4.4303 +11.9398,4.4399 +12.5559,4.4494 +13.0952,4.4589 +13.5526,4.4685 +13.9237,4.478 +14.205,4.4875 +14.3938,4.4971 +14.4884,4.5066 +14.4878,4.5161 +14.392,4.5257 +14.2019,4.5352 +13.9194,4.5448 +13.5471,4.5543 +13.0886,4.5638 +12.5483,4.5734 +11.9313,4.5829 +11.2435,4.5924 +10.4914,4.602 +9.6822,4.6115 +8.8236,4.621 +7.9239,4.6115 +6.9915,4.602 +6.0353,4.5924 +5.0646,4.5829 +4.0884,4.5734 +3.1162,4.5638 +2.1572,4.5543 +1.2204,4.5448 +0.315,4.5352 +-0.5506,4.5257 +-1.3681,4.5161 +-2.1296,4.5066 +-2.8279,4.4971 +-3.4565,4.4875