twotracks

twotracks · effects

Two 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.

A two-reel tape-loop emulator — two independent tape decks (reel A and reel B) in one box, mixed to a stereo output. Each reel records the stereo audio at its inputs onto a fixed-length 'blank tape', then plays the captured take back: you set a loop window (START / END) within the tape, a tape RATE (which slows, speeds, or reverses playback and pitch like a varispeed reel), an ECHOES feedback amount for tape-echo-style repeats, and per-reel 3-band EQ + a multimode filter to colour the playback. Recording is driven hands-free by the per-reel REC START / REC ARM / OVERDUB gate inputs (or the on-card transport), and OVERDUB layers new input onto the existing loop sound-on-sound. The two reels are blended by the global A/B crossfader, can cross-feed into each other (A→B and B→A) for runaway tape-loop textures, and a global LOFI option degrades the sound; MONITOR passes the live input through. The card draws each reel's live waveform + playhead and can export a take to WAV.

the faceplate

twotracksaudio_l_in_aaudioaudio_r_in_aaudiorec_start_agaterec_arm_agateoverdub_agaterate_cv_acvaudio_l_in_baudioaudio_r_in_baudiorec_start_bgaterec_arm_bgateoverdub_bgaterate_cv_bcvout_laudioout_raudioaudiocvgatepitch
12 inputs · 2 outputs · 29 params

inputs

idcablewhat it does
audio_l_in_aaudioLeft 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_aaudioRight audio into reel A's record path, partnering the left input.
audio signal; L/R stereo pair with audio_l_in_a
rec_start_agateReel 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_agateReel 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_agateReel 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_acvReel 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_baudioLeft 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_baudioRight audio into reel B's record path, partnering the left input.
audio signal; L/R stereo pair with audio_l_in_b
rec_start_bgateReel 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_bgateReel 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_bgateReel 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_bcvReel 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

idcablewhat it does
out_laudioLeft 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_raudioRight channel of the mixed stereo output, the partner of OUT L.
audio signal; L/R stereo pair with out_l

params

idlabelrangedefaultcurve
rate_aRate A-3..31linear
mode_aMode A0..11discrete
echoes_aEchoes A1..53discrete
start_aStart A0..10linear
end_aEnd A0..11linear
overdub_flag_aOverdub A0..10discrete
eqLow_aEQ Low A-12..12dB0linear
eqMid_aEQ Mid A-12..12dB0linear
eqHigh_aEQ Hi A-12..12dB0linear
filterMode_aFlt Mode A0..30discrete
cutoff_aCutoff A20..20000Hz20000log
reso_aReso A0..10linear
rate_bRate B-3..31linear
mode_bMode B0..11discrete
echoes_bEchoes B1..53discrete
start_bStart B0..10linear
end_bEnd B0..11linear
overdub_flag_bOverdub B0..10discrete
eqLow_bEQ Low B-12..12dB0linear
eqMid_bEQ Mid B-12..12dB0linear
eqHigh_bEQ Hi B-12..12dB0linear
filterMode_bFlt Mode B0..30discrete
cutoff_bCutoff B20..20000Hz20000log
reso_bReso B0..10linear
abA/B0..10linear
a2bA→B0..10linear
b2aB→A0..10linear
lofiLofi0..30discrete
monitorMonitor0..10discrete

controls

controlwhat it does
A→BCross-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/BA/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→ACross-feed B→A (0..1) — routes reel B's playback into reel A's input/record path (the mirror of A→B).
Cutoff AReel A filter CUTOFF (20 Hz..20 kHz, log) — the corner of reel A's playback filter (active per FILTER MODE).
Cutoff BReel B filter CUTOFF (20 Hz..20 kHz, log) — the corner of reel B's playback filter (active per FILTER MODE).
Echoes AReel A ECHOES (1..5) — sets the feedback/repeat behavior: how many times the recorded loop re-circulates (and decays) like a tape echo.
Echoes BReel B ECHOES (1..5) — sets the feedback/repeat behavior: how many times the recorded loop re-circulates (and decays) like a tape echo.
End AReel A loop END (0..1) — the right edge of the playback window within the recorded tape.
End BReel B loop END (0..1) — the right edge of the playback window within the recorded tape.
EQ Hi AReel A EQ HIGH (±12 dB) — high-band shelf on reel A's playback.
EQ Hi BReel B EQ HIGH (±12 dB) — high-band shelf on reel B's playback.
EQ Low AReel A EQ LOW (±12 dB) — low-band shelf on reel A's playback.
EQ Low BReel B EQ LOW (±12 dB) — low-band shelf on reel B's playback.
EQ Mid AReel A EQ MID (±12 dB) — mid-band on reel A's playback.
EQ Mid BReel B EQ MID (±12 dB) — mid-band on reel B's playback.
Flt Mode AReel 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 BReel 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).
LofiLOFI degradation (OFF / LOW / HIGH / ERROR) — a global tape-degradation amount that adds wow/flutter/bit-grit character; OFF = clean.
Mode AReel A MODE (LOOP vs ONE-SHOT) — whether the reel loops continuously or plays its take once.
Mode BReel B MODE (LOOP vs ONE-SHOT) — whether the reel loops continuously or plays its take once.
MonitorMONITOR (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 AReel 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 BReel 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 AReel 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 BReel 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 AReel A filter RESONANCE (0..1) — emphasis at reel A's filter cutoff.
Reso BReel B filter RESONANCE (0..1) — emphasis at reel B's filter cutoff.
Start AReel 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 BReel 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.

Generated from packages/web/src/lib/{audio,video}/module-registry.ts · repo