← All modules
AvailableEffect

Frequency Shifter

Shift every partial by the same number of Hz.

Engine preview

Not built for macOS, Windows or Linux

About

A linear frequency shifter. It adds a fixed number of Hz to every frequency in the signal, which breaks the harmonic series rather than transposing it, metallic, clangorous, and at small settings a slow barber-pole drift.

Build evidence

Every row below is a recorded build row or the recorded absence of one. Nothing here is inferred from what this module is meant to support.

Module
music.codex.freq-shifter v1.0.0
Built at
no recorded row carries a build time; the browser lanes record none
Closure hash
not a Processor — no lowering closure
Toolchain
  • scriptc 64acce1ae3b8…
  • moduleToolchainDist c621ffab721d…
  • pluginShellKitRuntime bca003784692…
  • faceShellGeneration 8533207ab81f…
  • uiPreservation cd28dbd7e3d6…
  • packagerVersion 3
Build result and download for each format
FormatResultDownload
Browser package (JS)Not built by this module's lane

this module has no release.json; its packager lane records no browser program rows

Not built for the browser
Browser package (WASM)Not built by this module's lane

this module has no release.json; its packager lane records no browser program rows

Not built for the browser
VST3Not built

no recorded artifact row for vst3; native-lane-report.json is absent or records no vst3 row for this module

Not built for macOS, Windows or Linux
Audio UnitNot built

no recorded artifact row for au; native-lane-report.json is absent or records no au row for this module

Not built for macOS
CLAPNot built

no recorded artifact row for clap; native-lane-report.json is absent or records no clap row for this module

Not built for macOS, Windows or Linux
Standalone appNot built

no recorded artifact row for standalone; native-lane-report.json is absent or records no standalone row for this module

Not built for macOS, Windows or Linux

Parity

No lane recorded an artifact; there is no parity evidence.

Presets

Start from a named sound, then adjust the instrument to make it yours.

InitDefault

Signal graph.

Experimental

The exact normalized graph packaged for the shared browser/native runtime and exports.

How it works.

A frequency shifter adds a constant number of Hz to every partial. A pitch shifter multiplies them all by a constant ratio. That difference is the whole module: multiplying preserves the harmonic series, so it stays the same sound at a new pitch, while adding does not, a 100 Hz shift moves a 200 Hz fundamental to 300 Hz and its 400 Hz octave to 500 Hz, and the two are no longer an octave apart. What comes out is inharmonic and reads as metallic or bell-like rather than transposed.

It is also not a ring modulator, though it is built from one. Multiplying a signal by a sine produces both a sum and a difference band, which is the ring modulator's characteristic doubled, hollow sound. A frequency shifter cancels one of those bands and keeps the other: the signal is split into two copies 90 degrees apart across the whole spectrum, each is multiplied by a quadrature pair of sines, and summing the results cancels the unwanted sideband. The 90-degree split is the hard part and the reason this is not a two-node graph.

Small shifts are the musical setting. Under about 10 Hz nothing sounds transposed at all, the shifted copy drifts slowly against the dry one and the interference sweeps through the spectrum, which is the barber-pole effect and is why the mix control matters as much as the shift.

The browser preview implements the 90-degree split as two banks of four second-order allpass sections, the classic Niemitalo IIR design, whose outputs are not individually at 0 and 90 degrees but whose difference is approximately 90 across the audible band. The pair is multiplied against phase-locked cosine and sine carriers and summed, and the sign of the Shift knob decides which of the two sums is taken, so a bipolar control passes through a silent unison at zero.

Two limits come with that design and neither is a bug to be fixed later. Sideband rejection is around -30 to -40 dB from roughly 100 Hz to 10 kHz and loosens at the band edges, so the unwanted sideband is always faintly present and reads as a slight ring-mod halo on dense material, better than that needs an FIR Hilbert or a worklet. And partials shifted past Nyquist, or below zero where they reflect, fold back as aliasing, since nothing here can resample in real time; low-passing the input first is the usual answer.

Goes well with.

Preview

Motion

Phaser and vibrato with independent LFOs.

PreviewNo build recorded
Preview

Pitch Shift

Change pitch while keeping the tempo.

PreviewNo build recorded
Preview

FX Mini

Drive, tone, and bounded feedback delay.

Preview