Pular para conteúdo

Escalas

Módulo das escalas

Attributes:

Name Type Description
ESCALAS

Escalas implementadas usando a notação de intervalos.

NOTAS

Notas musicais.

ESCALAS

As escalas estão implementadas em uma constante chamada escalas, que é um dicionário onde as chaves são os nomes das escalas. Se quiser ver todas as escalas implementadas pode usar:

No meu shell interativo
>>> from notas_musicais.escalas import ESCALAS
>>> ESCALAS
{'maior': (0, 2, 4, 5, 7, 9, 11), 'menor': (0, 2, 3, 5, 7, 8, 10)}

A notação inteira para as escalas foi retirada da página List of musical scales and modes na wikipedia.

Dica!

Você pode contribuir com novas escalas usando a notação inteira: Escalas wikipedia. Todos os Pull Requests serão bem vindos! ❤

NOTAS

As notas estão sendo definidas em uma constante NOTAS. Foi optado por manter somentr as notas no formato Natural e o Sustenido (#). As notas bemol (b) não foram implementadas por questões de simplicidade para a simplificação do fluxo de trabalho.

No meu shell interativo
>>> from notas_musicais.escalas import NOTAS
>>> NOTAS
['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B']

escala(tonica, tonalidade)

Gera uma escala a partir de uma tonica e uma tonalidade.

Parameters:

Name Type Description Default
tonica str

Nota que será a tônica da escala.

required
tonalidade str

Tonaliade da escala.

required

Returns:

Type Description
dict[str, list[str]]

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

Raises:

Type Description
ValueError

Caso a tônica não seja uma nota valida.

KeyError

Caso a tonalidade não exista ou não tenha sido implementada.

Examples:

>>> escala('C', 'maior')
{'notas': ['C', 'D', 'E', 'F', 'G', 'A', 'B'], 'graus': ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII']}
>>> escala('a', 'maior')
{'notas': ['A', 'B', 'C#', 'D', 'E', 'F#', 'G#'], 'graus': ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII']}
Source code in notas_musicais/escalas.py
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
def escala(tonica: str, tonalidade: str) -> dict[str, list[str]]:
    """
    Gera uma escala a partir de uma tonica e uma tonalidade.

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

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

    Raises:
        ValueError: Caso a tônica não seja uma nota valida.
        KeyError: Caso a tonalidade não exista ou não tenha sido implementada.

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

        >>> escala('a', 'maior')
        {'notas': ['A', 'B', 'C#', 'D', 'E', 'F#', 'G#'], 'graus': ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII']}
    """
    tonica = tonica.upper()
    try:
        intervalos = ESCALAS[tonalidade]
        toinca_pos = NOTAS.index(tonica)
    except ValueError:
        raise ValueError(f'Essa nota não existe, tente uma dessas {NOTAS}')
    except KeyError:
        raise KeyError(
            'Essa escala não existe ou não foi implementada,'
            f' tente uma dessas {list(ESCALAS.keys())}'
        )
    temp = []
    for intervalo in intervalos:
        _nota = (toinca_pos + intervalo) % len(NOTAS)
        temp.append(NOTAS[_nota])
    return {'notas': temp, 'graus': ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII']}