Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implementa escala cromática #5

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Embora isso seja somente uma recomendação! Você também pode instalar o proje
pip install notas-musicais
```

## como usar?
## Como usar?

### Escalas

Expand Down
2 changes: 1 addition & 1 deletion docs/02_contribua.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Os exemplos usados na docstring também estão sendo usados para testes. Então,

#### Sobre a biblioteca

Toda a biblioteca usa python puro, ela não tem nenhuma dependência de bibliotecas externas. Isso é proposital, pois o código é bastante simples. As respostas das funções foram padronizadas com o retorno sempre sendo um dicionário python, pois em algum momento alguém pode querer expandir isso para uma interface gráfica ou usar em um API REST, dessa forma, acredito que um padrão que pode ser serealizado, pode ajudar bastante as pessoas.
Toda a biblioteca usa python puro, ela não tem nenhuma dependência de bibliotecas externas. Isso é proposital, pois o código é bastante simples. As respostas das funções foram padronizadas com o retorno sempre sendo um dicionário python, pois em algum momento alguém pode querer expandir isso para uma interface gráfica ou usar em um API REST, dessa forma, acredito que um padrão que pode ser serializado, pode ajudar bastante as pessoas.

Todas as vezes em que o código é consumido entre funções, durante a construção da aplicação foi criado um padrão para desempacotar o dicionário em outras funções. Então, não se preocupe se ver muito esse formato de código:

Expand Down
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Toda a aplicação é baseada em um comando chamado `notas-musicais`. Esse coman

{% include "templates/instalacao.md" %}

## como usar?
## Como usar?

### Escalas

Expand Down
16 changes: 10 additions & 6 deletions notas_musicais/escalas.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

# ESCALAS

A escalas estão implementadas em uma constande chamada `ESCALAS`. Que é um dicionário onde as chaves são as escalas. Se quiser ver todas as escalas implementadas pode usar:
A 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:

```py title="No seu shell interativo"
>>> from notas_musicais.escalas import ESCALAS
Expand All @@ -25,7 +25,7 @@

# NOTAS

As notas estão sendo definidas em uma contasnte `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:
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 esteja totalmente correto. Para ver as 12 notas você pode:

```py title="No seu shell interativo"
>>> from notas_musicais.escalas import NOTAS
Expand All @@ -35,16 +35,20 @@
```
"""
NOTAS = 'C C# D D# E F F# G G# A A# B'.split()
ESCALAS = {'maior': (0, 2, 4, 5, 7, 9, 11), 'menor': (0, 2, 3, 5, 7, 8, 10)}
ESCALAS = {
'maior': (0, 2, 4, 5, 7, 9, 11),
'menor': (0, 2, 3, 5, 7, 8, 10),
'cromatica': (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11),
}


def escala(tonica: str, tonalidade: str) -> dict[str, list[str]]:
"""
Gera uma escala apartir de uma tônica e uma tonalidade.
Gera uma escala a partir de uma tônica e uma tonalidade.

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

Returns:
Um dicionário com as notas da escala e os graus.
Expand All @@ -68,7 +72,7 @@ def escala(tonica: str, tonalidade: str) -> dict[str, list[str]]:
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. '
'Essa escala não existe ou não foi implementada ainda. '
f'Tente uma dessas {list(ESCALAS.keys())}'
)

Expand Down
17 changes: 16 additions & 1 deletion tests/test_escalas.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ def test_deve_retornar_um_erro_dizendo_que_a_escala_não_existe():
tonalidade = 'tonalidade'

mensagem_de_erro = (
'Essa escala não existe ou não foi implementada. '
'Essa escala não existe ou não foi implementada ainda. '
f'Tente uma dessas {list(ESCALAS.keys())}'
)

Expand All @@ -57,6 +57,21 @@ def test_deve_retornar_um_erro_dizendo_que_a_escala_não_existe():
('C', 'menor', ['C', 'D', 'D#', 'F', 'G', 'G#', 'A#']),
('C#', 'menor', ['C#', 'D#', 'E', 'F#', 'G#', 'A', 'B']),
('F', 'menor', ['F', 'G', 'G#', 'A#', 'C', 'C#', 'D#']),
(
'C',
'cromatica',
['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'],
),
(
'C#',
'cromatica',
['C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B', 'C'],
),
(
'D',
'cromatica',
['D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B', 'C', 'C#'],
),
],
)
def test_deve_retornar_as_notas_corretas(tonica, tonalidade, esperado):
Expand Down