Scala Scale Auralizer — User Guide

Loads scales from Scala (.scl) files, maps scale degrees to frequencies through an explicit tuning layer, synthesises tones with a separately‑specified spectrum and envelope, and plays the scale in several modes (ascending, descending, ping‑pong, arpeggio, sustained chord, scale against drone, A/B compare). Includes 19 built‑in scales (historical temperaments, just intonation, non‑octave scales) plus support for any external .scl file.

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

What this does

Scala Scale Auralizer is a complete microtonal scale synthesiser. It reads scales from Scala (.scl) files (the standard format in microtonal music), applies a flexible tuning layer (fundamental, reference degree anchoring, period transposition), synthesises tones with a configurable spectrum (pure sine, harmonic series, odd‑only, bright, dark), shapes each note with an ADSR envelope, and plays the scale in eight different playback modes.

Separation of concerns (as requested):
  • SCALE – .scl parser: degree list in cents, ratios, period.
  • TUNING – cents + fundamental → Hz, with reference degree anchoring and period transposition.
  • SPECTRUM – partial recipe (multiples and amplitudes), independent of pitch.
  • TIMBRE – ADSR envelope, note duration, gap.
  • VOICING – respace degrees across periods (closed, open, compressed, expanded).
  • PLAYBACK – sequences notes or builds chords.

Quick start

  1. Download the Scala scale archive (e.g., from huygens-fokker.org) and place the .scl files in a folder.
  2. In Praat, run the script Scala_Scale_Auralizer.praat.
  3. Choose a scale:
    • Builtin_scale – select from 19 curated scales (12‑TET, Pythagorean, Werckmeister III, Kirnberger III, 1/4‑comma meantone, just intonation, Slendro, Pelog, Partch 43, Bohlen‑Pierce, Carlos Alpha/Beta/Gamma, etc.).
    • External_scl_path – paste the full path to any .scl file (overrides built‑in).
  4. Set tuning parameters: Fundamental_Hz (e.g., 220 Hz for A2), Reference_degree and Reference_Hz (anchor a specific degree to a pitch), Transpose_periods (shift by periods).
  5. Choose a Playback Mode (ascending, descending, ping‑pong, arpeggio, sustained chord, scale vs drone, A/B compare).
  6. Select Spectrum (timbre) and Envelope parameters.
  7. Click OK. The script synthesises the scale and creates a Sound object named scale_scalename.
Tip: Start with 12-TET (synthetic) to verify your audio path. Then try Werckmeister III or Kirnberger III to hear historical temperaments. For non‑octave scales, try Bohlen‑Pierce (period 1901 cents) or Carlos Alpha (78 cents per step).
Important: This script is entirely in Praat – no Python required. It uses additive synthesis (sum of sinusoids) with a fixed sample rate of 44.1 kHz. For long scales (e.g., Partch 43 degrees) with arpeggio or drone modes, synthesis may take 10–30 seconds.

Scala (.scl) file format

📄 Format specification

Scala files are plain text with the following structure:

  1. Description line – name of the scale (e.g., “Werckmeister III”).
  2. Note count – integer N (number of degrees).
  3. N interval lines – each line is either:
    • Cents – a floating‑point number (e.g., “386.314”).
    • Ratio – two integers separated by “/” (e.g., “5/4”).

The Nth interval is the period (usually 2/1 = 1200 cents, but may be other values for non‑octave scales). Lines starting with “!” are comments and are ignored.

Example (12‑TET):

! 12-TET.scl
!
12-TET
12
100
200
300
400
500
600
700
800
900
1000
1100
2/1
  

The script automatically detects truncated files and warns if fewer degree lines are provided than declared.

Built‑in scales (19)

The script includes 19 curated scales. Most require the corresponding .scl file in the plugin_AudioTools/scl/ folder or a user‑specified archive path.

。<1200。 。<1200。<12 notes from the cycle of fifths.fi。。<1200。 。<1200。 。<1200。 。<1200。 。<5-limit JI。<1200。<12‑note just intonation.fi。<1200。<7‑note diatonic just scale.fi。。<1200。 。<5‑note equal。<1200。 。<5‑note JI。 。<7‑note JI。<1200。 。<1200。 。<1200。 。<1200。<1901。<13‑note scale, period 3/1.fi。。<78.0。 。<63.8。 。<35.1。
ScaleTypePeriod (cents)Description
12-TET (synthetic)
Pythagorean 12
Young-Lonnberg guitar
Werckmeister III
Kirnberger III
1/4‑comma meantone
Just intonation 12
Just intonation 7。<5-limit JI (diatonic)
Indian 12
Slendro
Alves slendro。<1200
Alves pelog
Harrison 5
Harmonical
Partch 43
Bohlen-Pierce
Carlos Alpha
Carlos Beta
Carlos Gamma

