Messagesquisse Opening — User Guide

Six-layer SACHER pitch-field construction with Morse-derived entry times, score-advancing source reads, sample-rate pitch shifting, and stereo accumulation.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 4.8.1 (2026) Category: Composition / Spectral / Pitch License: MIT License Repo: https://github.com/ShaiCohen-ops/Praat-plugin_AudioTools
Contents:

What this does

Messagesquisse Opening builds a stereo six-layer field from one selected Sound. The six target pitches follow the SACHER pitch collection Eb–A–C–B–E–D. Their entries are staggered by the Morse-code durations of the letters S-A-C-H-E-R, while each later layer reads from a correspondingly later score-relative position in the source.

The processed layers are generated by sample-rate reinterpretation followed by resampling. A target-register parameter defines where the SACHER field is placed, while a separate source-pitch parameter states the assumed fundamental of the input recording and therefore anchors the actual transposition ratio.

What is the SACHER mapping here?

The script uses the six pitch classes associated with the letters of SACHER:

S A C H E R Eb A C B E D semitone offsets from C = [3, 9, 0, 11, 4, 2]

This is a compositional reference used by the tool. The script does not reproduce the score or performance structure of Boulez's Messagesquisse.

Current implementation:

Quick start

  1. Select exactly one Sound in Praat. It must be at least 1 second long.
  2. Run Messagesquisse_Opening.praat.
  3. Choose a preset or Custom.
  4. Set Source_pitch_MIDI to the assumed fundamental of the input recording. Named presets intentionally do not change this field.
  5. Use Base_MIDI_note and, if needed, Quartertone_offset_semitones to place the target SACHER register.
  6. Choose a Speed mode, then adjust timing, fade, pan spread, wet mix, and source looping as needed.
  7. Run the script. The final Sound is named Messagesquisse_Opening.
Important pitch distinction: Base_MIDI_note describes the target register. Source_pitch_MIDI describes the assumed fundamental of the input recording. The pitch-shift ratio is calculated from both; they are not interchangeable.

SACHER & Morse structure

Pitch collection

SACHER pitch field

LayerLetterPitchOffset from target C
1SEb+3 st
2AA+9 st
3CC0 st
4HB+11 st
5EE+4 st
6RD+2 st

Morse timing

36-unit timing grid

The code assigns dot = one unit, dash = three units, and the gap between symbols inside a letter = one unit.

LetterMorseDuration in code
S...5 units
A.-5 units
C-.-.11 units
H....7 units
E.1 unit
R.-.7 units

Total = 36 units. With Unit_duration_s ≤ 0, one unit is set to source duration / 36, so the score duration equals the original source duration.

entry[1] = 0 entry[2] = dur(S) entry[3] = dur(S) + dur(A) entry[4] = dur(S) + dur(A) + dur(C) entry[5] = ... + dur(H) entry[6] = ... + dur(E) activeDur[i] = totalScoreDuration - entry[i]

Pitch and source model

Target register

targetRootHz = 440 × 2^((Base_MIDI_note + Quartertone_offset_semitones - 69) / 12) targetFreq[i] = targetRootHz × 2^(SACHER_offset[i] / 12)

Assumed source pitch

sourcePitchHz = 440 × 2^((Source_pitch_MIDI - 69) / 12) pitchFactor[i] = targetFreq[i] / sourcePitchHz

The script does not estimate the input fundamental. Source_pitch_MIDI is supplied by the user and is left untouched by all named presets.

Score-advancing source reads

Layer i starts reading at its score entry time. Before sample-rate reinterpretation, the requested source duration is:

requestedSourceDuration[i] = activeDur[i] × pitchFactor[i]

This compensates for the duration change caused by sample-rate reinterpretation. If the required material extends beyond the source, Loop_if_short chooses between repeated source material and zero padding.

Frequency safety: the script rejects an assumed source pitch or target-layer frequency at or above 45% of the sampling frequency. It also rejects temporary override sampling rates below 1000 Hz or above 2,000,000 Hz.

Preset strategies

Named presets replace target-register, quartertone-offset, timing, fade, pan, wet-mix, and looping values. They do not replace Source_pitch_MIDI or Speed_mode.

