Gingo¶
Biblioteca Python para Teoria Musical e Análise Harmônica
Gingo é uma biblioteca Python que implementa conceitos de teoria musical ocidental, fornecendo ferramentas para análise harmônica, manipulação de escalas e acordes, e validação de progressões. Construída em C++17 com bindings Python (pybind11), combina performance nativa com API Python intuitiva.
Arquitetura¶
Gingo modela conceitos musicais em camadas hierárquicas, onde cada componente fundamental serve de base para estruturas mais complexas:
graph LR
A[Nota] --> B[Intervalo]
B --> C[Acorde]
A --> D[Escala]
C --> E[Campo Harmônico]
D --> E
E --> F[Árvore Harmônica]
C --> G[Piano]
C --> H[Fretboard]
D --> H
G --> I[PianoSVG]
H --> J[FretboardSVG]
style A fill:#e1f5e1,color:#000
style B fill:#e3f2fd,color:#000
style C fill:#fff3e0,color:#000
style D fill:#fce4ec,color:#000
style E fill:#f3e5f5,color:#000
style F fill:#e0f2f1,color:#000
style G fill:#e8eaf6,color:#000
style H fill:#fbe9e7,color:#000
style I fill:#e8eaf6,color:#000
style J fill:#fbe9e7,color:#000
Esta arquitetura em camadas permite a construção progressiva de conceitos harmônicos complexos a partir de elementos fundamentais.
Instalação¶
Requer Python 3.10+. Wheels pré-compiladas disponíveis para Linux, macOS e Windows. A sintese de audio e exportacao WAV funcionam sem dependencias extras.
Exemplos¶
1. Notas Musicais¶
from gingo import Note
# Criar uma nota
nota = Note("C") # Dó
print(nota.name()) # "C"
# Calcular frequência
freq = nota.frequency(4) # Dó da 4ª oitava (C4)
print(f"{freq:.2f} Hz") # 261.63 Hz
Ciclo cromático:
graph LR
C[C - Dó] --> D[D - Ré] --> E[E - Mi] --> F[F - Fá]
F --> G[G - Sol] --> A[A - Lá] --> B[B - Si] --> C2[C - Dó]
style C fill:#ff6b6b,color:#000
style D fill:#feca57,color:#000
style E fill:#48dbfb,color:#000
style F fill:#ff9ff3,color:#000
style G fill:#1dd1a1,color:#000
style A fill:#f368e0,color:#000
style B fill:#5f27cd,color:#fff
style C2 fill:#ff6b6b,color:#000
2. Acordes¶
from gingo import Chord
# Criar um acorde
acorde = Chord("Am7") # Lá menor com sétima (tétrade)
# Obter notas do acorde
notas = [n.name() for n in acorde.notes()]
print(notas) # ['A', 'C', 'E', 'G']
Estrutura intervalar de Am7:
graph TD
A[Am7<br/>Tétrade menor] --> B[A - Fundamental]
A --> C[C - Terça menor<br/>3 semitons]
A --> D[E - Quinta justa<br/>7 semitons]
A --> E[G - Sétima menor<br/>10 semitons]
style A fill:#667eea,color:#fff
style B fill:#f093fb,color:#000
style C fill:#4facfe,color:#000
style D fill:#43e97b,color:#000
style E fill:#fa709a,color:#000
3. Escalas¶
from gingo import Scale
# Criar uma escala
escala = Scale("C", "major") # Dó maior (escala diatônica)
# Obter notas da escala
notas = [n.name() for n in escala.notes()]
print(notas)
# ['C', 'D', 'E', 'F', 'G', 'A', 'B']
Escala de Dó maior com funções dos graus:
graph LR
I[I - C<br/>Tônica] --> II[II - D<br/>Supertônica]
II --> III[III - E<br/>Mediante]
III --> IV[IV - F<br/>Subdominante]
IV --> V[V - G<br/>Dominante]
V --> VI[VI - A<br/>Superdominante]
VI --> VII[VII - B<br/>Sensível]
VII --> I2[I - C<br/>Tônica]
style I fill:#1dd1a1,color:#000
style IV fill:#feca57,color:#000
style V fill:#ee5a6f,color:#000
style I2 fill:#1dd1a1,color:#000
4. Campo Harmônico¶
from gingo import Field, ScaleType
# Criar campo harmônico
campo = Field("C", ScaleType.Major)
# Obter acordes diatônicos
acordes = [c.name() for c in campo.chords()]
print(acordes)
# ['CM', 'Dm', 'Em', 'FM', 'GM', 'Am', 'Bdim']
Campo harmônico de Dó maior (tríades):
graph LR
I[I - CM<br/>Tônica] --> II[IIm - Dm<br/>Subdominante]
II --> III[IIIm - Em<br/>Tônica relativa]
III --> IV[IV - FM<br/>Subdominante]
IV --> V[V - GM<br/>Dominante]
V --> VI[VIm - Am<br/>Tônica relativa]
VI --> VII[VIIdim - Bdim<br/>Dominante]
style I fill:#1dd1a1,color:#000
style II fill:#feca57,color:#000
style III fill:#1dd1a1,color:#000
style IV fill:#feca57,color:#000
style V fill:#ee5a6f,color:#000
style VI fill:#1dd1a1,color:#000
style VII fill:#ee5a6f,color:#000
5. Audio — ouvir o que voce codou¶
from gingo import Note, Chord, Scale, Field
Note("C").play() # nota unica
Chord("Am7").play() # acorde com strum
Scale("C", "major").play(duration=0.3) # escala ascendente
Field("C", "major").play(duration=0.6) # 7 acordes do campo
# Exportar WAV
Chord("Am7").to_wav("am7.wav", waveform="triangle")
No terminal:
6. Fretboard — Digitacoes e Visualizacao¶
from gingo import Fretboard, FretboardSVG, Chord, Scale, Field
# Criar fretboard de violao
violao = Fretboard.violao()
# Gerar digitacao otima para um acorde
f = violao.fingering(Chord("Am"))
print(f.chord_name) # "Am"
print(f.barre) # 0 (sem pestana)
# Visualizar em SVG
svg = FretboardSVG.chord(violao, Chord("Am"))
FretboardSVG.write(svg, "am_chord.svg")
# Campo harmonico completo em SVG
svg = FretboardSVG.field(violao, Field("C", "major"))
FretboardSVG.write(svg, "c_major_field.svg")
No terminal:
gingo fretboard chord Am
gingo fretboard chord Am --svg am.svg
gingo fretboard scale "C major" --svg scale.svg
gingo fretboard field "C major" --svg field.svg
7. Progressões Harmônicas (beta)¶
Beta
A classe Tree esta em fase beta. A API pode mudar em versoes futuras.
from gingo import Tree, ScaleType, Progression
# Criar árvore harmônica (baseada na teoria de José de Alencar)
tree = Tree("C", ScaleType.Major, "harmonic_tree")
# Validar progressão
valido = tree.is_valid(["IIm", "V7", "I"])
print(valido) # True - progressão II-V-I
# Usar Progression para análise cross-tradition
prog = Progression("C", "major")
match = prog.identify(["IIm", "V7", "I"])
print(match.schema) # "descending"
Progressão II-V-I (cadência harmônica fundamental do jazz):
graph LR
II[IIm<br/>Dm7<br/>Preparação] -->|Tensão| V[V7<br/>G7<br/>Dominante]
V -->|Resolução| I[I<br/>CM<br/>Tônica]
style II fill:#feca57,color:#000
style V fill:#ee5a6f,color:#000
style I fill:#1dd1a1,color:#000
Características¶
API Intuitiva
Interface Python clara e consistente, seguindo convenções modernas de design de bibliotecas.
Performance
Core implementado em C++17 com lookup tables e cached computations para operações eficientes.
Instrumentos
Piano mapeia teoria para teclas fisicas (MIDI, voicings close/open/shell) com PianoSVG interativo.
Fretboard gera digitacoes realisticas para violao, cavaquinho e bandolim usando algoritmo CAGED.
FretboardSVG renderiza chord boxes, diagramas de braco e campos harmonicos — com orientacao (horizontal/vertical) e lateralidade (destro/canhoto).
Audio integrado
Ouca qualquer objeto com .play() — notas, acordes, escalas, campos harmonicos.
Exporte para WAV com .to_wav(). Quatro formas de onda, envelope ADSR, strum e gap.
Zero dependencias para sintese; simpleaudio opcional para playback.
Fundamentação Teórica
Implementa conceitos de teoria musical acadêmica:
- Teoria das Árvores Harmônicas (José de Alencar)
- Neo-Riemannian transformations (Richard Cohn)
- Voice leading (Dmitri Tymoczko)
- Interval vectors (Allen Forte)
- Dissonância psicoacústica (Plomp & Levelt)
Documentação Completa
Referência detalhada com exemplos práticos, conceitos de teoria musical e casos de uso avançados.
Para Quem É o Gingo¶
:material-guitar:{ .lg } Músicos : Análise de harmonias, transposição de escalas, identificação de acordes e validação de progressões.
Estudantes : Estudo de teoria musical através de experimentação prática com código Python.
Desenvolvedores : Criação de ferramentas de análise musical, aplicações de ensino e software de composição assistida.
Professores : Demonstrações interativas de conceitos harmônicos e exercícios programáticos para alunos.
Próximos Passos¶
-
Conceitos Básicos
Fundamentos de teoria musical e sistema de notação
-
Primeiros Passos
Exemplos práticos de uso da biblioteca
-
Tutoriais
Guias detalhados de cada classe e conceito
-
Referência da API
Documentação completa de métodos e classes
Exemplo Avançado: Análise Contextual¶
from gingo import Field, Chord, ScaleType
# Criar campo harmônico de Dó maior
campo = Field("C", ScaleType.Major)
# Comparar dois acordes dentro do contexto harmônico
resultado = campo.compare(Chord("CM"), Chord("GM"))
# Análise contextual (21 dimensões)
print(f"Grau de CM: {resultado.degree_a}") # 1 (I)
print(f"Grau de GM: {resultado.degree_b}") # 5 (V)
print(f"Função de CM: {resultado.function_a}") # Tonic
print(f"Função de GM: {resultado.function_b}") # Dominant
print(f"Movimento: {resultado.root_motion}") # "ascending_fifth"
Relação funcional I-V:
flowchart LR
A[CM<br/>Dó Maior<br/>I - Tônica] -->|Movimento de<br/>Quinta Ascendente| B[GM<br/>Sol Maior<br/>V - Dominante]
style A fill:#1dd1a1,color:#000,stroke:#000,stroke-width:3px
style B fill:#ee5a6f,color:#000,stroke:#000,stroke-width:3px
Funções Harmônicas
O Gingo classifica acordes em três funções principais:
- Tônica (T): estabilidade e repouso (I, IIIm, VIm)
- Subdominante (S): preparação e afastamento (IIm, IV)
- Dominante (D): tensão e resolução (V, V7, VIIdim)
Recursos Adicionais¶
- GitHub: github.com/sauloverissimo/gingo
- Referências Bibliográficas: Teoria e fundamentos acadêmicos
- Exemplos Práticos: Disponíveis em cada seção de tutorial