gibribbon
gibribbon · sources · schema v1GIBRIBBON (video) — a Vib-Ribbon spiritual successor rendered with DOOM shareware-WAD sprites. A single white vector "ribbon"/ground line scrolls right→left on black (Vib-Ribbon's exact line-art grammar: the ground dips into a pit V for a LOOP, rises into a hump for a JUMP), while imp (TROO*) and zombie/former-human (POSS*) enemies — REAL sprites decoded from the same DOOM1.WAD the DOOM module uses — ride the ribbon in from the right. The player character is the green DOOM marine (PLAY*). An overhead ABXY prompt strip shows the button each upcoming event needs. FOUR events map to the four ABXY buttons: LOOP (A), JUMP (B), IMP SPAWN (X), ZOMBIE SPAWN (Y); a correct, in-window press clears the obstacle (marine loops/jumps) or fires-and-kills the enemy (it plays its DOOM death animation). Missing an event degrades the marine down a DOOM-flavoured health ladder (super → healthy → wounded → critical → GAME OVER); clean streaks recover rungs and reach a SUPER state. Inputs: cv1..cv4 (modsignal — drive event GENERATION from slow Synesthesia envelopes; each channel maps to one event kind), clock (the 1× scroll/tempo tick), gate (the beat — biases which CV channel spawns), x + y (joystick axes), and four ABXY button gates a / b / x_btn / y_btn (named to disambiguate from the x/y axes). Outputs: out (video), evt_hit / evt_miss / evt_fire / evt_kill / evt_gameover (10 ms gate pulses), and health_cv (marine vitality 0..1). Event generation is a PURE deterministic function of the inputs (gibribbon-events.ts) with all CV→event thresholds in a single tunable GIB_TUNING block; sprite extraction is a PURE WAD picture/PLAYPAL decoder (wad-sprites.ts) run at load time. DOOM1.WAD stays gitignored + fetched like the DOOM module; without it the game falls back to line-art placeholder figures so it still plays. DOOM shareware terms apply (same as the DOOM module).
the faceplate
inputs
| id | cable | what it does |
|---|---|---|
cv1 | modsignal | CV that drives loop-event (button A) generation: on each beat, channels above the spawn threshold (~0.42) compete and the strongest spawns its mapped event. Patch a slow envelope here so an energetic band spawns loops. Modulates the CV1 control. modulation (CV / gate / audio); modulates cv1 (additive offset — ±1 CV sweeps the full range, centered on the knob) |
cv2 | modsignal | CV that drives jump-event (button B) generation; eligible when its level exceeds the spawn threshold (~0.42) and it wins the per-beat strongest-channel contest. Modulates the CV2 control. modulation (CV / gate / audio); modulates cv2 (additive offset — ±1 CV sweeps the full range, centered on the knob) |
cv3 | modsignal | CV that drives imp-event (button X) generation — imps render as DOOM imp sprites that the marine fires on and kills when cleared. Modulates the CV3 control. modulation (CV / gate / audio); modulates cv3 (additive offset — ±1 CV sweeps the full range, centered on the knob) |
cv4 | modsignal | CV that drives zombie-event (button Y) generation — former-human sprites the marine fires on and kills on a successful clear. Modulates the CV4 control. modulation (CV / gate / audio); modulates cv4 (additive offset — ±1 CV sweeps the full range, centered on the knob) |
clock | gate | The transport beat (a 1x clock train, declared gate-typed but EDGE-detected, i.e. a trigger). Each rising edge advances the ribbon one authoritative beat and runs spawn generation, and switches the game into external/musical mode, suppressing the internal AUTOPLAY clock for ~1.5 s. gate / trigger; modulates clock (summed directly (the destination DSP scales it)) |
gate | gate | The beat gate, read as a sampled level (gate, high above 0.5), not edge-judged: when high the strongest eligible CV channel spawns on the beat; when low, only a notably-strong channel spawns, so off-beat spawns are sparser. gate / trigger; modulates gate (summed directly (the destination DSP scales it)) |
x | modsignal | Joystick X axis (bipolar -1..1) consumed as AIM: re-centres the judgement point by up to one hit-window (stick left = clear events slightly early, right = slightly late). A timing aid that shifts, not widens, the window. Modulates the axis_x control. modulation (CV / gate / audio); modulates axis_x (additive offset — ±1 CV sweeps the full range, centered on the knob) |
y | modsignal | Joystick Y axis (bipolar -1..1) consumed as the marine's VERTICAL position: push up to raise the marine off the ribbon (aim high), down to crouch (up to +/-26 px). Modulates the axis_y control. modulation (CV / gate / audio); modulates axis_y (additive offset — ±1 CV sweeps the full range, centered on the knob) |
a | gate | The A player button (rising edge = a trigger): on the edge it judges the nearest in-window LOOP event and clears it on a match. Spare presses with no matching event are ignored (no penalty). gate / trigger; modulates btn_a (summed directly (the destination DSP scales it)) |
b | gate | The B player button (rising edge / trigger): judges the nearest in-window JUMP event on the edge, clearing it on a match. gate / trigger; modulates btn_b (summed directly (the destination DSP scales it)) |
x_btn | gate | The X player button (rising edge / trigger): judges the nearest in-window IMP event on the edge. Named x_btn to disambiguate from the x AXIS port. gate / trigger; modulates btn_x (summed directly (the destination DSP scales it)) |
y_btn | gate | The Y player button (rising edge / trigger): judges the nearest in-window ZOMBIE event on the edge. Named y_btn to disambiguate from the y AXIS port. gate / trigger; modulates btn_y (summed directly (the destination DSP scales it)) |
outputs
| id | cable | what it does |
|---|---|---|
out | video | The rendered game frame (video): the 16:9 ribbon scene rasterised and letterboxed (bars top/bottom) into the engine's 4:3 output. RGB video stream |
evt_hit | gate | A ~10 ms gate pulse on every successful clear (any in-window button match), for triggering hit feedback in the audio domain. gate / trigger |
evt_miss | gate | A ~10 ms gate pulse on every missed event (one that scrolled past the marine uncleared), as the marine degrades a health rung. gate / trigger |
evt_fire | gate | A ~10 ms gate pulse when the marine FIRES — emitted on a successful enemy (imp/zombie) clear. gate / trigger |
evt_kill | gate | A ~10 ms gate pulse when an enemy DIES (its death animation), emitted alongside evt_fire on an enemy clear. gate / trigger |
evt_gameover | gate | A ~10 ms gate pulse fired once when the marine reaches GAME OVER (health hits dead). gate / trigger |
health_cv | cv | The marine's vitality as a 0..1 CV (super=1, healthy=0.75, wounded=0.5, critical=0.25, dead=0), ramped smoothly on each health change. control voltage (CV) |
params
| id | label | range | default | curve |
|---|---|---|---|---|
cv1 | CV1 | 0..1 | 0 | linear |
cv2 | CV2 | 0..1 | 0 | linear |
cv3 | CV3 | 0..1 | 0 | linear |
cv4 | CV4 | 0..1 | 0 | linear |
clock | CLOCK | 0..1 | 0 | linear |
gate | GATE | 0..1 | 0 | linear |
autoplay | AUTOPLAY | 0..1 | 1 | linear |
axis_x | X | -1..1 | 0 | linear |
axis_y | Y | -1..1 | 0 | linear |
btn_a | A | 0..1 | 0 | linear |
btn_b | B | 0..1 | 0 | linear |
btn_x | X (btn) | 0..1 | 0 | linear |
btn_y | Y (btn) | 0..1 | 0 | linear |
controls
| control | what it does |
|---|---|
| AUTOPLAY | Autoplay toggle (0/1, default 1 = ON): when on and no external clock is active, an internal clock (~0.42 s beat) self-plays the game with synthesized rotating CV. Set 0 to require an external clock for pure deterministic/musical control. |
| X | The joystick X aim value (-1..1, default 0): re-centres the judgement point by up to one hit-window for leading/lagging the beat. Normally driven by the X axis input jack. |
| Y | The joystick Y value (-1..1, default 0): raises/lowers the marine on the ribbon (up to +/-26 px). Normally driven by the Y axis input jack. |
| A | The A-button target value (0..1); a rising edge judges the nearest in-window loop event. Normally driven by the A input jack (or keyboard F / left-arrow). |
| B | The B-button target value (0..1); a rising edge judges the nearest in-window jump event. Normally driven by the B input jack (or keyboard D / down-arrow). |
| X (btn) | The X-button target value (0..1); a rising edge judges the nearest in-window imp event. Normally driven by the x_btn input jack (or keyboard J / right-arrow). |
| Y (btn) | The Y-button target value (0..1); a rising edge judges the nearest in-window zombie event. Normally driven by the y_btn input jack (or keyboard K / up-arrow). |
| CLOCK | The clock port's target value (0..1); a rising edge here advances one beat and runs spawn generation. Normally driven by the CLOCK input jack. |
| CV1 | Sets/holds the loop-channel CV level read on each beat for spawn generation (0..1); normally driven by the CV1 input jack. |
| CV2 | Sets/holds the jump-channel CV level read on each beat (0..1); normally driven by the CV2 input jack. |
| CV3 | Sets/holds the imp-channel CV level read on each beat (0..1); normally driven by the CV3 input jack. |
| CV4 | Sets/holds the zombie-channel CV level read on each beat (0..1); normally driven by the CV4 input jack. |
| GATE | The beat-gate level (0..1, high above 0.5) that biases per-beat spawn selection; normally driven by the GATE input jack. |
source
gibribbon.ts on GitHub.