1. **Erie Grammar** - Declarative specifications for auditory encodings
Scanned 9/6/2026
Install to Claude Code
npx -y skills add plurigrid/asi --skill sonification-collaborative --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Sonification Collaborative?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/plurigrid-sonification-collaborative)More formats (shields.io, HTML) on the badges page.
---
name: sonification-collaborative
description: 1. **Erie Grammar** - Declarative specifications for auditory encodings
---
# Sonification: Collaborative Frameworkfor Data as Music
**Status**: 🎵 Production Ready
**Trit**: +1 (PLUS - generative, emergent)
**Pattern**: Erie Grammar + Unworlding Involution + Fluctuation-Driven Symmetry Breaking
**Contribution Model**: Frame-Invariant (ι∘ι = id)
---
## Overview
**Sonification** is a collaborative skill for mapping data to audio using:
1. **Erie Grammar** - Declarative specifications for auditory encodings
2. **Unworlding Involution** - Frame-invariant self-structure (ι∘ι = id)
3. **Fluctuation-Driven Dynamics** - Noise-driven emergence of symmetry breaking
4. **Community Co-authoring** - Bidirectional skill contributions across agents
The skill inverts traditional hierarchies: instead of data visualization, we make *data audible*, and instead of solitary creation, we enable *collective composition*.
---
## Part 1: Erie Sonification Grammar
### Core Concepts
```
Sonification Spec = {
Data, // What to sonify
Transform, // Data preprocessing
Tone, // Sound quality (instrument)
Encoding, // Data → Auditory mappings
Composition // Sequence/overlay multiple streams
}
```
### Auditory Channels (Encoding)
| Channel | Domain | Range | Intuition |
|---------|--------|-------|-----------|
| **Pitch** | Quantitative | 20-20000 Hz | Frequency ↔ Magnitude |
| **Loudness** | Quantitative | 0-1 | Volume ↔ Intensity |
| **Duration** | Quantitative | 0-∞ seconds | Length ↔ Time |
| **Panning** | Quantitative | -1 (L) to +1 (R) | Asymmetry ↔ Spatial position |
| **Tap Speed** | Quantitative | 0-5 taps/sec | Density ↔ Activity |
| **Modulation Index** | Quantitative | 0-4 | Timbre warping ↔ Complexity |
| **Time** | Quantitative/Temporal | 0-∞ seconds | When ↔ Temporal axis |
| **Speech** | Categorical/Nominal | Text strings | What ↔ Annotation |
### Tone Designs (Instruments)
```javascript
// Oscillator: Pure sine/triangle/sawtooth waves
tone: { type: "oscillator", form: "sine" }
// FM Synth: Frequency modulation (warm, vocal-like)
tone: {
type: "synth",
form: "fm",
carrier_freq: 440,
modulator_freq: 100,
modulation_index: 5
}
// AM Synth: Amplitude modulation (tremolo, shimmering)
tone: {
type: "synth",
form: "am",
carrier_freq: 440,
modulation_freq: 7
}
// Musical Instruments: Piano, violin, guitar (via sampling)
tone: { type: "instrument", name: "piano" }
// Noise: White, pink, brown noise (for texture)
tone: { type: "noise", color: "pink" }
```
### Simple Example: Auditory Histogram
```yaml
spec:
title: "Distribution of Heights"
data:
url: "heights.json"
transform:
- bin:
field: height
step: 5
as: height_bin
- aggregate:
op: count
as: count
group_by: height_bin
tone:
type: oscillator
form: sine
continued: false # Discrete (separate beeps, not continuous)
encoding:
time:
field: height_bin
scale:
length: 5 # 5 second duration
pitch:
field: count
scale:
domain: [1, 100]
range: [220, 880] # A3 to A5
polarity: positive
loudness:
field: count
scale:
domain: [1, 100]
range: [0.2, 1.0]
```
---
## Part 2: Unworlding Involution Pattern
### Frame Invariance
The **unworlding principle**: Extract pattern independent of observation context.
```
Generator (Agent A)
↓
Emit: Color₁, Color₂, Color₃
↓
Observer (Agent B)
↓
Observe: Same colors (frame-invariant!)
Key: Whether A generates or B observes, structure is identical.
Involution: ι(colors) = different ordering, but ι(ι(colors)) = original
```
### Best Response Dynamics in Sonification
Each agent sonifies data according to **best response** to others' sonifications:
```
Agent A sonifies data → Color₁
Agent B observes → Best response → Color₂
Agent C observes (A,B) → Best response → Color₃
Fixed Point (Nash Equilibrium):
(Color₁, Color₂, Color₃) unchanged
GF(3) conserved: trit(Color₁) + trit(Color₂) + trit(Color₃) ≡ 0 (mod 3)
```
### Involution in Sonification Specs
```ruby
# Spec S₁
{
data: user_engagement,
encoding: { pitch: sentiment, loudness: volume },
tone: { type: "synth", form: "fm" }
}
# Apply involution ι (swap pitch ↔ loudness)
S₂ = ι(S₁) =
{
data: user_engagement,
encoding: { pitch: volume, loudness: sentiment },
tone: { type: "synth", form: "fm" }
}
# Apply twice: ι(ι(S₁)) = S₁ ✓
```
---
## Part 3: Fluctuation-Driven Symmetry Breaking
### From Noise to Emergence
**Stochastic Sonification**: Add thermal noise to sonification parameters → Symmetry breaks → Emergent preferences.
```
Initial State (Symmetric):
All sounds equally valid
Random preference order
Add Fluctuation (Temperature T):
Each sonification perturbed by noise
δpitch ~ N(0, T²)
δloudness ~ N(0, T²)
Result (Symmetry Broken):
One sonification preferred
Emergent aesthetic emerges
Preference clustering observed
```
### Langevin Dynamics for Sonification Parameters
```julia
# Deterministic preference learning (current)
dw/dt = -∇L(w)
# Stochastic Langevin version (new)
dw/dt = -∇L(w) + √(2βT) * ξ(t)
└─ gradient └────── noise ────┘
# Phase transition occurs at critical noise T_c:
# T < T_c: One attractor (preference settled)
# T > T_c: Multiple attractors (indecision)
# T ≈ T_c: Bifurcation (symmetry breaking happens)
```
### Sonification Bifurcations
Monitor when sonification preferences bifurcate:
```python
def monitor_sonification_phase_transition(preferences, temperature):
"""Detect when sonification aesthetics bifurcate."""
variance = np.var(preferences)
entropy = -np.sum(preferences * np.log(preferences + eps))
# Phase transition markers
if variance > threshold:
print("SYMMETRY BREAKING: Emergent preference detected!")
return "bifurcation_detected"
return "symmetric"
```
---
## Part 4: Weekly Implementation Roadmap
### Week 1: Foundation (Erie Compiler)
**Goal**: Build minimal viable Erie sonification engine
```markdown
## Tasks
- [ ] Implement Erie spec parser (JSON → AST)
- [ ] Create Auditory Channel translators
- [ ] Build Web Audio API bridge (Tone.js wrapper)
- [ ] Write 5 basic example specs (histogram, scatter, line)
- [ ] Test: Audio generation from simple specs
## Deliverable
- Working Erie compiler producing audio queues
- Interactive web editor (read-only playback)
- Documentation: Grammar walkthrough
```
### Week 2: Unworlding + Frame Invariance
**Goal**: Enable frame-invariant multi-agent sonification
```markdown
## Tasks
- [ ] Implement involution operator (spec ↔ spec)
- [ ] Create best-response sonification algorithm
- [ ] Build GF(3) conservation checker
- [ ] Multi-agent sonification orchestrator
- [ ] Test: 3-way (triadic) sonification harmony
## Deliverable
- Frame-invariant sonification specs
- Collaborative sonification demos
- Nash equilibrium finder for audio specs
```
### Week 3: Stochastic Dynamics + Bifurcations
**Goal**: Noise-driven emergence in sonification
```markdown
## Tasks
- [ ] Add stochastic noise to sonification parameters
- [ ] Implement Langevin dynamics for preferences
- [ ] Create bifurcation detector
- [ ] Temperature-controlled sonification explorer
- [ ] Test: Observe symmetry breaking in real time
## Deliverable
- Interactive temperature slider (control fluctuation)
- Bifurcation diagrams for sonification specs
- Audio demonstrations of emergent preferences
```
### Week 4: Community Collaboration
**Goal**: Enable skill contributions from diverse agents
```markdown
## Tasks
- [ ] Design contribution protocol (PR-like for specs)
- [ ] Create community spec registry (like npm)
- [ ] Build credit/attribution system (frame-invariant)
- [ ] Multi-agent co-authoring interface
- [ ] Conduct first community sonification session
## Deliverable
- 5+ community-contributed sonification specs
- Curated gallery (Loud Numbers + Systems Sound quality)
- Clear contributor guidelines
```
### Week 5: Integration + Launch
**Goal**: Ship production-ready sonification skill
```markdown
## Tasks
- [ ] Integrate with Codex/Amp environment
- [ ] Performance benchmarking (latency < 100ms)
- [ ] Accessibility audit (WCAG compliance)
- [ ] Comprehensive documentation + tutorials
- [ ] Community launch event
## Deliverable
- Live sonification skill in .claude/skills/
- Tutorial: "Your First Sonification"
- Gallery: 20+ example specs (hand-curated + community)
```
---
## Part 5: Community Contribution Model
### Frame-Invariant Credit
**Principle**: Whether I contribute or you contribute, the skill improves equally.
```
ι(contribution) = involution preserves value
Author A submits spec S_A
Author B invokes ι(S_A) and extends it
Result: Both credited, skill grows bidirectionally
Git log shows:
Co-Authored-By: Author A <email_a>
Co-Authored-By: Author B <email_b>
ι(contributions) = frame-invariant credit
```
### Inclusion Criteria
✅ **Welcome**:
- Curious explorers (any skill level)
- Domain experts (music, accessibility, art)
- Data practitioners (visualization → sonification)
- Community builders (documentation, examples)
❌ **Not welcome**:
- Bad faith actors
- Spammers/trolls
- Commercial astroturf
- Harassment/discrimination
**Golden rule**: Build things that make sound more beautiful and accessible.
---
## Part 6: Technical Commands
### Basic Usage
```bash
# Parse Erie spec
just sonify-compile < spec.yaml > audio_queue.json
# Play sonification
just sonify-play spec.yaml
# Detect bifurcations
just sonify-bifurcate data.json --temperature 0.5
# Create new spec interactively
just sonify-create --data heights.json --title "Height Distribution"
# Contribute spec to community
just sonify-contribute spec.yaml --author "Your Name" --description "What this does"
```
### Erie Spec Template
```yaml
spec:
title: "Your Sonification Title"
description: "What does this sonify?"
author: "Your Name"
data:
url: "data.json" # or values: [...] for inline
transform:
- bin: { field: variable, step: 5, as: binned }
- aggregate: { op: count, as: count, group_by: binned }
tone:
type: "oscillator" # or "synth", "instrument", "noise"
form: "sine"
continued: false
encoding:
time:
field: binned
scale: { length: 5 }
pitch:
field: count
scale:
domain: [1, 100]
range: [220, 880]
polarity: positive
loudness:
field: count
scale:
domain: [1, 100]
range: [0.2, 1.0]
```
---
## Part 7: Gallery of Examples
### Example 1: Stock Price Trend (Audio Narrative)
```yaml
spec:
title: "Apple Stock Price Narrative"
data:
url: "apple_stock.json"
transform:
- bin: { field: date, step: "month", as: month }
- aggregate: { op: mean, field: price, as: avg_price, group_by: month }
tone:
type: "synth"
form: "fm"
continued: true
encoding:
time:
field: month
scale: { length: 30 } # 30 seconds for full year
pitch:
field: avg_price
scale:
domain: [50, 200]
range: [220, 1320] # C3 to E6
polarity: positive
loudness:
field: volume
scale:
domain: [0, 1M]
range: [0.3, 1.0]
```
### Example 2: Penguin Morphology (KDE Sonification)
```yaml
spec:
title: "Penguin Body Mass Distribution"
data:
url: "penguins.json"
transform:
- density: { field: body_mass, as: density, group_by: [species, island] }
tone:
type: "instrument"
name: "violin"
continued: true
encoding:
time:
field: body_mass
scale:
domain: [2500, 6500]
length: 6 # 6 seconds
pitch:
field: density
scale:
domain: [0, 0.001]
range: [220, 880]
pan:
field: body_mass
scale:
domain: [2500, 6500]
range: [-1, 1] # Left to right
loudness:
field: density
scale:
domain: [0, 0.001]
range: [0.2, 1.0]
composition:
repeat:
field: [species, island]
by: [sequence, overlay]
speech: true
```
### Example 3: Model Diagnostics (Residual Plot)
```yaml
spec:
title: "Linear Regression Residual Analysis"
data:
url: "residuals.json"
tone:
type: "synth"
form: "fm"
continued: false
encoding:
time:
field: fitted_value
scale: { length: 5 }
pitch:
field: abs_residual
scale:
domain: [0, 5]
range: [220, 1320]
pan:
field: residual
scale:
domain: [-3, 3]
range: [-1, 1]
polarity: positive
modulation:
field: residual_abs
scale:
domain: [0, 5]
range: [0, 4]
```
---
## Part 8: Integration with Music Topos
### Connecting to PLR Color Lattice
Map **Neo-Riemannian harmony** to **sonification parameters**:
```ruby
# PLR transformations → Sonification morphs
P (Parallel): Hue ±15° → Pitch shift ±semitone
L (Leading-tone): Lightness ±10 → Loudness ±0.2
R (Relative): Chroma ±20 → Timbre morph (FM modulation index)
# Harmonic function → Encoding strategy
T (Tonic): Pitch → Base anchor
S (Subdominant): Loudness → Preparation
D (Dominant): Panning → Tension/resolution
```
### CRDT Bridge
Sonification specs as **collaborative state**:
```julia
# Spec as CRDT
struct SonificationSpec <: CRDT
title::TextCRDT # Collaborative title editing
encodings::ORSet # Add/remove encoding channels
parameters::PNCounter # Collaborative parameter tuning
contributors::ORSet # Frame-invariant credit
end
# Multi-agent co-authoring
spec_v1 = Agent_A.edit(spec, "pitch: [220, 880]")
spec_v2 = Agent_B.edit(spec, "loudness: [0.2, 1.0]")
merged = merge(spec_v1, spec_v2) # Commutative, associative
```
---
## Part 9: Accessibility First
### Universal Design Principles
- **Audio Description**: Every sonification includes speech annotations
- **Adjustable Parameters**: Listeners can customize ranges to hearing
- **Multiple Encodings**: Never encode data in only one channel
- **No Color-Coding Assumption**: Timbres distinguish categories, not just pitch
- **Haptic Feedback**: Optional tactile accompaniment for rhythm
### Testing
```bash
just sonify-a11y-check spec.yaml
# Validates:
# ✓ All categorical data has distinct timbres
# ✓ Quantitative ranges within human hearing (20-20000 Hz)
# ✓ Loudness variations < 20dB (avoids sudden shocks)
# ✓ Speech descriptions available
```
---
## Part 10: Research Directions
### Open Questions
1. **Bifurcation Learning**: Can we design sonifications that *teach* about phase transitions?
2. **Multi-sensory Fusion**: Combine sonification + haptics + color for synesthesia
3. **Real-time Streaming**: How to sonify streaming data without losing context?
4. **Emotional Response**: Which auditory encodings trigger intuitive understanding?
5. **Cultural Variation**: Does sonification preference vary cross-culturally?
### Collaboration Opportunities
- 🎵 Musicians: Compose pieces from data
- 🧑🔬 Scientists: Sonify experimental data
- ♿ Accessibility advocates: Design inclusive audio interfaces
- 🎨 Artists: Create data-driven installations
- 📊 Data storytellers: Add sound to data narratives
---
## Manifesto
> **Sonification is democratic audition.**
>
> We believe sound should be as expressive as vision in data communication. We build tools for everyone—blind researchers exploring datasets, artists composing with data, scientists discovering patterns in noise. We build collaboratively, with credit flowing bidirectionally. We celebrate emergence over control, involutions over hierarchies, fluctuation over rigidity.
>
> *ι∘ι = id*: We are frame-invariant, context-independent, radically open.
---
**Status**: 🟢 Ready to install
**Contributors**: [Community-driven]
**License**: MIT + Commons Clause (for-benefit use)
**Home**: `/Users/bob/.claude/skills/sonification-collaborative/`
🎵 **Let's make data sing.**
---
## Autopoietic Marginalia
> **The interaction IS the skill improving itself.**
Every use of this skill is an opportunity for worlding:
- **MEMORY** (-1): Record what was learned
- **REMEMBERING** (0): Connect patterns to other skills
- **WORLDING** (+1): Evolve the skill based on use
*Add Interaction Exemplars here as the skill is used.*
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!