mirror of
https://github.com/kennethreitz/pytheory.git
synced 2026-06-05 23:00:20 +00:00
9da3ac8b28
- circle_of_fifths.py — visualize keys around the circle - chord_identifier.py — identify chords from notes and fingerings - key_explorer.py — explore keys, signatures, progressions, borrowed chords - temperament_comparison.py — compare equal, Pythagorean, and meantone - chord_tension.py — analyze tension, consonance, and voice leading - world_scales.py — scales from 6 musical traditions - fretboard_explorer.py — instruments, tunings, capo transposition - midi_converter.py — MIDI ↔ note ↔ frequency reference - progression_writer.py — famous progressions, Nashville numbers, random generation - interval_trainer.py — interval names, songs, and consonance ranking - overtone_series.py — harmonics and why chords sound good - key_detection.py — detect keys from melodies and chord progressions Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
75 lines
2.7 KiB
Python
75 lines
2.7 KiB
Python
"""Explore instruments, tunings, and chord fingerings."""
|
|
|
|
from pytheory import Fretboard, CHARTS
|
|
|
|
# ── Compare Instruments ─────────────────────────────────────────────────
|
|
|
|
print("Instrument Tunings")
|
|
print("=" * 55)
|
|
|
|
instruments = [
|
|
("Guitar (standard)", Fretboard.guitar()),
|
|
("Guitar (drop D)", Fretboard.guitar("drop d")),
|
|
("Guitar (open G)", Fretboard.guitar("open g")),
|
|
("Guitar (DADGAD)", Fretboard.guitar("dadgad")),
|
|
("Bass", Fretboard.bass()),
|
|
("Ukulele", Fretboard.ukulele()),
|
|
("Mandolin", Fretboard.mandolin()),
|
|
("Violin", Fretboard.violin()),
|
|
("Banjo", Fretboard.banjo()),
|
|
("Bouzouki (Irish)", Fretboard.bouzouki()),
|
|
]
|
|
|
|
for name, fb in instruments:
|
|
tuning = " ".join(t.full_name for t in fb.tones)
|
|
print(f" {name:22s} {tuning}")
|
|
|
|
# ── Guitar Chord Chart ──────────────────────────────────────────────────
|
|
|
|
print()
|
|
print("Guitar Chord Chart (standard tuning)")
|
|
print("=" * 55)
|
|
|
|
fb = Fretboard.guitar()
|
|
chart = CHARTS["western"]
|
|
|
|
for chord_name in ["C", "G", "D", "Am", "Em", "F", "A", "E", "Dm", "G7", "C7", "Am7"]:
|
|
f = chart[chord_name].fingering(fretboard=fb)
|
|
print(f" {chord_name:5s} {f}")
|
|
|
|
# ── Capo Magic ──────────────────────────────────────────────────────────
|
|
|
|
print()
|
|
print("Capo Transposition")
|
|
print("=" * 55)
|
|
print(" Playing open chord shapes with a capo changes the key:")
|
|
print()
|
|
|
|
open_shapes = ["C", "G", "D", "Am", "Em"]
|
|
|
|
for capo_fret in range(1, 6):
|
|
fb_capo = Fretboard.guitar(capo=capo_fret)
|
|
results = []
|
|
for shape in open_shapes:
|
|
f = chart[shape].fingering(fretboard=fb_capo)
|
|
actual = f.identify() or "?"
|
|
results.append(f"{shape}→{actual.split()[0]}")
|
|
print(f" Capo {capo_fret}: {', '.join(results)}")
|
|
|
|
# ── Same Chord on Different Instruments ─────────────────────────────────
|
|
|
|
print()
|
|
print("C Major on Different Instruments")
|
|
print("=" * 55)
|
|
|
|
c_chord = chart["C"]
|
|
for name, fb in [("Guitar", Fretboard.guitar()),
|
|
("Ukulele", Fretboard.ukulele()),
|
|
("Mandolin", Fretboard.mandolin()),
|
|
("Banjo", Fretboard.banjo())]:
|
|
try:
|
|
f = c_chord.fingering(fretboard=fb)
|
|
print(f" {name:12s} {f}")
|
|
except Exception:
|
|
print(f" {name:12s} (not available for this tuning)")
|