Skip to content

ScaleType

scale_type

The scale type dictionary — 92 scale definitions.

The ScaleType namespace exposes an in-memory dictionary of 92 scale types, each indexed by name, aliases, set number, and chroma. Includes the seven diatonic modes, jazz scales (melodic minor, harmonic minor, bebop, diminished, altered), pentatonics, hexatonics, exotic scales (messiaen modes, ragas, hungarian, persian), and the chromatic scale.

So ScaleType.get("major"), ScaleType.get("ionian"), ScaleType.get(2773), and ScaleType.get("101011010101") all return the same ScaleType.

Like ChordType, the dictionary is mutable — add extends it.

Example

from tonal_py import ScaleType len(ScaleType.all()) 92 ScaleType.get("major").chroma '101011010101' ScaleType.get("aeolian").name # alias resolves to "minor" 'minor'

Source parity: @tonaljs/scale-type

get

get(type_: Any) -> ScaleType

Look up a scale type by name, alias, set number, or chroma string.

Parameters:

Name Type Description Default
type_ Any

A lookup key. Name, alias, integer set number, or 12-bit chroma string.

required

Returns:

Type Description
ScaleType

A ScaleType dataclass. Returns NO_SCALE_TYPE for unknown input.

Example

from tonal_py import ScaleType ScaleType.get("major").intervals ('1P', '2M', '3M', '4P', '5P', '6M', '7M') ScaleType.get("ionian").name # alias resolves to "major" 'major' ScaleType.get("garbage").empty True

Source code in src/tonal_py/scale_type.py
def get(type_: Any) -> ScaleType:
    """Look up a scale type by name, alias, set number, or chroma string.

    Args:
        type_: A lookup key. Name, alias, integer set number, or 12-bit
            chroma string.

    Returns:
        A `ScaleType` dataclass. Returns `NO_SCALE_TYPE` for unknown input.

    Example:
        >>> from tonal_py import ScaleType
        >>> ScaleType.get("major").intervals
        ('1P', '2M', '3M', '4P', '5P', '6M', '7M')
        >>> ScaleType.get("ionian").name        # alias resolves to "major"
        'major'
        >>> ScaleType.get("garbage").empty
        True
    """
    return _INDEX.get(type_, NO_SCALE_TYPE)

names

names() -> list[str]

Return all 92 scale names in dictionary order.

Example

from tonal_py import ScaleType "major" in ScaleType.names() True "lydian" in ScaleType.names() True

Source code in src/tonal_py/scale_type.py
def names() -> list[str]:
    """Return all 92 scale names in dictionary order.

    Example:
        >>> from tonal_py import ScaleType
        >>> "major" in ScaleType.names()
        True
        >>> "lydian" in ScaleType.names()
        True
    """
    return [s.name for s in _DICTIONARY]

all

all() -> list[ScaleType]

Return all 92 scale types as a fresh list.

Example

from tonal_py import ScaleType len(ScaleType.all()) 92

Source code in src/tonal_py/scale_type.py
def all() -> list[ScaleType]:  # noqa: A001
    """Return all 92 scale types as a fresh list.

    Example:
        >>> from tonal_py import ScaleType
        >>> len(ScaleType.all())
        92
    """
    return _DICTIONARY.copy()

add

add(intervals: list[str], name: str, aliases: tuple[str, ...] | list[str] = ()) -> ScaleType

Add a scale type to the dictionary.

Parameters:

Name Type Description Default
intervals list[str]

List of interval names (e.g. ["1P", "2M", "3M", "5P"]).

required
name str

The full name (always required for scales).

required
aliases tuple[str, ...] | list[str]

Optional alias names.

()

Returns:

Type Description
ScaleType

The newly-created ScaleType.

Example

from tonal_py import ScaleType ScaleType.add(["1P", "3M", "5P"], "test triad scale", ["tts"]) ScaleType(empty=False, name='test triad scale', set_num=2192, ...) ScaleType.get("tts").name 'test triad scale'

Cleanup

ScaleType.remove_all() from tonal_py.scale_type import _seed _seed()

Source code in src/tonal_py/scale_type.py
def add(intervals: list[str], name: str, aliases: tuple[str, ...] | list[str] = ()) -> ScaleType:
    """Add a scale type to the dictionary.

    Args:
        intervals: List of interval names (e.g. `["1P", "2M", "3M", "5P"]`).
        name: The full name (always required for scales).
        aliases: Optional alias names.

    Returns:
        The newly-created `ScaleType`.

    Example:
        >>> from tonal_py import ScaleType
        >>> ScaleType.add(["1P", "3M", "5P"], "test triad scale", ["tts"])
        ScaleType(empty=False, name='test triad scale', set_num=2192, ...)
        >>> ScaleType.get("tts").name
        'test triad scale'
        >>> # Cleanup
        >>> ScaleType.remove_all()
        >>> from tonal_py.scale_type import _seed
        >>> _seed()
    """
    pcset_data = _pcset.get(intervals)
    scale = ScaleType(
        empty=False,
        name=name,
        set_num=pcset_data.set_num,
        chroma=pcset_data.chroma,
        normalized=pcset_data.normalized,
        intervals=tuple(intervals),
        aliases=tuple(aliases),
    )
    _DICTIONARY.append(scale)
    _INDEX[scale.name] = scale
    _INDEX[scale.set_num] = scale
    _INDEX[scale.chroma] = scale
    for alias in scale.aliases:
        add_alias(scale, alias)
    return scale