Code Monkey home page Code Monkey logo

ukebox's Introduction

ukebox

Crates.io Documentation Continuous integration license rustc

ukebox is a ukulele chord toolbox for the command line written in Rust.

Features

  • shows you how to play a given chord on a ukulele by printing a chord chart in ASCII art
  • presents the chord name(s) corresponding to a chord fingering given in numeric chord notation
  • supports different ukulele tunings (C, D and G)
  • can present each chord in different positions along the fretbord
  • allows you to transpose a chord by any number of semitones
  • helps you find a good voice leading for a given chord sequence

Installation

Archives of precompiled binaries for each release of ukebox are available for Windows, macOS and Linux.

Alternatively, ukebox can be installed with cargo.

$ cargo install ukebox

Usage

USAGE:
    ukebox [OPTIONS] <SUBCOMMAND>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -t, --tuning <TUNING>    Type of tuning to be used [default: C]  [possible values: C, D, G]

SUBCOMMANDS:
    chart         Chord chart lookup
    chords        List all supported chord types and symbols
    help          Prints this message or the help of the given subcommand(s)
    name          Chord name lookup
    voice-lead    Voice leading for a sequence of chords

When running the program with Rust, replace the command ukebox with cargo run --release, e.g. cargo run --release -- chart G.

Chord chart lookup

Use the subcommand chart to look up the chart for a given chord name. By default, the first matching chord voicing is presented. Use the flag --all to get all possible voicings of the same chord. You can use additional options to further filter the result, e.g. by specifying a minimal or a maximal fret that should be involved in the chord voicing.

USAGE:
    ukebox chart [FLAGS] [OPTIONS] <chord>

FLAGS:
    -a, --all        Print out all voicings of <chord> that fulfill the given conditions
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
        --max-fret <FRET_ID>       Maximal fret up to which to play <chord> [default: 12]
        --max-span <FRET_COUNT>    Maximal span between the first and the last fret pressed down when playing <chord>
                                   [default: 4]
        --min-fret <FRET_ID>       Minimal fret (= minimal position) from which to play <chord> [default: 0]
        --transpose <SEMITONES>    Number of semitones to add (e.g. 1, +1) or to subtract (e.g. -1) [default: 0]
    -t, --tuning <TUNING>          Type of tuning to be used [default: C]  [possible values: C, D, G]

ARGS:
    <CHORD>    Name of the chord to be shown

Some examples:

$ ukebox chart G
[G - G major]

A  ||---|-o-|---|---|- B
E  ||---|---|-o-|---|- G
C  ||---|-o-|---|---|- D
G o||---|---|---|---|- G
$ ukebox chart --tuning D G
[G - G major]

B  o||---|---|---|---|- B
F#  ||-o-|---|---|---|- G
D  o||---|---|---|---|- D
A   ||---|-o-|---|---|- B
$ ukebox chart --min-fret 3 G
[G - G major]

A  -|---|-o-|---|---|- D
E  -|---|---|---|-o-|- B
C  -|---|---|---|-o-|- G
G  -|-o-|---|---|---|- B
      4
$ ukebox chart --tuning D --min-fret 3 G
[G - G major]

B   -|-o-|---|---|---|- D
F#  -|---|---|-o-|---|- B
D   -|---|---|-o-|---|- G
A   -|---|---|-o-|---|- D
       3
