Skip to content

Instantly share code, notes, and snippets.

@louspringer
Created September 8, 2025 11:42
Show Gist options
  • Select an option

  • Save louspringer/a476dd3db3e7e4cc1b7e0a46f3a3dcb4 to your computer and use it in GitHub Desktop.

Select an option

Save louspringer/a476dd3db3e7e4cc1b7e0a46f3a3dcb4 to your computer and use it in GitHub Desktop.
Awesome zoom whoopee cushion set up
Display the source blob
Display the rendered blob
Raw
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1320" height="760" viewBox="0 0 1320 760">
<defs>
<style>
.box { fill: #f7f7f7; stroke: #222; stroke-width: 2; rx: 14; ry: 14; }
.title { font: bold 20px sans-serif; fill: #111; }
.text { font: 16px sans-serif; fill: #222; }
.small { font: 14px monospace; fill: #333; }
.arrow { stroke: #222; stroke-width: 2; marker-end: url(#arrowhead); fill: none; }
.arrow-soft { stroke: #666; stroke-dasharray: 6 6; stroke-width: 2; marker-end: url(#arrowheadSoft); fill: none; }
.chip { fill: #e9f2ff; stroke: #1d3f72; stroke-width: 2; rx: 10; ry: 10; }
.act { fill: #fff6e5; stroke: #7a4a00; stroke-width: 2; rx: 10; ry: 10; }
.io { fill: #eefaf0; stroke: #1f6a2f; stroke-width: 2; rx: 10; ry: 10; }
.warn { fill: #fff3cd; stroke: #856404; stroke-width: 2; rx: 10; ry: 10; }
.danger { fill: #fdecea; stroke: #7b241c; stroke-width: 2; rx: 10; ry: 10; }
.legend { font: 14px sans-serif; fill: #333; }
</style>
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="10" refY="3.5" orient="auto">
<polygon points="0 0, 10 3.5, 0 7" fill="#222" />
</marker>
<marker id="arrowheadSoft" markerWidth="10" markerHeight="7" refX="10" refY="3.5" orient="auto">
<polygon points="0 0, 10 3.5, 0 7" fill="#666" />
</marker>
</defs>
<!-- Title -->
<text x="660" y="40" text-anchor="middle" class="title">Clip Cushion™ — Audio-Level Triggered Gag System</text>
<text x="660" y="68" text-anchor="middle" class="small">Yellow: peak ≥ –10 dBFS (≥ 80 ms) • Red: peak ≥ –3 dBFS (≥ 30 ms) • Cooldowns: Yellow 1.5 s, Red 3 s • Priority: Red suppresses Yellow for 2 s</text>
<!-- Row 1: Input chain -->
<rect x="60" y="110" width="230" height="120" class="io"/>
<text x="175" y="140" text-anchor="middle" class="text">Mic: Electro‑Voice RE20</text>
<text x="175" y="168" text-anchor="middle" class="small">Dynamic • ~–56.5 dBV/Pa • 2–4" off‑axis</text>
<text x="175" y="196" text-anchor="middle" class="small">Pop filter • No phantom (48V off)</text>
<line x1="290" y1="170" x2="340" y2="170" class="arrow"/>
<rect x="340" y="110" width="230" height="120" class="io"/>
<text x="455" y="140" text-anchor="middle" class="text">Interface: MOTU M4</text>
<text x="455" y="168" text-anchor="middle" class="small">Gain ≈ 55–60 dB • 24‑bit/48 kHz</text>
<text x="455" y="196" text-anchor="middle" class="small">Keep peaks in yellow, avoid red</text>
<line x1="570" y1="170" x2="620" y2="170" class="arrow"/>
<rect x="620" y="100" width="260" height="140" class="chip"/>
<text x="750" y="130" text-anchor="middle" class="text">Level Monitor &amp; Trigger Logic</text>
<text x="750" y="158" text-anchor="middle" class="small">Peak detector: attack 5–10 ms • release 150–250 ms</text>
<text x="750" y="186" text-anchor="middle" class="small">Hysteresis: re‑arm when &lt; (threshold – 3 dB) for ≥ 200 ms</text>
<!-- Branches: software and hardware -->
<line x1="750" y1="240" x2="750" y2="290" class="arrow"/>
<!-- Software branch -->
<rect x="420" y="290" width="320" height="140" class="box"/>
<text x="580" y="318" text-anchor="middle" class="text">Software Output Path</text>
<text x="580" y="346" text-anchor="middle" class="small">Play local WAV: yellow → “pffft”, red → “BRAAAP”</text>
<text x="580" y="374" text-anchor="middle" class="small">Route to monitors only (no loopback to call)</text>
<!-- Hardware branch -->
<rect x="760" y="290" width="320" height="140" class="box"/>
<text x="920" y="318" text-anchor="middle" class="text">Hardware Output Path</text>
<text x="920" y="346" text-anchor="middle" class="small">Send UDP/OSC/Serial to ESP32</text>
<text x="920" y="374" text-anchor="middle" class="small">Duty guard: ≤ 1.5 s in any 10 s window</text>
<line x1="580" y1="240" x2="580" y2="290" class="arrow"/>
<line x1="920" y1="240" x2="920" y2="290" class="arrow"/>
<!-- Threshold cards -->
<rect x="80" y="300" width="300" height="60" class="warn"/>
<text x="230" y="335" text-anchor="middle" class="text">Yellow Threshold</text>
<text x="230" y="360" text-anchor="middle" class="small">peak ≥ –10 dBFS for ≥ 80 ms → small toot • cooldown 1.5 s</text>
<rect x="80" y="380" width="300" height="60" class="danger"/>
<text x="230" y="415" text-anchor="middle" class="text">Red Threshold</text>
<text x="230" y="440" text-anchor="middle" class="small">peak ≥ –3 dBFS for ≥ 30 ms → big BRAAAP • cooldown 3 s</text>
<!-- Call apps -->
<rect x="60" y="510" width="240" height="110" class="box"/>
<text x="180" y="540" text-anchor="middle" class="text">Call / DAW</text>
<text x="180" y="568" text-anchor="middle" class="small">Zoom • Discord • DAW</text>
<text x="180" y="596" text-anchor="middle" class="small">Optional: soft limiter at –3 dBFS</text>
<!-- ESP32 block -->
<rect x="910" y="460" width="160" height="110" class="chip"/>
<text x="990" y="490" text-anchor="middle" class="text">ESP32</text>
<text x="990" y="518" text-anchor="middle" class="small">State machine • cooldowns</text>
<text x="990" y="544" text-anchor="middle" class="small">GPIO → driver</text>
<!-- Driver & Actuator -->
<rect x="1090" y="460" width="190" height="110" class="act"/>
<text x="1185" y="490" text-anchor="middle" class="text">Actuator</text>
<text x="1185" y="518" text-anchor="middle" class="small">MOSFET + diode → pump / solenoid / servo</text>
<text x="1185" y="544" text-anchor="middle" class="small">Inflate/press whoopee cushion</text>
<!-- Arrows among lower blocks -->
<line x1="750" y1="170" x2="230" y2="300" class="arrow-soft"/>
<line x1="750" y1="170" x2="230" y2="380" class="arrow-soft"/>
<line x1="260" y1="170" x2="180" y2="510" class="arrow-soft"/>
<line x1="740" y1="360" x2="740" y2="440" class="arrow-soft"/>
<line x1="1080" y1="360" x2="990" y2="460" class="arrow"/>
<line x1="1070" y1="515" x2="1090" y2="515" class="arrow"/>
<line x1="1250" y1="515" x2="1270" y2="515" class="arrow"/>
<!-- Legend -->
<rect x="430" y="640" width="460" height="90" class="box"/>
<text x="660" y="666" text-anchor="middle" class="legend">
Legend: Green = I/O • Blue = Logic/Microcontroller • Orange = Actuation • Yellow = Warning threshold • Red = Over threshold
</text>
<text x="660" y="692" text-anchor="middle" class="legend">
Hysteresis prevents chatter • Cooldowns avoid spam • Red overrides Yellow
</text>
</svg>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment