npx skills add smithery/plurigrid --skill catsharp-sonification
plurigrid/asi
catsharp-sonification
Sonify GF(3) color streams via CatSharp scale. Maps Gay.jl colors to pitch classes and plays through sox. No voice synthesis.
Installation
$
npx skills add plurigrid/asi --skill catsharp-sonification
Also in this package
Other skills from plurigrid/asi · top by installs.
npx skills add plurigrid/asi
More details
Agent compatibility
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
Claude Code
Not declared
Cursor
Not declared
Codex
Not declared
GitHub Copilot
Not declared
Windsurf
Not declared
Gemini CLI
Not declared
Cline
Not declared
OpenCode
Not declared
Also listed on
Alternate registries and mirrors of this skill.
Repository health
Stars
62
License
LICENSE
Default branch
main
Open issues
3
Status
Active
Package contents
Files included with this skill beyond the listing page.
-
skill md
SKILL.md2,864 B -
docs
SUMMARY.md154 B
History
- First seen on skills.sh
- First recorded snapshot · 7 installs
SKILL.md
CatSharp Sonification
Sonify deterministic color streams using the CatSharp scale (Mazzola's Topos of Music).
Galois Chain
seed ⊣ γ ⊣ color ⊣ hue ⊣ pitch ⊣ freq ⊣ tone
Mappings
Hue → Trit (Gay.jl spec)
| Hue Range | Trit | Role | Temperature |
|---|---|---|---|
| 0-60°, 300-360° | +1 | PLUS | warm |
| 60-180° | 0 | ERGODIC | neutral |
| 180-300° | -1 | MINUS | cold |
Trit → Waveform
| Trit | Waveform | Character |
|---|---|---|
| +1 | sine | smooth, harmonic |
| 0 | triangle | balanced, neutral |
| -1 | square | harsh, digital |
Hue → Pitch Class
pitch_class = floor(hue / 30) mod 12
30° per semitone maps the color wheel to the chromatic scale.
CatSharp Pitch → Trit
| Pitch Classes | Trit | Structure |
|---|---|---|
| {0, 4, 8} (C, E, G#) | +1 | Augmented triad |
| {3, 6, 9} (Eb, F#, A) | 0 | Diminished subset |
| Circle of fifths | -1 | Fifths stack |
Usage
Python (sox required)
import subprocess
def play_color(r, g, b, duration=0.15):
hue = rgb_to_hue(r, g, b)
trit = hue_to_trit(hue)
pc = int(hue / 30) % 12
freq = 261.63 * (2 ** (pc / 12)) # C4 base
wave = {1: "sine", 0: "triangle", -1: "square"}[trit]
subprocess.run(["play", "-q", "-n", "synth", str(duration),
wave, str(freq), "vol", "0.3"])
Babashka
(defn play-trit [trit freq]
(let [wave (case trit 1 "sine" 0 "triangle" -1 "square")]
(shell "play" "-q" "-n" "synth" "0.15" wave (str freq) "vol" "0.3")))
Julia (Gay.jl)
using Gay
function sonify_stream(seed, n=12)
Gay.gay_seed!(seed)
for _ in 1:n
c = Gay.next_color()
hue = Gay.Colors.convert(Gay.HSL, c).h
pc = mod(round(Int, hue / 30), 12)
freq = 261.63 * 2^(pc / 12)
trit = hue < 60 || hue >= 300 ? 1 : hue < 180 ? 0 : -1
wave = Dict(1 => "sine", 0 => "triangle", -1 => "square")[trit]
run(`play -q -n synth 0.15 $wave $freq vol 0.3`)
end
end
GF(3) Conservation
Every tripartite emission sums to 0 mod 3:
MINUS(-1) + ERGODIC(0) + PLUS(+1) = 0
Modelica Formulation
See catsharp.mo for acausal equation-based model.
Dependencies
sox(via flox:flox install sox)- Python 3.x or Julia with Gay.jl
- macOS
afplayas fallback
Related Skills
gay-mcp: Deterministic color generationrubato-composer: Mazzola's mathematical music theorytopos-of-music: Full categorical music implementation