
    rh1                       S r SSKJr  SSKrSSKJr  SSKJr  SSKJr  SSKJr  SSKJ	r	   " S	 S
\R                  5      r " S S\	R                  5      r " S S\	R                  5      r " S S5      r " S S\R                   \5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\R,                  5      r\S:X  a  SSKr\R2                  " \5        gg)z}
Music21 representation of FretNote and FretBoard objects.

TODO:
Chord from Figure
Chord from FretBoard Object with tuning.
    )annotationsN)common)exceptions21)harmony)pitch)prebasec                      \ rS rSrSrg)TablatureException    N)__name__
__module____qualname____firstlineno____static_attributes__r       K/home/james-whalen/.local/lib/python3.13/site-packages/music21/tablature.pyr
   r
      s    r   r
   c                  <    \ rS rSrSr   S     SS jjrS rSrg)	FretNote!   au  
A FretNote represents a note on a Fretboard, where each string should
be fingered (or not).

>>> fn = tablature.FretNote(3, 4, 1)
>>> fn
<music21.tablature.FretNote 3rd string, 4th fret, 1st finger>

>>> fn.string
3
>>> fn.fret
4
>>> fn.fingering
1
>>> fn.displayFingerNumber
True

>>> fnUnknownFinger = tablature.FretNote(1, 1)
>>> fnUnknownFinger.fingering is None
True
Nc                6    Xl         X l        X0l        SU l        g )NT)stringfret	fingeringdisplayFingerNumber)selfr   r   r   s       r   __init__FretNote.__init__7   s    
 !'"	#,)- r   c                X   S nU R                   b  U" U R                   5       S3nOSnU R                  b  U" U R                  5       S3nOSnU R                  b  U" U R                  5       S3nOSn/ nX#U4 H  nUS:w  d  M  UR                  U5        M     SR	                  U5      nU$ )a  
Defines the representation of a FretNote object under music21 standards.

>>> fn = tablature.FretNote(4, 2, 1)
>>> fn
<music21.tablature.FretNote 4th string, 2nd fret, 1st finger>

>>> fn2 = tablature.FretNote(3, 2)
>>> fn2
<music21.tablature.FretNote 3rd string, 2nd fret>

>>> fn3 = tablature.FretNote(fret=2, fingering=3)
>>> fn3
<music21.tablature.FretNote 2nd fret, 3rd finger>

>>> emptyNote = tablature.FretNote()
>>> emptyNote
<music21.tablature.FretNote>
c                6    U  [         R                  " U 5       3$ N)r   ordinalAbbreviation)xs    r   abbr$FretNote._reprInternal.<locals>.abbrU   s    S33A6788r   z string z fretz fingerz, )r   r   r   appendjoin)r   r$   
stringReprfretReprfingeringReprnonEmptyReprthisReprfullReprs           r   _reprInternalFretNote._reprInternalA   s    (	9 ;;" -.g6JJ99 tyy/*%0HH>>%#DNN34G<MM"m;H2~##H- < 99\*r   )r   r   r   r   )NNN)r   
int | Noner   r1   r   r1   )r   r   r   r   __doc__r   r/   r   r   r   r   r   r   !   s6    , "&"... .,r   r   c                  R    \ rS rSrSr   S
     SS jjrS rS rS rSS jr	S	r
g)	FretBoardp   a  
A FretBoard represents a displayed fretboard (i.e. used in chord symbols).
To be displayed, a fretboard requires a tuning system, defined by the fretted instrument
classes defined.

>>> fn1 = tablature.FretNote(string=3, fret=2, fingering=1)
>>> fn2 = tablature.FretNote(string=2, fret=3, fingering=3)
>>> fn3 = tablature.FretNote(string=1, fret=2, fingering=2)
>>> fb = tablature.FretBoard(6, fretNotes=[fn1, fn2, fn3], displayFrets=5)
>>> fb.numStrings
6
>>> fb
<music21.tablature.FretBoard 6 strings, 3 notes, 5 frets>
>>> len(fb.fretNotes)
3
>>> fb.fretNotes[0]
<music21.tablature.FretNote 3rd string, 2nd fret, 1st finger>

>>> fb.getFretNoteByString(2)
<music21.tablature.FretNote 2nd string, 3rd fret, 3rd finger>
Nc                J    Xl         U=(       d    / U l        X0l        / U l        g r!   )
numStrings	fretNotesdisplayFretstuning)r   r7   r8   r9   s       r   r   FretBoard.__init__   s!    
  *)2b()+r   c                f    U R                    S[        U R                  5       SU R                   S3$ )aA  
>>> fn3 = tablature.FretNote(string=6, fret=1, fingering=1)
>>> fn2 = tablature.FretNote(string=4, fret=2, fingering=2)
>>> fn1 = tablature.FretNote(string=2, fret=4, fingering=4)
>>> fb = tablature.FretBoard(6, fretNotes=[fn3, fn2, fn1], displayFrets=4)
>>> fb
<music21.tablature.FretBoard 6 strings, 3 notes, 4 frets>
z
 strings, z notes, z frets)r7   lenr8   r9   r   s    r   r/   FretBoard._reprInternal   s4     //"*S-@,A$J[J[I\\bccr   c                    / n[        U R                  SS5       H*  nU R                  U5      nUc  M  UR                  U5        M,     U$ )ap  
