twotracks
twotracks · effectsTwo independent tape decks in one box, mixed to a stereo output. Each reel (A and B) records the stereo audio at its own L/R inputs onto a fixed-length blank tape, then plays the take back: patch audio in, arm with the ARM gate or fire the REC gate, and the tape records destructively (TAPE mode) or layers sound-on-sound (OVERDUB). Set a loop window by dragging the START and END markers on the reel picture, and drag anywhere else on it to scrub the playhead. RATE is varispeed — 1 is forward unity, 0 freezes the tape, negative plays it backwards, and it pitches the audio the way a real reel does; ECHOES (1–5) sets how many times the loop re-circulates and decays like a tape echo. Each reel then has its own 3-band EQ and a multimode filter (OFF / HP / LP / BP) to colour the playback. Globally, the A/B crossfader blends the two reels, A→B and B→A cross-feed one reel into the other for runaway tape textures, LOFI adds four grades of tape degradation, and MONITOR passes the live input through so you can hear what you are about to record. Every transport event has a gate input, so a sequencer can drive both reels by cable, and RATE CV per reel sweeps the full varispeed range for wow, flutter and tape-stops. SAVE TAPE exports a reel as a stereo 48 kHz 16-bit WAV, and a recorded take rides along in a saved performance.
the faceplate
inputs
| id | cable | what it does |
|---|---|---|
audio_l_in_a | audio | Left audio into reel A's record path. While reel A is recording or overdubbing, this is what gets written to the tape; pairs with the right input. audio signal; L/R stereo pair with audio_r_in_a — L-only auto-duplicates to R |
audio_r_in_a | audio | Right audio into reel A's record path, partnering the left input. audio signal; L/R stereo pair with audio_l_in_a |
rec_start_a | gate | Reel A record START gate: a rising edge starts (or restarts) recording onto reel A from the head of the tape. Drive it from a clock/button to capture a take hands-free. gate / trigger; trigger — fires once per rising edge |
rec_arm_a | gate | Reel A record ARM gate: a rising edge arms reel A so the next pass (or the next REC START) drops into record — the "ready to record" toggle. gate / trigger; trigger — fires once per rising edge |
overdub_a | gate | Reel A OVERDUB gate: a rising edge toggles overdub (sound-on-sound) mode, layering new input onto the existing loop instead of erasing it. gate / trigger; trigger — fires once per rising edge |
rate_cv_a | cv | Reel A RATE CV — varispeed control voltage for reel A's tape speed. A bipolar −1..+1 CV sweeps the RATE control across its full −3..+3 span centred on wherever you left the knob, so an LFO here wows and flutters the tape, an envelope does a tape-stop, and a slow ramp through zero turns the reel around into reverse. Modulates the same speed the record head runs at, so it varispeeds a take being recorded as well as one being played back. control voltage (CV); modulates rate_a (additive offset — ±1 CV sweeps the full range, centered on the knob) |
audio_l_in_b | audio | Left audio into reel B's record path. While reel B is recording or overdubbing, this is what gets written to the tape; pairs with the right input. audio signal; L/R stereo pair with audio_r_in_b — L-only auto-duplicates to R |
audio_r_in_b | audio | Right audio into reel B's record path, partnering the left input. audio signal; L/R stereo pair with audio_l_in_b |
rec_start_b | gate | Reel B record START gate: a rising edge starts (or restarts) recording onto reel B from the head of the tape. Drive it from a clock/button to capture a take hands-free. gate / trigger; trigger — fires once per rising edge |
rec_arm_b | gate | Reel B record ARM gate: a rising edge arms reel B so the next pass (or the next REC START) drops into record — the "ready to record" toggle. gate / trigger; trigger — fires once per rising edge |
overdub_b | gate | Reel B OVERDUB gate: a rising edge toggles overdub (sound-on-sound) mode, layering new input onto the existing loop instead of erasing it. gate / trigger; trigger — fires once per rising edge |
rate_cv_b | cv | Reel B RATE CV — varispeed control voltage for reel B's tape speed. A bipolar −1..+1 CV sweeps the RATE control across its full −3..+3 span centred on wherever you left the knob, so an LFO here wows and flutters the tape, an envelope does a tape-stop, and a slow ramp through zero turns the reel around into reverse. Modulates the same speed the record head runs at, so it varispeeds a take being recorded as well as one being played back. control voltage (CV); modulates rate_b (additive offset — ±1 CV sweeps the full range, centered on the knob) |
outputs
| id | cable | what it does |
|---|---|---|
out_l | audio | Left channel of the mixed stereo output — reels A and B summed per the A/B crossfader (and any cross-feed), post per-reel EQ/filter and the global LOFI stage. audio signal; L/R stereo pair with out_r |
out_r | audio | Right channel of the mixed stereo output, the partner of OUT L. audio signal; L/R stereo pair with out_l |
params
| id | label | range | default | curve |
|---|---|---|---|---|
rate_a | Rate A | -3..3 | 1 | linear |
mode_a | Mode A | 0..1 | 1 | discrete |
echoes_a | Echoes A | 1..5 | 3 | discrete |
start_a | Start A | 0..1 | 0 | linear |
end_a | End A | 0..1 | 1 | linear |
overdub_flag_a | Overdub A | 0..1 | 0 | discrete |
eqLow_a | EQ Low A | -12..12dB | 0 | linear |
eqMid_a | EQ Mid A | -12..12dB | 0 | linear |
eqHigh_a | EQ Hi A | -12..12dB | 0 | linear |
filterMode_a | Flt Mode A | 0..3 | 0 | discrete |
cutoff_a | Cutoff A | 20..20000Hz | 20000 | log |
reso_a | Reso A | 0..1 | 0 | linear |
rate_b | Rate B | -3..3 | 1 | linear |
mode_b | Mode B | 0..1 | 1 | discrete |
echoes_b | Echoes B | 1..5 | 3 | discrete |
start_b | Start B | 0..1 | 0 | linear |
end_b | End B | 0..1 | 1 | linear |
overdub_flag_b | Overdub B | 0..1 | 0 | discrete |
eqLow_b | EQ Low B | -12..12dB | 0 | linear |
eqMid_b | EQ Mid B | -12..12dB | 0 | linear |
eqHigh_b | EQ Hi B | -12..12dB | 0 | linear |
filterMode_b | Flt Mode B | 0..3 | 0 | discrete |
cutoff_b | Cutoff B | 20..20000Hz | 20000 | log |
reso_b | Reso B | 0..1 | 0 | linear |
ab | A/B | 0..1 | 0 | linear |
a2b | A→B | 0..1 | 0 | linear |
b2a | B→A | 0..1 | 0 | linear |
lofi | Lofi | 0..3 | 0 | discrete |
monitor | Monitor | 0..1 | 0 | discrete |
controls
| control | what it does |
|---|---|
| A→B | Cross-feed A→B (0..1) — routes reel A's playback into reel B's input/record path; with overdub this builds layered, evolving tape loops (raise carefully — it can run away). |
| A/B | A/B crossfade (0..1) — blends the two reels in the output: 0 = reel A only, 0.5 = both at unity, 1 = reel B only. |
| B→A | Cross-feed B→A (0..1) — routes reel B's playback into reel A's input/record path (the mirror of A→B). |
| Cutoff A | Reel A filter CUTOFF (20 Hz..20 kHz, log) — the corner of reel A's playback filter (active per FILTER MODE). |
| Cutoff B | Reel B filter CUTOFF (20 Hz..20 kHz, log) — the corner of reel B's playback filter (active per FILTER MODE). |
| Echoes A | Reel A ECHOES (1..5) — sets the feedback/repeat behavior: how many times the recorded loop re-circulates (and decays) like a tape echo. |
| Echoes B | Reel B ECHOES (1..5) — sets the feedback/repeat behavior: how many times the recorded loop re-circulates (and decays) like a tape echo. |
| End A | Reel A loop END (0..1) — the right edge of the playback window within the recorded tape. |
| End B | Reel B loop END (0..1) — the right edge of the playback window within the recorded tape. |
| EQ Hi A | Reel A EQ HIGH (±12 dB) — high-band shelf on reel A's playback. |
| EQ Hi B | Reel B EQ HIGH (±12 dB) — high-band shelf on reel B's playback. |
| EQ Low A | Reel A EQ LOW (±12 dB) — low-band shelf on reel A's playback. |
| EQ Low B | Reel B EQ LOW (±12 dB) — low-band shelf on reel B's playback. |
| EQ Mid A | Reel A EQ MID (±12 dB) — mid-band on reel A's playback. |
| EQ Mid B | Reel B EQ MID (±12 dB) — mid-band on reel B's playback. |
| Flt Mode A | Reel A FILTER MODE — OFF / HP / LP / BP selector for reel A's playback filter (0 = off, and the state-variable filter's high-pass tap comes BEFORE its low-pass one: 1 = HP, 2 = LP, 3 = BP, as the worklet selects them). |
| Flt Mode B | Reel B FILTER MODE — OFF / HP / LP / BP selector for reel B's playback filter (0 = off, and the state-variable filter's high-pass tap comes BEFORE its low-pass one: 1 = HP, 2 = LP, 3 = BP, as the worklet selects them). |
| Lofi | LOFI degradation (OFF / LOW / HIGH / ERROR) — a global tape-degradation amount that adds wow/flutter/bit-grit character; OFF = clean. |
| Mode A | Reel A MODE (LOOP vs ONE-SHOT) — whether the reel loops continuously or plays its take once. |
| Mode B | Reel B MODE (LOOP vs ONE-SHOT) — whether the reel loops continuously or plays its take once. |
| Monitor | MONITOR (on/off) — passes the live input signal through to the output so you can hear what you're about to record (input monitoring), independent of playback. |
| Overdub A | Reel A overdub state flag (0/1) — the persisted on/off of overdub mode (the button form of the OVERDUB gate); when on, new input layers onto the existing loop. |
| Overdub B | Reel B overdub state flag (0/1) — the persisted on/off of overdub mode (the button form of the OVERDUB gate); when on, new input layers onto the existing loop. |
| Rate A | Reel A tape RATE (−3..+3) — playback/record speed and direction; 1 = normal, fractions slow it down and pitch it lower, negatives play the tape backwards. |
| Rate B | Reel B tape RATE (−3..+3) — playback/record speed and direction; 1 = normal, fractions slow it down and pitch it lower, negatives play the tape backwards. |
| Reso A | Reel A filter RESONANCE (0..1) — emphasis at reel A's filter cutoff. |
| Reso B | Reel B filter RESONANCE (0..1) — emphasis at reel B's filter cutoff. |
| Start A | Reel A loop START (0..1) — the left edge of the playback window within the recorded tape (you can't drag it past the playhead while rolling). |
| Start B | Reel B loop START (0..1) — the left edge of the playback window within the recorded tape (you can't drag it past the playhead while rolling). |
| Twotracks play a {n} | Reel A PLAY — roll the tape from the loop window's START. In LOOP TAPE mode it keeps circling the window; in TAPE mode it plays the take once and stops. |
| Twotracks play b {n} | Reel B PLAY — roll the tape from the loop window's START. In LOOP TAPE mode it keeps circling the window; in TAPE mode it plays the take once and stops. |
| Twotracks rec a {n} | Reel A REC — drop the reel into record from the head of the tape. With OVERDUB off this erases what was there; with OVERDUB on it layers the new input over the existing loop, sound-on-sound. The same thing the REC START gate input does, so a sequencer can take a hands-free take. |
| Twotracks rec b {n} | Reel B REC — drop the reel into record from the head of the tape. With OVERDUB off this erases what was there; with OVERDUB on it layers the new input over the existing loop, sound-on-sound. The same thing the REC START gate input does, so a sequencer can take a hands-free take. |
| Twotracks save a {n} | Reel A SAVE TAPE — export this reel's recorded take as a stereo 48 kHz 16-bit WAV. A reel with nothing on it exports nothing; the take also travels inside a saved performance without needing this. |
| Twotracks save b {n} | Reel B SAVE TAPE — export this reel's recorded take as a stereo 48 kHz 16-bit WAV. A reel with nothing on it exports nothing; the take also travels inside a saved performance without needing this. |
| Twotracks stop a {n} | Reel A STOP — halt the reel, whether it was playing, recording or overdubbing. The tape is kept: pressing PLAY again rolls the same take. |
| Twotracks stop b {n} | Reel B STOP — halt the reel, whether it was playing, recording or overdubbing. The tape is kept: pressing PLAY again rolls the same take. |
source
twotracks.ts on GitHub.