Skip to main content

🖐️ A universal representation of fingering systems for winds, reeds, and brass 🖐️

Project description

🖐️ fing: Represent all fingering systems for wind instruments 🖐️

fing is a general representation of fingering systems for woodwinds, reeds, and keyed brass.

fing has three goals:

  1. To represent existing and new fingering systems as documents that can easily be created, read and understood by humans and computers alike.

  2. To easily create classic and new types of fingering charts, tables, images and even animations, for existing and new fingering systems.

  3. To be adaptable to any keyed monophonic instrument, any human language, and any definition of note.

Example: recorder fingering

Here's a full specification of the Baroque fingerings for the recorder family:

https://github.com/rec/fing/blob/main/fingerings/recorder-fingering.toml

It's written in a format called TOML designed to be straight-forward for both humans and computers to read and write.

It isn't trying to be good for learners, but fing also provides a general system for making fingering charts without writing Python programs.

This short layout document together with the specification above, created this image:

Complete but sparse fingering chart for the recorder

A final chart would have "more stuff" on it; this shows how it can be done in one page of layout.

How does fing work, in 90 seconds?

fing represents fingering systems using Buttons: keys, pads, buttons, or switches that can be pressed, holes that can be covered, etc.

A Button definition looks like this:

[buttons.octave]
short_name = 'oct'
press = "left-thumb"
description = 'Half-cover the thumb hole with the nail'

Fingerings are defined in terms of those Buttons, like this:

[fingerings]
all = 'oct lt l1 l2 l3 r1 r2 r3 r3h r4 r4h cb  '

C_1 = 'lt  l1  l2  l3  r1  r2  r3  r4      '
Db1 = 'lt  l1  l2  l3  r1  r2  r3  r4h     '
D_1 = 'lt  l1  l2  l3  r1  r2  r3          '
Eb1 = 'lt  l1  l2  l3  r1  r2  r3h         '

... many more ...

General "modifier" Buttons like in electronic wind instruments are also possible.

There's a separate layout system to describe how to render a Fingering System into graphical Fingering Charts in a simple, standard text-based graphical language called Scalable Vector Graphics or SVG.

The result can be displayed in any browser or web page, edited by hand as text or with free and open source tools, embeded in a PDF, Illustrator, Photoshop or other graphical document, and printed at any resolution.

Appendix: notes on SVG

If you're thinking of creating new fingering chart formats, the SVG snippets aren't so terrible - here's all of them from the recorder fingering chart.

[layout]
styles = '''
.outline { fill: white; stroke: black; stroke-width: 1.5; }
'''
[layout.defs]
pad = '<circle cx="50" cy="50" r="50" />'
little-hole = '<circle cx="80" cy="55" r="20" />'
big-hole = '<circle cx="30" cy="30" r="30" />'
horizontal-line = '<rect x="0" y="50" width="120" height="1" style="fill: black;"/>'
octave = '<path d="  M 0,50   A 50,50 0 0 0 100,50   Z  " fill="black" />'

and then you re-use them like this:

[layout.pieces.left-thumb.parts]
_off = 'pad @ outline'
oct = 'pad @ outline + octave'
left-thumb = 'pad'

[layout.pieces.right-3.parts]
_off = 'little-hole @ outline + big-hole @ outline'
right-3 = 'little-hole + big-hole'
right-3-half = 'little-hole @ outline + big-hole'

where the image for the oct key is the circular pad Def with the outline style, plus the octave Def, a half-filled circle.

The path instruction can be tricky, but this is something that LLMs do very well, though that single line octave above is the only part of this whole project that was done with an LLM (which, in fairness, came up with a better solution than I did, so I used it.)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fing-0.2.0.tar.gz (43.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fing-0.2.0-py3-none-any.whl (11.3 kB view details)

Uploaded Python 3

File details

Details for the file fing-0.2.0.tar.gz.

File metadata

  • Download URL: fing-0.2.0.tar.gz
  • Upload date:
  • Size: 43.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for fing-0.2.0.tar.gz
Algorithm Hash digest
SHA256 82324cc0292cc0cb9c2bff75419a80a8e0618fcbcdf8ce17c391477ca2c89d3e
MD5 8d1e97419b15899c32db027585c6289d
BLAKE2b-256 4c71645a0ee3cecdb49d5b54846cae06021873f71911343b4dd5432e79e7e3eb

See more details on using hashes here.

File details

Details for the file fing-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: fing-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 11.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for fing-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bf9f7e717aa43d02a63e94f1d99cf59880be49233613497a92b222b0edebb8fd
MD5 69cf716d3b9b823fef0e29bf6d6001a6
BLAKE2b-256 c2cf391f97204c7f8b6c3a930a407f8c77c46bff44a623f32e280f6e4d0a8583

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page