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.
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:
- Accelerando: longest slice → shortest slice. Event durations become progressively shorter, so the event rate accelerates.
- Decelerando: shortest slice → longest slice. Event durations become progressively longer, so the event rate decelerates.
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).
Quick start
- Select exactly one Sound object in Praat.
- Run
BP_Slice_Remapper.praat. - Choose 1, 2, 3, or 4 Blocks.
- Set Num_slices per block; the default is 13.
- Choose the left-channel Direction: Accelerando or Decelerando.
- Choose how the BP grid is oriented across source blocks with Block_direction.
- Optionally add a short overlap crossfade with Overlap_factor.
- Run the script. The result is a new stereo Sound named
BP_<source>.
Temporal grid
For each block, the script first calculates the BP-inspired weights:
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
| n | Weight | Relative role |
|---|---|---|
| 1 | 3^0 = 1.000 | Shortest weight |
| 2 | 3^0.2 ≈ 1.246 | |
| 3 | 3^0.4 ≈ 1.552 | |
| 4 | 3^0.6 ≈ 1.933 | |
| 5 | 3^0.8 ≈ 2.408 | Longest 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:
- Accelerando: global descending duration sort — longest → shortest.
- Decelerando: global ascending duration sort — shortest → longest.
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:
- All same: every source block uses the orientation implied by Direction.
- Alternating (A D A D): odd source blocks receive increasing BP weights, even blocks receive decreasing weights.
- Alternating (D A D A): odd source blocks receive decreasing BP weights, even blocks receive increasing weights.
Stereo remapping
Both output channels are built from the same mono slice pool but use opposite duration sorts:
| Direction setting | Left | Right |
|---|---|---|
| Accelerando | longest → shortest | shortest → longest |
| Decelerando | shortest → longest | longest → 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
| Parameter | Default | Behavior |
|---|---|---|
| Preset | 1 Block | Chooses 1, 2, 3, or 4 equal source blocks. |
| Num_slices | 13 | Number of BP slices per block. Values are clamped to 2–64. |
| Direction | Accelerando | Final L-channel duration order; R is always opposite. |
| Block_direction | All same | Orientation of BP duration weights across source positions in successive blocks. |
| Overlap_factor | 0.0 | Fraction of the shortest extracted slice used as overlap crossfade. Clamped to 0–0.45. |
| Normalize_output | On | If the result is non-silent, scales its peak to 0.99. |
| Draw_visualization | On | Draws Source → BP remap map → Output → Summary. |
| Play_result | On | Automatically plays the new stereo Sound. |
Visualization
The Picture window shows the implemented transformation directly:
- Source: mono display of the input with the BP slice boundaries and source-block regions.
- BP remap map: three lanes — chronological source grid, L render order, and R render order. Cell width is proportional to slice duration; colour identifies the source block.
- Output: mono display copy of the resulting stereo Sound.
- Summary: block/slice count, L/R direction, block-direction mode, slice-duration range, crossfade, and input/output duration.
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:
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
- The original Sound remains unchanged.
- The processed object is stereo and is named
BP_<source name>. - Temporary mono and slice objects are removed after rendering.