PresetTarget registerOffsetFadePanWetLoop
CustomForm valueForm valueForm valueForm valueForm valueForm value
Boulez ReferenceMIDI 36 (C2)0 st50 ms1.000.80yes
Low Drone FieldMIDI 24 (C1)0 st80 ms1.000.90yes
High ShimmerMIDI 60 (C4)0 st30 ms1.000.70yes
Centred MassMIDI 36 (C2)0 st50 ms0.001.00yes
Dry GhostMIDI 36 (C2)0 st50 ms1.000.20no
Quartertone HazeMIDI 36 (C2)+0.5 st60 ms0.650.75yes

Parameters & controls

ParameterDefaultCurrent behaviour
PresetCustomCustom plus six named strategies.
Base_MIDI_note36Integer MIDI note defining the target/root register of the SACHER field.
Quartertone_offset_semitones0.0Real semitone offset added to the entire target register; 0.5 = 50 cents.
Source_pitch_MIDI36Assumed fundamental of the input recording; used to calculate each pitch-shift ratio. Presets do not override it.
Unit_duration_s0.0One Morse unit. ≤0 means auto-fit: source duration / 36.
Fade_duration_s0.05Monotonic half-cosine fade-in at each layer entry.
Pan_spread1.0Clamped to 0–1. Layers are evenly placed from -spread to +spread.
Wet_mix0.8Clamped to 0–1. Wet layers are scaled by this value; dry path uses 1 - Wet_mix.
Loop_if_shortonIf a requested source segment overruns the source, repeat source material when on; otherwise append silence.
Speed_modeBalancedFull Quality / Balanced / Fast correspond to resample precision 50 / 20 / 10.
Draw_visualizationonDraws the current six-panel process view plus parameter/footer strips.
Play_resultonPlays the final stereo Sound.

Rendering pipeline

Wet field

For each of 6 layers: 1. targetFreq = targetRoot × SACHER interval 2. pitchFactor = targetFreq / assumedSourcePitch 3. request source material from score-relative entry time 4. loop or zero-pad if the request exceeds the source 5. Override sampling frequency by round(sourceSR × pitchFactor) 6. Resample back to sourceSR at selected precision 7. trim/pad to exact active duration 8. prepend exact entry silence 9. apply entry fade 10. add to left/right accumulators × pan gain × Wet_mix

Stereo placement

panPos[i] = -spread + (i-1) × (2×spread / 5) panAngle = (panPos + 1) × π / 4 L = cos(panAngle) R = sin(panAngle)

The six wet layers are therefore equally spaced across the selected stereo span using a constant-power pan law.

Dry path

The dry signal is the script's mono working source, centred equally into both output channels at gain 0.707 per side and multiplied by 1 - Wet_mix. If the source is shorter than the score, the dry path is zero-padded; if it is longer, it is trimmed.

Dry/Wet is a true crossfade: Wet_mix = 0 skips the six-layer wet render entirely. Wet_mix = 1 skips dry-path preparation. Intermediate values scale both paths continuously.

Final level and tail

After combining the left and right accumulators, the script measures the stereo peak. It scales to 0.99 only if the peak already exceeds 0.99; quiet outputs are not boosted. A final cosine fade-out of 3 × Fade_duration_s, capped at 25% of the score duration, is then applied to both channels.

Visualization

The current Picture view is a direct process visualization rather than an explanatory diagram. Its main panels are:

A parameter footer reports source duration, target register, assumed source pitch, dot/score duration, wet/dry balance, pan spread, fade, looping, sample rate, and all six target frequencies. A final Summary strip identifies the process as a pitch-field opening and points to the Info window for complete run parameters.

What does the timeline show? The grey portion of each row is the Morse-derived delay before that layer enters. The colored region begins at entry[i] and continues to the score end. The layer color is reused in the pan map and pitch display so the six voices can be followed across panels.

Output and edge cases

Source_pitch_MIDI is an assumption, not a measurement. If it does not correspond to the input's intended fundamental, the six rendered pitches will be transposed by a different ratio than expected.