├── .cargo └── config.toml ├── .github └── workflows │ └── rust.yml ├── .gitignore ├── .vscode └── launch.json ├── Cargo.lock ├── Cargo.toml ├── README.md ├── bundler.toml ├── src ├── Scrollscope.ini ├── lib.rs ├── main.rs ├── scrollscope_gui.rs └── slim_checkbox.rs └── xtask ├── Cargo.toml └── src └── main.rs /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [alias] 2 | xtask = "run --package xtask --release --" 3 | -------------------------------------------------------------------------------- /.github/workflows/rust.yml: -------------------------------------------------------------------------------- 1 | name: rust 2 | 3 | on: 4 | push: 5 | branches: '**' 6 | pull_request: 7 | branches: '**' 8 | 9 | env: 10 | CARGO_TERM_COLOR: always 11 | 12 | jobs: 13 | build_mac_m1: 14 | runs-on: macos-latest 15 | steps: 16 | - uses: actions/checkout@v3 17 | - name: Run bundler 18 | run: cargo xtask bundle scrollscope --profile release 19 | - uses: actions/upload-artifact@v4 20 | with: 21 | name: macos_m1_build 22 | path: target/bundled/* 23 | if-no-files-found: warn 24 | build_macos: 25 | runs-on: macos-13 26 | steps: 27 | - uses: actions/checkout@v3 28 | - name: Run bundler 29 | run: cargo xtask bundle scrollscope --profile release 30 | - uses: actions/upload-artifact@v4 31 | with: 32 | name: macos_build 33 | path: target/bundled/* 34 | if-no-files-found: warn 35 | build_linux: 36 | runs-on: ubuntu-latest 37 | steps: 38 | - uses: ConorMacBride/install-package@v1.1.0 39 | with: 40 | apt: libgl1-mesa-dev libglu1-mesa-dev libxcursor-dev libxkbcommon-x11-dev libatk1.0-dev build-essential libgtk-3-dev libxcb-dri2-0-dev libxcb-icccm4-dev libx11-xcb-dev libasound2-dev libjack-dev 41 | - uses: actions/checkout@v3 42 | - name: Run bundler 43 | run: cargo xtask bundle scrollscope --profile release 44 | - uses: actions/upload-artifact@v4 45 | with: 46 | name: linux_build 47 | path: target/bundled/* 48 | if-no-files-found: warn 49 | build_windows: 50 | runs-on: windows-latest 51 | steps: 52 | - uses: actions/checkout@v3 53 | - name: Run bundler 54 | run: cargo xtask bundle scrollscope --profile release 55 | - uses: actions/upload-artifact@v4 56 | with: 57 | name: windows_build 58 | path: target/bundled/* 59 | if-no-files-found: warn -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | *.wav 3 | *.txt 4 | *.zip 5 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "cppvsdbg", 9 | "request": "attach", 10 | "name": "Debug the plugin inside a DAW", 11 | "processId": "${command:pickProcess}", 12 | "internalConsoleOptions": "openOnSessionStart", 13 | "symbolOptions": { 14 | "searchPaths": ["${workspaceFolder}/target/debug", "${workspaceFolder}/target/profiling"], 15 | "searchMicrosoftSymbolServer": false 16 | } 17 | }, 18 | { 19 | "type": "lldb", 20 | "request": "launch", 21 | "name": "Debug executable 'xtask'", 22 | "cargo": { 23 | "args": [ 24 | "build", 25 | "--bin=xtask", 26 | "--package=xtask" 27 | ], 28 | "filter": { 29 | "name": "xtask", 30 | "kind": "bin" 31 | } 32 | }, 33 | "args": [], 34 | "cwd": "${workspaceFolder}" 35 | }, 36 | { 37 | "type": "lldb", 38 | "request": "launch", 39 | "name": "Debug unit tests in executable 'xtask'", 40 | "cargo": { 41 | "args": [ 42 | "test", 43 | "--no-run", 44 | "--bin=xtask", 45 | "--package=xtask" 46 | ], 47 | "filter": { 48 | "name": "xtask", 49 | "kind": "bin" 50 | } 51 | }, 52 | "args": [], 53 | "cwd": "${workspaceFolder}" 54 | }, 55 | { 56 | "type": "lldb", 57 | "request": "launch", 58 | "name": "Debug unit tests in library 'Subhoofer'", 59 | "cargo": { 60 | "args": [ 61 | "test", 62 | "--no-run", 63 | "--lib", 64 | "--package=Subhoofer" 65 | ], 66 | "filter": { 67 | "name": "Subhoofer", 68 | "kind": "lib" 69 | } 70 | }, 71 | "args": [], 72 | "cwd": "${workspaceFolder}" 73 | } 74 | ] 75 | } -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "ab_glyph" 7 | version = "0.2.29" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" 10 | dependencies = [ 11 | "ab_glyph_rasterizer", 12 | "owned_ttf_parser", 13 | ] 14 | 15 | [[package]] 16 | name = "ab_glyph_rasterizer" 17 | version = "0.1.8" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" 20 | 21 | [[package]] 22 | name = "addr2line" 23 | version = "0.24.2" 24 | source = "registry+https://github.com/rust-lang/crates.io-index" 25 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 26 | dependencies = [ 27 | "gimli", 28 | ] 29 | 30 | [[package]] 31 | name = "adler2" 32 | version = "2.0.0" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 35 | 36 | [[package]] 37 | name = "ahash" 38 | version = "0.8.11" 39 | source = "registry+https://github.com/rust-lang/crates.io-index" 40 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 41 | dependencies = [ 42 | "cfg-if", 43 | "getrandom", 44 | "once_cell", 45 | "version_check", 46 | "zerocopy", 47 | ] 48 | 49 | [[package]] 50 | name = "aho-corasick" 51 | version = "1.1.3" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 54 | dependencies = [ 55 | "memchr", 56 | ] 57 | 58 | [[package]] 59 | name = "alsa" 60 | version = "0.7.1" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "e2562ad8dcf0f789f65c6fdaad8a8a9708ed6b488e649da28c01656ad66b8b47" 63 | dependencies = [ 64 | "alsa-sys", 65 | "bitflags 1.3.2", 66 | "libc", 67 | "nix 0.24.3", 68 | ] 69 | 70 | [[package]] 71 | name = "alsa" 72 | version = "0.9.1" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" 75 | dependencies = [ 76 | "alsa-sys", 77 | "bitflags 2.9.0", 78 | "cfg-if", 79 | "libc", 80 | ] 81 | 82 | [[package]] 83 | name = "alsa-sys" 84 | version = "0.3.1" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" 87 | dependencies = [ 88 | "libc", 89 | "pkg-config", 90 | ] 91 | 92 | [[package]] 93 | name = "anstream" 94 | version = "0.6.18" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 97 | dependencies = [ 98 | "anstyle", 99 | "anstyle-parse", 100 | "anstyle-query", 101 | "anstyle-wincon", 102 | "colorchoice", 103 | "is_terminal_polyfill", 104 | "utf8parse", 105 | ] 106 | 107 | [[package]] 108 | name = "anstyle" 109 | version = "1.0.10" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 112 | 113 | [[package]] 114 | name = "anstyle-parse" 115 | version = "0.2.6" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 118 | dependencies = [ 119 | "utf8parse", 120 | ] 121 | 122 | [[package]] 123 | name = "anstyle-query" 124 | version = "1.1.2" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 127 | dependencies = [ 128 | "windows-sys 0.59.0", 129 | ] 130 | 131 | [[package]] 132 | name = "anstyle-wincon" 133 | version = "3.0.7" 134 | source = "registry+https://github.com/rust-lang/crates.io-index" 135 | checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 136 | dependencies = [ 137 | "anstyle", 138 | "once_cell", 139 | "windows-sys 0.59.0", 140 | ] 141 | 142 | [[package]] 143 | name = "anyhow" 144 | version = "1.0.97" 145 | source = "registry+https://github.com/rust-lang/crates.io-index" 146 | checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" 147 | 148 | [[package]] 149 | name = "anymap" 150 | version = "0.12.1" 151 | source = "registry+https://github.com/rust-lang/crates.io-index" 152 | checksum = "33954243bd79057c2de7338850b85983a44588021f8a5fee574a8888c6de4344" 153 | 154 | [[package]] 155 | name = "assert_no_alloc" 156 | version = "1.1.2" 157 | source = "git+https://github.com/robbert-vdh/rust-assert-no-alloc.git?branch=feature%2Fnested-permit-forbid#a6fb4f62b9624715291e320ea5f0f70e73b035cf" 158 | dependencies = [ 159 | "backtrace", 160 | "log", 161 | ] 162 | 163 | [[package]] 164 | name = "atomic_float" 165 | version = "0.1.0" 166 | source = "registry+https://github.com/rust-lang/crates.io-index" 167 | checksum = "62af46d040ba9df09edc6528dae9d8e49f5f3e82f55b7d2ec31a733c38dbc49d" 168 | 169 | [[package]] 170 | name = "atomic_refcell" 171 | version = "0.1.13" 172 | source = "registry+https://github.com/rust-lang/crates.io-index" 173 | checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" 174 | 175 | [[package]] 176 | name = "atty" 177 | version = "0.2.14" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 180 | dependencies = [ 181 | "hermit-abi", 182 | "libc", 183 | "winapi", 184 | ] 185 | 186 | [[package]] 187 | name = "autocfg" 188 | version = "1.4.0" 189 | source = "registry+https://github.com/rust-lang/crates.io-index" 190 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 191 | 192 | [[package]] 193 | name = "backtrace" 194 | version = "0.3.74" 195 | source = "registry+https://github.com/rust-lang/crates.io-index" 196 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 197 | dependencies = [ 198 | "addr2line", 199 | "cfg-if", 200 | "libc", 201 | "miniz_oxide", 202 | "object", 203 | "rustc-demangle", 204 | "windows-targets 0.52.6", 205 | ] 206 | 207 | [[package]] 208 | name = "baseview" 209 | version = "0.1.0" 210 | source = "git+https://github.com/RustAudio/baseview.git?rev=7001c2521fa1a439a01967cb881b411cd75d9ee0#7001c2521fa1a439a01967cb881b411cd75d9ee0" 211 | dependencies = [ 212 | "cocoa", 213 | "core-foundation", 214 | "keyboard-types", 215 | "nix 0.22.3", 216 | "objc", 217 | "raw-window-handle", 218 | "uuid", 219 | "winapi", 220 | "x11", 221 | "xcb", 222 | "xcb-util", 223 | ] 224 | 225 | [[package]] 226 | name = "baseview" 227 | version = "0.1.0" 228 | source = "git+https://github.com/RustAudio/baseview.git?rev=eae4033e7d2cc9c31ccaa2794d5d08eedf2f510c#eae4033e7d2cc9c31ccaa2794d5d08eedf2f510c" 229 | dependencies = [ 230 | "cocoa", 231 | "core-foundation", 232 | "keyboard-types", 233 | "nix 0.22.3", 234 | "objc", 235 | "raw-window-handle", 236 | "uuid", 237 | "winapi", 238 | "x11", 239 | "xcb", 240 | "xcb-util", 241 | ] 242 | 243 | [[package]] 244 | name = "bindgen" 245 | version = "0.70.1" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" 248 | dependencies = [ 249 | "bitflags 2.9.0", 250 | "cexpr", 251 | "clang-sys", 252 | "itertools 0.13.0", 253 | "proc-macro2", 254 | "quote", 255 | "regex", 256 | "rustc-hash", 257 | "shlex", 258 | "syn 2.0.99", 259 | ] 260 | 261 | [[package]] 262 | name = "bitflags" 263 | version = "1.3.2" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 266 | 267 | [[package]] 268 | name = "bitflags" 269 | version = "2.9.0" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 272 | 273 | [[package]] 274 | name = "block" 275 | version = "0.1.6" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 278 | 279 | [[package]] 280 | name = "bumpalo" 281 | version = "3.17.0" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 284 | 285 | [[package]] 286 | name = "bytemuck" 287 | version = "1.22.0" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" 290 | dependencies = [ 291 | "bytemuck_derive", 292 | ] 293 | 294 | [[package]] 295 | name = "bytemuck_derive" 296 | version = "1.8.1" 297 | source = "registry+https://github.com/rust-lang/crates.io-index" 298 | checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" 299 | dependencies = [ 300 | "proc-macro2", 301 | "quote", 302 | "syn 2.0.99", 303 | ] 304 | 305 | [[package]] 306 | name = "bytes" 307 | version = "1.10.0" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" 310 | 311 | [[package]] 312 | name = "cache-padded" 313 | version = "1.3.0" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "981520c98f422fcc584dc1a95c334e6953900b9106bc47a9839b81790009eb21" 316 | 317 | [[package]] 318 | name = "camino" 319 | version = "1.1.9" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" 322 | dependencies = [ 323 | "serde", 324 | ] 325 | 326 | [[package]] 327 | name = "cargo-platform" 328 | version = "0.1.9" 329 | source = "registry+https://github.com/rust-lang/crates.io-index" 330 | checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" 331 | dependencies = [ 332 | "serde", 333 | ] 334 | 335 | [[package]] 336 | name = "cargo_metadata" 337 | version = "0.18.1" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" 340 | dependencies = [ 341 | "camino", 342 | "cargo-platform", 343 | "semver", 344 | "serde", 345 | "serde_json", 346 | "thiserror", 347 | ] 348 | 349 | [[package]] 350 | name = "cc" 351 | version = "1.2.16" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" 354 | dependencies = [ 355 | "jobserver", 356 | "libc", 357 | "shlex", 358 | ] 359 | 360 | [[package]] 361 | name = "cesu8" 362 | version = "1.1.0" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 365 | 366 | [[package]] 367 | name = "cexpr" 368 | version = "0.6.0" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 371 | dependencies = [ 372 | "nom", 373 | ] 374 | 375 | [[package]] 376 | name = "cfg-if" 377 | version = "1.0.0" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 380 | 381 | [[package]] 382 | name = "clang-sys" 383 | version = "1.8.1" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 386 | dependencies = [ 387 | "glob", 388 | "libc", 389 | "libloading 0.8.6", 390 | ] 391 | 392 | [[package]] 393 | name = "clap" 394 | version = "4.5.31" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" 397 | dependencies = [ 398 | "clap_builder", 399 | "clap_derive", 400 | ] 401 | 402 | [[package]] 403 | name = "clap-sys" 404 | version = "0.3.0" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "27f4e06657d33d5d194db1155cef359c359483a4170362bf4e105146dd0109e3" 407 | 408 | [[package]] 409 | name = "clap_builder" 410 | version = "4.5.31" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" 413 | dependencies = [ 414 | "anstream", 415 | "anstyle", 416 | "clap_lex", 417 | "strsim", 418 | "terminal_size", 419 | ] 420 | 421 | [[package]] 422 | name = "clap_derive" 423 | version = "4.5.28" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" 426 | dependencies = [ 427 | "heck", 428 | "proc-macro2", 429 | "quote", 430 | "syn 2.0.99", 431 | ] 432 | 433 | [[package]] 434 | name = "clap_lex" 435 | version = "0.7.4" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 438 | 439 | [[package]] 440 | name = "clipboard-win" 441 | version = "3.1.1" 442 | source = "registry+https://github.com/rust-lang/crates.io-index" 443 | checksum = "9fdf5e01086b6be750428ba4a40619f847eb2e95756eee84b18e06e5f0b50342" 444 | dependencies = [ 445 | "lazy-bytes-cast", 446 | "winapi", 447 | ] 448 | 449 | [[package]] 450 | name = "cocoa" 451 | version = "0.24.1" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" 454 | dependencies = [ 455 | "bitflags 1.3.2", 456 | "block", 457 | "cocoa-foundation", 458 | "core-foundation", 459 | "core-graphics", 460 | "foreign-types", 461 | "libc", 462 | "objc", 463 | ] 464 | 465 | [[package]] 466 | name = "cocoa-foundation" 467 | version = "0.1.2" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" 470 | dependencies = [ 471 | "bitflags 1.3.2", 472 | "block", 473 | "core-foundation", 474 | "core-graphics-types", 475 | "libc", 476 | "objc", 477 | ] 478 | 479 | [[package]] 480 | name = "colorchoice" 481 | version = "1.0.3" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 484 | 485 | [[package]] 486 | name = "combine" 487 | version = "4.6.7" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 490 | dependencies = [ 491 | "bytes", 492 | "memchr", 493 | ] 494 | 495 | [[package]] 496 | name = "configparser" 497 | version = "3.1.0" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "e57e3272f0190c3f1584272d613719ba5fc7df7f4942fe542e63d949cf3a649b" 500 | 501 | [[package]] 502 | name = "copypasta" 503 | version = "0.8.2" 504 | source = "registry+https://github.com/rust-lang/crates.io-index" 505 | checksum = "133fc8675ee3a4ec9aa513584deda9aa0faeda3586b87f7f0f2ba082c66fb172" 506 | dependencies = [ 507 | "clipboard-win", 508 | "objc", 509 | "objc-foundation", 510 | "objc_id", 511 | "smithay-clipboard", 512 | "x11-clipboard", 513 | ] 514 | 515 | [[package]] 516 | name = "core-foundation" 517 | version = "0.9.4" 518 | source = "registry+https://github.com/rust-lang/crates.io-index" 519 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 520 | dependencies = [ 521 | "core-foundation-sys", 522 | "libc", 523 | ] 524 | 525 | [[package]] 526 | name = "core-foundation-sys" 527 | version = "0.8.7" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 530 | 531 | [[package]] 532 | name = "core-graphics" 533 | version = "0.22.3" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" 536 | dependencies = [ 537 | "bitflags 1.3.2", 538 | "core-foundation", 539 | "core-graphics-types", 540 | "foreign-types", 541 | "libc", 542 | ] 543 | 544 | [[package]] 545 | name = "core-graphics-types" 546 | version = "0.1.3" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" 549 | dependencies = [ 550 | "bitflags 1.3.2", 551 | "core-foundation", 552 | "libc", 553 | ] 554 | 555 | [[package]] 556 | name = "coreaudio-rs" 557 | version = "0.11.3" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" 560 | dependencies = [ 561 | "bitflags 1.3.2", 562 | "core-foundation-sys", 563 | "coreaudio-sys", 564 | ] 565 | 566 | [[package]] 567 | name = "coreaudio-sys" 568 | version = "0.2.16" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "2ce857aa0b77d77287acc1ac3e37a05a8c95a2af3647d23b15f263bdaeb7562b" 571 | dependencies = [ 572 | "bindgen", 573 | ] 574 | 575 | [[package]] 576 | name = "coremidi" 577 | version = "0.6.0" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "1a7847ca018a67204508b77cb9e6de670125075f7464fff5f673023378fa34f5" 580 | dependencies = [ 581 | "core-foundation", 582 | "core-foundation-sys", 583 | "coremidi-sys", 584 | ] 585 | 586 | [[package]] 587 | name = "coremidi-sys" 588 | version = "3.1.1" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "709d142e542467e028d5dc5f0374392339ab7dead0c48c129504de2ccd667e1b" 591 | dependencies = [ 592 | "core-foundation-sys", 593 | ] 594 | 595 | [[package]] 596 | name = "cpal" 597 | version = "0.15.3" 598 | source = "registry+https://github.com/rust-lang/crates.io-index" 599 | checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" 600 | dependencies = [ 601 | "alsa 0.9.1", 602 | "core-foundation-sys", 603 | "coreaudio-rs", 604 | "dasp_sample", 605 | "jni", 606 | "js-sys", 607 | "libc", 608 | "mach2", 609 | "ndk", 610 | "ndk-context", 611 | "oboe", 612 | "wasm-bindgen", 613 | "wasm-bindgen-futures", 614 | "web-sys", 615 | "windows 0.54.0", 616 | ] 617 | 618 | [[package]] 619 | name = "crossbeam" 620 | version = "0.8.4" 621 | source = "registry+https://github.com/rust-lang/crates.io-index" 622 | checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" 623 | dependencies = [ 624 | "crossbeam-channel", 625 | "crossbeam-deque", 626 | "crossbeam-epoch", 627 | "crossbeam-queue", 628 | "crossbeam-utils", 629 | ] 630 | 631 | [[package]] 632 | name = "crossbeam-channel" 633 | version = "0.5.14" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" 636 | dependencies = [ 637 | "crossbeam-utils", 638 | ] 639 | 640 | [[package]] 641 | name = "crossbeam-deque" 642 | version = "0.8.6" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 645 | dependencies = [ 646 | "crossbeam-epoch", 647 | "crossbeam-utils", 648 | ] 649 | 650 | [[package]] 651 | name = "crossbeam-epoch" 652 | version = "0.9.18" 653 | source = "registry+https://github.com/rust-lang/crates.io-index" 654 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 655 | dependencies = [ 656 | "crossbeam-utils", 657 | ] 658 | 659 | [[package]] 660 | name = "crossbeam-queue" 661 | version = "0.3.12" 662 | source = "registry+https://github.com/rust-lang/crates.io-index" 663 | checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 664 | dependencies = [ 665 | "crossbeam-utils", 666 | ] 667 | 668 | [[package]] 669 | name = "crossbeam-utils" 670 | version = "0.8.21" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 673 | 674 | [[package]] 675 | name = "cty" 676 | version = "0.2.2" 677 | source = "registry+https://github.com/rust-lang/crates.io-index" 678 | checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" 679 | 680 | [[package]] 681 | name = "dasp_sample" 682 | version = "0.11.0" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" 685 | 686 | [[package]] 687 | name = "deranged" 688 | version = "0.3.11" 689 | source = "registry+https://github.com/rust-lang/crates.io-index" 690 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 691 | dependencies = [ 692 | "powerfmt", 693 | ] 694 | 695 | [[package]] 696 | name = "dirs" 697 | version = "5.0.1" 698 | source = "registry+https://github.com/rust-lang/crates.io-index" 699 | checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" 700 | dependencies = [ 701 | "dirs-sys", 702 | ] 703 | 704 | [[package]] 705 | name = "dirs-sys" 706 | version = "0.4.1" 707 | source = "registry+https://github.com/rust-lang/crates.io-index" 708 | checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 709 | dependencies = [ 710 | "libc", 711 | "option-ext", 712 | "redox_users", 713 | "windows-sys 0.48.0", 714 | ] 715 | 716 | [[package]] 717 | name = "dlib" 718 | version = "0.5.2" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 721 | dependencies = [ 722 | "libloading 0.8.6", 723 | ] 724 | 725 | [[package]] 726 | name = "downcast-rs" 727 | version = "1.2.1" 728 | source = "registry+https://github.com/rust-lang/crates.io-index" 729 | checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" 730 | 731 | [[package]] 732 | name = "egui" 733 | version = "0.19.0" 734 | source = "registry+https://github.com/rust-lang/crates.io-index" 735 | checksum = "fc9fcd393c3daaaf5909008a1d948319d538b79c51871e4df0993260260a94e4" 736 | dependencies = [ 737 | "ahash", 738 | "epaint", 739 | "nohash-hasher", 740 | ] 741 | 742 | [[package]] 743 | name = "egui-baseview" 744 | version = "0.1.0" 745 | source = "git+https://github.com/BillyDM/egui-baseview.git?rev=46e21cc11c57c705fb83611389399ec3d2670a44#46e21cc11c57c705fb83611389399ec3d2670a44" 746 | dependencies = [ 747 | "baseview 0.1.0 (git+https://github.com/RustAudio/baseview.git?rev=eae4033e7d2cc9c31ccaa2794d5d08eedf2f510c)", 748 | "copypasta", 749 | "egui", 750 | "egui_glow", 751 | "keyboard-types", 752 | "raw-window-handle", 753 | ] 754 | 755 | [[package]] 756 | name = "egui_glow" 757 | version = "0.19.0" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | checksum = "ad77d4a00402bae9658ee64be148f4b2a0b38e4fc7874970575ca01ed1c5b75d" 760 | dependencies = [ 761 | "bytemuck", 762 | "egui", 763 | "glow", 764 | "memoffset", 765 | "tracing", 766 | "wasm-bindgen", 767 | "web-sys", 768 | ] 769 | 770 | [[package]] 771 | name = "either" 772 | version = "1.14.0" 773 | source = "registry+https://github.com/rust-lang/crates.io-index" 774 | checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" 775 | 776 | [[package]] 777 | name = "emath" 778 | version = "0.19.0" 779 | source = "registry+https://github.com/rust-lang/crates.io-index" 780 | checksum = "9542a40106fdba943a055f418d1746a050e1a903a049b030c2b097d4686a33cf" 781 | dependencies = [ 782 | "bytemuck", 783 | ] 784 | 785 | [[package]] 786 | name = "epaint" 787 | version = "0.19.0" 788 | source = "registry+https://github.com/rust-lang/crates.io-index" 789 | checksum = "5ba04741be7f6602b1a1b28f1082cce45948a7032961c52814f8946b28493300" 790 | dependencies = [ 791 | "ab_glyph", 792 | "ahash", 793 | "atomic_refcell", 794 | "bytemuck", 795 | "emath", 796 | "nohash-hasher", 797 | "parking_lot", 798 | ] 799 | 800 | [[package]] 801 | name = "equivalent" 802 | version = "1.0.2" 803 | source = "registry+https://github.com/rust-lang/crates.io-index" 804 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 805 | 806 | [[package]] 807 | name = "errno" 808 | version = "0.3.10" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 811 | dependencies = [ 812 | "libc", 813 | "windows-sys 0.59.0", 814 | ] 815 | 816 | [[package]] 817 | name = "foreign-types" 818 | version = "0.3.2" 819 | source = "registry+https://github.com/rust-lang/crates.io-index" 820 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 821 | dependencies = [ 822 | "foreign-types-shared", 823 | ] 824 | 825 | [[package]] 826 | name = "foreign-types-shared" 827 | version = "0.1.1" 828 | source = "registry+https://github.com/rust-lang/crates.io-index" 829 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 830 | 831 | [[package]] 832 | name = "gethostname" 833 | version = "0.2.3" 834 | source = "registry+https://github.com/rust-lang/crates.io-index" 835 | checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" 836 | dependencies = [ 837 | "libc", 838 | "winapi", 839 | ] 840 | 841 | [[package]] 842 | name = "getrandom" 843 | version = "0.2.15" 844 | source = "registry+https://github.com/rust-lang/crates.io-index" 845 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 846 | dependencies = [ 847 | "cfg-if", 848 | "libc", 849 | "wasi", 850 | ] 851 | 852 | [[package]] 853 | name = "gimli" 854 | version = "0.31.1" 855 | source = "registry+https://github.com/rust-lang/crates.io-index" 856 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 857 | 858 | [[package]] 859 | name = "glob" 860 | version = "0.3.2" 861 | source = "registry+https://github.com/rust-lang/crates.io-index" 862 | checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 863 | 864 | [[package]] 865 | name = "glow" 866 | version = "0.11.2" 867 | source = "registry+https://github.com/rust-lang/crates.io-index" 868 | checksum = "d8bd5877156a19b8ac83a29b2306fe20537429d318f3ff0a1a2119f8d9c61919" 869 | dependencies = [ 870 | "js-sys", 871 | "slotmap", 872 | "wasm-bindgen", 873 | "web-sys", 874 | ] 875 | 876 | [[package]] 877 | name = "goblin" 878 | version = "0.6.1" 879 | source = "registry+https://github.com/rust-lang/crates.io-index" 880 | checksum = "0d6b4de4a8eb6c46a8c77e1d3be942cb9a8bf073c22374578e5ba4b08ed0ff68" 881 | dependencies = [ 882 | "log", 883 | "plain", 884 | "scroll", 885 | ] 886 | 887 | [[package]] 888 | name = "hashbrown" 889 | version = "0.15.2" 890 | source = "registry+https://github.com/rust-lang/crates.io-index" 891 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 892 | 893 | [[package]] 894 | name = "heck" 895 | version = "0.5.0" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 898 | 899 | [[package]] 900 | name = "hermit-abi" 901 | version = "0.1.19" 902 | source = "registry+https://github.com/rust-lang/crates.io-index" 903 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 904 | dependencies = [ 905 | "libc", 906 | ] 907 | 908 | [[package]] 909 | name = "indexmap" 910 | version = "2.7.1" 911 | source = "registry+https://github.com/rust-lang/crates.io-index" 912 | checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" 913 | dependencies = [ 914 | "equivalent", 915 | "hashbrown", 916 | ] 917 | 918 | [[package]] 919 | name = "is_terminal_polyfill" 920 | version = "1.70.1" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 923 | 924 | [[package]] 925 | name = "itertools" 926 | version = "0.12.1" 927 | source = "registry+https://github.com/rust-lang/crates.io-index" 928 | checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 929 | dependencies = [ 930 | "either", 931 | ] 932 | 933 | [[package]] 934 | name = "itertools" 935 | version = "0.13.0" 936 | source = "registry+https://github.com/rust-lang/crates.io-index" 937 | checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 938 | dependencies = [ 939 | "either", 940 | ] 941 | 942 | [[package]] 943 | name = "itoa" 944 | version = "1.0.14" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 947 | 948 | [[package]] 949 | name = "jack" 950 | version = "0.11.4" 951 | source = "registry+https://github.com/rust-lang/crates.io-index" 952 | checksum = "0e5a18a3c2aefb354fb77111ade228b20267bdc779de84e7a4ccf7ea96b9a6cd" 953 | dependencies = [ 954 | "bitflags 1.3.2", 955 | "jack-sys", 956 | "lazy_static", 957 | "libc", 958 | "log", 959 | ] 960 | 961 | [[package]] 962 | name = "jack-sys" 963 | version = "0.5.1" 964 | source = "registry+https://github.com/rust-lang/crates.io-index" 965 | checksum = "6013b7619b95a22b576dfb43296faa4ecbe40abbdb97dfd22ead520775fc86ab" 966 | dependencies = [ 967 | "bitflags 1.3.2", 968 | "lazy_static", 969 | "libc", 970 | "libloading 0.7.4", 971 | "log", 972 | "pkg-config", 973 | ] 974 | 975 | [[package]] 976 | name = "jni" 977 | version = "0.21.1" 978 | source = "registry+https://github.com/rust-lang/crates.io-index" 979 | checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" 980 | dependencies = [ 981 | "cesu8", 982 | "cfg-if", 983 | "combine", 984 | "jni-sys", 985 | "log", 986 | "thiserror", 987 | "walkdir", 988 | "windows-sys 0.45.0", 989 | ] 990 | 991 | [[package]] 992 | name = "jni-sys" 993 | version = "0.3.0" 994 | source = "registry+https://github.com/rust-lang/crates.io-index" 995 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 996 | 997 | [[package]] 998 | name = "jobserver" 999 | version = "0.1.32" 1000 | source = "registry+https://github.com/rust-lang/crates.io-index" 1001 | checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" 1002 | dependencies = [ 1003 | "libc", 1004 | ] 1005 | 1006 | [[package]] 1007 | name = "js-sys" 1008 | version = "0.3.77" 1009 | source = "registry+https://github.com/rust-lang/crates.io-index" 1010 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1011 | dependencies = [ 1012 | "once_cell", 1013 | "wasm-bindgen", 1014 | ] 1015 | 1016 | [[package]] 1017 | name = "keyboard-types" 1018 | version = "0.6.2" 1019 | source = "registry+https://github.com/rust-lang/crates.io-index" 1020 | checksum = "0b7668b7cff6a51fe61cdde64cd27c8a220786f399501b57ebe36f7d8112fd68" 1021 | dependencies = [ 1022 | "bitflags 1.3.2", 1023 | ] 1024 | 1025 | [[package]] 1026 | name = "lazy-bytes-cast" 1027 | version = "5.0.1" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | checksum = "10257499f089cd156ad82d0a9cd57d9501fa2c989068992a97eb3c27836f206b" 1030 | 1031 | [[package]] 1032 | name = "lazy_static" 1033 | version = "1.5.0" 1034 | source = "registry+https://github.com/rust-lang/crates.io-index" 1035 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1036 | 1037 | [[package]] 1038 | name = "libc" 1039 | version = "0.2.170" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" 1042 | 1043 | [[package]] 1044 | name = "libloading" 1045 | version = "0.7.4" 1046 | source = "registry+https://github.com/rust-lang/crates.io-index" 1047 | checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" 1048 | dependencies = [ 1049 | "cfg-if", 1050 | "winapi", 1051 | ] 1052 | 1053 | [[package]] 1054 | name = "libloading" 1055 | version = "0.8.6" 1056 | source = "registry+https://github.com/rust-lang/crates.io-index" 1057 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 1058 | dependencies = [ 1059 | "cfg-if", 1060 | "windows-targets 0.52.6", 1061 | ] 1062 | 1063 | [[package]] 1064 | name = "libredox" 1065 | version = "0.1.3" 1066 | source = "registry+https://github.com/rust-lang/crates.io-index" 1067 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 1068 | dependencies = [ 1069 | "bitflags 2.9.0", 1070 | "libc", 1071 | ] 1072 | 1073 | [[package]] 1074 | name = "linux-raw-sys" 1075 | version = "0.4.15" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 1078 | 1079 | [[package]] 1080 | name = "lock_api" 1081 | version = "0.4.12" 1082 | source = "registry+https://github.com/rust-lang/crates.io-index" 1083 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1084 | dependencies = [ 1085 | "autocfg", 1086 | "scopeguard", 1087 | ] 1088 | 1089 | [[package]] 1090 | name = "log" 1091 | version = "0.4.26" 1092 | source = "registry+https://github.com/rust-lang/crates.io-index" 1093 | checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" 1094 | 1095 | [[package]] 1096 | name = "mach2" 1097 | version = "0.4.2" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" 1100 | dependencies = [ 1101 | "libc", 1102 | ] 1103 | 1104 | [[package]] 1105 | name = "malloc_buf" 1106 | version = "0.0.6" 1107 | source = "registry+https://github.com/rust-lang/crates.io-index" 1108 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 1109 | dependencies = [ 1110 | "libc", 1111 | ] 1112 | 1113 | [[package]] 1114 | name = "memchr" 1115 | version = "2.7.4" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1118 | 1119 | [[package]] 1120 | name = "memmap2" 1121 | version = "0.5.10" 1122 | source = "registry+https://github.com/rust-lang/crates.io-index" 1123 | checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" 1124 | dependencies = [ 1125 | "libc", 1126 | ] 1127 | 1128 | [[package]] 1129 | name = "memoffset" 1130 | version = "0.6.5" 1131 | source = "registry+https://github.com/rust-lang/crates.io-index" 1132 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 1133 | dependencies = [ 1134 | "autocfg", 1135 | ] 1136 | 1137 | [[package]] 1138 | name = "midi-consts" 1139 | version = "0.1.0" 1140 | source = "registry+https://github.com/rust-lang/crates.io-index" 1141 | checksum = "6f2dd5c7f8aaf48a76e389068ab25ed80bdbc226b887f9013844c415698c9952" 1142 | 1143 | [[package]] 1144 | name = "midir" 1145 | version = "0.9.1" 1146 | source = "registry+https://github.com/rust-lang/crates.io-index" 1147 | checksum = "a456444d83e7ead06ae6a5c0a215ed70282947ff3897fb45fcb052b757284731" 1148 | dependencies = [ 1149 | "alsa 0.7.1", 1150 | "bitflags 1.3.2", 1151 | "coremidi", 1152 | "js-sys", 1153 | "libc", 1154 | "wasm-bindgen", 1155 | "web-sys", 1156 | "windows 0.43.0", 1157 | ] 1158 | 1159 | [[package]] 1160 | name = "minimal-lexical" 1161 | version = "0.2.1" 1162 | source = "registry+https://github.com/rust-lang/crates.io-index" 1163 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1164 | 1165 | [[package]] 1166 | name = "miniz_oxide" 1167 | version = "0.8.5" 1168 | source = "registry+https://github.com/rust-lang/crates.io-index" 1169 | checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" 1170 | dependencies = [ 1171 | "adler2", 1172 | ] 1173 | 1174 | [[package]] 1175 | name = "ndk" 1176 | version = "0.8.0" 1177 | source = "registry+https://github.com/rust-lang/crates.io-index" 1178 | checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" 1179 | dependencies = [ 1180 | "bitflags 2.9.0", 1181 | "jni-sys", 1182 | "log", 1183 | "ndk-sys", 1184 | "num_enum", 1185 | "thiserror", 1186 | ] 1187 | 1188 | [[package]] 1189 | name = "ndk-context" 1190 | version = "0.1.1" 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" 1192 | checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 1193 | 1194 | [[package]] 1195 | name = "ndk-sys" 1196 | version = "0.5.0+25.2.9519653" 1197 | source = "registry+https://github.com/rust-lang/crates.io-index" 1198 | checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" 1199 | dependencies = [ 1200 | "jni-sys", 1201 | ] 1202 | 1203 | [[package]] 1204 | name = "nih_log" 1205 | version = "0.3.1" 1206 | source = "registry+https://github.com/rust-lang/crates.io-index" 1207 | checksum = "d0cdb52ef79af48ae110401c883bdb9c15e0306a99ab6ecf18bc52068b668e54" 1208 | dependencies = [ 1209 | "atty", 1210 | "log", 1211 | "once_cell", 1212 | "termcolor", 1213 | "time", 1214 | "windows 0.44.0", 1215 | ] 1216 | 1217 | [[package]] 1218 | name = "nih_plug" 1219 | version = "0.0.0" 1220 | source = "git+https://github.com/robbert-vdh/nih-plug.git?rev=e59dc33aaf0c06c834dba0821f6e269e6377f362#e59dc33aaf0c06c834dba0821f6e269e6377f362" 1221 | dependencies = [ 1222 | "anyhow", 1223 | "anymap", 1224 | "assert_no_alloc", 1225 | "atomic_float", 1226 | "atomic_refcell", 1227 | "backtrace", 1228 | "baseview 0.1.0 (git+https://github.com/RustAudio/baseview.git?rev=7001c2521fa1a439a01967cb881b411cd75d9ee0)", 1229 | "bitflags 1.3.2", 1230 | "cfg-if", 1231 | "clap", 1232 | "clap-sys", 1233 | "core-foundation", 1234 | "cpal", 1235 | "crossbeam", 1236 | "jack", 1237 | "lazy_static", 1238 | "libc", 1239 | "log", 1240 | "midi-consts", 1241 | "midir", 1242 | "nih_log", 1243 | "nih_plug_derive", 1244 | "objc", 1245 | "parking_lot", 1246 | "raw-window-handle", 1247 | "rtrb", 1248 | "serde", 1249 | "serde_json", 1250 | "vst3-sys", 1251 | "widestring", 1252 | "windows 0.44.0", 1253 | ] 1254 | 1255 | [[package]] 1256 | name = "nih_plug_derive" 1257 | version = "0.1.0" 1258 | source = "git+https://github.com/robbert-vdh/nih-plug.git?rev=e59dc33aaf0c06c834dba0821f6e269e6377f362#e59dc33aaf0c06c834dba0821f6e269e6377f362" 1259 | dependencies = [ 1260 | "proc-macro2", 1261 | "quote", 1262 | "syn 1.0.109", 1263 | ] 1264 | 1265 | [[package]] 1266 | name = "nih_plug_egui" 1267 | version = "0.0.0" 1268 | source = "git+https://github.com/robbert-vdh/nih-plug.git?rev=e59dc33aaf0c06c834dba0821f6e269e6377f362#e59dc33aaf0c06c834dba0821f6e269e6377f362" 1269 | dependencies = [ 1270 | "baseview 0.1.0 (git+https://github.com/RustAudio/baseview.git?rev=eae4033e7d2cc9c31ccaa2794d5d08eedf2f510c)", 1271 | "crossbeam", 1272 | "egui", 1273 | "egui-baseview", 1274 | "lazy_static", 1275 | "nih_plug", 1276 | "parking_lot", 1277 | "serde", 1278 | ] 1279 | 1280 | [[package]] 1281 | name = "nih_plug_xtask" 1282 | version = "0.1.0" 1283 | source = "git+https://github.com/robbert-vdh/nih-plug.git#18ec34e9166c4dbe91ced06165d2940c23c30372" 1284 | dependencies = [ 1285 | "anyhow", 1286 | "cargo_metadata", 1287 | "goblin", 1288 | "reflink", 1289 | "serde", 1290 | "toml", 1291 | ] 1292 | 1293 | [[package]] 1294 | name = "nix" 1295 | version = "0.22.3" 1296 | source = "registry+https://github.com/rust-lang/crates.io-index" 1297 | checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" 1298 | dependencies = [ 1299 | "bitflags 1.3.2", 1300 | "cc", 1301 | "cfg-if", 1302 | "libc", 1303 | "memoffset", 1304 | ] 1305 | 1306 | [[package]] 1307 | name = "nix" 1308 | version = "0.24.3" 1309 | source = "registry+https://github.com/rust-lang/crates.io-index" 1310 | checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" 1311 | dependencies = [ 1312 | "bitflags 1.3.2", 1313 | "cfg-if", 1314 | "libc", 1315 | "memoffset", 1316 | ] 1317 | 1318 | [[package]] 1319 | name = "nohash-hasher" 1320 | version = "0.2.0" 1321 | source = "registry+https://github.com/rust-lang/crates.io-index" 1322 | checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" 1323 | 1324 | [[package]] 1325 | name = "nom" 1326 | version = "7.1.3" 1327 | source = "registry+https://github.com/rust-lang/crates.io-index" 1328 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1329 | dependencies = [ 1330 | "memchr", 1331 | "minimal-lexical", 1332 | ] 1333 | 1334 | [[package]] 1335 | name = "num-complex" 1336 | version = "0.4.6" 1337 | source = "registry+https://github.com/rust-lang/crates.io-index" 1338 | checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" 1339 | dependencies = [ 1340 | "num-traits", 1341 | ] 1342 | 1343 | [[package]] 1344 | name = "num-conv" 1345 | version = "0.1.0" 1346 | source = "registry+https://github.com/rust-lang/crates.io-index" 1347 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1348 | 1349 | [[package]] 1350 | name = "num-derive" 1351 | version = "0.4.2" 1352 | source = "registry+https://github.com/rust-lang/crates.io-index" 1353 | checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" 1354 | dependencies = [ 1355 | "proc-macro2", 1356 | "quote", 1357 | "syn 2.0.99", 1358 | ] 1359 | 1360 | [[package]] 1361 | name = "num-integer" 1362 | version = "0.1.46" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1365 | dependencies = [ 1366 | "num-traits", 1367 | ] 1368 | 1369 | [[package]] 1370 | name = "num-traits" 1371 | version = "0.2.19" 1372 | source = "registry+https://github.com/rust-lang/crates.io-index" 1373 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1374 | dependencies = [ 1375 | "autocfg", 1376 | ] 1377 | 1378 | [[package]] 1379 | name = "num_enum" 1380 | version = "0.7.3" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" 1383 | dependencies = [ 1384 | "num_enum_derive", 1385 | ] 1386 | 1387 | [[package]] 1388 | name = "num_enum_derive" 1389 | version = "0.7.3" 1390 | source = "registry+https://github.com/rust-lang/crates.io-index" 1391 | checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" 1392 | dependencies = [ 1393 | "proc-macro-crate", 1394 | "proc-macro2", 1395 | "quote", 1396 | "syn 2.0.99", 1397 | ] 1398 | 1399 | [[package]] 1400 | name = "num_threads" 1401 | version = "0.1.7" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" 1404 | dependencies = [ 1405 | "libc", 1406 | ] 1407 | 1408 | [[package]] 1409 | name = "objc" 1410 | version = "0.2.7" 1411 | source = "registry+https://github.com/rust-lang/crates.io-index" 1412 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 1413 | dependencies = [ 1414 | "malloc_buf", 1415 | ] 1416 | 1417 | [[package]] 1418 | name = "objc-foundation" 1419 | version = "0.1.1" 1420 | source = "registry+https://github.com/rust-lang/crates.io-index" 1421 | checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" 1422 | dependencies = [ 1423 | "block", 1424 | "objc", 1425 | "objc_id", 1426 | ] 1427 | 1428 | [[package]] 1429 | name = "objc_id" 1430 | version = "0.1.1" 1431 | source = "registry+https://github.com/rust-lang/crates.io-index" 1432 | checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" 1433 | dependencies = [ 1434 | "objc", 1435 | ] 1436 | 1437 | [[package]] 1438 | name = "object" 1439 | version = "0.36.7" 1440 | source = "registry+https://github.com/rust-lang/crates.io-index" 1441 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1442 | dependencies = [ 1443 | "memchr", 1444 | ] 1445 | 1446 | [[package]] 1447 | name = "oboe" 1448 | version = "0.6.1" 1449 | source = "registry+https://github.com/rust-lang/crates.io-index" 1450 | checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" 1451 | dependencies = [ 1452 | "jni", 1453 | "ndk", 1454 | "ndk-context", 1455 | "num-derive", 1456 | "num-traits", 1457 | "oboe-sys", 1458 | ] 1459 | 1460 | [[package]] 1461 | name = "oboe-sys" 1462 | version = "0.6.1" 1463 | source = "registry+https://github.com/rust-lang/crates.io-index" 1464 | checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" 1465 | dependencies = [ 1466 | "cc", 1467 | ] 1468 | 1469 | [[package]] 1470 | name = "once_cell" 1471 | version = "1.20.3" 1472 | source = "registry+https://github.com/rust-lang/crates.io-index" 1473 | checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" 1474 | 1475 | [[package]] 1476 | name = "option-ext" 1477 | version = "0.2.0" 1478 | source = "registry+https://github.com/rust-lang/crates.io-index" 1479 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 1480 | 1481 | [[package]] 1482 | name = "owned_ttf_parser" 1483 | version = "0.25.0" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" 1486 | dependencies = [ 1487 | "ttf-parser", 1488 | ] 1489 | 1490 | [[package]] 1491 | name = "parking_lot" 1492 | version = "0.12.3" 1493 | source = "registry+https://github.com/rust-lang/crates.io-index" 1494 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1495 | dependencies = [ 1496 | "lock_api", 1497 | "parking_lot_core", 1498 | ] 1499 | 1500 | [[package]] 1501 | name = "parking_lot_core" 1502 | version = "0.9.10" 1503 | source = "registry+https://github.com/rust-lang/crates.io-index" 1504 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1505 | dependencies = [ 1506 | "cfg-if", 1507 | "libc", 1508 | "redox_syscall", 1509 | "smallvec", 1510 | "windows-targets 0.52.6", 1511 | ] 1512 | 1513 | [[package]] 1514 | name = "pin-project-lite" 1515 | version = "0.2.16" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1518 | 1519 | [[package]] 1520 | name = "pkg-config" 1521 | version = "0.3.32" 1522 | source = "registry+https://github.com/rust-lang/crates.io-index" 1523 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1524 | 1525 | [[package]] 1526 | name = "plain" 1527 | version = "0.2.3" 1528 | source = "registry+https://github.com/rust-lang/crates.io-index" 1529 | checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" 1530 | 1531 | [[package]] 1532 | name = "powerfmt" 1533 | version = "0.2.0" 1534 | source = "registry+https://github.com/rust-lang/crates.io-index" 1535 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1536 | 1537 | [[package]] 1538 | name = "primal-check" 1539 | version = "0.3.4" 1540 | source = "registry+https://github.com/rust-lang/crates.io-index" 1541 | checksum = "dc0d895b311e3af9902528fbb8f928688abbd95872819320517cc24ca6b2bd08" 1542 | dependencies = [ 1543 | "num-integer", 1544 | ] 1545 | 1546 | [[package]] 1547 | name = "proc-macro-crate" 1548 | version = "3.2.0" 1549 | source = "registry+https://github.com/rust-lang/crates.io-index" 1550 | checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" 1551 | dependencies = [ 1552 | "toml_edit 0.22.24", 1553 | ] 1554 | 1555 | [[package]] 1556 | name = "proc-macro2" 1557 | version = "1.0.94" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" 1560 | dependencies = [ 1561 | "unicode-ident", 1562 | ] 1563 | 1564 | [[package]] 1565 | name = "quote" 1566 | version = "1.0.39" 1567 | source = "registry+https://github.com/rust-lang/crates.io-index" 1568 | checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" 1569 | dependencies = [ 1570 | "proc-macro2", 1571 | ] 1572 | 1573 | [[package]] 1574 | name = "raw-window-handle" 1575 | version = "0.4.3" 1576 | source = "registry+https://github.com/rust-lang/crates.io-index" 1577 | checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" 1578 | dependencies = [ 1579 | "cty", 1580 | ] 1581 | 1582 | [[package]] 1583 | name = "redox_syscall" 1584 | version = "0.5.9" 1585 | source = "registry+https://github.com/rust-lang/crates.io-index" 1586 | checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" 1587 | dependencies = [ 1588 | "bitflags 2.9.0", 1589 | ] 1590 | 1591 | [[package]] 1592 | name = "redox_users" 1593 | version = "0.4.6" 1594 | source = "registry+https://github.com/rust-lang/crates.io-index" 1595 | checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" 1596 | dependencies = [ 1597 | "getrandom", 1598 | "libredox", 1599 | "thiserror", 1600 | ] 1601 | 1602 | [[package]] 1603 | name = "reflink" 1604 | version = "0.1.3" 1605 | source = "git+https://github.com/nicokoch/reflink.git?rev=e8d93b465f5d9ad340cd052b64bbc77b8ee107e2#e8d93b465f5d9ad340cd052b64bbc77b8ee107e2" 1606 | dependencies = [ 1607 | "libc", 1608 | "winapi", 1609 | ] 1610 | 1611 | [[package]] 1612 | name = "regex" 1613 | version = "1.11.1" 1614 | source = "registry+https://github.com/rust-lang/crates.io-index" 1615 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1616 | dependencies = [ 1617 | "aho-corasick", 1618 | "memchr", 1619 | "regex-automata", 1620 | "regex-syntax", 1621 | ] 1622 | 1623 | [[package]] 1624 | name = "regex-automata" 1625 | version = "0.4.9" 1626 | source = "registry+https://github.com/rust-lang/crates.io-index" 1627 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1628 | dependencies = [ 1629 | "aho-corasick", 1630 | "memchr", 1631 | "regex-syntax", 1632 | ] 1633 | 1634 | [[package]] 1635 | name = "regex-syntax" 1636 | version = "0.8.5" 1637 | source = "registry+https://github.com/rust-lang/crates.io-index" 1638 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1639 | 1640 | [[package]] 1641 | name = "rtrb" 1642 | version = "0.2.3" 1643 | source = "registry+https://github.com/rust-lang/crates.io-index" 1644 | checksum = "99e704dd104faf2326a320140f70f0b736d607c1caa1b1748a6c568a79819109" 1645 | dependencies = [ 1646 | "cache-padded", 1647 | ] 1648 | 1649 | [[package]] 1650 | name = "rustc-demangle" 1651 | version = "0.1.24" 1652 | source = "registry+https://github.com/rust-lang/crates.io-index" 1653 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1654 | 1655 | [[package]] 1656 | name = "rustc-hash" 1657 | version = "1.1.0" 1658 | source = "registry+https://github.com/rust-lang/crates.io-index" 1659 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1660 | 1661 | [[package]] 1662 | name = "rustfft" 1663 | version = "6.2.0" 1664 | source = "registry+https://github.com/rust-lang/crates.io-index" 1665 | checksum = "43806561bc506d0c5d160643ad742e3161049ac01027b5e6d7524091fd401d86" 1666 | dependencies = [ 1667 | "num-complex", 1668 | "num-integer", 1669 | "num-traits", 1670 | "primal-check", 1671 | "strength_reduce", 1672 | "transpose", 1673 | "version_check", 1674 | ] 1675 | 1676 | [[package]] 1677 | name = "rustix" 1678 | version = "0.38.44" 1679 | source = "registry+https://github.com/rust-lang/crates.io-index" 1680 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 1681 | dependencies = [ 1682 | "bitflags 2.9.0", 1683 | "errno", 1684 | "libc", 1685 | "linux-raw-sys", 1686 | "windows-sys 0.59.0", 1687 | ] 1688 | 1689 | [[package]] 1690 | name = "rustversion" 1691 | version = "1.0.19" 1692 | source = "registry+https://github.com/rust-lang/crates.io-index" 1693 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 1694 | 1695 | [[package]] 1696 | name = "ryu" 1697 | version = "1.0.19" 1698 | source = "registry+https://github.com/rust-lang/crates.io-index" 1699 | checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" 1700 | 1701 | [[package]] 1702 | name = "same-file" 1703 | version = "1.0.6" 1704 | source = "registry+https://github.com/rust-lang/crates.io-index" 1705 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1706 | dependencies = [ 1707 | "winapi-util", 1708 | ] 1709 | 1710 | [[package]] 1711 | name = "scoped-tls" 1712 | version = "1.0.1" 1713 | source = "registry+https://github.com/rust-lang/crates.io-index" 1714 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 1715 | 1716 | [[package]] 1717 | name = "scopeguard" 1718 | version = "1.2.0" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1721 | 1722 | [[package]] 1723 | name = "scroll" 1724 | version = "0.11.0" 1725 | source = "registry+https://github.com/rust-lang/crates.io-index" 1726 | checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" 1727 | dependencies = [ 1728 | "scroll_derive", 1729 | ] 1730 | 1731 | [[package]] 1732 | name = "scroll_derive" 1733 | version = "0.11.1" 1734 | source = "registry+https://github.com/rust-lang/crates.io-index" 1735 | checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" 1736 | dependencies = [ 1737 | "proc-macro2", 1738 | "quote", 1739 | "syn 2.0.99", 1740 | ] 1741 | 1742 | [[package]] 1743 | name = "scrollscope" 1744 | version = "1.4.2" 1745 | dependencies = [ 1746 | "atomic_float", 1747 | "configparser", 1748 | "dirs", 1749 | "itertools 0.12.1", 1750 | "nih_plug", 1751 | "nih_plug_egui", 1752 | "rustfft", 1753 | ] 1754 | 1755 | [[package]] 1756 | name = "semver" 1757 | version = "1.0.25" 1758 | source = "registry+https://github.com/rust-lang/crates.io-index" 1759 | checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" 1760 | dependencies = [ 1761 | "serde", 1762 | ] 1763 | 1764 | [[package]] 1765 | name = "serde" 1766 | version = "1.0.218" 1767 | source = "registry+https://github.com/rust-lang/crates.io-index" 1768 | checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" 1769 | dependencies = [ 1770 | "serde_derive", 1771 | ] 1772 | 1773 | [[package]] 1774 | name = "serde_derive" 1775 | version = "1.0.218" 1776 | source = "registry+https://github.com/rust-lang/crates.io-index" 1777 | checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" 1778 | dependencies = [ 1779 | "proc-macro2", 1780 | "quote", 1781 | "syn 2.0.99", 1782 | ] 1783 | 1784 | [[package]] 1785 | name = "serde_json" 1786 | version = "1.0.140" 1787 | source = "registry+https://github.com/rust-lang/crates.io-index" 1788 | checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 1789 | dependencies = [ 1790 | "itoa", 1791 | "memchr", 1792 | "ryu", 1793 | "serde", 1794 | ] 1795 | 1796 | [[package]] 1797 | name = "serde_spanned" 1798 | version = "0.6.8" 1799 | source = "registry+https://github.com/rust-lang/crates.io-index" 1800 | checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 1801 | dependencies = [ 1802 | "serde", 1803 | ] 1804 | 1805 | [[package]] 1806 | name = "shlex" 1807 | version = "1.3.0" 1808 | source = "registry+https://github.com/rust-lang/crates.io-index" 1809 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1810 | 1811 | [[package]] 1812 | name = "slotmap" 1813 | version = "1.0.7" 1814 | source = "registry+https://github.com/rust-lang/crates.io-index" 1815 | checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" 1816 | dependencies = [ 1817 | "version_check", 1818 | ] 1819 | 1820 | [[package]] 1821 | name = "smallvec" 1822 | version = "1.14.0" 1823 | source = "registry+https://github.com/rust-lang/crates.io-index" 1824 | checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" 1825 | 1826 | [[package]] 1827 | name = "smithay-client-toolkit" 1828 | version = "0.16.1" 1829 | source = "registry+https://github.com/rust-lang/crates.io-index" 1830 | checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" 1831 | dependencies = [ 1832 | "bitflags 1.3.2", 1833 | "dlib", 1834 | "lazy_static", 1835 | "log", 1836 | "memmap2", 1837 | "nix 0.24.3", 1838 | "pkg-config", 1839 | "wayland-client", 1840 | "wayland-cursor", 1841 | "wayland-protocols", 1842 | ] 1843 | 1844 | [[package]] 1845 | name = "smithay-clipboard" 1846 | version = "0.6.6" 1847 | source = "registry+https://github.com/rust-lang/crates.io-index" 1848 | checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" 1849 | dependencies = [ 1850 | "smithay-client-toolkit", 1851 | "wayland-client", 1852 | ] 1853 | 1854 | [[package]] 1855 | name = "strength_reduce" 1856 | version = "0.2.4" 1857 | source = "registry+https://github.com/rust-lang/crates.io-index" 1858 | checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" 1859 | 1860 | [[package]] 1861 | name = "strsim" 1862 | version = "0.11.1" 1863 | source = "registry+https://github.com/rust-lang/crates.io-index" 1864 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1865 | 1866 | [[package]] 1867 | name = "syn" 1868 | version = "1.0.109" 1869 | source = "registry+https://github.com/rust-lang/crates.io-index" 1870 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1871 | dependencies = [ 1872 | "proc-macro2", 1873 | "quote", 1874 | "unicode-ident", 1875 | ] 1876 | 1877 | [[package]] 1878 | name = "syn" 1879 | version = "2.0.99" 1880 | source = "registry+https://github.com/rust-lang/crates.io-index" 1881 | checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" 1882 | dependencies = [ 1883 | "proc-macro2", 1884 | "quote", 1885 | "unicode-ident", 1886 | ] 1887 | 1888 | [[package]] 1889 | name = "termcolor" 1890 | version = "1.4.1" 1891 | source = "registry+https://github.com/rust-lang/crates.io-index" 1892 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 1893 | dependencies = [ 1894 | "winapi-util", 1895 | ] 1896 | 1897 | [[package]] 1898 | name = "terminal_size" 1899 | version = "0.4.1" 1900 | source = "registry+https://github.com/rust-lang/crates.io-index" 1901 | checksum = "5352447f921fda68cf61b4101566c0bdb5104eff6804d0678e5227580ab6a4e9" 1902 | dependencies = [ 1903 | "rustix", 1904 | "windows-sys 0.59.0", 1905 | ] 1906 | 1907 | [[package]] 1908 | name = "thiserror" 1909 | version = "1.0.69" 1910 | source = "registry+https://github.com/rust-lang/crates.io-index" 1911 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1912 | dependencies = [ 1913 | "thiserror-impl", 1914 | ] 1915 | 1916 | [[package]] 1917 | name = "thiserror-impl" 1918 | version = "1.0.69" 1919 | source = "registry+https://github.com/rust-lang/crates.io-index" 1920 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1921 | dependencies = [ 1922 | "proc-macro2", 1923 | "quote", 1924 | "syn 2.0.99", 1925 | ] 1926 | 1927 | [[package]] 1928 | name = "time" 1929 | version = "0.3.37" 1930 | source = "registry+https://github.com/rust-lang/crates.io-index" 1931 | checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" 1932 | dependencies = [ 1933 | "deranged", 1934 | "itoa", 1935 | "libc", 1936 | "num-conv", 1937 | "num_threads", 1938 | "powerfmt", 1939 | "serde", 1940 | "time-core", 1941 | "time-macros", 1942 | ] 1943 | 1944 | [[package]] 1945 | name = "time-core" 1946 | version = "0.1.2" 1947 | source = "registry+https://github.com/rust-lang/crates.io-index" 1948 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 1949 | 1950 | [[package]] 1951 | name = "time-macros" 1952 | version = "0.2.19" 1953 | source = "registry+https://github.com/rust-lang/crates.io-index" 1954 | checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" 1955 | dependencies = [ 1956 | "num-conv", 1957 | "time-core", 1958 | ] 1959 | 1960 | [[package]] 1961 | name = "toml" 1962 | version = "0.7.8" 1963 | source = "registry+https://github.com/rust-lang/crates.io-index" 1964 | checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" 1965 | dependencies = [ 1966 | "serde", 1967 | "serde_spanned", 1968 | "toml_datetime", 1969 | "toml_edit 0.19.15", 1970 | ] 1971 | 1972 | [[package]] 1973 | name = "toml_datetime" 1974 | version = "0.6.8" 1975 | source = "registry+https://github.com/rust-lang/crates.io-index" 1976 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 1977 | dependencies = [ 1978 | "serde", 1979 | ] 1980 | 1981 | [[package]] 1982 | name = "toml_edit" 1983 | version = "0.19.15" 1984 | source = "registry+https://github.com/rust-lang/crates.io-index" 1985 | checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 1986 | dependencies = [ 1987 | "indexmap", 1988 | "serde", 1989 | "serde_spanned", 1990 | "toml_datetime", 1991 | "winnow 0.5.40", 1992 | ] 1993 | 1994 | [[package]] 1995 | name = "toml_edit" 1996 | version = "0.22.24" 1997 | source = "registry+https://github.com/rust-lang/crates.io-index" 1998 | checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" 1999 | dependencies = [ 2000 | "indexmap", 2001 | "toml_datetime", 2002 | "winnow 0.7.3", 2003 | ] 2004 | 2005 | [[package]] 2006 | name = "tracing" 2007 | version = "0.1.41" 2008 | source = "registry+https://github.com/rust-lang/crates.io-index" 2009 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 2010 | dependencies = [ 2011 | "pin-project-lite", 2012 | "tracing-core", 2013 | ] 2014 | 2015 | [[package]] 2016 | name = "tracing-core" 2017 | version = "0.1.33" 2018 | source = "registry+https://github.com/rust-lang/crates.io-index" 2019 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 2020 | dependencies = [ 2021 | "once_cell", 2022 | ] 2023 | 2024 | [[package]] 2025 | name = "transpose" 2026 | version = "0.2.3" 2027 | source = "registry+https://github.com/rust-lang/crates.io-index" 2028 | checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e" 2029 | dependencies = [ 2030 | "num-integer", 2031 | "strength_reduce", 2032 | ] 2033 | 2034 | [[package]] 2035 | name = "ttf-parser" 2036 | version = "0.25.1" 2037 | source = "registry+https://github.com/rust-lang/crates.io-index" 2038 | checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" 2039 | 2040 | [[package]] 2041 | name = "unicode-ident" 2042 | version = "1.0.17" 2043 | source = "registry+https://github.com/rust-lang/crates.io-index" 2044 | checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" 2045 | 2046 | [[package]] 2047 | name = "utf8parse" 2048 | version = "0.2.2" 2049 | source = "registry+https://github.com/rust-lang/crates.io-index" 2050 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2051 | 2052 | [[package]] 2053 | name = "uuid" 2054 | version = "0.8.2" 2055 | source = "registry+https://github.com/rust-lang/crates.io-index" 2056 | checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" 2057 | dependencies = [ 2058 | "getrandom", 2059 | ] 2060 | 2061 | [[package]] 2062 | name = "version_check" 2063 | version = "0.9.5" 2064 | source = "registry+https://github.com/rust-lang/crates.io-index" 2065 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2066 | 2067 | [[package]] 2068 | name = "vst3-com" 2069 | version = "0.1.0" 2070 | source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix%2Fdrop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" 2071 | dependencies = [ 2072 | "vst3-com-macros", 2073 | ] 2074 | 2075 | [[package]] 2076 | name = "vst3-com-macros" 2077 | version = "0.2.0" 2078 | source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix%2Fdrop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" 2079 | dependencies = [ 2080 | "proc-macro2", 2081 | "quote", 2082 | "syn 1.0.109", 2083 | "vst3-com-macros-support", 2084 | ] 2085 | 2086 | [[package]] 2087 | name = "vst3-com-macros-support" 2088 | version = "0.2.0" 2089 | source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix%2Fdrop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" 2090 | dependencies = [ 2091 | "proc-macro2", 2092 | "quote", 2093 | "syn 1.0.109", 2094 | ] 2095 | 2096 | [[package]] 2097 | name = "vst3-sys" 2098 | version = "0.1.0" 2099 | source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix%2Fdrop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" 2100 | dependencies = [ 2101 | "vst3-com", 2102 | ] 2103 | 2104 | [[package]] 2105 | name = "walkdir" 2106 | version = "2.5.0" 2107 | source = "registry+https://github.com/rust-lang/crates.io-index" 2108 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 2109 | dependencies = [ 2110 | "same-file", 2111 | "winapi-util", 2112 | ] 2113 | 2114 | [[package]] 2115 | name = "wasi" 2116 | version = "0.11.0+wasi-snapshot-preview1" 2117 | source = "registry+https://github.com/rust-lang/crates.io-index" 2118 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2119 | 2120 | [[package]] 2121 | name = "wasm-bindgen" 2122 | version = "0.2.100" 2123 | source = "registry+https://github.com/rust-lang/crates.io-index" 2124 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2125 | dependencies = [ 2126 | "cfg-if", 2127 | "once_cell", 2128 | "rustversion", 2129 | "wasm-bindgen-macro", 2130 | ] 2131 | 2132 | [[package]] 2133 | name = "wasm-bindgen-backend" 2134 | version = "0.2.100" 2135 | source = "registry+https://github.com/rust-lang/crates.io-index" 2136 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2137 | dependencies = [ 2138 | "bumpalo", 2139 | "log", 2140 | "proc-macro2", 2141 | "quote", 2142 | "syn 2.0.99", 2143 | "wasm-bindgen-shared", 2144 | ] 2145 | 2146 | [[package]] 2147 | name = "wasm-bindgen-futures" 2148 | version = "0.4.50" 2149 | source = "registry+https://github.com/rust-lang/crates.io-index" 2150 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 2151 | dependencies = [ 2152 | "cfg-if", 2153 | "js-sys", 2154 | "once_cell", 2155 | "wasm-bindgen", 2156 | "web-sys", 2157 | ] 2158 | 2159 | [[package]] 2160 | name = "wasm-bindgen-macro" 2161 | version = "0.2.100" 2162 | source = "registry+https://github.com/rust-lang/crates.io-index" 2163 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2164 | dependencies = [ 2165 | "quote", 2166 | "wasm-bindgen-macro-support", 2167 | ] 2168 | 2169 | [[package]] 2170 | name = "wasm-bindgen-macro-support" 2171 | version = "0.2.100" 2172 | source = "registry+https://github.com/rust-lang/crates.io-index" 2173 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2174 | dependencies = [ 2175 | "proc-macro2", 2176 | "quote", 2177 | "syn 2.0.99", 2178 | "wasm-bindgen-backend", 2179 | "wasm-bindgen-shared", 2180 | ] 2181 | 2182 | [[package]] 2183 | name = "wasm-bindgen-shared" 2184 | version = "0.2.100" 2185 | source = "registry+https://github.com/rust-lang/crates.io-index" 2186 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2187 | dependencies = [ 2188 | "unicode-ident", 2189 | ] 2190 | 2191 | [[package]] 2192 | name = "wayland-client" 2193 | version = "0.29.5" 2194 | source = "registry+https://github.com/rust-lang/crates.io-index" 2195 | checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" 2196 | dependencies = [ 2197 | "bitflags 1.3.2", 2198 | "downcast-rs", 2199 | "libc", 2200 | "nix 0.24.3", 2201 | "scoped-tls", 2202 | "wayland-commons", 2203 | "wayland-scanner", 2204 | "wayland-sys", 2205 | ] 2206 | 2207 | [[package]] 2208 | name = "wayland-commons" 2209 | version = "0.29.5" 2210 | source = "registry+https://github.com/rust-lang/crates.io-index" 2211 | checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" 2212 | dependencies = [ 2213 | "nix 0.24.3", 2214 | "once_cell", 2215 | "smallvec", 2216 | "wayland-sys", 2217 | ] 2218 | 2219 | [[package]] 2220 | name = "wayland-cursor" 2221 | version = "0.29.5" 2222 | source = "registry+https://github.com/rust-lang/crates.io-index" 2223 | checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" 2224 | dependencies = [ 2225 | "nix 0.24.3", 2226 | "wayland-client", 2227 | "xcursor", 2228 | ] 2229 | 2230 | [[package]] 2231 | name = "wayland-protocols" 2232 | version = "0.29.5" 2233 | source = "registry+https://github.com/rust-lang/crates.io-index" 2234 | checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" 2235 | dependencies = [ 2236 | "bitflags 1.3.2", 2237 | "wayland-client", 2238 | "wayland-commons", 2239 | "wayland-scanner", 2240 | ] 2241 | 2242 | [[package]] 2243 | name = "wayland-scanner" 2244 | version = "0.29.5" 2245 | source = "registry+https://github.com/rust-lang/crates.io-index" 2246 | checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" 2247 | dependencies = [ 2248 | "proc-macro2", 2249 | "quote", 2250 | "xml-rs", 2251 | ] 2252 | 2253 | [[package]] 2254 | name = "wayland-sys" 2255 | version = "0.29.5" 2256 | source = "registry+https://github.com/rust-lang/crates.io-index" 2257 | checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" 2258 | dependencies = [ 2259 | "dlib", 2260 | "lazy_static", 2261 | "pkg-config", 2262 | ] 2263 | 2264 | [[package]] 2265 | name = "web-sys" 2266 | version = "0.3.77" 2267 | source = "registry+https://github.com/rust-lang/crates.io-index" 2268 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 2269 | dependencies = [ 2270 | "js-sys", 2271 | "wasm-bindgen", 2272 | ] 2273 | 2274 | [[package]] 2275 | name = "widestring" 2276 | version = "1.1.0" 2277 | source = "registry+https://github.com/rust-lang/crates.io-index" 2278 | checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" 2279 | 2280 | [[package]] 2281 | name = "winapi" 2282 | version = "0.3.9" 2283 | source = "registry+https://github.com/rust-lang/crates.io-index" 2284 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2285 | dependencies = [ 2286 | "winapi-i686-pc-windows-gnu", 2287 | "winapi-x86_64-pc-windows-gnu", 2288 | ] 2289 | 2290 | [[package]] 2291 | name = "winapi-i686-pc-windows-gnu" 2292 | version = "0.4.0" 2293 | source = "registry+https://github.com/rust-lang/crates.io-index" 2294 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2295 | 2296 | [[package]] 2297 | name = "winapi-util" 2298 | version = "0.1.9" 2299 | source = "registry+https://github.com/rust-lang/crates.io-index" 2300 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 2301 | dependencies = [ 2302 | "windows-sys 0.59.0", 2303 | ] 2304 | 2305 | [[package]] 2306 | name = "winapi-wsapoll" 2307 | version = "0.1.2" 2308 | source = "registry+https://github.com/rust-lang/crates.io-index" 2309 | checksum = "1eafc5f679c576995526e81635d0cf9695841736712b4e892f87abbe6fed3f28" 2310 | dependencies = [ 2311 | "winapi", 2312 | ] 2313 | 2314 | [[package]] 2315 | name = "winapi-x86_64-pc-windows-gnu" 2316 | version = "0.4.0" 2317 | source = "registry+https://github.com/rust-lang/crates.io-index" 2318 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2319 | 2320 | [[package]] 2321 | name = "windows" 2322 | version = "0.43.0" 2323 | source = "registry+https://github.com/rust-lang/crates.io-index" 2324 | checksum = "04662ed0e3e5630dfa9b26e4cb823b817f1a9addda855d973a9458c236556244" 2325 | dependencies = [ 2326 | "windows_aarch64_gnullvm 0.42.2", 2327 | "windows_aarch64_msvc 0.42.2", 2328 | "windows_i686_gnu 0.42.2", 2329 | "windows_i686_msvc 0.42.2", 2330 | "windows_x86_64_gnu 0.42.2", 2331 | "windows_x86_64_gnullvm 0.42.2", 2332 | "windows_x86_64_msvc 0.42.2", 2333 | ] 2334 | 2335 | [[package]] 2336 | name = "windows" 2337 | version = "0.44.0" 2338 | source = "registry+https://github.com/rust-lang/crates.io-index" 2339 | checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" 2340 | dependencies = [ 2341 | "windows-targets 0.42.2", 2342 | ] 2343 | 2344 | [[package]] 2345 | name = "windows" 2346 | version = "0.54.0" 2347 | source = "registry+https://github.com/rust-lang/crates.io-index" 2348 | checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" 2349 | dependencies = [ 2350 | "windows-core", 2351 | "windows-targets 0.52.6", 2352 | ] 2353 | 2354 | [[package]] 2355 | name = "windows-core" 2356 | version = "0.54.0" 2357 | source = "registry+https://github.com/rust-lang/crates.io-index" 2358 | checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" 2359 | dependencies = [ 2360 | "windows-result", 2361 | "windows-targets 0.52.6", 2362 | ] 2363 | 2364 | [[package]] 2365 | name = "windows-result" 2366 | version = "0.1.2" 2367 | source = "registry+https://github.com/rust-lang/crates.io-index" 2368 | checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" 2369 | dependencies = [ 2370 | "windows-targets 0.52.6", 2371 | ] 2372 | 2373 | [[package]] 2374 | name = "windows-sys" 2375 | version = "0.45.0" 2376 | source = "registry+https://github.com/rust-lang/crates.io-index" 2377 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 2378 | dependencies = [ 2379 | "windows-targets 0.42.2", 2380 | ] 2381 | 2382 | [[package]] 2383 | name = "windows-sys" 2384 | version = "0.48.0" 2385 | source = "registry+https://github.com/rust-lang/crates.io-index" 2386 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2387 | dependencies = [ 2388 | "windows-targets 0.48.5", 2389 | ] 2390 | 2391 | [[package]] 2392 | name = "windows-sys" 2393 | version = "0.59.0" 2394 | source = "registry+https://github.com/rust-lang/crates.io-index" 2395 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2396 | dependencies = [ 2397 | "windows-targets 0.52.6", 2398 | ] 2399 | 2400 | [[package]] 2401 | name = "windows-targets" 2402 | version = "0.42.2" 2403 | source = "registry+https://github.com/rust-lang/crates.io-index" 2404 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 2405 | dependencies = [ 2406 | "windows_aarch64_gnullvm 0.42.2", 2407 | "windows_aarch64_msvc 0.42.2", 2408 | "windows_i686_gnu 0.42.2", 2409 | "windows_i686_msvc 0.42.2", 2410 | "windows_x86_64_gnu 0.42.2", 2411 | "windows_x86_64_gnullvm 0.42.2", 2412 | "windows_x86_64_msvc 0.42.2", 2413 | ] 2414 | 2415 | [[package]] 2416 | name = "windows-targets" 2417 | version = "0.48.5" 2418 | source = "registry+https://github.com/rust-lang/crates.io-index" 2419 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2420 | dependencies = [ 2421 | "windows_aarch64_gnullvm 0.48.5", 2422 | "windows_aarch64_msvc 0.48.5", 2423 | "windows_i686_gnu 0.48.5", 2424 | "windows_i686_msvc 0.48.5", 2425 | "windows_x86_64_gnu 0.48.5", 2426 | "windows_x86_64_gnullvm 0.48.5", 2427 | "windows_x86_64_msvc 0.48.5", 2428 | ] 2429 | 2430 | [[package]] 2431 | name = "windows-targets" 2432 | version = "0.52.6" 2433 | source = "registry+https://github.com/rust-lang/crates.io-index" 2434 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2435 | dependencies = [ 2436 | "windows_aarch64_gnullvm 0.52.6", 2437 | "windows_aarch64_msvc 0.52.6", 2438 | "windows_i686_gnu 0.52.6", 2439 | "windows_i686_gnullvm", 2440 | "windows_i686_msvc 0.52.6", 2441 | "windows_x86_64_gnu 0.52.6", 2442 | "windows_x86_64_gnullvm 0.52.6", 2443 | "windows_x86_64_msvc 0.52.6", 2444 | ] 2445 | 2446 | [[package]] 2447 | name = "windows_aarch64_gnullvm" 2448 | version = "0.42.2" 2449 | source = "registry+https://github.com/rust-lang/crates.io-index" 2450 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 2451 | 2452 | [[package]] 2453 | name = "windows_aarch64_gnullvm" 2454 | version = "0.48.5" 2455 | source = "registry+https://github.com/rust-lang/crates.io-index" 2456 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2457 | 2458 | [[package]] 2459 | name = "windows_aarch64_gnullvm" 2460 | version = "0.52.6" 2461 | source = "registry+https://github.com/rust-lang/crates.io-index" 2462 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2463 | 2464 | [[package]] 2465 | name = "windows_aarch64_msvc" 2466 | version = "0.42.2" 2467 | source = "registry+https://github.com/rust-lang/crates.io-index" 2468 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 2469 | 2470 | [[package]] 2471 | name = "windows_aarch64_msvc" 2472 | version = "0.48.5" 2473 | source = "registry+https://github.com/rust-lang/crates.io-index" 2474 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2475 | 2476 | [[package]] 2477 | name = "windows_aarch64_msvc" 2478 | version = "0.52.6" 2479 | source = "registry+https://github.com/rust-lang/crates.io-index" 2480 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2481 | 2482 | [[package]] 2483 | name = "windows_i686_gnu" 2484 | version = "0.42.2" 2485 | source = "registry+https://github.com/rust-lang/crates.io-index" 2486 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 2487 | 2488 | [[package]] 2489 | name = "windows_i686_gnu" 2490 | version = "0.48.5" 2491 | source = "registry+https://github.com/rust-lang/crates.io-index" 2492 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2493 | 2494 | [[package]] 2495 | name = "windows_i686_gnu" 2496 | version = "0.52.6" 2497 | source = "registry+https://github.com/rust-lang/crates.io-index" 2498 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2499 | 2500 | [[package]] 2501 | name = "windows_i686_gnullvm" 2502 | version = "0.52.6" 2503 | source = "registry+https://github.com/rust-lang/crates.io-index" 2504 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2505 | 2506 | [[package]] 2507 | name = "windows_i686_msvc" 2508 | version = "0.42.2" 2509 | source = "registry+https://github.com/rust-lang/crates.io-index" 2510 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 2511 | 2512 | [[package]] 2513 | name = "windows_i686_msvc" 2514 | version = "0.48.5" 2515 | source = "registry+https://github.com/rust-lang/crates.io-index" 2516 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2517 | 2518 | [[package]] 2519 | name = "windows_i686_msvc" 2520 | version = "0.52.6" 2521 | source = "registry+https://github.com/rust-lang/crates.io-index" 2522 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2523 | 2524 | [[package]] 2525 | name = "windows_x86_64_gnu" 2526 | version = "0.42.2" 2527 | source = "registry+https://github.com/rust-lang/crates.io-index" 2528 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 2529 | 2530 | [[package]] 2531 | name = "windows_x86_64_gnu" 2532 | version = "0.48.5" 2533 | source = "registry+https://github.com/rust-lang/crates.io-index" 2534 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2535 | 2536 | [[package]] 2537 | name = "windows_x86_64_gnu" 2538 | version = "0.52.6" 2539 | source = "registry+https://github.com/rust-lang/crates.io-index" 2540 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2541 | 2542 | [[package]] 2543 | name = "windows_x86_64_gnullvm" 2544 | version = "0.42.2" 2545 | source = "registry+https://github.com/rust-lang/crates.io-index" 2546 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 2547 | 2548 | [[package]] 2549 | name = "windows_x86_64_gnullvm" 2550 | version = "0.48.5" 2551 | source = "registry+https://github.com/rust-lang/crates.io-index" 2552 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2553 | 2554 | [[package]] 2555 | name = "windows_x86_64_gnullvm" 2556 | version = "0.52.6" 2557 | source = "registry+https://github.com/rust-lang/crates.io-index" 2558 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2559 | 2560 | [[package]] 2561 | name = "windows_x86_64_msvc" 2562 | version = "0.42.2" 2563 | source = "registry+https://github.com/rust-lang/crates.io-index" 2564 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 2565 | 2566 | [[package]] 2567 | name = "windows_x86_64_msvc" 2568 | version = "0.48.5" 2569 | source = "registry+https://github.com/rust-lang/crates.io-index" 2570 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2571 | 2572 | [[package]] 2573 | name = "windows_x86_64_msvc" 2574 | version = "0.52.6" 2575 | source = "registry+https://github.com/rust-lang/crates.io-index" 2576 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2577 | 2578 | [[package]] 2579 | name = "winnow" 2580 | version = "0.5.40" 2581 | source = "registry+https://github.com/rust-lang/crates.io-index" 2582 | checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" 2583 | dependencies = [ 2584 | "memchr", 2585 | ] 2586 | 2587 | [[package]] 2588 | name = "winnow" 2589 | version = "0.7.3" 2590 | source = "registry+https://github.com/rust-lang/crates.io-index" 2591 | checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" 2592 | dependencies = [ 2593 | "memchr", 2594 | ] 2595 | 2596 | [[package]] 2597 | name = "x11" 2598 | version = "2.21.0" 2599 | source = "registry+https://github.com/rust-lang/crates.io-index" 2600 | checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" 2601 | dependencies = [ 2602 | "libc", 2603 | "pkg-config", 2604 | ] 2605 | 2606 | [[package]] 2607 | name = "x11-clipboard" 2608 | version = "0.7.1" 2609 | source = "registry+https://github.com/rust-lang/crates.io-index" 2610 | checksum = "980b9aa9226c3b7de8e2adb11bf20124327c054e0e5812d2aac0b5b5a87e7464" 2611 | dependencies = [ 2612 | "x11rb", 2613 | ] 2614 | 2615 | [[package]] 2616 | name = "x11rb" 2617 | version = "0.10.1" 2618 | source = "registry+https://github.com/rust-lang/crates.io-index" 2619 | checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507" 2620 | dependencies = [ 2621 | "gethostname", 2622 | "nix 0.24.3", 2623 | "winapi", 2624 | "winapi-wsapoll", 2625 | "x11rb-protocol", 2626 | ] 2627 | 2628 | [[package]] 2629 | name = "x11rb-protocol" 2630 | version = "0.10.0" 2631 | source = "registry+https://github.com/rust-lang/crates.io-index" 2632 | checksum = "56b245751c0ac9db0e006dc812031482784e434630205a93c73cfefcaabeac67" 2633 | dependencies = [ 2634 | "nix 0.24.3", 2635 | ] 2636 | 2637 | [[package]] 2638 | name = "xcb" 2639 | version = "0.9.0" 2640 | source = "registry+https://github.com/rust-lang/crates.io-index" 2641 | checksum = "62056f63138b39116f82a540c983cc11f1c90cd70b3d492a70c25eaa50bd22a6" 2642 | dependencies = [ 2643 | "libc", 2644 | "log", 2645 | "x11", 2646 | ] 2647 | 2648 | [[package]] 2649 | name = "xcb-util" 2650 | version = "0.3.0" 2651 | source = "registry+https://github.com/rust-lang/crates.io-index" 2652 | checksum = "43893e47f27bf7d81d489feef3a0e34a457e90bc314b7e74ad9bb3980e4c1c48" 2653 | dependencies = [ 2654 | "libc", 2655 | "xcb", 2656 | ] 2657 | 2658 | [[package]] 2659 | name = "xcursor" 2660 | version = "0.3.8" 2661 | source = "registry+https://github.com/rust-lang/crates.io-index" 2662 | checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" 2663 | 2664 | [[package]] 2665 | name = "xml-rs" 2666 | version = "0.8.25" 2667 | source = "registry+https://github.com/rust-lang/crates.io-index" 2668 | checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" 2669 | 2670 | [[package]] 2671 | name = "xtask" 2672 | version = "0.1.0" 2673 | dependencies = [ 2674 | "nih_plug_xtask", 2675 | ] 2676 | 2677 | [[package]] 2678 | name = "zerocopy" 2679 | version = "0.7.35" 2680 | source = "registry+https://github.com/rust-lang/crates.io-index" 2681 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2682 | dependencies = [ 2683 | "zerocopy-derive", 2684 | ] 2685 | 2686 | [[package]] 2687 | name = "zerocopy-derive" 2688 | version = "0.7.35" 2689 | source = "registry+https://github.com/rust-lang/crates.io-index" 2690 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2691 | dependencies = [ 2692 | "proc-macro2", 2693 | "quote", 2694 | "syn 2.0.99", 2695 | ] 2696 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "scrollscope" 3 | version = "1.4.2" 4 | edition = "2021" 5 | authors = ["Ardura "] 6 | license = "GPL-3.0-or-later" 7 | homepage = "https://github.com/ardura" 8 | description = "A simple scrolling oscilloscope" 9 | 10 | [workspace] 11 | members = ["xtask"] 12 | 13 | [lib] 14 | crate-type = ["cdylib","lib"] 15 | 16 | [dependencies] 17 | atomic_float = "0.1" 18 | configparser = "3.0.4" 19 | dirs = "5.0.1" 20 | #egui = "0.21.0" 21 | #egui_plot = "0.31.0" 22 | itertools = "0.12.1" 23 | nih_plug = { git = "https://github.com/robbert-vdh/nih-plug.git", rev = "e59dc33aaf0c06c834dba0821f6e269e6377f362", features = ["assert_process_allocs","standalone"] } 24 | nih_plug_egui = { git = "https://github.com/robbert-vdh/nih-plug.git", rev = "e59dc33aaf0c06c834dba0821f6e269e6377f362" } 25 | rustfft = "6.2.0" 26 | 27 | [profile.release] 28 | lto = "thin" 29 | strip = "symbols" 30 | 31 | [profile.profiling] 32 | inherits = "release" 33 | lto = "off" 34 | opt-level = 0 35 | debug = true 36 | strip = "none" 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Scrollscope by Ardura 2 | 3 | Available as a VST3 and CLAP. This is an oscilloscope with a few different features I’ve wanted for myself. So I’m sharing that! 4 | 5 | Join the discord! https://discord.com/invite/hscQXkTdfz 6 | 7 | Check out the KVR page: https://www.kvraudio.com/product/scrollscope-by-ardura 8 | 9 | ## Example 10 | [![Scrollscope Frequency Analyzer](https://markdown-videos-api.jorgenkh.no/url?url=https%3A%2F%2Fyoutu.be%2Fbsk1fAZlk-k)](https://youtu.be/bsk1fAZlk-k) 11 | ![analyzer](https://github.com/ardura/Scrollscope/assets/31751444/bb09c85c-c2c0-425a-a1f5-49dc4c025382) 12 | ![scope](https://github.com/ardura/Scrollscope/assets/31751444/255cfc19-5000-49fa-a385-10af79fa7d6a) 13 | 14 | Note this can take a sidechain input! Do the routing in FL in plugin processing tab: 15 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/6f7c6c75-afa0-47a4-8914-8d1c899ad572) 16 | 17 | 18 | ## Installation 19 | 20 | ### Windows 21 | - VST3: Copy the vst3 file to `C:\Program Files\Common Files\VST3` 22 | - CLAP: Copy the CLAP file to `C:\Program Files\Common Files\CLAP` 23 | 24 | ### MacOS 25 | - VST3: Copy the vst3 file to `/Library/Audio/Plug-Ins/VST3` 26 | - CLAP: Copy the CLAP file to `/Library/Audio/Plug-Ins/CLAP` 27 | 28 | ### First Run: 29 | 30 | *When this plugin runs the first time it will attempt to create a config file: Scrollscope.ini under:* 31 | - `$XDG_CONFIG_HOME` or `$HOME/.config` on Linux 32 | - `$HOME/Library/Application Support` on MacOS 33 | - `FOLDERID_LocalAppData` on Windows (like `C:\Users\Ardura\AppData\Local\`) 34 | 35 | You can use this config to make your own custom color themes, have fun! 36 | 37 | Here is the default config otherwise (Also included in source) 38 | ```ini 39 | # These are in RGB 40 | [ui_colors] 41 | background = 40,40,40 42 | guidelines = 160,160,160 43 | ui_main_color = 239,123,69 44 | user_main = 239,123,69 45 | user_aux_1 = 14,177,210 46 | user_aux_2 = 50,255,40 47 | user_aux_3 = 0,153,255 48 | user_aux_4 = 255,0,255 49 | user_aux_5 = 230,80,80 50 | user_sum_line = 248,255,31 51 | inactive_bg = 60,60,60 52 | ``` 53 | 54 | ## Features 55 | - Sidechain input graphing - simply route sidechain input from another channel (up to 5) 56 | - Frequency analysis of multiple channels 57 | - Scaling signals up and down with gain 58 | - Displaying large or small sample sizes 59 | - Optimization with skipping amount configurable 60 | - Reordering waveforms to display main or sidechain on top 61 | - Beat synchronization and Bar Synchronization 62 | - Support for different DAWs with different time-tracking modes (Alt Sync option) 63 | - Standalone version. I've run it on Windows to test with options like: ./scrollscope.exe --input-device 'Stereo Mix (Realtek(R) Audio)' --sample-rate 48000 64 | Note that with the standalone version, I'm not sure how to setup the aux inputs sorry - I've just used the standalone generation in nih-plug. 65 | 66 | This plugin was made possible thanks to the Nih-Plug Rust Library and the egui GUI library 67 | 68 | ## How to use 69 | ### Ableton 70 | 1. Add Scrollscope to a track. In this case "Rainstorm" has scrollscope 71 | 72 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/cee6b7a2-74b6-4fa9-876b-41a01a38d7bf) 73 | 74 | 2. Press Ctrl+Alt+I to bring up the audio routing options 75 | 3. On "Coffee Leaf" the Audio To is routed to "Rainstorm" then under that you can route the Aux input **You might need to duplicate or send if you still want to send this audio to the master 76 | 77 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/7db4dce8-b5cf-4724-9623-639473b8b187) 78 | 79 | ### FL Studio 80 | 1. Add Scrollscope to a mixer track. In this case "808 Kick" has scrollscope 81 | 82 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/2b8b99f5-8275-410d-a61d-047fbb47c149) 83 | 84 | 2. On channels you want to send to the aux inputs, select them in the mixer, then right click the arrow on the bottom of the track you want to send to and select sidechain to this track 85 | 86 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/08959b5c-41f6-4819-a690-b1ef28e74d6b) 87 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/e30a086b-f2bb-4b9f-a593-fba79e0cdab1) 88 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/24032a3e-bd21-4751-8896-8858351ef85d) 89 | 90 | 3. With the scrollscope window open click the cog at the top, then the plug and cog symbol on the right 91 | 92 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/a85a809c-ca83-4228-9f55-ab8bd15e7e4f) 93 | 94 | 4. Go to the processing tab, then at the bottom you can right click on the sidechain inputs to assign them 95 | 96 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/c115fb1f-3060-41d3-a6d0-e7a2860692cb) 97 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/e5e44a2f-7f0c-4410-b64d-870ce8f593ca) 98 | 99 | ### Ardour 100 | 1. Add scrollscope to a mixer track in Ardour 101 | 102 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/b5c67d0a-ff09-4b13-906b-23b511eebe5d) 103 | 104 | 2. Select the input routing, then the enable sidechains to Scrollscope 105 | 106 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/5a966ab8-56fb-41f4-868d-8156f8a64624) 107 | 108 | 3. Click on the "-" and route another mixer channel as the sidechain 109 | 110 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/6e978526-f12b-4daa-9420-2564646f5bf0) 111 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/e3d23570-5b0a-4888-985f-637b489fc741) 112 | 113 | 4. Repeat for other inputs but it should work at that point 114 | 115 | ![image](https://github.com/ardura/Scrollscope/assets/31751444/21ab72a2-c9cd-40fe-a43a-60479dbf9852) 116 | 117 | ## Building 118 | 119 | After installing [Rust](https://rustup.rs/), you can compile Scrollscope as follows: 120 | 121 | ```shell 122 | cargo xtask bundle scrollscope --profile release 123 | ``` 124 | -------------------------------------------------------------------------------- /bundler.toml: -------------------------------------------------------------------------------- 1 | # This provides metadata for NIH-plug's `cargo xtask bundle ` plugin 2 | # bundler. This file's syntax is as follows: 3 | # 4 | # [package_name] 5 | # name = "Human Readable Plugin Name" # defaults to 6 | 7 | [Scrollscope] 8 | name = "Scrollscope" 9 | -------------------------------------------------------------------------------- /src/Scrollscope.ini: -------------------------------------------------------------------------------- 1 | # These are in RGB 2 | [ui_colors] 3 | background = 40,40,40 4 | guidelines = 160,160,160 5 | ui_main_color = 239,123,69 6 | user_main = 239,123,69 7 | user_aux_1 = 14,177,210 8 | user_aux_2 = 50,255,40 9 | user_aux_3 = 0,153,255 10 | user_aux_4 = 255,0,255 11 | user_aux_5 = 230,80,80 12 | user_sum_line = 248,255,31 13 | inactive_bg = 60,60,60 -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | use atomic_float::AtomicF32; 2 | use itertools::izip; 3 | use nih_plug::prelude::*; 4 | use nih_plug_egui::EguiState; 5 | use rustfft::{num_complex::Complex, FftPlanner}; 6 | use std::{ 7 | env, 8 | sync::{ 9 | atomic::{AtomicBool, AtomicI32, AtomicU8, AtomicUsize, Ordering}, 10 | Arc, Mutex, RwLock, 11 | }, 12 | }; 13 | 14 | mod slim_checkbox; 15 | mod scrollscope_gui; 16 | 17 | /************************************************** 18 | * Scrollscope v1.4.2 by Ardura 19 | * "A simple scrolling Oscilloscope has become complex now" 20 | * ************************************************/ 21 | 22 | // Calculate buffer size dynamically based on sample rate and max display time 23 | fn calculate_buffer_size(sample_rate: f32, max_display_ms: f32) -> usize { 24 | ((sample_rate * max_display_ms) / 1000.0).ceil() as usize 25 | } 26 | 27 | const NUM_CHANNELS: usize = 8; // Main + 5 aux + beat lines + sum 28 | const MAX_DISPLAY_MS: f32 = 1000.0; // Maximum display time in milliseconds 29 | 30 | // Channel data container 31 | struct ChannelBuffer { 32 | data: Vec, 33 | write_index: usize, 34 | } 35 | 36 | impl ChannelBuffer { 37 | fn new(size: usize) -> Self { 38 | Self { 39 | data: vec![0.0; size], 40 | write_index: 0, 41 | } 42 | } 43 | 44 | fn resize(&mut self, new_size: usize) { 45 | if new_size > self.data.len() { 46 | self.data.resize(new_size, 0.0); 47 | } 48 | // Don't shrink - avoid reallocation 49 | } 50 | 51 | fn push_sample(&mut self, sample: f32, buffer_len: usize) { 52 | self.data[self.write_index % buffer_len] = sample; 53 | self.write_index = (self.write_index + 1) % buffer_len; 54 | } 55 | 56 | fn update_sample(&mut self, index: usize, sample: f32) { 57 | if index < self.data.len() { 58 | self.data[index] = sample; 59 | } 60 | } 61 | 62 | fn zero_out(&mut self) { 63 | for x in 0..self.data.len() { 64 | self.data[x] = 0.0; 65 | } 66 | self.write_index = 0; 67 | } 68 | 69 | fn get_sample(&self, index: usize) -> Option { 70 | if index < self.data.len() { 71 | Some(self.data[index]) 72 | } else { 73 | None 74 | } 75 | } 76 | 77 | fn get_samples(&self, buffer_len: usize) -> Vec { 78 | let mut samples = Vec::with_capacity(buffer_len); 79 | let start_idx = self.write_index; 80 | 81 | for i in 0..buffer_len { 82 | let idx = (start_idx + i) % buffer_len; 83 | samples.push(self.data[idx]); 84 | } 85 | 86 | samples 87 | } 88 | 89 | fn get_complex_samples(&self, length: usize, buffer_len: usize) -> Vec> { 90 | let mut complex_samples = Vec::with_capacity(length.min(buffer_len)); 91 | let start_idx = self.write_index; 92 | 93 | for i in 0..length.min(buffer_len) { 94 | let idx = (start_idx + i) % buffer_len; 95 | let sample = self.data[idx]; 96 | complex_samples.push(Complex::new(flush_denormal_bits(sample), 0.0)); 97 | } 98 | 99 | complex_samples 100 | } 101 | } 102 | 103 | // More efficient buffer implementation 104 | struct OptimizedBuffer { 105 | internal_length: AtomicUsize, 106 | // Use RwLock for better read concurrency 107 | buffers: RwLock>, 108 | } 109 | 110 | impl OptimizedBuffer { 111 | fn new(size: usize) -> Self { 112 | let mut channels = Vec::with_capacity(NUM_CHANNELS); 113 | for _ in 0..NUM_CHANNELS { 114 | channels.push(ChannelBuffer::new(size)); 115 | } 116 | 117 | Self { 118 | internal_length: AtomicUsize::new(size), 119 | buffers: RwLock::new(channels), 120 | } 121 | } 122 | 123 | fn update_internal_length(&self, new_length: usize) { 124 | self.internal_length.store(new_length, Ordering::Release); 125 | let mut buffers = self.buffers.write().unwrap(); 126 | for channel in buffers.iter_mut() { 127 | channel.resize(new_length); 128 | } 129 | } 130 | 131 | // Batch process multiple samples with a single lock acquisition 132 | fn push_samples(&self, channel_data: &[(usize, f32)]) { 133 | let buffer_len = self.internal_length.load(Ordering::Acquire); 134 | let mut buffers = self.buffers.write().unwrap(); 135 | 136 | for &(channel, sample) in channel_data { 137 | if channel < NUM_CHANNELS { 138 | buffers[channel].push_sample(sample, buffer_len); 139 | } 140 | } 141 | } 142 | 143 | fn update_sample(&self, channel: usize, index: usize, sample: f32) { 144 | if channel >= NUM_CHANNELS { 145 | return; 146 | } 147 | 148 | let buffers = self.buffers.write().unwrap(); 149 | if let Some(buffer) = buffers.get(channel) { 150 | if index < buffer.data.len() { 151 | // Use const cast to avoid double locking 152 | unsafe { 153 | let buffer_ptr = buffer as *const ChannelBuffer as *mut ChannelBuffer; 154 | (*buffer_ptr).update_sample(index, sample); 155 | } 156 | } 157 | } 158 | } 159 | 160 | fn get_sample(&self, channel: usize, index: usize) -> Option { 161 | if channel >= NUM_CHANNELS { 162 | return None; 163 | } 164 | 165 | let buffers = self.buffers.read().unwrap(); 166 | buffers[channel].get_sample(index) 167 | } 168 | 169 | fn get_samples(&self, channel: usize) -> Vec { 170 | if channel >= NUM_CHANNELS { 171 | return Vec::new(); 172 | } 173 | 174 | let buffer_len = self.internal_length.load(Ordering::Acquire); 175 | let buffers = self.buffers.read().unwrap(); 176 | buffers[channel].get_samples(buffer_len) 177 | } 178 | 179 | fn get_complex_samples_with_length(&self, channel: usize, length: usize) -> Vec> { 180 | if channel >= NUM_CHANNELS { 181 | return Vec::new(); 182 | } 183 | 184 | let buffer_len = self.internal_length.load(Ordering::Acquire); 185 | let buffers = self.buffers.read().unwrap(); 186 | buffers[channel].get_complex_samples(length, buffer_len) 187 | } 188 | } 189 | 190 | #[derive(Enum, Clone, PartialEq)] 191 | pub enum BeatSync { 192 | Beat, 193 | Bar, 194 | } 195 | 196 | pub struct Scrollscope { 197 | params: Arc, 198 | 199 | // Counter for scaling sample skipping - use a local counter to reduce atomic ops 200 | skip_counter: [Arc; 2], 201 | focused_line_toggle: Arc, 202 | is_clipping: Arc, 203 | direction: Arc, 204 | 205 | // Channel visibility flags 206 | channel_enabled: [Arc; 7], // main + 5 aux + sum 207 | 208 | // Gui flags 209 | enable_sum: Arc, 210 | enable_guidelines: Arc, 211 | enable_bar_mode: Arc, 212 | 213 | // Data holding values - optimized buffer implementation 214 | sample_buffer: Arc, 215 | sample_buffer_2: Arc, 216 | 217 | // Syncing for beats - cached to reduce atomic ops 218 | sync_var: Arc, 219 | alt_sync: Arc, 220 | in_place_index: Arc, 221 | beat_threshold: Arc, 222 | add_beat_line: Arc, 223 | 224 | // FFT/Analyzer 225 | fft: Arc>>, 226 | show_analyzer: Arc, 227 | en_filled_lines: Arc, 228 | en_filled_osc: Arc, 229 | 230 | // Stereo view 231 | stereo_view: Arc, 232 | en_left_channel: Arc, 233 | en_right_channel: Arc, 234 | 235 | sample_rate: Arc, 236 | prev_skip: Arc, 237 | 238 | // Cache frequently accessed parameters 239 | gain_cache: Arc, 240 | h_scale_cache: Arc, 241 | } 242 | 243 | #[derive(Params)] 244 | struct ScrollscopeParams { 245 | /// The editor state 246 | #[persist = "editor-state"] 247 | editor_state: Arc, 248 | 249 | /// Scrollscope scaling for the oscilloscope 250 | #[id = "free_gain"] 251 | pub free_gain: FloatParam, 252 | 253 | /// Scrolling speed for GUI 254 | #[id = "scrollspeed"] 255 | pub scrollspeed: FloatParam, 256 | 257 | /// Horizontal Scaling 258 | #[id = "scaling"] 259 | pub h_scale: IntParam, 260 | 261 | /// Sync Timing 262 | #[id = "Sync Timing"] 263 | pub sync_timing: EnumParam, 264 | } 265 | 266 | impl Default for Scrollscope { 267 | fn default() -> Self { 268 | // Initialize with reasonable defaults based on 44.1kHz 269 | let initial_buffer_size = calculate_buffer_size(44100.0, MAX_DISPLAY_MS); 270 | 271 | Self { 272 | params: Arc::new(ScrollscopeParams::default()), 273 | skip_counter: [Arc::new(AtomicI32::new(0)), Arc::new(AtomicI32::new(0))], 274 | focused_line_toggle: Arc::new(AtomicU8::new(0)), 275 | direction: Arc::new(AtomicBool::new(false)), 276 | is_clipping: Arc::new(AtomicF32::new(0.0)), 277 | 278 | // Replace individual AtomicBools with an array for simpler access 279 | channel_enabled: [ 280 | Arc::new(AtomicBool::new(true)), // main 281 | Arc::new(AtomicBool::new(false)), // aux_1 282 | Arc::new(AtomicBool::new(false)), // aux_2 283 | Arc::new(AtomicBool::new(false)), // aux_3 284 | Arc::new(AtomicBool::new(false)), // aux_4 285 | Arc::new(AtomicBool::new(false)), // aux_5 286 | Arc::new(AtomicBool::new(true)), // sum 287 | ], 288 | en_left_channel: Arc::new(AtomicBool::new(true)), 289 | en_right_channel: Arc::new(AtomicBool::new(true)), 290 | 291 | enable_sum: Arc::new(AtomicBool::new(true)), 292 | enable_guidelines: Arc::new(AtomicBool::new(true)), 293 | enable_bar_mode: Arc::new(AtomicBool::new(false)), 294 | 295 | sample_buffer: Arc::new(OptimizedBuffer::new(initial_buffer_size)), 296 | sample_buffer_2: Arc::new(OptimizedBuffer::new(initial_buffer_size)), 297 | 298 | sync_var: Arc::new(AtomicBool::new(false)), 299 | alt_sync: Arc::new(AtomicBool::new(false)), 300 | add_beat_line: Arc::new(AtomicBool::new(false)), 301 | in_place_index: Arc::new(AtomicI32::new(0)), 302 | beat_threshold: Arc::new(AtomicI32::new(0)), 303 | fft: Arc::new(Mutex::new(FftPlanner::new())), 304 | show_analyzer: Arc::new(AtomicBool::new(false)), 305 | en_filled_lines: Arc::new(AtomicBool::new(false)), 306 | en_filled_osc: Arc::new(AtomicBool::new(false)), 307 | stereo_view: Arc::new(AtomicBool::new(false)), 308 | sample_rate: Arc::new(AtomicF32::new(44100.0)), 309 | prev_skip: Arc::new(AtomicI32::new(24)), 310 | 311 | // Cache parameters for faster access 312 | gain_cache: Arc::new(AtomicF32::new(1.0)), 313 | h_scale_cache: Arc::new(AtomicI32::new(24)), 314 | } 315 | } 316 | } 317 | 318 | impl Default for ScrollscopeParams { 319 | fn default() -> Self { 320 | Self { 321 | editor_state: EguiState::from_size(1040, 520), 322 | 323 | // Input gain dB parameter (free as in unrestricted nums) 324 | free_gain: FloatParam::new( 325 | "Input Gain", 326 | util::db_to_gain(0.0), 327 | FloatRange::Skewed { 328 | min: util::db_to_gain(-12.0), 329 | max: util::db_to_gain(12.0), 330 | factor: FloatRange::gain_skew_factor(-12.0, 12.0), 331 | }, 332 | ) 333 | .with_smoother(SmoothingStyle::Logarithmic(50.0)) 334 | .with_unit(" dB") 335 | .with_value_to_string(formatters::v2s_f32_gain_to_db(2)) 336 | .with_string_to_value(formatters::s2v_f32_gain_to_db()), 337 | 338 | // scrollspeed parameter 339 | scrollspeed: FloatParam::new("Length", 100.0, FloatRange::Skewed { min: 1.0, max: 1000.0, factor: 0.33 }) 340 | .with_unit(" ms") 341 | .with_step_size(1.0), 342 | 343 | // scaling parameter 344 | h_scale: IntParam::new("Scale", 24, IntRange::Linear { min: 1, max: 100 }) 345 | .with_unit(" Skip"), 346 | 347 | // Sync timing parameter 348 | sync_timing: EnumParam::new("Timing", BeatSync::Beat), 349 | } 350 | } 351 | } 352 | 353 | impl Plugin for Scrollscope { 354 | const NAME: &'static str = "Scrollscope"; 355 | const VENDOR: &'static str = "Ardura"; 356 | const URL: &'static str = "https://github.com/ardura"; 357 | const EMAIL: &'static str = "azviscarra@gmail.com"; 358 | 359 | const VERSION: &'static str = env!("CARGO_PKG_VERSION"); 360 | 361 | const AUDIO_IO_LAYOUTS: &'static [AudioIOLayout] = &[ 362 | AudioIOLayout { 363 | main_input_channels: NonZeroU32::new(2), 364 | main_output_channels: NonZeroU32::new(2), 365 | aux_input_ports: &[new_nonzero_u32(2); 5], 366 | aux_output_ports: &[], 367 | names: PortNames { 368 | layout: Option::None, 369 | main_input: Some("Main Input"), 370 | aux_inputs: &[ 371 | "Aux 1", 372 | "Aux 2", 373 | "Aux 3", 374 | "Aux 4", 375 | "Aux 5", 376 | ], 377 | main_output: Option::None, 378 | aux_outputs: &[] 379 | } 380 | }, 381 | AudioIOLayout { 382 | main_input_channels: NonZeroU32::new(1), 383 | main_output_channels: NonZeroU32::new(1), 384 | aux_input_ports: &[new_nonzero_u32(1); 5], 385 | ..AudioIOLayout::const_default() 386 | }, 387 | ]; 388 | 389 | const SAMPLE_ACCURATE_AUTOMATION: bool = true; 390 | 391 | type SysExMessage = (); 392 | type BackgroundTask = (); 393 | 394 | fn params(&self) -> Arc { 395 | self.params.clone() 396 | } 397 | 398 | fn editor(&self, async_executor: AsyncExecutor) -> Option> { 399 | scrollscope_gui::make_gui(self, async_executor) 400 | } 401 | 402 | fn initialize( 403 | &mut self, 404 | _audio_io_layout: &AudioIOLayout, 405 | buffer_config: &BufferConfig, 406 | _context: &mut impl InitContext, 407 | ) -> bool { 408 | // Update sample rate and buffer size on initialization 409 | let sample_rate = buffer_config.sample_rate; 410 | self.sample_rate.store(sample_rate, Ordering::Release); 411 | 412 | // Calculate appropriate buffer size based on sample rate and max display time 413 | let buffer_size = calculate_buffer_size(sample_rate, MAX_DISPLAY_MS); 414 | self.sample_buffer.update_internal_length(buffer_size); 415 | self.sample_buffer_2.update_internal_length(buffer_size); 416 | 417 | true 418 | } 419 | 420 | fn process( 421 | &mut self, 422 | buffer: &mut nih_plug::prelude::Buffer<'_>, 423 | aux: &mut nih_plug::prelude::AuxiliaryBuffers<'_>, 424 | context: &mut impl ProcessContext, 425 | ) -> ProcessStatus { 426 | // Only process if the GUI is open 427 | if !self.params.editor_state.is_open() { 428 | return ProcessStatus::Normal; 429 | } 430 | 431 | // Update cached parameters to reduce atomic loads inside the loop 432 | let current_gain = self.params.free_gain.smoothed.next(); 433 | self.gain_cache.store(current_gain, Ordering::Relaxed); 434 | 435 | let h_scale = self.params.h_scale.value(); 436 | self.h_scale_cache.store(h_scale, Ordering::Relaxed); 437 | 438 | // Update sample rate if it changed 439 | let sample_rate = context.transport().sample_rate; 440 | if sample_rate != self.sample_rate.load(Ordering::Relaxed) { 441 | self.sample_rate.store(sample_rate, Ordering::Release); 442 | 443 | // Recalculate buffer size based on new sample rate 444 | let buffer_size = calculate_buffer_size(sample_rate, self.params.scrollspeed.value()); 445 | self.sample_buffer.update_internal_length(buffer_size); 446 | self.sample_buffer_2.update_internal_length(buffer_size); 447 | } 448 | 449 | // Reset skip counter before processing 450 | let mut local_skip_counter = [0,0]; 451 | self.skip_counter[0].store(0, Ordering::Relaxed); 452 | self.skip_counter[1].store(0, Ordering::Relaxed); 453 | 454 | // Determine whether to process in analyzer mode or oscilloscope mode 455 | if !self.show_analyzer.load(Ordering::Relaxed) { 456 | // Process in oscilloscope mode 457 | self.process_oscilloscope(buffer, aux, context, &mut local_skip_counter); 458 | } else { 459 | // Process in analyzer mode 460 | self.process_analyzer(buffer, aux, &mut local_skip_counter); 461 | } 462 | 463 | // Update the skip counter 464 | self.skip_counter[0].store(local_skip_counter[0], Ordering::Relaxed); 465 | self.skip_counter[1].store(local_skip_counter[1], Ordering::Relaxed); 466 | 467 | ProcessStatus::Normal 468 | } 469 | 470 | const MIDI_INPUT: MidiConfig = MidiConfig::None; 471 | const MIDI_OUTPUT: MidiConfig = MidiConfig::None; 472 | const HARD_REALTIME_ONLY: bool = false; 473 | 474 | fn task_executor(&self) -> TaskExecutor { 475 | Box::new(|_| ()) 476 | } 477 | 478 | fn filter_state(_state: &mut PluginState) {} 479 | fn reset(&mut self) {} 480 | fn deactivate(&mut self) {} 481 | } 482 | 483 | // Separate processing implementations to reduce complexity 484 | impl Scrollscope { 485 | fn process_oscilloscope( 486 | &self, 487 | buffer: &mut nih_plug::buffer::Buffer<'_>, 488 | aux: &mut nih_plug::audio_setup::AuxiliaryBuffers<'_>, 489 | context: &mut impl ProcessContext, 490 | skip_counter: &mut [i32; 2], 491 | ) { 492 | // Get buffer slices for efficient processing 493 | let raw_buffer = buffer.as_slice_immutable(); 494 | let aux_0 = aux.inputs[0].as_slice_immutable(); 495 | let aux_1 = aux.inputs[1].as_slice_immutable(); 496 | let aux_2 = aux.inputs[2].as_slice_immutable(); 497 | let aux_3 = aux.inputs[3].as_slice_immutable(); 498 | let aux_4 = aux.inputs[4].as_slice_immutable(); 499 | 500 | // Cache parameters to avoid atomic loads in the loop 501 | let h_scale = self.h_scale_cache.load(Ordering::Relaxed) as i32; 502 | let current_gain = self.gain_cache.load(Ordering::Relaxed); 503 | let sync_active = self.sync_var.load(Ordering::Relaxed); 504 | let alt_sync_active = self.alt_sync.load(Ordering::Relaxed); 505 | let stereo_mode = self.stereo_view.load(Ordering::Relaxed); 506 | 507 | // Process beat detection once per buffer instead of per sample 508 | let (is_on_beat, is_on_bar) = self.detect_beat(context); 509 | let mut add_beat_line = false; 510 | 511 | // Update in-place index if needed 512 | let mut in_place_idx = self.in_place_index.load(Ordering::Relaxed); 513 | if sync_active { 514 | if alt_sync_active { 515 | if context.transport().playing { 516 | match self.params.sync_timing.value() { 517 | BeatSync::Bar => { 518 | if is_on_bar && self.beat_threshold.load(Ordering::Relaxed) == 0 { 519 | in_place_idx = 0; 520 | self.beat_threshold.fetch_add(1, Ordering::Relaxed); 521 | } else if !is_on_bar && self.beat_threshold.load(Ordering::Relaxed) > 0 { 522 | self.beat_threshold.store(0, Ordering::Relaxed); 523 | } 524 | }, 525 | BeatSync::Beat => { 526 | if is_on_beat && self.beat_threshold.load(Ordering::Relaxed) == 0 { 527 | in_place_idx = 0; 528 | self.beat_threshold.fetch_add(1, Ordering::Relaxed); 529 | } else if !is_on_beat && self.beat_threshold.load(Ordering::Relaxed) > 0 { 530 | self.beat_threshold.store(0, Ordering::Relaxed); 531 | } 532 | } 533 | } 534 | } else { 535 | in_place_idx = 0; 536 | } 537 | } else { 538 | // Normal sync mode 539 | let current_beat = context.transport().pos_beats().unwrap(); 540 | let temp_current_beat = (current_beat * 1000.0).round() / 1000.0; 541 | 542 | const EPSILON: f64 = 0.001; 543 | match self.params.sync_timing.value() { 544 | BeatSync::Bar => { 545 | if (temp_current_beat % 4.0) < EPSILON { 546 | in_place_idx = 0; 547 | skip_counter[0] = 0; 548 | skip_counter[1] = 0; 549 | let mut buffers = self.sample_buffer.buffers.write(); 550 | for buff in buffers.iter_mut() { 551 | buff[0].zero_out(); 552 | buff[1].zero_out(); 553 | buff[2].zero_out(); 554 | buff[3].zero_out(); 555 | buff[4].zero_out(); 556 | buff[5].zero_out(); 557 | buff[6].zero_out(); 558 | buff[7].zero_out(); 559 | } 560 | let mut buffers = self.sample_buffer_2.buffers.write(); 561 | for buff in buffers.iter_mut() { 562 | buff[0].zero_out(); 563 | buff[1].zero_out(); 564 | buff[2].zero_out(); 565 | buff[3].zero_out(); 566 | buff[4].zero_out(); 567 | buff[5].zero_out(); 568 | buff[6].zero_out(); 569 | buff[7].zero_out(); 570 | } 571 | } 572 | } 573 | BeatSync::Beat => { 574 | if (temp_current_beat % 1.0) < EPSILON { 575 | in_place_idx = 0; 576 | skip_counter[0] = 0; 577 | skip_counter[1] = 0; 578 | let mut buffers = self.sample_buffer.buffers.write(); 579 | for buff in buffers.iter_mut() { 580 | buff[0].zero_out(); 581 | buff[1].zero_out(); 582 | buff[2].zero_out(); 583 | buff[3].zero_out(); 584 | buff[4].zero_out(); 585 | buff[5].zero_out(); 586 | buff[6].zero_out(); 587 | buff[7].zero_out(); 588 | } 589 | let mut buffers = self.sample_buffer_2.buffers.write(); 590 | for buff in buffers.iter_mut() { 591 | buff[0].zero_out(); 592 | buff[1].zero_out(); 593 | buff[2].zero_out(); 594 | buff[3].zero_out(); 595 | buff[4].zero_out(); 596 | buff[5].zero_out(); 597 | buff[6].zero_out(); 598 | buff[7].zero_out(); 599 | } 600 | } 601 | } 602 | } 603 | } 604 | } 605 | 606 | // Check if we need to add beat lines 607 | if context.transport().playing { 608 | if alt_sync_active { 609 | add_beat_line = is_on_beat; 610 | self.in_place_index.store(0, Ordering::SeqCst); 611 | } else if ((context.transport().pos_beats().unwrap() * 1000.0).round() / 1000.0) % 1.0 == 0.0 { 612 | add_beat_line = true; 613 | if sync_active { 614 | self.in_place_index.store(0, Ordering::SeqCst); 615 | } 616 | } 617 | } 618 | 619 | // Process all channels in stereo mode 620 | let channels = [0, 1]; 621 | for (b0, ax0, ax1, ax2, ax3, ax4, channel) in 622 | izip!(raw_buffer, aux_0, aux_1, aux_2, aux_3, aux_4, channels) { 623 | 624 | // Setup batch processing 625 | let mut l_batch = Vec::with_capacity(100); // Pre-allocate to avoid reallocations 626 | let mut r_batch = Vec::with_capacity(100); // Pre-allocate to avoid reallocations 627 | 628 | // Process all samples in this channel 629 | for (sample, aux_sample_1, aux_sample_2, aux_sample_3, aux_sample_4, aux_sample_5) in 630 | izip!(b0.iter(), ax0.iter(), ax1.iter(), ax2.iter(), ax3.iter(), ax4.iter()) { 631 | 632 | // Only process samples according to h_scale parameter 633 | if (channel == 0 && skip_counter[0] % h_scale == 0) || (channel == 1 && skip_counter[1] % h_scale == 0) { 634 | // Apply gain to samples 635 | let visual_main_sample = sample * current_gain; 636 | 637 | // Only apply aux processing if the aux isn't the same as the main signal 638 | let visual_aux_sample_1 = if *aux_sample_1 != *sample { *aux_sample_1 * current_gain } else { 0.0 }; 639 | let visual_aux_sample_2 = if *aux_sample_2 != *sample { *aux_sample_2 * current_gain } else { 0.0 }; 640 | let visual_aux_sample_3 = if *aux_sample_3 != *sample { *aux_sample_3 * current_gain } else { 0.0 }; 641 | let visual_aux_sample_4 = if *aux_sample_4 != *sample { *aux_sample_4 * current_gain } else { 0.0 }; 642 | let visual_aux_sample_5 = if *aux_sample_5 != *sample { *aux_sample_5 * current_gain } else { 0.0 }; 643 | 644 | let mut sum_sample = 0.0; 645 | if self.channel_enabled[6].load(Ordering::Relaxed) { 646 | if self.channel_enabled[0].load(Ordering::Relaxed) { 647 | sum_sample += visual_main_sample; 648 | } 649 | if self.channel_enabled[1].load(Ordering::Relaxed) { 650 | sum_sample += visual_aux_sample_1; 651 | } 652 | if self.channel_enabled[2].load(Ordering::Relaxed) { 653 | sum_sample += visual_aux_sample_2; 654 | } 655 | if self.channel_enabled[3].load(Ordering::Relaxed) { 656 | sum_sample += visual_aux_sample_3; 657 | } 658 | if self.channel_enabled[4].load(Ordering::Relaxed) { 659 | sum_sample += visual_aux_sample_4; 660 | } 661 | if self.channel_enabled[5].load(Ordering::Relaxed) { 662 | sum_sample += visual_aux_sample_5; 663 | } 664 | } 665 | 666 | // Check for clipping 667 | if visual_main_sample.abs() > 1.0 || 668 | visual_aux_sample_1.abs() > 1.0 || 669 | visual_aux_sample_2.abs() > 1.0 || 670 | visual_aux_sample_3.abs() > 1.0 || 671 | visual_aux_sample_4.abs() > 1.0 || 672 | visual_aux_sample_5.abs() > 1.0 { 673 | self.is_clipping.store(120.0, Ordering::Relaxed); 674 | } 675 | 676 | // Process based on sync mode 677 | if sync_active { 678 | // In-place update mode 679 | let ipi_index = in_place_idx as usize; 680 | 681 | if self.sample_buffer.get_sample(0, ipi_index).is_some() { 682 | self.sample_buffer.update_sample(0, ipi_index, visual_main_sample); 683 | self.sample_buffer.update_sample(1, ipi_index, visual_aux_sample_1); 684 | self.sample_buffer.update_sample(2, ipi_index, visual_aux_sample_2); 685 | self.sample_buffer.update_sample(3, ipi_index, visual_aux_sample_3); 686 | self.sample_buffer.update_sample(4, ipi_index, visual_aux_sample_4); 687 | self.sample_buffer.update_sample(5, ipi_index, visual_aux_sample_5); 688 | //6 is beat lines 689 | if add_beat_line { 690 | if stereo_mode { 691 | self.sample_buffer.update_sample(6, ipi_index, 2.1); 692 | if ipi_index > 0 { 693 | self.sample_buffer.update_sample(6, ipi_index - 1, -2.1); 694 | } else { 695 | self.sample_buffer.update_sample(6, ipi_index + 1, -2.1); 696 | } 697 | } else { 698 | self.sample_buffer.update_sample(6, ipi_index, 1.0); 699 | if ipi_index > 0 { 700 | self.sample_buffer.update_sample(6, ipi_index - 1, -1.0); 701 | } else { 702 | self.sample_buffer.update_sample(6, ipi_index + 1, -1.0); 703 | } 704 | } 705 | } 706 | self.sample_buffer.update_sample(7, ipi_index, sum_sample); 707 | } 708 | 709 | if self.sample_buffer_2.get_sample(0, ipi_index).is_some() { 710 | self.sample_buffer_2.update_sample(0, ipi_index, visual_main_sample); 711 | self.sample_buffer_2.update_sample(1, ipi_index, visual_aux_sample_1); 712 | self.sample_buffer_2.update_sample(2, ipi_index, visual_aux_sample_2); 713 | self.sample_buffer_2.update_sample(3, ipi_index, visual_aux_sample_3); 714 | self.sample_buffer_2.update_sample(4, ipi_index, visual_aux_sample_4); 715 | self.sample_buffer_2.update_sample(5, ipi_index, visual_aux_sample_5); 716 | //6 is beat lines 717 | self.sample_buffer_2.update_sample(7, ipi_index, sum_sample); 718 | } 719 | 720 | if channel == 1 { 721 | // Increment in-place index 722 | in_place_idx += 1; 723 | } 724 | } else { 725 | if channel == 0 { 726 | // Add beat line if needed (only on first channel) 727 | if add_beat_line { 728 | if stereo_mode { 729 | l_batch.push((6, 2.1)); 730 | l_batch.push((6, -2.1)); 731 | } else { 732 | l_batch.push((6, 1.0)); 733 | l_batch.push((6, -1.0)); 734 | } 735 | 736 | add_beat_line = false; // Reset flag after adding 737 | self.add_beat_line.store(false, Ordering::Relaxed); 738 | } else { 739 | l_batch.push((6, 0.0)); // Normal point for beat channel 740 | } 741 | // Normal scrolling mode - add samples to batch 742 | l_batch.push((0, visual_main_sample)); 743 | l_batch.push((1, visual_aux_sample_1)); 744 | l_batch.push((2, visual_aux_sample_2)); 745 | l_batch.push((3, visual_aux_sample_3)); 746 | l_batch.push((4, visual_aux_sample_4)); 747 | l_batch.push((5, visual_aux_sample_5)); 748 | l_batch.push((7, sum_sample)); 749 | } else { 750 | // Normal scrolling mode - add samples to batch 751 | r_batch.push((0, visual_main_sample)); 752 | r_batch.push((1, visual_aux_sample_1)); 753 | r_batch.push((2, visual_aux_sample_2)); 754 | r_batch.push((3, visual_aux_sample_3)); 755 | r_batch.push((4, visual_aux_sample_4)); 756 | r_batch.push((5, visual_aux_sample_5)); 757 | r_batch.push((7, sum_sample)); 758 | } 759 | } 760 | 761 | // Process batch if it's getting large 762 | if l_batch.len() >= 50 { 763 | if channel == 0 { 764 | self.sample_buffer.push_samples(&l_batch); 765 | } 766 | l_batch.clear(); 767 | } 768 | if r_batch.len() >= 50 { 769 | if channel == 1 { 770 | self.sample_buffer_2.push_samples(&r_batch); 771 | } 772 | r_batch.clear(); 773 | } 774 | } 775 | 776 | skip_counter[channel] += 1; 777 | } 778 | 779 | // Process any remaining samples in batch 780 | if !l_batch.is_empty() { 781 | if channel == 0 { 782 | self.sample_buffer.push_samples(&l_batch); 783 | } 784 | } 785 | if !r_batch.is_empty() { 786 | if channel == 1 { 787 | self.sample_buffer_2.push_samples(&r_batch); 788 | } 789 | } 790 | } 791 | // Store updated in-place index 792 | self.in_place_index.store(in_place_idx, Ordering::Relaxed); 793 | } 794 | 795 | fn process_analyzer( 796 | &self, 797 | buffer: &mut nih_plug::prelude::Buffer<'_>, 798 | aux: &mut nih_plug::prelude::AuxiliaryBuffers<'_>, 799 | skip_counter: &mut [i32; 2], 800 | ) { 801 | // Get buffer slices for efficient processing 802 | let raw_buffer = buffer.as_slice_immutable(); 803 | let aux_0 = aux.inputs[0].as_slice_immutable(); 804 | let aux_1 = aux.inputs[1].as_slice_immutable(); 805 | let aux_2 = aux.inputs[2].as_slice_immutable(); 806 | let aux_3 = aux.inputs[3].as_slice_immutable(); 807 | let aux_4 = aux.inputs[4].as_slice_immutable(); 808 | 809 | // Cache parameters to avoid atomic loads in the loop 810 | let h_scale = self.h_scale_cache.load(Ordering::Relaxed) as i32; 811 | let current_gain = self.gain_cache.load(Ordering::Relaxed); 812 | 813 | // Process all channels 814 | let channels = [0, 1]; 815 | for (b0, ax0, ax1, ax2, ax3, ax4, channel) in 816 | izip!(raw_buffer, aux_0, aux_1, aux_2, aux_3, aux_4, channels) { 817 | 818 | // Setup batch processing 819 | let mut batch = Vec::with_capacity(100); // Pre-allocate to avoid reallocations 820 | 821 | // Process all samples in this channel 822 | for (sample, aux_sample_1, aux_sample_2, aux_sample_3, aux_sample_4, aux_sample_5) in 823 | izip!(b0.iter(), ax0.iter(), ax1.iter(), ax2.iter(), ax3.iter(), ax4.iter()) { 824 | 825 | // Only process samples according to h_scale parameter 826 | if (channel == 0 && skip_counter[0] % h_scale == 0) || (channel == 1 && skip_counter[1] % h_scale == 0) { 827 | // Apply gain to samples 828 | let visual_main_sample = sample * current_gain; 829 | 830 | // Only apply aux processing if the aux isn't the same as the main signal 831 | let visual_aux_sample_1 = if *aux_sample_1 != *sample { *aux_sample_1 * current_gain } else { 0.0 }; 832 | let visual_aux_sample_2 = if *aux_sample_2 != *sample { *aux_sample_2 * current_gain } else { 0.0 }; 833 | let visual_aux_sample_3 = if *aux_sample_3 != *sample { *aux_sample_3 * current_gain } else { 0.0 }; 834 | let visual_aux_sample_4 = if *aux_sample_4 != *sample { *aux_sample_4 * current_gain } else { 0.0 }; 835 | let visual_aux_sample_5 = if *aux_sample_5 != *sample { *aux_sample_5 * current_gain } else { 0.0 }; 836 | 837 | // Check for clipping 838 | if visual_main_sample.abs() > 1.0 || 839 | visual_aux_sample_1.abs() > 1.0 || 840 | visual_aux_sample_2.abs() > 1.0 || 841 | visual_aux_sample_3.abs() > 1.0 || 842 | visual_aux_sample_4.abs() > 1.0 || 843 | visual_aux_sample_5.abs() > 1.0 { 844 | self.is_clipping.store(120.0, Ordering::Relaxed); 845 | } 846 | 847 | // Add samples to batch 848 | batch.push((0, visual_main_sample)); 849 | batch.push((1, visual_aux_sample_1)); 850 | batch.push((2, visual_aux_sample_2)); 851 | batch.push((3, visual_aux_sample_3)); 852 | batch.push((4, visual_aux_sample_4)); 853 | batch.push((5, visual_aux_sample_5)); 854 | 855 | // Process batch if it's getting large 856 | if batch.len() >= 50 { 857 | if channel == 0 { 858 | self.sample_buffer.push_samples(&batch); 859 | } else { 860 | self.sample_buffer_2.push_samples(&batch); 861 | } 862 | batch.clear(); 863 | } 864 | } 865 | 866 | skip_counter[channel] += 1; 867 | } 868 | 869 | // Process any remaining samples in batch 870 | if !batch.is_empty() { 871 | if channel == 0 { 872 | self.sample_buffer.push_samples(&batch); 873 | } else { 874 | self.sample_buffer_2.push_samples(&batch); 875 | } 876 | } 877 | } 878 | } 879 | 880 | // Helper method to detect beats from transport 881 | fn detect_beat(&self, context: &mut impl ProcessContext) -> (bool, bool) { 882 | let mut is_on_beat = false; 883 | let mut is_on_bar = false; 884 | 885 | if context.transport().playing { 886 | if let Some(beats) = context.transport().pos_beats() { 887 | // Check if we're on a beat (integer value) 888 | let beat_fractional = beats.fract(); 889 | // Use epsilon comparison for floating point 890 | if beat_fractional < 0.01 || beat_fractional > 0.99 { 891 | is_on_beat = true; 892 | 893 | // Check if we're on a bar (every 4 beats typically) 894 | let beat_in_bar = beats % 4.0; 895 | if beat_in_bar < 0.01 || beat_in_bar > 3.99 { 896 | is_on_bar = true; 897 | } 898 | } 899 | } 900 | } 901 | 902 | (is_on_beat, is_on_bar) 903 | } 904 | } 905 | 906 | // Helper function to eliminate denormals for better performance 907 | #[inline] 908 | fn flush_denormal_bits(value: f32) -> f32 { 909 | if value.abs() < 1.0e-20 { 910 | 0.0 911 | } else { 912 | value 913 | } 914 | } 915 | 916 | impl ClapPlugin for Scrollscope { 917 | const CLAP_ID: &'static str = "com.ardura.scrollscope"; 918 | const CLAP_DESCRIPTION: Option<&'static str> = Some("A scrolling oscilloscope"); 919 | const CLAP_MANUAL_URL: Option<&'static str> = Some(Self::URL); 920 | const CLAP_SUPPORT_URL: Option<&'static str> = None; 921 | const CLAP_FEATURES: &'static [ClapFeature] = &[ 922 | ClapFeature::AudioEffect, 923 | ClapFeature::Utility, 924 | ClapFeature::Analyzer, 925 | ]; 926 | } 927 | 928 | impl Vst3Plugin for Scrollscope { 929 | const VST3_CLASS_ID: [u8; 16] = *b"ScrollscopeAAAAA"; 930 | const VST3_SUBCATEGORIES: &'static [Vst3SubCategory] = &[ 931 | Vst3SubCategory::Analyzer, 932 | Vst3SubCategory::Tools, 933 | ]; 934 | } 935 | 936 | nih_export_clap!(Scrollscope); 937 | nih_export_vst3!(Scrollscope); 938 | 939 | fn pivot_frequency_slope(freq: f32, magnitude: f32, f0: f32, slope: f32) -> f32{ 940 | if freq < f0 { 941 | magnitude * (freq / f0).powf(slope / 20.0) 942 | } else { 943 | magnitude * (f0 / freq).powf(slope / 20.0) 944 | } 945 | } -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | // src/main.rs for standalone only 2 | 3 | use nih_plug::prelude::*; 4 | use scrollscope::Scrollscope as Scrollscope_Standalone; 5 | 6 | fn main() { 7 | nih_export_standalone::(); 8 | } -------------------------------------------------------------------------------- /src/slim_checkbox.rs: -------------------------------------------------------------------------------- 1 | // This is a copy of egui checkbox just with slimmer padding/spacing needed in Scrollscope 2 | // I also added a version to work with Atomic structures 3 | 4 | // ---------------------------------------------------------------------------- 5 | 6 | use std::sync::atomic::{AtomicBool, Ordering}; 7 | use nih_plug_egui::egui::{ 8 | epaint, pos2, vec2, NumExt, Response, Rounding, Sense, Shape, TextStyle, Ui, Vec2, Widget, WidgetInfo, WidgetText, WidgetType 9 | }; 10 | 11 | // TODO(emilk): allow checkbox without a text label 12 | /// Boolean on/off control with text label. 13 | /// 14 | /// Usually you'd use [`Ui::checkbox`] instead. 15 | /// 16 | /// ``` 17 | /// # egui::__run_test_ui(|ui| { 18 | /// # let mut my_bool = true; 19 | /// // These are equivalent: 20 | /// ui.checkbox(&mut my_bool, "Checked"); 21 | /// ui.add(egui::SlimCheckbox::new(&mut my_bool, "Checked")); 22 | /// # }); 23 | /// ``` 24 | #[must_use = "You should put this widget in an ui with `ui.add(widget);`"] 25 | pub struct SlimCheckbox<'a> { 26 | checked: &'a mut bool, 27 | text: WidgetText, 28 | } 29 | 30 | #[must_use = "You should put this widget in an ui with `ui.add(widget);`"] 31 | pub struct AtomicSlimCheckbox<'a> { 32 | checked: &'a AtomicBool, 33 | text: WidgetText, 34 | } 35 | 36 | impl<'a> AtomicSlimCheckbox<'a> { 37 | pub fn new(checked: &'a AtomicBool, text: impl Into) -> Self { 38 | AtomicSlimCheckbox { 39 | checked, 40 | text: text.into(), 41 | } 42 | } 43 | } 44 | 45 | impl<'a> Widget for AtomicSlimCheckbox<'a> { 46 | fn ui(self, ui: &mut Ui) -> Response { 47 | let AtomicSlimCheckbox { checked, text } = self; 48 | 49 | let spacing = &ui.spacing(); 50 | let icon_width = spacing.icon_width; 51 | let icon_spacing = spacing.icon_spacing; 52 | 53 | let (text, mut desired_size) = if text.is_empty() { 54 | (None, vec2(icon_width, 0.0)) 55 | } else { 56 | let total_extra = vec2(icon_width + icon_spacing, 0.0); 57 | 58 | let wrap_width = ui.available_width() - total_extra.x; 59 | let text = text.into_galley(ui, None, wrap_width, TextStyle::Button); 60 | 61 | let mut desired_size = total_extra + text.size(); 62 | 63 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 64 | //This is the only piece I changed -Ardura 65 | desired_size = 66 | desired_size.at_least(vec2(spacing.interact_size.x * 0.45, spacing.interact_size.y)); 67 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 68 | 69 | (Some(text), desired_size) 70 | }; 71 | 72 | desired_size = desired_size.at_least(Vec2::splat(spacing.interact_size.y)); 73 | desired_size.y = desired_size.y.max(icon_width); 74 | let (rect, mut response) = ui.allocate_exact_size(desired_size, Sense::click()); 75 | 76 | if response.clicked() { 77 | checked.fetch_xor(true, Ordering::SeqCst); 78 | response.mark_changed(); 79 | } 80 | response.widget_info(|| { 81 | WidgetInfo::selected( 82 | WidgetType::Checkbox, 83 | //true, 84 | checked.load(Ordering::SeqCst), 85 | text.as_ref().map_or("", |x| x.text()), 86 | ) 87 | }); 88 | 89 | if ui.is_rect_visible(rect) { 90 | // let visuals = ui.style().interact_selectable(&response, *checked); // too colorful 91 | let visuals = ui.style().interact(&response); 92 | let (small_icon_rect, big_icon_rect) = ui.spacing().icon_rectangles(rect); 93 | ui.painter().add(epaint::RectShape { 94 | rect: big_icon_rect.expand(visuals.expansion), 95 | //corner_radius: visuals.corner_radius, 96 | fill: visuals.bg_fill, 97 | stroke: visuals.bg_stroke, 98 | //fill_texture_id: TextureId::default(), 99 | //uv: big_icon_rect.expand(visuals.expansion), 100 | //blur_width: 0.0, 101 | //stroke_kind: epaint::StrokeKind::Inside, 102 | //round_to_pixels: Option::None, 103 | //brush: Option::None, 104 | rounding: Rounding::none(), 105 | }); 106 | 107 | if checked.load(Ordering::SeqCst) { 108 | // Check mark: 109 | ui.painter().add(Shape::line( 110 | vec![ 111 | pos2(small_icon_rect.left(), small_icon_rect.center().y), 112 | pos2(small_icon_rect.center().x, small_icon_rect.bottom()), 113 | pos2(small_icon_rect.right(), small_icon_rect.top()), 114 | ], 115 | visuals.fg_stroke, 116 | )); 117 | } 118 | if let Some(text) = text { 119 | let text_pos = pos2( 120 | rect.min.x + icon_width + icon_spacing, 121 | rect.center().y - 0.5 * text.size().y, 122 | ); 123 | //ui.painter().galley(text_pos, text, visuals.fg_stroke.color); 124 | text.paint_with_visuals(ui.painter(), text_pos, visuals); 125 | } 126 | } 127 | 128 | response 129 | } 130 | } 131 | 132 | // This is here but I don't use it in scrollscope 133 | #[allow(dead_code)] 134 | impl<'a> SlimCheckbox<'a> { 135 | pub fn new(checked: &'a mut bool, text: impl Into) -> Self { 136 | SlimCheckbox { 137 | checked, 138 | text: text.into(), 139 | } 140 | } 141 | } 142 | 143 | impl<'a> Widget for SlimCheckbox<'a> { 144 | fn ui(self, ui: &mut Ui) -> Response { 145 | let SlimCheckbox { checked, text } = self; 146 | 147 | let spacing = &ui.spacing(); 148 | let icon_width = spacing.icon_width; 149 | let icon_spacing = spacing.icon_spacing; 150 | 151 | let (text, mut desired_size) = if text.is_empty() { 152 | (None, vec2(icon_width, 0.0)) 153 | } else { 154 | let total_extra = vec2(icon_width + icon_spacing, 0.0); 155 | 156 | let wrap_width = ui.available_width() - total_extra.x; 157 | let text = text.into_galley(ui, None, wrap_width, TextStyle::Button); 158 | 159 | let mut desired_size = total_extra + text.size(); 160 | 161 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 162 | //This is the only piece I changed -Ardura 163 | desired_size = 164 | desired_size.at_least(vec2(spacing.interact_size.x * 0.45, spacing.interact_size.y)); 165 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 166 | 167 | (Some(text), desired_size) 168 | }; 169 | 170 | desired_size = desired_size.at_least(Vec2::splat(spacing.interact_size.y)); 171 | desired_size.y = desired_size.y.max(icon_width); 172 | let (rect, mut response) = ui.allocate_exact_size(desired_size, Sense::click()); 173 | 174 | if response.clicked() { 175 | *checked = !*checked; 176 | response.mark_changed(); 177 | } 178 | response.widget_info(|| { 179 | WidgetInfo::selected( 180 | WidgetType::Checkbox, 181 | //true, 182 | *checked, 183 | text.as_ref().map_or("", |x| x.text()), 184 | ) 185 | }); 186 | 187 | if ui.is_rect_visible(rect) { 188 | // let visuals = ui.style().interact_selectable(&response, *checked); // too colorful 189 | let visuals = ui.style().interact(&response); 190 | let (small_icon_rect, big_icon_rect) = ui.spacing().icon_rectangles(rect); 191 | ui.painter().add(epaint::RectShape { 192 | rect: big_icon_rect.expand(visuals.expansion), 193 | //corner_radius: visuals.corner_radius, 194 | fill: visuals.bg_fill, 195 | stroke: visuals.fg_stroke, 196 | //blur_width: 0.0, 197 | //stroke_kind: epaint::StrokeKind::Inside, 198 | //round_to_pixels: Option::None, 199 | //brush: Option::None, 200 | rounding: Rounding::none() 201 | }); 202 | 203 | if *checked { 204 | // Check mark: 205 | ui.painter().add(Shape::line( 206 | vec![ 207 | pos2(small_icon_rect.left(), small_icon_rect.center().y), 208 | pos2(small_icon_rect.center().x, small_icon_rect.bottom()), 209 | pos2(small_icon_rect.right(), small_icon_rect.top()), 210 | ], 211 | visuals.fg_stroke, 212 | )); 213 | } 214 | if let Some(text) = text { 215 | let text_pos = pos2( 216 | rect.min.x + icon_width + icon_spacing, 217 | rect.center().y - 0.5 * text.size().y, 218 | ); 219 | //ui.painter().galley(text_pos, text, visuals.fg_stroke.color); 220 | text.paint_with_visuals(ui.painter(), text_pos, visuals); 221 | } 222 | } 223 | 224 | response 225 | } 226 | } 227 | -------------------------------------------------------------------------------- /xtask/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "xtask" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | nih_plug_xtask = { git = "https://github.com/robbert-vdh/nih-plug.git" } 8 | -------------------------------------------------------------------------------- /xtask/src/main.rs: -------------------------------------------------------------------------------- 1 | fn main() -> nih_plug_xtask::Result<()> { 2 | nih_plug_xtask::main() 3 | } 4 | --------------------------------------------------------------------------------