Returns a list of FretNotes in lowest to highest string order.

>>> firstNote = tablature.FretNote(string=2, fret=3, fingering=4)
>>> secondNote = tablature.FretNote(string=3, fret=3, fingering=3)
>>> thirdNote = tablature.FretNote(string=1, fret=3, fingering=3)
>>> myFretBoard = tablature.FretBoard(6, fretNotes=[firstNote, secondNote, thirdNote])
>>> for thisFretNote in myFretBoard.fretNotesLowestFirst():
...    print(thisFretNote)
<music21.tablature.FretNote 3rd string, 3rd fret, 3rd finger>
<music21.tablature.FretNote 2nd string, 3rd fret, 4th finger>
<music21.tablature.FretNote 1st string, 3rd fret, 3rd finger>
r   )ranger7   getFretNoteByStringr'   )r   allFretNotesstringNumberthisFretNotes       r   fretNotesLowestFirstFretBoard.fretNotesLowestFirst   sO     !$//1b9L33LAL#- : r   c                P    U R                    H  nXR                  :X  d  M  Us  $    g)a  
Returns FretNote object on a given string or None if there are none.

>>> firstNote = tablature.FretNote(string=6, fret=3, fingering=4)
>>> secondNote = tablature.FretNote(string=2, fret=3, fingering=3)
>>> myFretBoard = tablature.FretBoard(6, fretNotes=[firstNote, secondNote])
>>> myFretBoard.getFretNoteByString(6)
<music21.tablature.FretNote 6th string, 3rd fret, 4th finger>

>>> myFretBoard.getFretNoteByString(2)
<music21.tablature.FretNote 2nd string, 3rd fret, 3rd finger>

