Leviathan for VCV Rack 2 · Open Source

Strand

One cycle from A. One cycle from B. A new strand of sound.

A compact pseudo-cycle interleaver that joins captured waveforms in time, creating new repeating patterns and harmonic textures.

3 HPZero-crossing captureA + B → C
Strand front panel

Weave cycles into a new waveform

Weave cycles into a new waveform

Strand is a 3 HP monophonic pseudo-cycle interleaver. It captures waveform segments from A and B, then plays one captured A segment followed by one captured B segment. Each keeps its captured duration and voltage shape. The result combines the sources in time.

Capture at zero crossings

A normal capture begins at a rising zero crossing after the signal has gone negative, and ends at the next rising crossing. Simple bipolar oscillators usually provide whole cycles; complex audio can provide shorter pseudo-cycles.

Play the latest complete segment

At each playback boundary, Strand selects the latest completed capture from the other source. A playing segment stays intact while capture continues. Source cycles can be skipped or repeated; this is not a chronological recording of every incoming cycle.

First patch

First patch

  1. Patch a bipolar sine oscillator into A and a triangle oscillator into B.
  2. Begin with both at the same frequency. Connect C to your mixer or output module at a comfortable level.
  3. Change B’s pitch and waveform. Listen to the combined pattern change in duration and shape.
  4. Compare the A and B cycle-frequency estimates with C’s sequence-rate readout.
Shape the sources upstream. Strand has no knobs or custom context menu. It reads channel 1 of each input and produces one output channel.

See the interleaving

See the interleaving

Adjust the source frequencies. Each output segment keeps the duration of its source cycle; dashed lines mark the joins. Color and letter labels identify A and B.

100 Hz A (10 ms) + 200 Hz B (5 ms) → 15 ms per A+B sequence → 66.7 sequences/s.

For steady periodic inputs, TC = TA + TB and fC = fAfB / (fA + fB). Two 100 Hz inputs produce 50 A+B sequences per second. If both shapes are identical, the waveform can have a shorter audible repetition period; C still counts A+B sequences.

The diagram illustrates stable captures after startup, using a sine for A and triangle for B. It omits capture updates, interpolation, and timeout fades. It is not an audio simulation.

Panel tour

Panel tour

Click a numbered marker to reach its description.

Strand front panel1234
1

A — input

Upper purple jack

First source for cycle capture. A bipolar signal with clear zero crossings gives the most predictable segmentation.

2

B — input

Middle purple jack

Second source. Its latest complete segment follows A when both sources have captures available.

3

C — output

Lower cyan jack

Alternating captured A and B segments. With only one available source, its latest segment repeats. With neither available, C is silent.

4

Frequency readouts

Windows beneath A, B, and C

A/B average frequency estimates from accepted natural cycles. C counts completed A+B sequences, or individual cycles with one source. Updates occur about once per second. --- means no reported frequency above 0.05 Hz.

Capture and playback details

Capture and playback details

Independent capture and playback

Both sources continue recording while a pinned capture plays. New captures are selected only at playback boundaries, preserving each playing segment’s shape and length.

Missing or stopped sources

An unavailable source is skipped. A completed capture remains available when its source becomes silent or stops crossing zero, so old material can keep playing. Unplugging that source or resetting the module clears its captured material.

Long segments

Capture is capped at 100 ms at ordinary sample rates, also subject to a 65,536-sample storage capacity. A segment reaching the cap is forcibly ended and restarted. Short fades soften forced boundaries; slow or offset signals therefore differ from ideal full-cycle interleaving.

Startup and reset

Capture needs a start and a completed segment before playback is available. Segments shorter than two samples are rejected. Module reset and sample-rate changes clear the engine; cable connection changes reset the affected source and its frequency tracker.

Patch recipes

Patch recipes

Equal pitch, different shape

Use equal-frequency sine and triangle waves. Each occupies half of an A+B sequence. Follow C with a filter to explore the resulting harmonics.

Interval weaving

Keep A steady and tune B a fifth or octave higher. The B cycle becomes shorter, taking a smaller share of the combined pattern.

Moving timbre

Modulate source shapes upstream. Strand continually captures fresh segments, creating evolving splices without a blend control.

Complex fragments

Try speech, percussion, or noise in one input and an oscillator in the other. Multiple zero crossings produce changing pseudo-cycles rather than a stable musical pitch.

Troubleshooting

Troubleshooting

Why is C silent?

Check routing and use bipolar audio with zero crossings. A constant positive voltage cannot initiate normal cycle capture. Wait for a completed capture after startup.

Why does C read lower than A and B?

C counts one complete A+B sequence when alternating. Two 100 Hz sources give 50 sequences per second, because their cycle durations add.

Why does the output keep sounding after I stop a source?

The latest completed capture can repeat until replaced or cleared. Unplug the source or reset the module to clear it.

Why do the readings jump with complex audio?

Strand measures zero-crossing segments, not a musical fundamental. A/B are averaged cycle estimates; C is a sequence count.

Does Strand mix, normalize, or process polyphony?

It plays captured segments sequentially without a gain or blend control. Adjust source levels upstream. Only channel 1 of each input is used; C is monophonic.

Reference

Reference

FormatVCV Rack 2 · 3 HP
Signal pathA + B → C · monophonic
SegmentationRising zero crossings
Capture cap100 ms, subject to sample capacity
ControlsNo parameters
Readout intervalApproximately one second

Checked against the local Strand.hpp, Strand.cpp, and StrandEngine.hpp implementations. The visualization shows ideal steady-cycle behavior.