Skip to content

Equal Temperament

Equal temperament divides an interval (usually the octave) into equal parts. This contrasts with pure ratios, which use exact fractions from the harmonic series.

What Is Equal Temperament?

In equal temperament:

  • An interval is divided into N equal steps
  • Each step has the same frequency ratio
  • The ratio is the Nth root of the interval

For 12-TET (standard Western tuning):

  • Octave (2:1) divided into 12 equal semitones
  • Each semitone = 2^(1/12) ≈ 1.05946

Why Equal Temperament?

The Problem with Pure Ratios

Pure ratios sound beautiful, but they have a limitation: the circle of fifths doesn't close.

Starting from C and going up by pure fifths (3/2):

C → G → D → A → E → B → F# → C# → G# → D# → A# → E# → B#

After 12 fifths: (3/2)^12 = 129.746

After 7 octaves: 2^7 = 128

The difference (the "Pythagorean comma") means you can't return to the same pitch!

The Equal Temperament Solution

Equal temperament compromises each interval slightly so that:

  • 12 semitones exactly equal one octave
  • All keys sound equally good (or equally compromised)
  • Music can modulate freely between keys

TET Systems in RMT Compose

RMT Compose supports multiple equal temperament systems:

SystemSteps per OctaveStep Ratio
12-TET122^(1/12)
19-TET192^(1/19)
31-TET312^(1/31)
BP-1313 (per tritave)3^(1/13)

Expression Syntax

Basic TET Step

javascript
// One 12-TET semitone
new Fraction(2).pow(new Fraction(1, 12))

// One 19-TET step
new Fraction(2).pow(new Fraction(1, 19))

// Multiple steps (e.g., 7 semitones = perfect fifth in 12-TET)
new Fraction(2).pow(new Fraction(7, 12))

Applying to a Note

javascript
// Frequency: 4 semitones above BaseNote (major third in 12-TET)
module.baseNote.getVariable('frequency').mul(
  new Fraction(2).pow(new Fraction(4, 12))
)

Building a Scale

javascript
// Each note is one semitone above the previous
note1.frequency = baseNote.frequency
note2.frequency = note1.frequency.mul(new Fraction(2).pow(new Fraction(1, 12)))
note3.frequency = note2.frequency.mul(new Fraction(2).pow(new Fraction(1, 12)))
// ... etc

The ≈ Symbol

Notes with TET frequencies display before their value:

≈ 1.05946...

This indicates:

  • The value is irrational (infinite non-repeating decimals)
  • The displayed value is an approximation
  • Internally, the value is stored as a SymbolicPower (exact algebraic form)

SymbolicPower Algebra

RMT Compose doesn't collapse TET values to floats. Instead, it preserves the algebraic structure:

javascript
// Two semitones:
2^(1/12) × 2^(1/12) = 2^(2/12) = 2^(1/6)

// Not:
1.05946... × 1.05946... = 1.12246...

This means:

  • Computations stay exact algebraically
  • 12 semitones exactly equals 2 (the octave)
  • No floating-point drift

Comparison: Just vs Equal

IntervalJust RatioJust Decimal12-TETDifference
Minor second16/151.06671.0595-0.7%
Major second9/81.12501.1225-0.2%
Minor third6/51.20001.1892-0.9%
Major third5/41.25001.2599+0.8%
Perfect fourth4/31.33331.3348+0.1%
Tritone45/321.40631.4142+0.6%
Perfect fifth3/21.50001.4983-0.1%
Minor sixth8/51.60001.5874-0.8%
Major sixth5/31.66671.6818+0.9%
Minor seventh7/41.75001.7818+1.8%
Major seventh15/81.87501.8877+0.7%

Notice that fifths are very close, but thirds are noticeably different.

When to Use Equal Temperament

Use TET when:

  • You need to modulate between keys
  • You want compatibility with standard instruments
  • You're exploring microtonal music (19-TET, 31-TET)
  • You want predictable, symmetric scales

Use pure ratios when:

  • You want maximum consonance
  • You're staying in one key
  • You're exploring historical tunings
  • You want mathematical elegance

Included TET Modules

RMT Compose includes pre-built modules:

Find them in the Module Bar under Melodies.

Next Steps

Released under the RMT Personal Non-Commercial License