From 85c3ac6debe7fc294db65d4c29f9c65be82b819f Mon Sep 17 00:00:00 2001 From: Brad Barnett <127794626+bdbarnett@users.noreply.github.com> Date: Sat, 31 Oct 2026 09:36:31 -0500 Subject: [PATCH] Portal: audioinstruments and audioeffects take the cards and pages; audiocomponents becomes a moved pointer --- assets/js/site-chrome.js | 21 +++-- data/repos_db.json | 106 +++++++++++++++++++++---- docs-site/projects/audiocomponents.md | 5 -- docs-site/projects/audioeffects.md | 5 ++ docs-site/projects/audioinstruments.md | 5 ++ docs-site/projects/index.md | 6 +- profile/README.md | 8 +- scripts/generate_sites.py | 4 + tests/test_generate_sites.py | 8 ++ 9 files changed, 135 insertions(+), 33 deletions(-) delete mode 100644 docs-site/projects/audiocomponents.md create mode 100644 docs-site/projects/audioeffects.md create mode 100644 docs-site/projects/audioinstruments.md diff --git a/assets/js/site-chrome.js b/assets/js/site-chrome.js index dc41b53..9b583be 100644 --- a/assets/js/site-chrome.js +++ b/assets/js/site-chrome.js @@ -111,12 +111,21 @@ icon: '' }, { - id: "audiocomponents", - name: "audiocomponents", - path: "/audiocomponents/", - url: ROOT + "/audiocomponents/", - tag: "Instruments & FX", - desc: "55 instruments and 45 effects on audiodsp", + id: "audioinstruments", + name: "audioinstruments", + path: "/audioinstruments/", + url: ROOT + "/audioinstruments/", + tag: "Instruments", + desc: "33 playable instruments on audiodsp", + icon: '' + }, + { + id: "audioeffects", + name: "audioeffects", + path: "/audioeffects/", + url: ROOT + "/audioeffects/", + tag: "Effects", + desc: "45 studio and pedal effects on audiodsp", icon: '' }, { diff --git a/data/repos_db.json b/data/repos_db.json index 427072e..6e8b3ff 100644 --- a/data/repos_db.json +++ b/data/repos_db.json @@ -33,6 +33,7 @@ }, "moved": { "displayif": "now [`modules/displayif`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/displayif) in micropython-pydevices. The old repository is archived.", + "audiocomponents": "split into [`audioinstruments`](https://github.com/PyDevices/audioinstruments) and [`audioeffects`](https://github.com/PyDevices/audioeffects). The old repository is archived.", "audioif": "now [`modules/audioif`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/audioif) in micropython-pydevices. The old repository is archived.", "cameraif": "now [`modules/cameraif`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/cameraif) in micropython-pydevices. The old repository is archived.", "usbif": "the C module is now [`modules/usbhost`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/usbhost) in micropython-pydevices; the Python USB packages are in [pydevices](https://github.com/PyDevices/pydevices/blob/main/docs/guides/usb.md). The old repository is archived.", @@ -120,7 +121,7 @@ "theme_color": "var(--tier-1-amber)", "eyebrow": "audiodsp", "headline": "audiodsp — CircuitPython-compatible audio for MicroPython and CPython.", - "description": "CircuitPython's audio system (audiocore, synthio, audiomixer, effects, audiomp3) ported to MicroPython and CPython, extending CircuitPython along the way: dynamics, routing, convolution, and offline rendering. On PyPI as pydevices-audiodsp; the instrument and effect libraries built on it ship from audiocomponents.", + "description": "CircuitPython's audio system (audiocore, synthio, audiomixer, effects, audiomp3) ported to MicroPython and CPython, extending CircuitPython along the way: dynamics, routing, convolution, and offline rendering. On PyPI as pydevices-audiodsp; the instrument and effect libraries built on it are audioinstruments and audioeffects.", "hero_canvas": { "app": "signal_gen", "width": 480, @@ -145,8 +146,8 @@ "tier_color": true }, { - "label": "audiocomponents", - "href": "https://pydevices.github.io/audiocomponents/", + "label": "audioinstruments", + "href": "https://pydevices.github.io/audioinstruments/", "tier_color": true } ] @@ -184,14 +185,14 @@ } ] }, - "audiocomponents": { + "audioinstruments": { "tier": 1, "page": "portal-subdir", "tier_name": "Core Platform & Board Contract", "theme_color": "var(--tier-1-amber)", - "eyebrow": "audiocomponents", - "headline": "audiocomponents — 55 classic instruments and 45 effects, in pure Python, on audiodsp.", - "description": "The instrument and effect libraries for audiodsp: audioinstruments (55 modelled classics, from the TR-808 to the DX7) and audioeffects (45 effect classes and racks), pure Python on MicroPython and CPython. Ships as pydevices-audioinstruments and pydevices-audioeffects, each a standalone distribution on TestPyPI and a MIP package.", + "eyebrow": "audioinstruments", + "headline": "audioinstruments — 33 playable synthesizers, organs, electric pianos and drum machines, in pure Python.", + "description": "Playable synthesizers, organs, electric pianos and drum machines, each a patch of modules on a virtual rack, rendered a block at a time on audiodsp. Pure Python on CPython and MicroPython-compatible firmware. Install omnipython-audioinstruments from TestPyPI, or audioinstruments from the MIP index.", "hero_canvas": { "app": "audio_scope", "width": 240, @@ -202,22 +203,93 @@ "buttons": [ { "label": "GitHub Repo", - "href": "https://github.com/PyDevices/audiocomponents", + "href": "https://github.com/PyDevices/audioinstruments", + "primary": true + }, + { + "label": "Docs", + "href": "https://github.com/PyDevices/audioinstruments/blob/main/docs/overview.md", + "tier_color": true + }, + { + "label": "Instruments", + "href": "https://github.com/PyDevices/audioinstruments/blob/main/docs/instruments.md", + "tier_color": true + }, + { + "label": "TestPyPI", + "href": "https://test.pypi.org/project/omnipython-audioinstruments/", + "tier_color": true + } + ] + }, + "audioeffects": { + "tier": 1, + "page": "portal-subdir", + "tier_name": "Core Platform & Board Contract", + "theme_color": "var(--tier-1-amber)", + "eyebrow": "audioeffects", + "headline": "audioeffects — 45 studio and guitar-pedal effects, in pure Python.", + "description": "Compressors, EQs, reverbs, delays, modulation, drive and amp simulation, pitch shifters and racks, pure Python on audiodsp's audio nodes, the same on MicroPython-compatible boards, CircuitPython-compatible boards and a desktop. Install omnipython-audioeffects from TestPyPI, or audioeffects from the MIP index.", + "hero_canvas": { + "app": "signal_gen", + "width": 240, + "height": 240, + "shape": "square", + "app_url": "https://PyDevices.github.io/assets/apps/signal_gen.py" + }, + "buttons": [ + { + "label": "GitHub Repo", + "href": "https://github.com/PyDevices/audioeffects", + "primary": true + }, + { + "label": "Docs", + "href": "https://github.com/PyDevices/audioeffects/blob/main/docs/index.md", + "tier_color": true + }, + { + "label": "Effects", + "href": "https://github.com/PyDevices/audioeffects/blob/main/docs/reference/effects.md", + "tier_color": true + }, + { + "label": "TestPyPI", + "href": "https://test.pypi.org/project/omnipython-audioeffects/", + "tier_color": true + } + ] + }, + "audiocomponents": { + "tier": 1, + "page": "portal-subdir", + "portal_grid": false, + "title": "PyDevices - audiocomponents (moved)", + "tier_name": "Core Platform & Board Contract", + "theme_color": "var(--tier-1-amber)", + "eyebrow": "audiocomponents · moved", + "headline": "audiocomponents has split into audioinstruments and audioeffects.", + "description": "Split into two repositories: audioinstruments, the playable synthesizers, organs, electric pianos and drum machines, and audioeffects, the studio and guitar-pedal effects. Both are 0.5.0 on TestPyPI and the MIP index, under the same names. Your code doesn't change. The old repository is archived.", + "buttons": [ + { + "label": "audioinstruments", + "href": "https://github.com/PyDevices/audioinstruments", "primary": true }, { - "label": "Component API", - "href": "https://github.com/PyDevices/audiocomponents/blob/main/docs/reference/component-api.md", + "label": "audioeffects", + "href": "https://github.com/PyDevices/audioeffects", "tier_color": true }, { - "label": "TestPyPI: instruments", - "href": "https://test.pypi.org/project/pydevices-audioinstruments/", + "label": "Instruments docs", + "href": "https://github.com/PyDevices/audioinstruments/blob/main/docs/overview.md", "tier_color": true }, { - "label": "TestPyPI: effects", - "href": "https://test.pypi.org/project/pydevices-audioeffects/", + "label": "Archived repo", + "href": "https://github.com/PyDevices/audiocomponents", "tier_color": true } ] @@ -904,7 +976,7 @@ "theme_color": "var(--tier-5-steel)", "eyebrow": "mpvst", "headline": "MPVST — audio effects and instruments as a VST3 plug-in.", - "description": "Programmable VST3 instruments and effects: every audiocomponents instrument and effect as a named plug-in, each instance running its Python in a sidecar process. Installers for Windows and Linux; nothing has to be built.", + "description": "Programmable VST3 instruments and effects: every audioinstruments instrument and audioeffects effect as a named plug-in, each instance running its Python in a sidecar process. Installers for Windows and Linux; nothing has to be built.", "hero_canvas": { "app": "ftp_scope", "width": 240, @@ -929,8 +1001,8 @@ "tier_color": true }, { - "label": "audiocomponents", - "href": "https://pydevices.github.io/audiocomponents/", + "label": "audioinstruments", + "href": "https://pydevices.github.io/audioinstruments/", "tier_color": true } ] diff --git a/docs-site/projects/audiocomponents.md b/docs-site/projects/audiocomponents.md deleted file mode 100644 index 20153e5..0000000 --- a/docs-site/projects/audiocomponents.md +++ /dev/null @@ -1,5 +0,0 @@ -# audiocomponents - -The instrument and effect libraries built on audiodsp: `audioinstruments` (55 modelled classics, from the TR-808 to the DX7) and `audioeffects` (45 effect classes and racks). Pure Python on MicroPython and CPython, each a standalone package. - -[audiocomponents on GitHub](https://github.com/PyDevices/audiocomponents). diff --git a/docs-site/projects/audioeffects.md b/docs-site/projects/audioeffects.md new file mode 100644 index 0000000..abc37de --- /dev/null +++ b/docs-site/projects/audioeffects.md @@ -0,0 +1,5 @@ +# audioeffects + +Studio and guitar-pedal effects: compressors, EQs, reverbs, delays, modulation, drive and amp simulation, pitch shifters and racks. Pure Python on audiodsp's audio nodes. It is on TestPyPI as `omnipython-audioeffects` and in the MIP index as `audioeffects`. + +[audioeffects on GitHub](https://github.com/PyDevices/audioeffects). diff --git a/docs-site/projects/audioinstruments.md b/docs-site/projects/audioinstruments.md new file mode 100644 index 0000000..6264b75 --- /dev/null +++ b/docs-site/projects/audioinstruments.md @@ -0,0 +1,5 @@ +# audioinstruments + +Playable synthesizers, organs, electric pianos and drum machines, each one a patch of modules on a virtual rack, rendered a block at a time on audiodsp. Pure Python on CPython and MicroPython-compatible firmware. It is on TestPyPI as `omnipython-audioinstruments` and in the MIP index as `audioinstruments`. + +[audioinstruments on GitHub](https://github.com/PyDevices/audioinstruments). diff --git a/docs-site/projects/index.md b/docs-site/projects/index.md index 189620d..22eb365 100644 --- a/docs-site/projects/index.md +++ b/docs-site/projects/index.md @@ -7,7 +7,8 @@ Each project has its own manual. A project listed with its manual here has it on - [palettes](palettes.md) - [pdwidgets](pdwidgets.md) - [audiodsp](audiodsp.md) -- [audiocomponents](audiocomponents.md) +- [audioinstruments](audioinstruments.md) +- [audioeffects](audioeffects.md) - [mpftp](mpftp.md) - [LVGL bindings and ports](lvgl.md) - [micropython-pydevices and the device modules](micropython-pydevices.md) @@ -22,7 +23,8 @@ pygraphics palettes pdwidgets audiodsp -audiocomponents +audioinstruments +audioeffects mpftp lvgl micropython-pydevices diff --git a/profile/README.md b/profile/README.md index 03f838f..77ff2f4 100644 --- a/profile/README.md +++ b/profile/README.md @@ -23,8 +23,9 @@ Welcome to **PyDevices** — a unified pure-Python hardware abstraction engine, Standard hardware driver engine and companion reference code. - [`pydevices`](https://github.com/PyDevices/pydevices) — Unified pure-Python hardware abstraction layer and core device contract for MicroPython, CircuitPython, CPython, direct WebAssembly, Pyodide, and Android. -- [`audiodsp`](https://github.com/PyDevices/audiodsp) — CircuitPython's audio system (audiocore, synthio, audiomixer, effects, audiomp3) ported to MicroPython and CPython, extending CircuitPython along the way: dynamics, routing, convolution, and offline rendering. On PyPI as pydevices-audiodsp; the instrument and effect libraries built on it ship from audiocomponents. -- [`audiocomponents`](https://github.com/PyDevices/audiocomponents) — The instrument and effect libraries for audiodsp: audioinstruments (55 modelled classics, from the TR-808 to the DX7) and audioeffects (45 effect classes and racks), pure Python on MicroPython and CPython. Ships as pydevices-audioinstruments and pydevices-audioeffects, each a standalone distribution on TestPyPI and a MIP package. +- [`audiodsp`](https://github.com/PyDevices/audiodsp) — CircuitPython's audio system (audiocore, synthio, audiomixer, effects, audiomp3) ported to MicroPython and CPython, extending CircuitPython along the way: dynamics, routing, convolution, and offline rendering. On PyPI as pydevices-audiodsp; the instrument and effect libraries built on it are audioinstruments and audioeffects. +- [`audioinstruments`](https://github.com/PyDevices/audioinstruments) — Playable synthesizers, organs, electric pianos and drum machines, each a patch of modules on a virtual rack, rendered a block at a time on audiodsp. Pure Python on CPython and MicroPython-compatible firmware. Install omnipython-audioinstruments from TestPyPI, or audioinstruments from the MIP index. +- [`audioeffects`](https://github.com/PyDevices/audioeffects) — Compressors, EQs, reverbs, delays, modulation, drive and amp simulation, pitch shifters and racks, pure Python on audiodsp's audio nodes, the same on MicroPython-compatible boards, CircuitPython-compatible boards and a desktop. Install omnipython-audioeffects from TestPyPI, or audioeffects from the MIP index. - [`gallery`](https://github.com/PyDevices/gallery) — Comprehensive example code, direct MicroPython WebAssembly demos, board configurations, and multi-interpreter showcase benchmarks. ### Tier 2: Python Framebuffers & GUI Toolkits @@ -56,11 +57,12 @@ MIP package indexing, multi-usermod builds, and serial/FTP IDE extensions. - [`mip`](https://github.com/PyDevices/mip) — Single source of truth (SoT) for precompiled MicroPython .mpy bytecode packages and pure-Python library distributions across the PyDevices ecosystem. - [`micropython-pydevices`](https://github.com/PyDevices/micropython-pydevices) — The PyDevices patch queue for MicroPython, kept like a distribution keeps one: an ordered, provenance-tracked patch series over the pinned upstream (MicroPython v1.30.0-preview-160), with presets, boards and variants that build PyDevices modules into firmware with upstream's own make. - [`workbench`](https://github.com/PyDevices/workbench) — A ViperIDE fork with a built-in WebAssembly MicroPython simulator: edit, run, and debug PyDevices code against a simulated board entirely in the browser, no hardware required. -- [`mpvst`](https://github.com/PyDevices/mpvst) — Programmable VST3 instruments and effects: every audiocomponents instrument and effect as a named plug-in, each instance running its Python in a sidecar process. Installers for Windows and Linux; nothing has to be built. +- [`mpvst`](https://github.com/PyDevices/mpvst) — Programmable VST3 instruments and effects: every audioinstruments instrument and audioeffects effect as a named plug-in, each instance running its Python in a sidecar process. Installers for Windows and Linux; nothing has to be built. **Moved into other repositories:** - **displayif** — now [`modules/displayif`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/displayif) in micropython-pydevices. The old repository is archived. +- **audiocomponents** — split into [`audioinstruments`](https://github.com/PyDevices/audioinstruments) and [`audioeffects`](https://github.com/PyDevices/audioeffects). The old repository is archived. - **audioif** — now [`modules/audioif`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/audioif) in micropython-pydevices. The old repository is archived. - **cameraif** — now [`modules/cameraif`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/cameraif) in micropython-pydevices. The old repository is archived. - **usbif** — the C module is now [`modules/usbhost`](https://github.com/PyDevices/micropython-pydevices/tree/main/modules/usbhost) in micropython-pydevices; the Python USB packages are in [pydevices](https://github.com/PyDevices/pydevices/blob/main/docs/guides/usb.md). The old repository is archived. diff --git a/scripts/generate_sites.py b/scripts/generate_sites.py index 5edf3bc..db04a41 100755 --- a/scripts/generate_sites.py +++ b/scripts/generate_sites.py @@ -43,6 +43,8 @@ def get_card_icon(repo_name): 'audiodsp': '', 'audioif': '', 'audiocomponents': '', + 'audioinstruments': '', + 'audioeffects': '', 'usbif': '', 'cameraif': '', 'micropython-pydevices': '', @@ -74,6 +76,8 @@ def get_tag_label(repo_name): 'audiodsp': 'C Audio Usermod', 'audioif': 'C Audio Driver', 'audiocomponents': 'Pure-Python Audio', + 'audioinstruments': 'Instruments', + 'audioeffects': 'Effects', 'usbif': 'C USB Usermod', 'cameraif': 'C Camera Usermod', 'micropython-pydevices': 'Runtime Overlay', diff --git a/tests/test_generate_sites.py b/tests/test_generate_sites.py index 4c68917..93e0177 100644 --- a/tests/test_generate_sites.py +++ b/tests/test_generate_sites.py @@ -148,6 +148,14 @@ def test_the_four_lvgl_repos_give_way_to_omnipython_lvgl(self) -> None: block = self.gen.build_ecosystem_markdown(self.db) self.assertIn("[`omnipython-lvgl`](https://github.com/PyDevices/omnipython-lvgl)", block) + def test_audiocomponents_gives_way_to_instruments_and_effects(self) -> None: + grid = self.gen.build_portal_grids_html(self.db) + self.assertIn("audiocomponents", self.db["_meta"]["moved"]) + self.assertNotIn('href="/audiocomponents/"', grid) + for name in ("audioinstruments", "audioeffects"): + self.assertNotEqual(self.gen.page_destination(self.db[name]), "none", name) + self.assertIn(f'href="/{name}/"', grid) + if __name__ == "__main__": unittest.main()