Pular para conteúdo

Escalas

Módulo das escalas musicais.

Attributes:

Name Type Description
ESCALAS

Escalas implementadas usando a notação de inteiros

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 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 menter somente as notas no formato Natural e o Sustenido (#) para a simplificação do fluxo de trabalho. Embora não esteja 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 apartir 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 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
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
85
86
87
88
89
def escala(tonica: str, tonalidade: str) -> dict[str, list[str]]:
    """
    Gera uma escala apartir 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 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']}
    """
    tonica = tonica.upper()
    try:
        intervalos = ESCALAS[tonalidade]
        tonica_pos = NOTAS.index(tonica)
    except ValueError:
        raise ValueError(f'Essa nota não existe, tente umas dessas {NOTAS}')
    except KeyError:
        raise KeyError(
            'Essa escala não existe ou nao foi implementada. '
            f'Tente umas 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']}