Pular para conteúdo

Escalas

escala(tonica, tonalidade)

Gera uma escala a partir de uma tônica e uma tonalidade

Parameters:

Name Type Description Default
tonica str

Nota que será a tônica da escala

required
tonalidade str

Tonalidade da escala

required

Returns:

Type Description
dict[str, list[str]]

Um dicionário com as notas da escala e os graus

Raises:

Type Description
ValueError

Caso a tônica não seja uma nota válida

KeyError

Caso a escala não exista ou não seja implementada

Examples:

>>> escala('C', 'maior')
{'notas': ['C', 'D', 'E', 'F', 'G', 'A', 'B'], 'graus': ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII']}
>>> escala('a', 'menor')
{'notas': ['A', 'B', 'C', 'D', 'E', 'F', 'G'], 'graus': ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII']}
Source code in pacote_python_tb/escalas.py
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
def escala(tonica: str, tonalidade: str) -> dict[str, list[str]]:
    """
    Gera uma escala a partir de uma tônica e uma tonalidade

    Parameters:
        tonica: Nota que será a tônica da escala
        tonalidade: Tonalidade da escala

    Returns:
        Um dicionário com as notas da escala e os graus

    Raises:
        ValueError: Caso a tônica não seja uma nota válida
        KeyError: Caso a escala não exista ou não seja implementada

    Examples:
        >>> escala('C', 'maior')
        {'notas': ['C', 'D', 'E', 'F', 'G', 'A', 'B'], 'graus': ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII']}

        >>> escala('a', 'menor')
        {'notas': ['A', 'B', 'C', 'D', 'E', 'F', 'G'], 'graus': ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII']}
    """
    retorno = []

    tonica = tonica.upper()

    try:
        intervalos = ESCALAS[tonalidade]
        posicao_tonica = NOTAS.index(tonica)
    except ValueError:
        raise ValueError(f'Essa nota não existe, tente uma dessas: {NOTAS}')
    except KeyError:
        raise KeyError(
            f'Essa escala não existe ou não foi implementada. Tente uma dessas {list(ESCALAS.keys())}'
        )

    for intervalo in intervalos:
        nota = (posicao_tonica + intervalo) % len(NOTAS)
        retorno.append(NOTAS[nota])

    return {
        'notas': retorno,
        'graus': ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII'],
    }