Pular para conteúdo

Escalas

Módulo das escalas musicais.

Attributes:

Name Type Description
ESCALAS list[LiteralString]

Escalas implementadas usando a notação de inteiros.

NOTAS list[LiteralString]

Notas musicais.

Escalas

As escalas estão implementadas em uma constante chamada ESCALAS. Que é um dicionário onde as chaves são as escalas. Se quiser ver todas as escalas implementadas pode usar:

No seu 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 somente as notas no formato Natural e o Sustenido (#) para a simplificação do fluxo de trabalho. Embora não seja totalmente correto. Para ver as 12 notas você pode:

No seu 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 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]]

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 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', 'menor')
{'notas': ['A', 'B', 'C', 'D', 'E', 'F', 'G'], 'graus': ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII']}
Source code in notas_musicais/escalas.py
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
80
81
82
83
84
def escala(tonica: str, tonalidade: str) -> dict[str, list[str]]:
    """Gera uma escala a partir de uma tônica e uma tonalidade.

    Parameters:
        tonica (str): Nota que será a tônica da escala.
        tonalidade (str): Tonalidade da escala.

    Returns:
        dict[str, list[str]]: 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 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', 'menor')
        {'notas': ['A', 'B', 'C', 'D', 'E', 'F', 'G'], 'graus': ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII']}
    """

    try:
        intervalos = ESCALAS[tonalidade]
        tonica_pos = NOTAS.index(tonica.upper())
    except ValueError:
        raise ValueError(f'Essa nota não existe , tente uma desssas {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 = (tonica_pos + intervalo) % 12
        temp.append(NOTAS[nota])

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