
    3jQ'                       d dl m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 d d	lmZ  ej                  d
      Z G d d      ZddZ G d dej$                        Zedk(  rd dlZ ej*                  e       yy)    )annotations)OrderedDictN)clef)dynamics)environment)expressions)basic)symbolszbraille/noteGrouping.pyc            
          e Zd ZdZddZd Zed        Zej                  d        Zed        Z	e	j                  d        Z	dd	Z
d
 Zd Zd Zd Zd Zd Zd Z edefdefdefdefdefdefdefg      Zd ZddZy)NoteGroupingTranscriberz4
    Object that can transcribe note groupings.
    Nc                t    d| _         || _        d | _        d | _        d | _        d | _        g | _        d | _        y NT)showLeadingOctavebrailleElementGrouping_upperFirstInFingering_showClefSignspreviousNotepreviousElementtrans	transText)selfr   s     I/DATA/.local/lib/python3.12/site-packages/music21/braille/noteGrouping.py__init__z NoteGroupingTranscriber.__init__   sB    !%&<#&*#" !#
    c                <    d | _         d | _        g | _        d | _        y N)r   r   r   r   r   s    r   resetzNoteGroupingTranscriber.reset)   s      #
r   c                x    | j                   | j                   S | j                  | j                  j                  S y)a  
        Generally, in Braille, clef signs are not used.  However, they
        can be shown for pedagogical purposes or to make a facsimile
        transcription of the sighted text.

        If not set but self.brailleElementGrouping.showClefSigns
        is set, uses that instead.

        >>> ngt = braille.noteGrouping.NoteGroupingTranscriber()
        >>> ngt.showClefSigns
        False
        >>> beg = braille.segment.BrailleElementGrouping()
        >>> ngt.brailleElementGrouping = beg
        >>> ngt.showClefSigns
        False
        >>> beg.showClefSigns = True
        >>> ngt.showClefSigns
        True
        >>> ngt.showClefSigns = False
        >>> ngt.showClefSigns
        False
        F)r   r   showClefSignsr   s    r   r    z%NoteGroupingTranscriber.showClefSigns/   s=    0 *&&&((4..<<<r   c                    || _         y r   )r   r   news     r   r    z%NoteGroupingTranscriber.showClefSignsN   s
    !r   c                x    | j                   | j                   S | j                  | j                  j                  S y)a  
        When there are multiple fingering patterns listed at the same time,
        should the highest be listed first (default True) or last?

        If not set but self.brailleElementGrouping.upperFirstInNoteFingering
        is set, uses that instead. (note the slight difference in names: NoteFingering)

        >>> ngt = braille.noteGrouping.NoteGroupingTranscriber()
        >>> ngt.upperFirstInFingering
        True
        >>> beg = braille.segment.BrailleElementGrouping()
        >>> ngt.brailleElementGrouping = beg
        >>> ngt.upperFirstInFingering
        True
        >>> beg.upperFirstInNoteFingering = False
        >>> ngt.upperFirstInFingering
        False
        >>> ngt.upperFirstInFingering = True
        >>> ngt.upperFirstInFingering
        True
        T)r   r   upperFirstInNoteFingeringr   s    r   upperFirstInFingeringz-NoteGroupingTranscriber.upperFirstInFingeringR   s=    . &&2...((4..HHHr   c                    || _         y r   )r   r"   s     r   r&   z-NoteGroupingTranscriber.upperFirstInFingeringp   s
    &)#r   c                
   | j                          ||| _        | j                  D ]  }| j                  |        |j                  r"| j                  j                  t        d          dj                  | j                        S )z
        transcribe a group of notes, possibly excluding certain attributes.

        Returns a (unicode) string of brailleElementGrouping transcribed.

        music_hyphen )r   r   transcribeOneElement
withHyphenr   appendr
   join)r   r   brailleElements      r   transcribeGroupz'NoteGroupingTranscriber.transcribeGroupt   sn     	

!-*@D'"99N%%n5 : ",,JJgn56wwtzz""r   c                    | j                   | j                  }n t        j                  | j                   |      }t        j                  ||| j
                        }|| _         |S )N)