External scale files: Paste the full path to any .scl file in External_scl_path. This overrides the built‑in selection.

Tuning layer – mapping degrees to frequencies

Frequency calculation:
freq[degree] = fundamental × 2^((cents[degree] + periodShift) / 1200)
where periodShift = transpose_periods × scale.period

Reference degree anchoring (optional):
If reference_degree > 0 or reference_Hz ≠ fundamental_Hz, the script applies a global shift so that the specified degree plays at the target frequency. This allows you to, for example, set the fifth (degree 7) to 330 Hz while keeping the fundamental free.

Example: Fundamental = 220 Hz (A2), reference_degree = 7 (fifth), reference_Hz = 330 Hz (E3). The script adjusts all frequencies so that the fifth is exactly 330 Hz, and the fundamental becomes whatever it needs to be to satisfy that condition.

Playback modes (8)

。<0…N then N‑1…0 (no repeat of apex).。
ModeDescriptionOutput
Single tone
Ascending scale
Descending scale
Ping-pong
Arpeggio
Sustained chord
Scale against drone
A/B compare

For arpeggio and sustained chord modes, the Subset_degrees field (e.g., “1 3 5”) selects which degrees to include. Voicing (closed, open, compressed, expanded) respaces degrees across one or two periods.

Parameters & defaults

Scale selection

ParameterDefaultDescription
External_scl_path(empty)
Builtin_scale12-TET (synthetic)

Tuning

Playback

ParameterRangeDefaultDescription
Fundamental_Hz20–5000220
Reference_degree0–N1
Reference_Hz20–5000220
Transpose_periods-3–30
ParameterOptionsDefaultDescription
Mode1–82 (ascending)
Subset_degreesspace‑separated list1 3 5
Second_builtin_for_AB12‑TET / Pythagorean / Partch 43 / Bohlen‑Pierce / Carlos Alpha12-TET

Voicing

ParameterOptionsDefaultDescription VoicingClosed / Open / Compressed / ExpandedClosed。

Spectrum (timbre)

ParameterOptionsDefaultDescription SpectrumPure sine / Harmonic 8 (1/n) / Harmonic 16 (1/n) / Odd harmonics only / Bright flat 8 / Dark 1/n^2。

Envelope (per note)

ParameterRangeDefaultDescription Note_duration_s0.1–5.00.6。 Gap_s0–1.00.05。 Attack_ms0–50015。 Release_ms0–50080。

Output

ParameterDefaultDescription
Output_gain0.7
Show_visualizationyes
Play_resultyes

Visualization (Praat picture)

When Show_visualization = 1, the script draws a 5‑panel figure:

Tip: The cents distribution plot is especially useful for non‑octave scales – you can see where the period falls relative to 1200 cents. The frequency bar chart shows the actual pitch spacing in Hz (logarithmic by nature, but displayed linearly).

FAQ / troubleshooting

“Could not locate built-in scale file”

The script searches for .scl files in several locations: a user‑configurable path (C:/Users/User/Downloads/scales/scl), the plugin folder (preferencesDirectory$/plugin_AudioTools/scl), and the script’s directory. If your .scl files are elsewhere, either set External_scl_path to the full path, or edit the testDir$ variable in the script to point to your archive folder.

“File was truncated” warning

Some .scl files declare a note count N but provide fewer degree lines. The script automatically truncates to the number of lines actually found. This is common in older or hand‑edited Scala files – the scale still works with the available degrees.

Non‑octave scales sound strange / don’t repeat

Non‑octave scales (Bohlen‑Pierce, Carlos Alpha/Beta/Gamma) have periods other than 1200 cents. The script respects the period – transposition by transpose_periods shifts by the actual period (e.g., 1901 cents for Bohlen‑Pierce). Ascending/descending modes play through the degrees exactly once; they do not wrap.

Reference degree anchoring

If you set reference_degree = 7 and reference_Hz = 330, the fifth will be exactly 330 Hz, and the fundamental will be adjusted accordingly. This is useful for tuning a scale to a fixed interval (e.g., A‑440 but with a specific fifth ratio).

Spectrum normalisation

All spectra are normalised so that the sum of partial amplitudes = 1. This ensures consistent loudness regardless of the number of partials or the roll‑off slope. Pure sine is a single partial with amplitude 1.

Performance for large scales

Partch 43 has 43 degrees. In ascending mode, that’s 44 notes. Synthesis of 44 notes with 8 partials each = 352 sinusoids. This is computationally intensive but still finishes in 5–10 seconds on a modern CPU. For arpeggio or chord modes, the number of simultaneously playing partials is lower.