Fast Chunk Distortion — v1.11 User Guide
Fixed-size chunk processing with ten transformation modes, synchronized stereo structure, raised-cosine overlap-add, dry/wet mixing, and diagnostic visualization.
What this does
Fast Chunk Distortion divides one selected Sound into fixed-duration time chunks and applies one of ten transformations: Stutter, Gaps, Reverse, Shuffle, Time Stretch, Time Compress, Pumping, Ring Modulator, Bitcrush, or Tremolo. Despite the legacy script filename, the processor does not detect wavesets or zero crossings; segmentation is based on a fixed time grid.
Chunks are assembled with Praat's Concatenate with overlap. The join is a raised-cosine complementary-power crossfade: the two amplitude weights sum to one through the overlap. It is not an equal-power crossfade, and it is not a pair of independent Hann fades to silence.
- Exactly one Sound is required.
- Stereo input keeps its real left and right channels. Mono input becomes a synthetic stereo pair; inputs with more than two channels are downmixed to mono first and then rendered to stereo.
- Left and right use the same chunk grid and the same structural decisions, including repeat count, gap period, shuffle order, and varispeed factor.
- Stereo_spread creates width without changing the structural timing between channels.
- Dry/wet mixing pads the shorter side with silence instead of deleting the longer tail.
- The final output is always stereo and is named
<source>_FCD_<PresetName>.
Quick start
- In Praat, select exactly one Sound object.
- Run
Fast_Waveset_Distortion.praat(the form itself is titled Fast Chunk Distortion v1.11). - Choose a preset or leave Custom and select one of the ten modes.
- Set Amount, Chunk_ms, Fade_ms, Stereo_spread, and Mix.
- Choose whether to normalize, visualize, and play the result.
Amount has a different mathematical meaning in each mode. The preset values below are useful starting points, but there is no single global "effect strength" interpretation.
The 10 presets (+ Custom)
| Preset | Mode | Amount | Chunk | Fade | Spread | What it configures |
|---|---|---|---|---|---|---|
| Glitch Stutter | Stutter | 4.0 | 30 ms | 3 ms | 0.30 | Four repeats per source chunk, with repeat decay. |
| Rhythmic Gaps | Gaps | 3.0 | 50 ms | 5 ms | 0.10 | Every third chunk is silenced. |
| Backwards Chunks | Reverse | 1.0 | 80 ms | 8 ms | 0.15 | Each chunk is reversed while chunk order is retained. |
| Random Shuffle | Shuffle | 1.0 | 60 ms | 6 ms | 0.25 | One random chunk permutation, shared by L and R. |
| Slow Motion | Time Stretch | 4.0 | 100 ms | 10 ms | 0.10 | Varispeed factor 2.0: chunks become longer and pitch drops. |
| Fast Forward | Time Compress | 3.0 | 50 ms | 5 ms | 0.10 | Varispeed factor 1.5: chunks become shorter and pitch rises. |
| Alternating Pump | Pumping | 4.0 | 125 ms | 10 ms | 0.05 | Alternating high/low chunk gain; no sidechain detector is used. |
| Robot Voice | Ring Modulator | 2.5 | 20 ms | 2 ms | 0.40 | Carrier request 250 Hz before Nyquist clamping. |
| Lo-Fi Crush | Bitcrush | 4.0 | 30 ms | 3 ms | 0.20 | 4 quantization steps per polarity (approximately 9 possible values including zero). |
| Wobble Tremolo | Tremolo | 5.0 | 40 ms | 5 ms | 0.30 | 17 Hz requested modulation rate with 0.75 depth, before Nyquist clamping. |
Presets overwrite the mode and the listed processing parameters. Mix, Normalize_output, Show_visualization, and Play_result retain the values entered in the form.
Operation modes (10)
| Mode | Amount mapping | Implemented operation |
|---|---|---|
| 1. Stutter | R = clamp(round(amount), 2, 8) | Each source chunk is copied R times. Repeat r is multiplied by 0.85^(r-1); the first repeat stays at unity. |
| 2. Gaps | N = max(2, round(amount)) | Every Nth chunk is replaced by silence. |
| 3. Reverse | Ignored | Each chunk is reversed in time; the original chunk order is retained. |
| 4. Shuffle | Ignored | Chunks are reordered by an ascending Fisher-Yates shuffle. The same random order is reused for L and R. No random seed is exposed. |
| 5. Time Stretch | factor = max(1.1, amount/2) | Varispeed stretch: resample to sr × factor, then override the sampling frequency back to the original rate. Duration increases and pitch falls. v1.11 clamps the effective factor if the intermediate rate would exceed 192 kHz. |
| 6. Time Compress | factor = max(1.1, amount/2) | Varispeed compression: resample to sr / factor, then override back to the original rate. Duration decreases and pitch rises. If the intermediate rate would fall below 100 Hz, that chunk is left uncompressed. |
| 7. Pumping | gain_hi = max(0.05, 1 + (abs(amount)-1)×0.5); gain_lo = 1/gain_hi | Odd chunks use gain_hi; even chunks use gain_lo. This is alternating gain, not sidechain compression. |
| 8. Ring Modulator | f = clamp(50 + amount×80, 0, Nyquist) | Each chunk is multiplied by sin(2πfx + phase). The right channel receives the spread-derived phase offset. |
| 9. Bitcrush | L = max(2, round(16/abs(amount))); amount 0 uses 0.01 | round(sample × L) / L. L is steps per polarity, giving roughly 2L+1 possible values across negative, zero, and positive amplitudes. |
| 10. Tremolo | f = clamp(2 + amount×3, 0, Nyquist); depth = clamp(amount×0.15, 0, 0.9) | sample × [1 − depth × (0.5 + 0.5 sin(2πfx + phase))]. The right channel receives the spread-derived phase offset. |
Parameters & validation
| Parameter | Default | Behavior |
|---|---|---|
| Preset | Custom | Loads one of the ten preset configurations above. |
| Mode | Stutter | Selects one of the ten processing branches. |
| Amount | 3.0 | Mode-dependent; see the mode table. Time Stretch may reduce the effective Amount to stay under the 192 kHz intermediate-rate ceiling. |
| Chunk_ms | 40 ms | Base source-chunk size. It is floored to at least two samples and may be raised automatically to keep the temporary-object count bounded. |
| Fade_ms | 5 ms | Requested overlap duration. Negative values become 0. It is first reduced to fit the effective base chunk and can be reduced again to at most 40% of the shortest member in the assembled sequence. |
| Stereo_spread | 0.2 | Clamped to −0.95…1.0. Controls right-channel gain offset, pre-delay, and Ring Mod/Tremolo phase offset; it does not change the L/R chunk grid or structural mode decisions. |
| Mix | 1.0 | Clamped to 0…1. Formula: wet×Mix + dry×(1−Mix). |
| Normalize_output | On | If the final output is non-silent, Scale peak: 0.95 is applied. This can amplify or attenuate. Silent output is left unchanged. |
| Show_visualization | On | Draws the v1.11 diagnostic figure. |
| Play_result | On | Plays the final Sound after processing. |
ceiling(duration / chunk_size). If the final remainder is shorter than half a base chunk, that remainder is absorbed into the preceding final chunk. The visualization uses the same rule.
Stereo processing
The output is always stereo, but input handling depends on channel count:
- Stereo input: real channel 1 is processed as L and real channel 2 as R.
- Mono input: the mono source is copied to L and R; stereo differences are then introduced by Stereo_spread.
- More than two channels: the input is downmixed to mono first, then rendered through the same synthetic-stereo path.
L and R share the same chunk grid, Stutter repeat count, Gaps period, Shuffle permutation, and Stretch/Compress factor. The right channel then receives:
The phase offset is used only by Ring Modulator and Tremolo. The gain offset and short pre-delay apply to every mode. The pre-delay is silence-padded: silence is added before R and an equal-duration silence tail is added after L, so the width mechanism does not intentionally discard content.
Chunk assembly, overlap, and duration
After the mode-specific transformation, the complete ordered sequence is selected and assembled in one operation. If the effective overlap is greater than zero, the script calls Concatenate with overlap; otherwise it uses ordinary Concatenate.
The effective overlap is:
If that second limit reduces the requested fade, the reduction is written to the Info window separately for L and R.
Dry/wet length handling
When Mix < 1, the script does not trim the longer side to the shorter one. It pads whichever of dry or wet is shorter with trailing silence to the longer duration, reconciles any remaining one-sample mismatch, and then applies the mix formula. Consequently, Mix = 0 returns the dry program content, but if the wet path is longer it may be followed by silence out to the wet duration.
Visualization (Praat Picture)
When Show_visualization is enabled, v1.11 draws the following diagnostic layout:
- Header: source name, preset, mode, actual source-chunk count, and effective Amount.
- Panel A — Source + chunk grid: source waveform with the actual base-grid boundaries. If there are more than about 60 chunks, boundary lines are thinned for legibility.
- Panel B — Mode and parameter report: current mode description, actual chunk count, base size, requested/effective fade information, Amount, Spread, Mix, and normalization state.
- Panel C — Zoom: first up-to-200 ms, using one shared amplitude scale for source (gray), output L (blue), and output R (orange), with chunk-boundary marks.
- Panel D — Full output: complete output L and R waveforms on one shared output amplitude scale.
- Panel E — Summary: preset, source, mode, chunk/fade settings, Amount, Spread, Mix, normalization, input duration/channel count, and final stereo duration.
Panel A and Panel D use their own amplitude scales; only the zoom overlay directly compares source and both output channels on a common vertical scale.
Limits & interpretation
- This is fixed-time chunk processing, not true waveset processing. No zero-crossing segmentation or cycle detection is performed.
- Shuffle is random. The L/R order is shared within a run, but the form exposes no seed; repeated runs need not produce the same permutation.
- Stretch and Compress are varispeed operations, not pitch-preserving time stretching.
- Time Stretch is constrained by a 192 kHz intermediate-rate ceiling. v1.11 clamps excessive requests and reports the effective factor.
- Time Compress only performs the resampling step while the requested intermediate sampling rate is at least 100 Hz; extremely large factors can therefore leave a chunk unchanged.
- Normalization is peak scaling to 0.95 after the dry/wet mix. It changes absolute level relationships created by the effect.
- The script shifts a non-zero input start time to 0 only on an internal working copy; the selected source object itself is not modified.