showOctaver&   )r   r   r	   showOctaveWithNotenoteToBrailler&   )r   currentNotedoShowOctavebrailleNotes       r   translateNotez%NoteGroupingTranscriber.translateNote   s`    $11L 33D4E4E{SL))+5A@D@Z@Z\ (r   c                ,    t        j                  |      S r   )r	   restToBraille)r   currentRests     r   translateRestz%NoteGroupingTranscriber.translateRest   s    "";//r   c                T   t        |j                  d       }| j                  j                  r|d   }n|d   }| j                  | j
                  }n t        j                  | j                  |      }| j                  j                  }t        j                  |||      }|| _        |S )Nc                    | j                   S r   )pitch)ns    r   <lambda>z8NoteGroupingTranscriber.translateChord.<locals>.<lambda>   s    AGGr   )keyr   )
descendingr2   )	sortednotesr   descendingChordsr   r   r	   r3   chordToBraille)r   currentChordallNotesr5   r6   rG   brailleChords          r   translateChordz&NoteGroupingTranscriber.translateChord   s    ,,,2CD&&77"2,K"1+K$11L 33D4E4E{SL66GG++L7G7CE (r   c                L    t        j                  |      }d | _        d| _        |S r   )r	   dynamicToBrailler   r   )r   currentDynamicbrailleDynamics      r   translateDynamicz(NoteGroupingTranscriber.translateDynamic   s(    //? !%r   c                L    t        j                  |      }d | _        d| _        |S r   )r	   textExpressionToBrailler   r   )r   currentExpressionbrailleExpressions      r   translateTextExpressionz/NoteGroupingTranscriber.translateTextExpression   s*    !99:KL !%  r   c                ,    t        j                  |      S r   )r	   barlineToBraille)r   currentBarlines     r   translateBarlinez(NoteGroupingTranscriber.translateBarline   s    %%n55r   c                f    | j                   r%t        j                  |      }d| _        d| _        |S y)zJ
        translate Clefs to braille IF self.showClefSigns is True
        NT)r    r	   clefToBrailler   r   )r   currentClefbrailleClefs      r   translateClefz%NoteGroupingTranscriber.translateClef   s8     --k:K $D%)D"	 r   NoteRestChordDynamicTextExpressionBarlineClefc                   |j                   }| j                  j                         D ]1  \  }}||v s || |      }|| j                  j	                  |        n t
        j                  | d       | j                  |       || _        y)us  
        Transcribe a single element and add it to self.trans, setting self.previousElement
        along the way.

        >>> ngt = braille.noteGrouping.NoteGroupingTranscriber()
        >>> n = note.Note('C4')
        >>> ngt.transcribeOneElement(n)
        >>> ''.join(ngt.trans)
        '⠐⠹'
        >>> ngt.previousElement
        <music21.note.Note C>
        Nz not transcribed to braille.)	classestranslateDictitemsr   r-   environRuleswarnoptionallyAddDotToPreviousr   )r   el	elClasses	classNameclassMethod
addBrailles         r   r+   z,NoteGroupingTranscriber.transcribeOneElement   s     JJ	&*&8&8&>&>&@"I{I%(r2
)JJ%%j1 'A $@AB''+!r   c                f   | j                   }|y| j                  sy|t        |t        j                        ry|t        |t
        j                        ryt        |t        j                        sRt        |t        j                        r| j                  s,t        |t
        j                        r|j                  d   dk7  rot        j                  | j                  d   d         D ]G  }| j                  j                  d|       |j                  j                  j!                  d|         y y)a=  
        if el is None or not a Dynamic or TextExpression, add a dot-3 Dot
        before the current transcription
        under certain circumstances:

        1. self.previousElement exists
        2. the last character in the current transcription (self.trans) fits the criteria for
           basic.yieldDots()
        3. one of these three.  PreviousElement was:
            a. a Dynamic.
            b. a Clef and clef signs are being transcribed
            c. a TextExpression not ending in "."

        Returns True if a dot as added, or False otherwise.
        FrC   .r   zDot 3 T)r   r   
isinstancer   rc   r   rd   r   rf   r    contentr	   	yieldDotsinsert	editorialbrailleEnglishr-   )r   rn   prevdots       r   rm   z2NoteGroupingTranscriber.optionallyAddDotToPrevious   s      ##<zz>jX-=-=>>j[-G-GHtX--.4+&&4!;!;<LL$+tzz"~a'89

!!"c*--44vcU^D :
 r   r   )__name__
__module____qualname____doc__r   r   propertyr    setterr&   r0   r8   r<   rL   rQ   rV   rZ   r_   r   ri   r+   rm    r   r   r   r      s    
  < " "  : !!* "*#&	0&!6  			.!	$%	23	$%	! M"4&r   r   c                F    t               }||_        |j                  |       S )z
    transcribe a group of notes, possibly excluding certain attributes.

    To be DEPRECATED -- called only by BrailleGrandSegment now.
    )r   r   r0   )r   r   ngts      r   transcribeNoteGroupingr     s&     "
#C-C566r   c                      e Zd Zy)TestN)r}   r~   r   r   r   r   r   r     s    r   r   __main__)T)
__future__r   collectionsr   unittestmusic21r   r   r   r   music21.brailler	   music21.braille.lookupr
   Environmentrk   r   r   TestCaser   r}   mainTestr   r   r   <module>r      s{    # #      ! *&{&&'@Ar rj7	8 	 zGT r   