
    3j|1                       d Z ddlmZ ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	  G d	 d
ej                        Z G d de	j                        Z G d de	j                        Z G d d      Z G d dej                   e      Z G d de      Z G d de      Z G d de      Z G d de      Z G d dej,                        Zedk(  rddlZ ej2                  e       yy)z}
Music21 representation of FretNote and FretBoard objects.

TODO:
Chord from Figure
Chord from FretBoard Object with tuning.
    )annotationsN)common)exceptions21)harmony)pitch)prebasec                      e Zd Zy)TablatureExceptionN)__name__
__module____qualname__     >/DATA/.local/lib/python3.12/site-packages/music21/tablature.pyr
   r
      s    r   r
   c                  0    e Zd ZdZ	 	 	 d	 	 	 	 	 ddZd Zy)FretNotea  
    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                <    || _         || _        || _        d| _        y )NT)stringfret	fingeringdisplayFingerNumber)selfr   r   r   s       r   __init__zFretNote.__init__6   s!    
 !'"	#,)- r   c                L   d }| j                    || j                          d}nd}| j                   || j                         d}nd}| j                   || j                         d}nd}g }|||fD ]  }|dk7  s	|j                  |        dj	                  |      }|S )aA  
        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                4    |  t        j                  |        S N)r   ordinalAbbreviation)xs    r   abbrz$FretNote._reprInternal.<locals>.abbrT   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   _reprInternalzFretNote._reprInternal@   s    (	9 ;;" -.g6JJ99 tyy/*%0HH>>%#DNN34G<MM"Hm;H2~##H- < 99\*r   )NNN)r   
int | Noner   r*   r   r*   )r   r   r   __doc__r   r)   r   r   r   r   r       s6    , "&"... .,r   r   c                  D    e Zd ZdZ	 	 	 d	 	 	 	 	 d	dZd Zd Zd Zd
dZy)	FretBoarda  
    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                D    || _         |xs g | _        || _        g | _        y r   )
numStrings	fretNotesdisplayFretstuning)r   r/   r0   r1   s       r   r   zFretBoard.__init__   s%    
  *)2b()+r   c                f    | j                    dt        | j                         d| j                   dS )ay  
        >>> 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)r/   lenr0   r1   r   s    r   r)   zFretBoard._reprInternal   s4     //"*S-@,A$J[J[I\\bccr   c                    g }t        | j                  dd      D ]'  }| j                  |      }||j                  |       ) |S )a  
        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   )ranger/   getFretNoteByStringr!   )r   allFretNotesstringNumberthisFretNotes       r   fretNotesLowestFirstzFretBoard.fretNotesLowestFirst   sO     !$//1b9L33LAL#- : r   c                L    | j                   D ]  }||j                  k(  s|c S  y)ap  
        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)r0   r   )r   requestedStringr<   s      r   r9   zFretBoard.getFretNoteByString   s+      !NNL,"5"55## + r   c                   t        | j                        | j                  k7  r/t        dt        | j                         d| j                   d      dg| j                  z  }| j                  s|S | j                  D ]]  }|j
                  xs ddz  }| j                  |   }|j                  }||j                  xs dz   }t        j                  |      }|||<   _ |S )a  
        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]
        z$Tuning must be set first, tuned for z notes, on a z string instrumentNr   r7   )
r4   r2   r/   r
   r0   r   psr   r   Pitch)r   	pitchListr<   pitchListPositiontuningPitchtuningPitchAsPsactualPitchdisplayPitchs           r   
getPitcheszFretBoard.getPitches   s    0 t{{t.$6t{{#$M??##57  .2FT__,D	~~ NNL!-!4!4!9R ?++&78K%0^^O!0L4E4E4J!KK ;;{3L+7I'( + r   )   N   )r/   intr0   zlist[FretNote] | Noner1   rL   )returnzlist[None | pitch.Pitch])	r   r   r   r+   r   r)   r=   r9   rI   r   r   r   r-   r-   o   sF    . !")-	,	,&	, 	,	d4,.r   r-   c                      e Zd ZdZddZy)	FirstFretzp
    FirstFretInfo returns the information regarding the first fret utilized in a
    given chord position.
    c                     || _         || _        y r   )fretNumlocation)r   rQ   rR   s      r   r   zFirstFret.__init__  s     r   N)right)r   r   r   r+   r   r   r   r   rO   rO      s    
