BP Slice Remapper — User Guide

Temporal remapping based on a Bohlen–Pierce-inspired geometric duration grid. The source is divided into unequal slices, then those slices are globally reordered by duration in opposite directions for the left and right output channels.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 1.2.3 (2026) License: MIT License Repo: GitHub
Contents:

What this does

BP Slice Remapper divides the selected Sound into 1–4 equal blocks. Inside each block it creates N unequal temporal slices whose durations follow a geometric series based on powers of 3. The complete set of slices is then pooled and sorted by duration rather than played in its original chronological order.

The left and right channels use opposite render orders:

Multichannel input: the selected Sound is mixed to mono before slicing. The script then creates a new stereo output from that mono material: L and R contain the same source slices but in opposite duration orders. The original stereo or multichannel image is therefore not preserved.

What is Bohlen–Pierce?

The Bohlen–Pierce system is a tuning concept organized around a 3:1 frequency ratio (the tritave) rather than the octave's 2:1 ratio. A common equal-tempered Bohlen–Pierce division uses 13 equal steps across that 3:1 span.

This script does not retune pitch and does not implement the Bohlen–Pierce scale as a tuning system. It borrows only the geometric factor based on powers of 3 and applies it to time durations. With the default 13 slices, adjacent duration weights differ by a factor of 3^(1/13).

ratio[n] = 3^((n - 1) / N), n = 1 ... N adjacent ratio = 3^(1/N) N = 13: adjacent ratio ≈ 1.088

Quick start

  1. Select exactly one Sound object in Praat.
  2. Run BP_Slice_Remapper.praat.
  3. Choose 1, 2, 3, or 4 Blocks.
  4. Set Num_slices per block; the default is 13.
  5. Choose the left-channel Direction: Accelerando or Decelerando.
  6. Choose how the BP grid is oriented across source blocks with Block_direction.
  7. Optionally add a short overlap crossfade with Overlap_factor.
  8. Run the script. The result is a new stereo Sound named BP_<source>.
Good first setting: 1 Block, 13 slices, Accelerando, All same, and Overlap_factor = 0. This makes the geometric duration law easiest to hear.

Temporal grid

For each block, the script first calculates the BP-inspired weights:

ratio[n] = 3^((n - 1) / N) sumRatio = Σ ratio[n] sliceDuration[n] = blockDuration × ratio[n] / sumRatio

This normalization makes the slice durations inside each block add up to exactly the block duration before any output crossfades are applied. The last slice of each block is explicitly adjusted so that its endpoint lands on the exact block boundary.

Example: N = 5

nWeightRelative role
13^0 = 1.000Shortest weight
23^0.2 ≈ 1.246
33^0.4 ≈ 1.552
43^0.6 ≈ 1.933
53^0.8 ≈ 2.408Longest weight

Direction & block direction

The script uses two related but different direction controls.

Direction

Direction controls the final duration sort of the left output channel:

The right channel always uses the opposite sort.

Block_direction

Block_direction controls how the geometric duration pattern is assigned to chronological source positions before the global remapping:

Why this matters: Block_direction changes which source material receives which slice duration. After extraction, all slices from all blocks are pooled and globally sorted by duration for rendering. With multiple blocks, slices of similar duration from different source regions can therefore become neighbors in the output.

Stereo remapping

Both output channels are built from the same mono slice pool but use opposite duration sorts:

Direction settingLeftRight
Accelerandolongest → shortestshortest → longest
Decelerandoshortest → longestlongest → shortest

This produces a deliberately divergent stereo construction: the two channels contain the same slice material but traverse its duration hierarchy in opposite directions.

Parameters & defaults

ParameterDefaultBehavior
Preset1 BlockChooses 1, 2, 3, or 4 equal source blocks.
Num_slices13Number of BP slices per block. Values are clamped to 2–64.
DirectionAccelerandoFinal L-channel duration order; R is always opposite.
Block_directionAll sameOrientation of BP duration weights across source positions in successive blocks.
Overlap_factor0.0Fraction of the shortest extracted slice used as overlap crossfade. Clamped to 0–0.45.
Normalize_outputOnIf the result is non-silent, scales its peak to 0.99.
Draw_visualizationOnDraws Source → BP remap map → Output → Summary.
Play_resultOnAutomatically plays the new stereo Sound.

Visualization

The Picture window shows the implemented transformation directly:

The Source and Output waveforms use a shared amplitude scale, so their displayed amplitudes can be compared directly.

Output behavior

Overlap and duration

Overlap_factor is applied directly to the shortest extracted slice:

crossfadeDuration = Overlap_factor × shortestSlice expectedOutputDuration = sumOfSliceDurations - (numberOfSlices - 1) × crossfadeDuration

With Overlap_factor = 0, the concatenation uses butt joins and the slice durations sum to the source duration. With overlap enabled, every join shortens the rendered chain by one crossfade duration, so the final output is shorter than the source.

Normalization

When Normalize_output is enabled, the final stereo result is always peak-normalized to 0.99 if it is non-silent. This is normalization, not an attenuate-only safety ceiling: quiet results can be amplified.

Renderability

Before extraction, the script computes the actual shortest BP slice. It must be at least two samples long at the source sampling rate. Accepted slices are not silently discarded.

Objects