>>> myFretBoard.getFretNoteByString(9) is None
True
N)r8   r   )r   requestedStringrF   s      r   rC   FretBoard.getFretNoteByString   s)      !NNL"5"55## + r   c                   [        U R                  5      U R                  :w  a8  [        SR	                  [        U R                  5      U R                  5      5      eS/U R                  -  nU R
                  (       d  U$ U R
                   Hg  nUR                  =(       d    SS-  nU R                  U   nUR                  nXRR                  =(       d    S-   n[        R                  " U5      nXqU'   Mi     U$ )ah  
Returns a list of all the pitches (or None for each) given the FretNote information. This
requires a tuning to be set.

>>> firstNote = tablature.FretNote(string=4, fret=3, fingering=3)
>>> secondNote = tablature.FretNote(string=2, fret=1, fingering=1)
>>> gfb = tablature.GuitarFretBoard(fretNotes=[firstNote, secondNote])
>>> gfb.getPitches()
[None, None, <music21.pitch.Pitch F3>, None, <music21.pitch.Pitch C4>, None]

What if the User provides an empty FretBoard?
>>> gfb2 = tablature.GuitarFretBoard(fretNotes=[])
>>> gfb2.getPitches()
[None, None, None, None, None, None]

Works for other stringed instruments, as long as the tuning is included (see below).

>>> tablature.UkeleleFretBoard().numStrings
4
>>> uke = tablature.UkeleleFretBoard(fretNotes=[firstNote, secondNote])
>>> uke.getPitches()
[<music21.pitch.Pitch B-4>, None, <music21.pitch.Pitch F4>, None]
zITuning must be set first, tuned for {0} notes, on a {1} string instrumentNr   rA   )r=   r:   r7   r
   formatr8   r   psr   r   Pitch)r   	pitchListrF   pitchListPositiontuningPitchtuningPitchAsPsactualPitchdisplayPitchs           r   
getPitchesFretBoard.getPitches   s    0 t{{t.$[bb$OO  .2FT__,D	~~ NNL!-!4!4!9R ?++&78K%0^^O!04E4E4J!KK ;;{3L+7'( + r   )r9   r8   r7   r:   )   N   )r7   intr8   zlist[FretNote] | Noner9   rZ   )returnzlist[None | pitch.Pitch])r   r   r   r   r2   r   r/   rG   rC   rV   r   r   r   r   r4   r4   p   sF    . !")-	,	,&	, 	,	d4,.r   r4   c                  "    \ rS rSrSrSS jrSrg)	FirstFret   zd
FirstFretInfo returns the information regarding the first fret utilized in a
given chord position.
c                    Xl         X l        g r!   fretNumlocation)r   ra   rb   s      r   r   FirstFret.__init__  s     r   r`   N)right)r   r   r   r   r2   r   r   r   r   r   r]   r]      s    
!r   r]   c                  (    \ rS rSrSrSS jrS rSrg)ChordWithFretBoardi  a  
Music21Object subclass that combines a ChordSymbol with a FretBoard.
Tuning must be set!

>>> fn4 = tablature.FretNote(string=4, fret=0)
>>> fn3 = tablature.FretNote(string=3, fret=2, fingering=2)
>>> fn2 = tablature.FretNote(string=2, fret=3, fingering=3)
>>> fn1 = tablature.FretNote(string=1, fret=2, fingering=4)
>>> cwf = tablature.ChordWithFretBoard('Dm', fretNotes=[fn1, fn2, fn3, fn4])
Nc                v    [         R                  R                  " U 4SU0UD6  [        R                  U UUUS9  g )Nfigure)r7   r8   r9   )r   ChordSymbolr   r4   )r   rh   r7   r8   r9   keywordss         r   r   ChordWithFretBoard.__init__  s@    $$TE&EHE
 	4&0%.(4 	 	6r   c                    g)zf
TODO:
Given a chord with fret Figure, getFretNotesFromFigure returns each FretNote object
within it.
Nr   r>   s    r   getFretNotesFromFigure)ChordWithFretBoard.getFretNotesFromFigure"  s     r   r   )NrX   NrY   )r   r   r   r   r2   r   rm   r   r   r   r   rf   rf     s    		6r   rf   c                  0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )GuitarFretBoardi2  z.
A six-string fretboard tuned to E A D G B E.
c                4  > Sn[         TU ]  X1U5        [        R                  " S5      [        R                  " S5      [        R                  " S5      [        R                  " S5      [        R                  " S5      [        R                  " S5      /U l        g )NrX   E2A2D3G3B3E4superr   r   rO   r:   r   r8   r9   r7   	__class__s       r   r   GuitarFretBoard.__init__7  se    
={{4(%++d*;U[[=N{{4(%++d*;U[[=NPr   r:   NrY   r   r   r   r   r2   r   r   __classcell__r{   s   @r   rp   rp   2  s    P Pr   rp   c                  0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )UkeleleFretBoardi?  z*
A four-string fretboard tuned to G C E A
c                   > Sn[         TU ]  X1U5        [        R                  " S5      [        R                  " S5      [        R                  " S5      [        R                  " S5      /U l        g )NrY   G4C4rw   A4rx   rz   s       r   r   UkeleleFretBoard.__init__D  O    
={{4(%++d*;U[[=NPUP[P[\`Pabr   r}   r~   r   r   s   @r   r   r   ?      c cr   r   c                  0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )BassGuitarFretBoardiK  z*
A four-string fretboard tuned to E A D G
c                   > Sn[         TU ]  X1U5        [        R                  " S5      [        R                  " S5      [        R                  " S5      [        R                  " S5      /U l        g )NrY   E1A1D2G2rx   rz   s       r   r   BassGuitarFretBoard.__init__P  r   r   r}   r~   r   r   s   @r   r   r   K  r   r   r   c                  0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )MandolinFretBoardiW  z*
A four-string fretboard tuned to G D A E
c                   > Sn[         TU ]  X1U5        [        R                  " S5      [        R                  " S5      [        R                  " S5      [        R                  " S5      /U l        g )NrY   ru   D4r   E5rx   rz   s       r   r   MandolinFretBoard.__init__\  r   r   r}   r~   r   r   s   @r   r   r   W  r   r   r   c                  ,    \ rS rSrS rS rS rS rSrg)Testid  c                v    [        SSS5      nUR                  UR                  /nU R                  USS/5        g )NrY         )r   r   r   assertEqual)r   fstringAndFretInfos      r   testFretNoteStringTest.testFretNoteStringf  s8    Q1XXqvv.*QF3r   c                L    U R                  [        5       R                  S 5        g r!   )r   r   r   r>   s    r   testStupidFretNoteTest.testStupidFretNotem  s    **D1r   c                n    SSK Jn  UR                  SS5      nSnU R                  [	        U5      U5        g )Nr   )	tablaturerX      z3<music21.tablature.FretNote 6th string, 133rd fret>)music21r   r   r   repr)r   r   weirdFretNoteexpectedReprs       r   testFretNoteWeirdReprTest.testFretNoteWeirdReprp  s1    %!**1c2Lm,l;r   c                    [        SSS5      n[        SSS5      n[        SX/S9n/ nUR                  5        H  nUR                  UR                  5        M      U R                  USS/5        g )Nr   r   rX   )r8   )r   r4   rG   r'   r   r   )r   	fretNote1	fretNote2myFretBoard
stringListthisNotes         r   testFretBoardLowestFirstTest.testFretBoardLowestFirstx  sm    Q1%	Q1%	i-CD
#88:Hhoo. ; 	aV,r   r   N)	r   r   r   r   r   r   r   r   r   r   r   r   r   r   d  s    42<-r   r   __main__)r2   
__future__r   unittestr   r   r   r   r   r   Music21Exceptionr
   ProtoM21Objectr   r4   r]   ri   rf   rp   r   r   r   TestCaser   r   mainTestr   r   r   <module>r      s    #       	66 	Lw%% L^K&& K\! !,,i N
Pi 
P	cy 	c	c) 	c	c	 	c-8 -D zT r   