!r   rO   c                      e Zd ZdZddZd Zy)ChordWithFretBoarda  
    Music21Object subclass that combines a ChordSymbol with a FretBoard.
    Its 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                z    t        j                  j                  | fd|i| t        j                  | |||       y )Nfigure)r/   r0   r1   )r   ChordSymbolr   r-   )r   rW   r/   r0   r1   keywordss         r   r   zChordWithFretBoard.__init__  s@    $$TE&EHE
 	4&0%.(4 	 	6r   c                     y)z
        TODO:
        Given a chord with fret Figure, getFretNotesFromFigure returns each FretNote object
        within it.
        Nr   r5   s    r   getFretNotesFromFigurez)ChordWithFretBoard.getFretNotesFromFigure  s     r   )NrJ   NrK   )r   r   r   r+   r   r[   r   r   r   rU   rU     s    		6r   rU   c                  $     e Zd ZdZd fd	Z xZS )GuitarFretBoardz6
    A six-string fretboard tuned to E A D G B E.
    c                *   d}t         |   |||       t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      g| _        y )NrJ   E2A2D3G3B3E4superr   r   rB   r2   r   r0   r1   r/   	__class__s       r   r   zGuitarFretBoard.__init__4  sg    
Y={{4(%++d*;U[[=N{{4(%++d*;U[[=NPr   NrK   r   r   r   r+   r   __classcell__rh   s   @r   r]   r]   /  s    P Pr   r]   c                  $     e Zd ZdZd fd	Z xZS )UkeleleFretBoardz2
    A four-string fretboard tuned to G C E A
    c                    d}t         |   |||       t        j                  d      t        j                  d      t        j                  d      t        j                  d      g| _        y )NrK   G4C4rd   A4re   rg   s       r   r   zUkeleleFretBoard.__init__A  Q    
Y={{4(%++d*;U[[=NPUP[P[\`Pabr   ri   rj   rl   s   @r   rn   rn   <      c cr   rn   c                  $     e Zd ZdZd fd	Z xZS )BassGuitarFretBoardz2
    A four-string fretboard tuned to E A D G
    c                    d}t         |   |||       t        j                  d      t        j                  d      t        j                  d      t        j                  d      g| _        y )NrK   E1A1D2G2re   rg   s       r   r   zBassGuitarFretBoard.__init__M  rs   r   ri   rj   rl   s   @r   rv   rv   H  rt   r   rv   c                  $     e Zd ZdZd fd	Z xZS )MandolinFretBoardz2
    A four-string fretboard tuned to G D A E
    c                    d}t         |   |||       t        j                  d      t        j                  d      t        j                  d      t        j                  d      g| _        y )NrK   rb   D4rr   E5re   rg   s       r   r   zMandolinFretBoard.__init__Y  rs   r   ri   rj   rl   s   @r   r}   r}   T  rt   r   r}   c                  $    e Zd Zd Zd Zd Zd Zy)Testc                v    t        ddd      }|j                  |j                  g}| j                  |ddg       y )NrK         )r   r   r   assertEqual)r   fstringAndFretInfos      r   testFretNoteStringzTest.testFretNoteStringc  s8    Q1XXqvv.*QF3r   c                L    | j                  t               j                  d        y r   )r   r   r   r5   s    r   testStupidFretNotezTest.testStupidFretNotej  s    **D1r   c                n    ddl m} |j                  dd      }d}| j                  t	        |      |       y )Nr   )	tablaturerJ      z3<music21.tablature.FretNote 6th string, 133rd fret>)music21r   r   r   repr)r   r   weirdFretNoteexpectedReprs       r   testFretNoteWeirdReprzTest.testFretNoteWeirdReprm  s1    %!**1c2Lm,l;r   c                    t        ddd      }t        ddd      }t        d||g      }g }|j                         D ]  }|j                  |j                          | j                  |ddg       y )Nr   r   rJ   )r0   )r   r-   r=   r!   r   r   )r   	fretNote1	fretNote2myFretBoard
stringListthisNotes         r   testFretBoardLowestFirstzTest.testFretBoardLowestFirstu  so    Q1%	Q1%	i-CD
#88:Hhoo. ; 	aV,r   N)r   r   r   r   r   r   r   r   r   r   r   r   a  s    42<-r   r   __main__)r+   
__future__r   unittestr   r   r   r   r   r   Music21Exceptionr
   ProtoM21Objectr   r-   rO   rX   rU   r]   rn   rv   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GT r   