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()