$ ukebox chart --transpose 1 C
[C# - C# major]

A  ||---|---|---|-o-|- C#
E  ||-o-|---|---|---|- F
C  ||-o-|---|---|---|- C#
G  ||-o-|---|---|---|- G#
$ ukebox chart --transpose -2 C
[Bb - Bb major]

A  ||-o-|---|---|---|- Bb
E  ||-o-|---|---|---|- F
C  ||---|-o-|---|---|- D
G  ||---|---|-o-|---|- Bb
$ ukebox chart --all --max-fret 5 C
[C - C major]

A  ||---|---|-o-|---|- C
E o||---|---|---|---|- E
C o||---|---|---|---|- C
G o||---|---|---|---|- G

A  ||---|---|-o-|---|- C
E o||---|---|---|---|- E
C  ||---|---|---|-o-|- E
G o||---|---|---|---|- G

A  ||---|---|-o-|---|- C
E  ||---|---|-o-|---|- G
C  ||---|---|---|-o-|- E
G o||---|---|---|---|- G

A  -|-o-|---|---|---|- C
E  -|-o-|---|---|---|- G
C  -|---|-o-|---|---|- E
G  -|---|---|-o-|---|- C
      3

Chord name lookup

Use the subcommand name to look up the chord name(s) corresponding to a given chord fingering.

USAGE:
    ukebox name [OPTIONS] <FRET_PATTERN>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -t, --tuning <TUNING>    Type of tuning to be used [default: C]  [possible values: C, D, G]

ARGS:
    <FRET_PATTERN>    A compact chart representing the finger positions of the chord to be looked up

Some examples:

$ ukebox name 2220
D - D major
$ ukebox name --tuning D 2220
E - E major
$ ukebox name 0233
Csus2 - C suspended 2nd
Gsus4 - G suspended 4th

If the fret pattern contains fret numbers greater than 9 you have to add spaces between the fret numbers and embed them in quotes:

$ ukebox name "7 7 7 10"
G - G major

Voice leading

Use the subcommand voice-lead to get some inspiration for finding a good voice leading for a given sequence of chords. In order to decide that one voice leading may better than the other, ukebox uses both the "semitone distance" between two voicings (to find good sounding transitions between voicings) as well as the distance between the fingerings to be used to play them (to make sure the transitions are also comfortably playable). This feature is still very experimental and will hopefully be improved some more in the future. For its implementation, I took a lot of inspiration from these blog articles by Pete Corey.

USAGE:
    ukebox voice-lead [OPTIONS] <CHORD_SEQUENCE>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
        --max-fret <FRET_ID>       Maximal fret up to which to play <chord> [default: 12]
        --max-span <FRET_COUNT>    Maximal span between the first and the last fret pressed down when playing <chord>
                                   [default: 4]
        --min-fret <FRET_ID>       Minimal fret (= minimal position) from which to play <chord> [default: 0]
        --transpose <SEMITONES>    Number of semitones to add (e.g. 1, +1) or to subtract (e.g. -1) [default: 0]
    -t, --tuning <TUNING>          Type of tuning to be used [default: C]  [possible values: C, D, G]

ARGS:
    <CHORD_SEQUENCE>    Chord sequence

Some examples:

$ ukebox voice-lead "C F G"
[C - C major]

A  ||---|---|-3-|---|- C
E o||---|---|---|---|- E
C o||---|---|---|---|- C
G o||---|---|---|---|- G

[F - F major]

A  ||---|---|-3-|---|- C
E  ||-1-|---|---|---|- F
C o||---|---|---|---|- C
G  ||---|-2-|---|---|- A

[G - G major]

A  ||---|-2-|---|---|- B
E  ||---|---|-3-|---|- G
C  ||---|-1-|---|---|- D
G o||---|---|---|---|- G
$ ukebox voice-lead "C F G" --tuning D
[C - C major]

B   ||-1-|---|---|---|- C
F#  ||-1-|---|---|---|- G
D   ||---|-2-|---|---|- E
A   ||---|---|-3-|---|- C

[F - F major]

B   ||-1-|---|---|---|- C
F#  ||---|---|-4-|---|- A
D   ||---|---|-3-|---|- F
A   ||---|---|-2-|---|- C

[G - G major]

B  o||---|---|---|---|- B
F#  ||-1-|---|---|---|- G
D  o||---|---|---|---|- D
A   ||---|-2-|---|---|- B

Supported chord types

Run ukebox chords to get a list of the chord types and symbols currently supported.

$ ukebox chords
Supported chord types and symbols

The root note C is used as an example.

C major - C, Cmaj, CM
C major 7th - Cmaj7, CM7
C major 9th - Cmaj9, CM9
C major 11th - Cmaj11, CM11
C major 13th - Cmaj13, CM13
C major 6th - C6, Cmaj6, CM6
C 6th/9th - C6/9, Cmaj6/9, CM6/9
C dominant 7th - C7, Cdom
C dominant 9th - C9
C dominant 11th - C11
C dominant 13th - C13
C dominant 7th flat 9th - C7b9
C dominant 7th sharp 9th - C7#9
C dominant 7th flat 5th - C7b5, C7dim5
C suspended 4th - Csus4, Csus
C suspended 2nd - Csus2
C dominant 7th suspended 4th - C7sus4, C7sus
C dominant 7th suspended 2nd - C7sus2
C minor - Cm, Cmin
C minor 7th - Cm7, Cmin7
C minor/major 7th - CmMaj7, CmM7, CminMaj7
C minor 6th - Cm6, Cmin6
C minor 9th - Cm9, Cmin9
C minor 11th - Cm11, Cmin11
C minor 13th - Cm13, Cmin13
C diminished - Cdim, Co
C diminished 7th - Cdim7, Co7
C half-diminished 7th - Cm7b5, Cø, Cø7
C 5th - C5
C augmented - Caug, C+
C augmented 7th - Caug7, C+7, C7#5
C augmented major 7th - CaugMaj7, C+M7
C added 9th - Cadd9, Cadd2
C added 4th - Cadd4

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

ukebox's People

Contributors

dependabot-preview[bot] avatar dependabot[bot] avatar noeddl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

ukebox's Issues

Add more chord types

More chords, more fun:

To come up with this list, I used mainly these two sources:

Determine the optimal way to play a given chord sequence

The idea is that the user inputs a sequence of chord names and is presented a diagram showing the most convenient way to play these chords. I'm not sure how (and if at all) this can be computed reliably but it will probably involve some kind of distance measure between different chord shapes.

For this, the compact representation described in #16 would probably be helpful ad easier to read.

Something similar could also be useful for melodies.

Handle chord shapes that spread across more than four frets

Some chord shapes are okay to play in the basic position (with one or more open strings) but would require spreading your fingers across five frets in higher positions (see e.g. G#mMaj7 or some diminished chords). This is a problem because a) it makes the chords hard to play and b) ukebox cannot display them correctly because currently, it only shows a diagram of four frets.

These cases should be handled somehow, either by showing them correctly (and extending the diagram to five frets) or by allowing the corresponding chord shapes in the basic positions but ignoring everything that would require more than four frets.

Transpose chords

Add option/subcommand to transpose a chord a given number of semitones up or down.

Make sure a chord contains all necessary notes

Currently, G# is not generated correctly. The "chord" computed only contains two of the necessary notes.

[G#]

A  ||---+---+-●-+---+ C
E  ||---+---+---+-●-+ G#/Ab
C ○||---+---+---+---+ C
G  ||-●-+---+---+---+ G#/Ab

The correct result would be this:

[G#]

A  ||---+---+-●-+---+ C
E  ||---+---+---+-●-+ G#/Ab
C  ||---+---+-●-+---+ D#/Eb
G  ||-●-+---+---+---+ G#/Ab

Add more chord types

  • ['1P 3M 5P', '', '', '', 'major'],
  • ['1P 3M 5P 7M', '', 'maj7 ma7 M7 Maj7', 'Δ', 'major seventh'],
  • ['1P 3M 5P 7M 9M', '', 'maj9', 'Δ9', 'major ninth'],
  • maj11
  • ['1P 3M 5P 7M 9M 13M', '', 'maj13', 'Maj13', 'major thirteenth'],
  • ['1P 3M 5P 6M', '5P', '6 add6 add13', 'M6', 'sixth'],
  • ['1P 3M 5P 6M 9M', '', '6/9', '69', 'sixth/ninth'],
  • ['1P 3M 5P 7M 11A', '3M', 'maj7#11', 'maj#4 Δ#4 Δ#11', 'lydian'],
  • ['1P 3M 6m 7M', '', 'maj7b13', 'maj7b6 M7b6', 'major seventh b6'],
  • ['1P 3m 5P', '', 'm min', 'mi -', 'minor'],
  • ['1P 3m 5P 7m', '', 'm7 min7', 'mi7 -7', 'minor seventh'],
  • ['1P 3m 5P 7M', '', 'mmaj7 mM7', 'm/ma7 m/maj7 m/M7 -Δ7 mΔ', 'minor/major seventh'],
  • ['1P 3m 5P 6M', '5P', 'm6', '', 'minor sixth'],
  • ['1P 3m 5P 7m 9M', '3m 5P', 'm9', '', 'minor ninth'],
  • ['1P 3m 5P 7m 9M 11P', '5P', 'm11', '', 'minor eleventh'],
  • ['1P 3m 5P 7m 9M 13M', '3m 5P', 'm13', '', 'minor thirteenth'],
  • ['1P 3m 5d', '', 'dim', '° o', 'diminished'],
  • ['1P 3m 5d 7d', '', 'dim7', '°7 o7', 'diminished seventh'],
  • ['1P 3m 5d 7m', '', 'm7b5', 'ø', 'half-diminished'],
  • ['1P 3M 5P 7m', '', '7', 'dom', 'dominant seventh'],
  • ['1P 3M 5P 7m 9M', '5P', '9', '', 'dominant ninth'],
  • ['1P 3M 5P 7m 9M 13M', '3M 5P', '13', '', 'dominant thirteenth'],
  • ['1P 3M 5P 7m 11A', '3M', '7#11', '7#4', 'lydian dominant seventh'],
  • ['1P 3M 5P 7m 9m', '5P', '7b9', '', 'dominant b9'],
  • ['1P 3M 5P 7m 9A', '5P', '7#9', '', 'dominant #9'],
  • ['1P 3M 7m 9m', '', '', 'alt7', 'altered'],
  • ['1P 4P 5P', '', 'sus4', 'sus', 'suspended 4th'],
  • ['1P 2M 5P', '', 'sus2', '', 'suspended 2nd'],
  • ['1P 4P 5P 7m', '', '7sus4', '', 'suspended 4th seventh'],
  • 7sus2
  • ['1P 5P 7m 9M 11P', '', '11', '', 'eleventh'],
  • ['1P 4P 5P 7m 9m', '', '', 'sus4b9 susb9 (b9)sus phryg', 'suspended 4th b9'],
  • ['1P 5P', '', '5', '', 'fifth'],
  • ['1P 3M 5A', '', 'aug + +5', '', 'augmented'],
  • ['1P 3M 5A 7M', '', 'maj7#5 maj7+5', '', 'augmented seventh'],
  • ['1P 3M 5P 7M 9M 11A', '9M', 'maj9#11', 'Δ9#11', 'major #11 (lydian)'],
  • ['1P 2M 4P 5P', '', '', 'sus24 sus4add9 sus2sus4', ''],
  • ['1P 3M 5A 7M 9M', '', '9#5', 'maj9#5 Maj9#5', ''],
  • ['1P 3M 5A 7m', '', '7#5', '+7 7aug aug7', ''],
  • ['1P 3M 5A 7m 9A', '', '7#5#9', '7alt 7#5#9_ 7#9b13_', ''],
  • ['1P 3M 5A 7m 9M', '', '9#5', '9+', ''],
  • ['1P 3M 5A 7m 9M 11A', '', '', '9#5#11', ''],
  • ['1P 3M 5A 7m 9m', '', '', '7#5b9', ''],
  • ['1P 3M 5A 7m 9m 11A', '', '', '7#5b9#11', ''],
  • ['1P 3M 5A 9A', '', '', '+add#9', ''],
  • ['1P 3M 5A 9M', '', '+9', 'aug9 add9#5 (#5)add9 M#5add9 +add9', ''],
  • ['1P 3M 5P 6M 11A', '', '6#11 maj6#11', 'M6#11 6+11', ''],
  • ['1P 3M 5P 6M 7M 9M', '', 'maj7add13', 'M7add13', ''],
  • ['1P 3M 5P 6M 9M 11A', '', '', '6/9#11 69#11', ''],
  • ['1P 3M 5P 6m 7m', '', '7b13', '7b6', ''],
  • ['1P 3M 5P 7M 9A 11A', '', '', 'maj7#9#11 +11', ''],
  • ['1P 3M 5P 7M 9M 11A 13M', '', '', ' M13#11 maj13#11 M13+4 M13#4 maj13#4 +11maj13 maj13+11', ''],
  • ['1P 3M 5P 7M 9m', '', '', 'maj7b9 M7b9 maj7addb9 maj7-9', ''],
  • ['1P 3M 5P 7m 11A 13m', '', '', '7#11b13 7b5b13', ''],
  • ['1P 3M 5P 7m 13M', '', '7add6 7add13', '6/7 67', ''],
  • ['1P 3M 5P 7m 9A 11A', '', '', '7#9#11 7b5#9', ''],
  • ['1P 3M 5P 7m 9A 11A 13M', '', '', '13#9#11', ''],
  • ['1P 3M 5P 7m 9A 11A 13m', '', '', '7#9#11b13', ''],
  • ['1P 3M 5P 7m 9A 13M', '', '', '13#9 13#9_', ''],
  • ['1P 3M 5P 7m 9A 13m', '', '', '7#9b13', ''],
  • ['1P 3M 5P 7m 9M 11A', '', '', '9#11 9+4 9#4 9#11_ 9#4_', ''],
  • ['1P 3M 5P 7m 9M 11A 13M', '', '', '13#11 13+4 13#4', ''],
  • ['1P 3M 5P 7m 9M 11A 13m', '', '', '9#11b13 9b5b13', ''],
  • ['1P 3M 5P 7m 9m 11A', '3M 5P', '', '7b5b9 7b9#11', ''],
  • ['1P 3M 5P 7m 9m 11A 13M', '', '', '13b9#11', ''],
  • ['1P 3M 5P 7m 9m 11A 13m', '', '', '7b9b13#11 7b9#11b13 7b5b9b13', ''],
  • ['1P 3M 5P 7m 9m 13M', '', '13b9', '', ''],
  • ['1P 3M 5P 7m 9m 13m', '', '', '7b9b13', ''],
  • ['1P 3M 5P 7m 9m 9A', '', '', '7b9#9', ''],
  • ['1P 3M 5P 9M', '', 'add9 add2 2', 'Madd9', ''],
  • ['1P 3M 5P 9m', '', '(b9)', 'majaddb9 majb9 addb9 Maddb9', ''],
  • ['1P 3M 5d', '', '(b5)', 'Mb5', ''],
  • ['1P 3M 5d 6M 7m 9M', '', '', '13b5', ''],
  • ['1P 3M 5d 7M', '', 'maj7b5', 'M7b5', ''],
  • ['1P 3M 5d 7M 9M', '', '', 'maj9b5 M9b5', ''],
  • ['1P 3M 5d 7m', '', '7b5', '', ''],
  • ['1P 3M 5d 7m 9M', '', '9b5', '', ''],
  • ['1P 3M 7m', '', '', '7no5 7omit5', ''],
  • ['1P 3M 7m 13m', '', '7b13', '', ''],
  • ['1P 3M 7m 9M', '', '', '9no5 9omit5', ''],
  • ['1P 3M 7m 9M 13M', '', '', '13no5 13omit5', ''], // 1 3 6 9 ?
  • ['1P 3M 7m 9M 13m', '', '', '9b13', ''],
  • ['1P 3m 4P 5P', '', 'madd4', '', ''],
  • ['1P 3m 5A', '', '', 'm#5 m+ mb6', ''],
  • ['1P 3m 5P 6M 9M', '', 'm6/9', 'm69 _69', ''],
  • ['1P 3m 5P 6m 7M', '', '', 'mmaj7b6 mMaj7b6 mmaj7b13 mM7b6 mM7(b6) mmaj7-6', ''],
  • ['1P 3m 5P 6m 7M 9M', '', '', 'mmaj9b6 mMaj9b6 mmaj9b13 mM9b6 mmaj9-6', ''],
  • ['1P 3m 5P 7M 9M', '', 'mmaj9', 'mMaj9 -Maj9', ''],
  • ['1P 3m 5P 7m 11P', '', 'm7add11 m7add4', '', ''],
  • ['1P 3m 5P 9M', '', 'madd9', '', ''],
  • ['1P 3m 5d 6M 7M', '', '', 'o7M7 dim7maj7 dim7+7', ''],
  • ['1P 3m 5d 7M', '', '', 'oM7 dimmaj7 dim+7', ''],
  • ['1P 3m 5d 7m', '', 'm7b5', 'h7 _7b5', 'half-diminished'],
  • ['1P 3m 6m 7M', '', '', 'mb6maj7 mb6M7 mmaj7#5', ''],
  • ['1P 3m 6m 7m', '', 'm7#5', '', ''],
  • ['1P 3m 6m 7m 9M', '', '', 'm9#5 m7maj9#5 maj9#5', ''],
  • ['1P 3m 6m 7m 9M 11P', '', '', 'm11A +5m7maj11', ''],
  • ['1P 3m 6m 9m', '', '', 'mb6b9 +5b9', ''],
  • ['1P 3m 7m 12d 2M', '', '', 'm9b5 h9 -9b5', ''],
  • ['1P 3m 7m 12d 2M 4P', '', '', 'm11b5 h11 _11b5', ''],
  • ['1P 4P 5A 7M', '', '', 'maj7#5sus4 M7#5sus4', ''],
  • ['1P 4P 5A 7M 9M', '', '', 'maj9#5sus4 M9#5sus4', ''],
  • ['1P 4P 5A 7m', '', '', '7#5sus4', ''],
  • ['1P 4P 5P 7M', '', 'maj7sus4', 'maj77sus4 M7sus4', ''], //?
  • ['1P 4P 5P 7M 9M', '', 'maj9sus4', 'M9sus4', ''],
  • ['1P 4P 5P 7m 9M', '', '9sus4 9sus', '', ''],
  • ['1P 4P 5P 7m 9M 13M', '5P 7m 9M', '', '13sus4 13sus', ''],
  • ['1P 4P 5P 7m 9m 13m', '', '', '7sus4b9b13 7b9b13sus4', ''],
  • ['1P 4P 7m 10m', '', '', '4 quartal', 'quartal'],
  • ['1P 5P 7m 9m 11P', '', '11b9', '', ''],
  • ['1P 2M 5P 7M', '', 'maj7sus2', 'Δsus2 ma7sus2 M7sus2 Maj7sus2', 'major seventh'],
  • ['1P 3M 4P 5P', '', 'add4 add11', '', ''],

List copied from https://github.com/hyvyys/chord-fingering/blob/master/src/CHORD_DATA.js

Old list with links:

There's still more that could be added later, see e.g. extended and altered chords.

Enable compact chord chart

It could be handy to have an alternative, more compact representation of a chord, something like that:

     D
A |--0--
E |--2--
C |--2--
G |--2--

It could be presented when a command line option is used, e.g. --compact.

Restrict output to ASCII characters

So I realized that my "ASCII art" output in fact uses Unicode characters which may look different depending on the font used and which are destroyed if the encoding of the shell is e.g. latin-1 instead of utf8.

The obvious thing is to use o instead of ○ to mark open strings. Instead of ● we could use # or maybe @. (I will probably change my mind about this several times, anyway.)

Mark optional notes

Some of the chords generated with the help of the chord shapes could be played in a simpler way with one of the strings being left open. I noticed this at least for Em and F#m. The respective fret could be marked as optional with brackets, e.g. something like that:

A  ||---+-●-+---+---+ B
E  ||---+---+-●-+---+ G
C  ||---+---+---+-●-+ E
G  ||---+---+---+(●)+ G (B)

Add minor chords

Add minor chord quality and handle chord names such as Cm, C#m etc.

Backwards chord search

Chord finding the other way around:

The user inputs a chord pattern in a simple format (e.g. 2220) and is presented the name of the chord (in this case D).

This probably starts making sense and fun once we can handle enough different types of chords.

Fix D7 and Dm7

The chord shapes 2020 for D7 and 2010 for Dm7 are technically "wrong" because they both lack the root note D. I included them anyway because these were the ways I knew how to play these chords but now I think I should remove them from the program and start playing the "real" D7 and Dm7. 🙂

See also the discussion here: https://ukulele-chords.com/D7

Enable different tunings

Add a command line option for choosing a type of tuning. Let's start by providing the options C and D, C being the default.

Add option for choosing minimal fret

Add a command line option to specify a minimal fret from which to show the requested chord and display the chord accordingly.

For example, cargo run -- --min-fret 3 C should give

[C]

A  -+-●-+---+---+---+ C
E  -+-●-+---+---+---+ G
C  -+---+-●-+---+---+ E
G  -+---+---+-●-+---+ C
      3

Show correct name of enharmonic notes

Present the correct note name depending on the name of the chord and its intervals, e.g.

[F#]

A  ||-●-+---+---+---+ A#
E  ||---+-●-+---+---+ F#
C  ||-●-+---+---+---+ C#
G  ||---+---+-●-+---+ A#

vs.

[Gb]

A  ||-●-+---+---+---+ Bb
E  ||---+-●-+---+---+ Gb
C  ||-●-+---+---+---+ Db
G  ||---+---+-●-+---+ Bb

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.