text: # -*- encoding: utf-8 -*-
  
  __all__ = [
      'CHORDS', 'CHORD_TABS',
      'UkuleleNoteError', 'UkuleleChordError',
      'get_chord', 'get_note'
      ] 
  
  
  class UkuleleNoteError(Exception) :
      pass
  
  
  class UkuleleChordError(Exception) :
      pass
  
  
  def get_note(string, fret) :
      if abs(string) < len(FRETS) :
          if abs(fret) < len(FRETS[string]) :
              return FRETS[string][fret]
      raise UkuleleNoteError(string, fret)
  
  
  def get_chord(chord) :
      if chord in CHORD_TABS :
          return tuple([
              get_note(string, fret) for string, fret in enumerate(CHORD_TABS[chord])
          ])
      raise UkuleleChordError(chord)
  
  
  FRETS = (
      ('G4', 'G#4', 'A4', 'A#4', 'B4', 'C5', 'C#5', 'D5', 'D#5', 'E5', 'F5', 'F#5', 'G5'),
      ('C4', 'C#4', 'D4', 'D#4', 'E4', 'F4', 'F#4', 'G4', 'G#4', 'A4', 'A#4', 'B4', 'C5'),
      ('E4', 'F4', 'F#4', 'G4', 'G#4', 'A4', 'A#4', 'B4', 'C5', 'C#5', 'D5', 'D#5', 'E5'),
      ('A4', 'A#4', 'B4', 'C5', 'C#5', 'D5', 'D#5', 'E5', 'F5', 'F#5', 'G5', 'G#5', 'A5'),
  )
  
  
  CHORD_TABS = {
      'C'     : (0, 0, 0, 3),
      'C7'    : (0, 0, 0, 1),
      'Cm'    : (0, 3, 3, 3),
      'Cm7'   : (3, 3, 3, 3),
      'Cdim'  : (2, 3, 2, 3),
      'Caug'  : (1, 0, 0, 3),
      'C6'    : (0, 0, 0, 0),
      'Cmaj7' : (0, 0, 0, 2),
      'C9'    : (0, 2, 0, 1),
  
      'C#'     : (1, 1, 1, 4),
      'C#7'    : (1, 1, 1, 2),
      'C#m'    : (1, 1, 0, 3),
      'C#m7'   : (4, 4, 4, 4),
      'C#dim'  : (0, 1, 0, 1),
      'C#aug'  : (2, 1, 1, 0),
      'C#6'    : (1, 1, 1, 1),
      'C#maj7' : (1, 1, 1, 3),
      'C#9'    : (1, 3, 1, 2),
  
      'D'     : (2, 2, 2, 0),
      'D7'    : (2, 2, 2, 3),
      'Dm'    : (2, 2, 1, 0),
      'Dm7'   : (2, 2, 1, 3),
      'Ddim'  : (1, 2, 1, 2),
      'Daug'  : (3, 2, 2, 1),
      'D6'    : (2, 2, 2, 2),
      'Dmaj7' : (2, 2, 2, 4),
      'D9'    : (2, 4, 2, 3),
  
      'Eb'     : (1, 3, 3, 3),
      'Eb7'    : (3, 3, 3, 4),
      'Ebm'    : (3, 3, 2, 1),
      'Ebm7'   : (3, 3, 2, 4),
      'Ebdim'  : (2, 3, 2, 3),
      'Ebaug'  : (2, 1, 1, 4),
      'Eb6'    : (3, 3, 3, 3),
      'Ebmaj7' : (3, 3, 3, 0),
      'Eb9'    : (0, 1, 1, 1),
  
      'E'     : (2, 4, 4, 4),
      'E7'    : (1, 2, 0, 2),
      'Em'    : (0, 4, 3, 2),
      'Em7'   : (0, 2, 0, 2),
      'Edim'  : (0, 1, 0, 1),
      'Eaug'  : (1, 0, 0, 3),
      'E6'    : (1, 0, 2, 0),
      'Emaj7' : (1, 3, 0, 2),
      'E9'    : (1, 2, 2, 2),
  
      'F'     : (2, 0, 1, 0),
      'F7'    : (2, 3, 1, 0),
      'Fm'    : (1, 0, 1, 3),
      'Fm7'   : (1, 3, 1, 3),
      'Fdim'  : (1, 2, 1, 2),
      'Faug'  : (2, 1, 1, 0),
      'F6'    : (2, 2, 1, 3),
      'Fmaj7' : (2, 4, 1, 3),
      'F9'    : (2, 3, 3, 3),
  
      'F#'     : (3, 1, 2, 1),
      'F#7'    : (3, 4, 2, 4),
      'F#m'    : (2, 1, 2, 0),
      'F#m7'   : (2, 4, 2, 4),
      'F#dim'  : (2, 3, 2, 3),
      'F#aug'  : (4, 3, 2, 2),
      'F#6'    : (3, 3, 2, 4),
      'F#maj7' : (0, 1, 1, 1),
      'F#9'    : (1, 1, 0, 1),
  
      'G'     : (0, 2, 3, 2),
      'G7'    : (0, 2, 1, 2),
      'Gm'    : (0, 2, 3, 1),
      'Gm7'   : (0, 2, 1, 1),
      'Gdim'  : (0, 1, 0, 1),
      'Gaug'  : (4, 3, 3, 2),
      'G6'    : (0, 2, 0, 2),
      'Gmaj7' : (0, 2, 2, 2),
      'G9'    : (2, 2, 1, 2),
  
      'G#'     : (5, 3, 4, 3),
      'G#7'    : (1, 3, 2, 3),
      'G#m'    : (1, 3, 4, 2),
      'G#m7'   : (0, 3, 2, 2),
      'G#dim'  : (1, 2, 1, 2),
      'G#aug'  : (1, 0, 0, 2),
      'G#6'    : (1, 3, 1, 3),
      'G#maj7' : (1, 3, 3, 3),
      'G#9'    : (3, 3, 2, 3),
  
      'A'     : (2, 1, 0, 0),
      'A7'    : (0, 1, 0, 0),
      'Am'    : (2, 0, 0, 0),
      'Am7'   : (0, 4, 3, 3),
      'Adim'  : (2, 3, 2, 3),
      'Aaug'  : (2, 1, 1, 1),
      'A6'    : (2, 4, 2, 4),
      'Amaj7' : (1, 1, 0, 0),
      'A9'    : (0, 1, 0, 2),
  
      'Bb'    : (3, 2, 1, 1),
      'Bb7'   : (1, 2, 1, 1),
      'Bbm'   : (3, 1, 1, 1),
      'Bbm7'  : (1, 1, 1, 1),
      'Bbdim' : (0, 1, 0, 1),
      'Bbaug' : (3, 2, 2, 1),
      'Bb6'   : (0, 2, 1, 1),
      'Bbmaj7': (3, 2, 1, 0),
      'Bb9'   : (1, 2, 1, 3),
      
      'B'     : (4, 3, 2, 2),
      'B7'    : (2, 3, 2, 2),
      'Bm'    : (4, 2, 2, 2),
      'Bm7'   : (2, 2, 2, 2),
      'Bdim'  : (1, 2, 1, 2),
      'Baug'  : (4, 3, 3, 2),
      'B6'    : (1, 3, 2, 2),
      'Bmaj7' : (3, 3, 2, 2),
      'B9'    : (2, 3, 2, 4),
  }
  
  
  CHORDS = dict()
  for chord in CHORD_TABS :
      CHORDS[chord] = get_chord(chord)
  