
    3j܏                       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	 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 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 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 G d de      Z  G d d ejB                        Z" G d! d"ejB                        Z#e$d#k(  rddlZ ejJ                  e"       yy)$zE
Module to translate Noteworthy Composer's NWCTXT format to music21.
    )annotationsN)bar)chord)clef)common)duration)dynamics)environment)expressions)Music21Exception)
instrument)intervalkey)metadata)meter)note)pitch)repeat)spanner)stream)tempo)tie)dictionariesznoteworthy.translatec                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z y) NoteworthyTranslatorze
    stores all the data about the current parse context (whether we're in a slur, tuplet, etc.)
    c                   d | _         d | _        d| _        d| _        g | _        t        j                         | _        d| _        t        j                  d      | _        d| _        d | _        d| _        d| _        g | _        i | _        y )Nr      TREBLEF)currentPartcurrentMeasuremeasureNumbercurrentEndingrepeatedMeasuresr   ScorescorecurrentClefr   KeySignature
currentKey
withinSlurbeginningSlurNote	withinTielyricPositionlyricsactiveAccidentalsselfs    I/DATA/.local/lib/python3.12/site-packages/music21/noteworthy/translate.py__init__zNoteworthyTranslator.__init__d   s~    " "\\^
#**1-!%!#    c                    	 t        j                  |      }|j                  d      }| j                  |      S # t        t
        f$ r t        d| d      w xY w)N
zcannot open z: )r   readFileEncodingSafesplit	parseListOSErrorFileNotFoundErrorNoteworthyTranslateException)r1   filePathdatadataLists       r2   	parseFilezNoteworthyTranslator.parseFilex   s`    	L..x8Dzz$'H>>(++*+ 	L.hZr/JKK	Ls	   69 Ac                D    |j                         }| j                  |      S N)
splitlinesr9   )r1   r>   r?   s      r2   parseStringz NoteworthyTranslator.parseString   s    ??$~~h''r4   c           	     8   |D ]V  }|j                         }|j                  d      du r(|j                  d      }|d   }i }|dd D ]S  }	 |j                  dd      \  }}|dk(  r1|dv r-|j                  |      |g||<   n||   j	                  |       n|||<   U 	 |dk(  r| j                  |       n|dk(  r| j                  |       n|dk(  r(| j                  |       | xj                  dz  c_        n^|dk(  r| j                  |       nF|dk(  r| j                  |       n.|dk(  r| j                  |       n|dk(  r| j                  |       n|dk(  r| j!                  |       n|dk(  r| j#                  |       n|dk(  r| j%                  |      | _        n|dk(  r'| j)                  |       | xj                  dz  c_        n|dk(  r| j+                  |       nr|dk(  r| j-                  |       n[|dk(  r| j/                  |       nD|dk(  r| j1                  |       n-|dk(  r| j3                  |       n|dk(  r| j5                  |       Y | j:                  r%| j<                  j	                  | j:                         | j>                  jA                  d| j<                         | j>                  S # t
        $ r) |j                         d	k(  rnt        d
| d|       Y w xY w# t6        $ r}	t9        d| d       t        |	d}	~	ww xY w)a  
        Parses a list where each element is a line from a nwctxt file.

        Returns a :class:`~music21.stream.Score` object

        >>> data = []
        >>> data.append('!NoteWorthyComposer(2.0)\n')
        >>> data.append('|AddStaff|\n')
        >>> data.append('|Clef|Type:Bass\n')
        >>> data.append('|TimeSig|Signature:4/4\n')
        >>> data.append('|Note|Dur:Whole|Pos:1\n')

        >>>
        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> s = nwt.parseList(data)
        >>> s.show('text')
        {0.0} <music21.stream.Part ...>
            {0.0} <music21.stream.Measure 0 offset=0.0>
                {0.0} <music21.clef.BassClef>
                {0.0} <music21.meter.TimeSignature 4/4>
                {0.0} <music21.note.Note E>

        |Fr      N:Chord)DurPos zCannot unpack value from z in AddStaffBarClefDynamicDynamicVarianceEndingFlowKeyLyric1NoteRestSongInfoStaffInstrumentTempoTextTimeSigzCannot create object from ""r   )!rstrip
startswithr8   getappend
ValueErrorstripr<   createStaffcreateBarlinestranslateChordr-   
createClefcreateDynamicscreateDynamicVariancecreateEndingcreateOtherRepetitions	createKeycreateLyricsr.   translateNotetranslateRestcreateSongInfocreateStaffInstrumentcreateTempo
createTextcreateTimeSignature	Exceptionprintr!   r    r&   insert)
r1   r?   pisectionscommand
attributes	attributenamevaluees
             r2   r9   zNoteworthyTranslator.parseList   s   2 BB}}S!U*xx}HqkGJ%ab\	M$-OOC$;MT5')t~/E%>>$/705wJt,&t,33E:+0
4( *"':j($$Z0%''
3'''
3&&!+&&OOJ/	)''
3 11..z:(%%j1&//
;%NN:.("&"3"3J"?DK&&&z2&&!+&&&&z2
*''
3 11..z:'$$Z0&OOJ/	),,Z8y D ##D$7$78

!T--.
 zzs " M (B.:7	{$rdKM M MX  :3J<qAB29:s,   AK F;K5 .K21K25	L>LLc                V   |j                  d      }|d   }d}t        j                  t        d   |         }|D ]  }|dk(  r|j	                         }|dk(  r| j
                  s|| _        d}4|dk(  rd	|_        A|d
k(  rd|_        N|dv sSt        j                  dd|j                        }|j                  |        ||_        | j
                  rE|sCt        j                  | j                  |      }	| j                  j                  |	       d| _        y|rd| _        yd| _        y)aO  
        generalNote could be a Note, Chord, or Rest

        DurationInfo is a string like:

            Whole,Dotted,Slur

        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> n = note.Note()
        >>> nwt.setDurationForObject(n, 'Half')
        >>> n.duration
        <music21.duration.Duration 2.0>

        ,r   FdictionaryNoteLengthGraceSlurTDottedr   	DblDottedrG   )TripletzTriplet=FirstzTriplet=End   N)r8   r   Durationr   getGraceDurationr*   r+   dotsTuplettypeappendTupletr   r   r!   ra   )
r1   generalNotedurationInfoparts
lengthNotethisNoteIsSlurreddurationObjectkktupmusic21SlurObjs
             r2   setDurationForObjectz)NoteworthyTranslator.setDurationForObject   s     ""3'1X
!!**<8N+OPZ+[\BW}!/!@!@!Bv-8D*$(!x&'#{"&'#BBooaN,?,?@++C0    . ??#4$\\$*@*@+NN&&~6#DO"DO#DOr4   c                   d}d}|d   dk(  r| j                   du rd}d}d| _         t        |t        j                        r|nd}|rS|7|j                  D ]'  }|j                  t        j                  d      |       ) nt        j                  d      |_        | j                   du r`|du r[|7|j                  D ]'  }|j                  t        j                  d      |       ) nt        j                  d      |_        d| _         yyy)zJ
        sets the tie status for a noteOrChord from the pitchInfo
        F^TNstartstop)r,   
isinstancer   rI   pitchessetTier   Tie)r1   noteOrChord	pitchInfothisNoteBeginsATiethisNoteIsTiedachordps          r2   setTieFromPitchInfoz(NoteworthyTranslator.setTieFromPitchInfo  s     #R=C~~&%)"!N!DN *; D$ !AMM#'''"2A6 ( #&'''"2>>T!n&=!AMM#''&/15 ( #&''&/"DN '>!r4   c                    |j                  d      }|j                  d      }|j                  d      }|j                  d      }| j                  |      }|S )ax  
        returns a pitch object given the Pos: info

        removes ties and alteration signs.  Otherwise
        is same as getOnePitchFromPosition()

        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> nwt.currentClef = 'BASS'
        >>> p = nwt.getPitchFromPositionInfo('b3^')  # removes ties
        >>> p
        <music21.pitch.Pitch G-3>
        r   xXz)r^   getOnePitchFromPosition)r1   posInfoposr   s       r2   getPitchFromPositionInfoz-NoteworthyTranslator.getPitchFromPositionInfo8  sN     nnS!jjojjojjo((-r4   c                z    g }|j                  d      D ]$  }| j                  |      }|j                  |       & |S )aq  
        returns a list of pitch objects given the Pos:... info
        for a chord.

        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> nwt.currentClef = 'BASS'
        >>> pList = nwt.getMultiplePitchesFromPositionInfo('1,b3,5^')
        >>> pList
        [<music21.pitch.Pitch E3>, <music21.pitch.Pitch G-3>, <music21.pitch.Pitch B3>]
        r   )r8   r   ra   )r1   r   	pitchListthisPosr   s        r2   "getMultiplePitchesFromPositionInfoz7NoteworthyTranslator.getMultiplePitchesFromPositionInfoN  sB     	}}S)G--g6AQ * r4   c                
   d}|d   dv r!|d   }|dd }|dk(  rd}n|dk(  rd	}n|d
k(  rd}t        |      }| j                  |      \  }}t        j                         }||_        ||_        |j                  }|dk7  r+t        j                  |      |_        || j                  |<   |S || j                  v r)t        j                  | j                  |         |_        |S | j                  j                  |      }|||_        |S )a  
        Get one pitch from a position:

        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> nwt.currentClef = 'BASS'
        >>> p = nwt.getOnePitchFromPosition('b3')
        >>> p
        <music21.pitch.Pitch G-3>
        >>> p.ps
        54.0
        rL   r   )nb#r   vr   Nr   -r   z##r   z--)intgetStepAndOctaveFromPositionr   PitchstepoctavenameWithOctave
Accidental
accidentalr/   r)   accidentalByStep)	r1   r   r   positionNotenoteStepr   r   pNamestepAccidentals	            r2   r   z,NoteworthyTranslator.getOnePitchFromPosition`  s     
q6..QJab'CS  
s"!
s"!
3x!>>|L6KKM   ++J7AL,6D""5)  d,,, ++D,B,B5,IJAL
  "__==hGN)-r4   c                   | j                   }|dk(  rd}d}t        d   }n~|dk(  rd}d}t        d   }nk|dv rd}d	}t        d
   }nY|dk(  rd}d	}t        d
   }nF|dk(  rd}d	}t        d
   }n3|dk(  rd}d}t        d   }n |dk(  rd}d}t        d   }nd}d}t        d   }||k  s||dz   kD  r0||k  r
|dz   }|dz
  }||dz   kD  r
|dz
  }|dz   }||k  r'||dz   kD  r0||   }||fS )at  
        Given an int representing the position on the staff for the
        current clef,
        returns a string for the step and an int for the octave

        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> nwt.currentClef = 'BASS'
        >>> (step, octave) = nwt.getStepAndOctaveFromPosition(3)
        >>> (step, octave)
        ('G', 3)
        	TREBLE8dw   r   dictionaryTreble	TREBLE8up   )BASS
PERCUSSIONr   r   dictionaryBassBASS8dwrG   BASS8upALTOr   dictionaryAltoTENORdictionaryTenor      )r'   r   )r1   r   r'   r   minPosition
dictionarynoteNames          r2   r   z1NoteworthyTranslator.getStepAndOctaveFromPosition  si    &&+%FK%&89JK'FK%&89J22FK%&67JI%FK%&67JI%FK%&67JF"FK%&67JG#FK%&78JFK%&89J[(LK!O,Lk)+a/!{Q/+a/! [(LK!O,L l+&!!r4   c                "   |d   }|d   }| j                  |      }| j                  dk(  r7t        j                         }|j                  |_        |j                  |_        nt        j                  |      }| j                  ||       | j                  ||       | j                  rJ| j                  t        | j                        k  r(|j                  | j                  | j                            | j                         j!                  |       y)a4  
        Translation of a music21 note from a NWC note.

        >>> measure = stream.Measure()
        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> nwt.currentMeasure = measure
        >>> nwt.translateNote({'Dur': 'Half', 'Pos': '#-3'})
        >>> measure[0]
        <music21.note.Note F#>

        Note that the next note in the measure with the same position should
        inherit the last position's accidental:

        >>> nwt.translateNote({'Dur': 'Half', 'Pos': '-3'})
        >>> measure[1]
        <music21.note.Note F#>

        rJ   rK   r   N)r   r'   r   	Unpitchedr   displayStepr   displayOctaverV   r   r   r.   r-   lenaddLyricgetShortestStreamra   )r1   r{   r   r   r   r   s         r2   rn   z"NoteworthyTranslator.translateNote  s    & "%(u%	)))4|+ AFFAMhhAO		!A 	!!!\2 	  I. ;;4--DKK0@@JJt{{4#5#567 ''*r4   c                    | j                   j                  r| j                   S t        | j                   j                  t        j
                        d       S )Nc                    | j                   S rB   )quarterLength)r   s    r2   <lambda>z8NoteworthyTranslator.getShortestStream.<locals>.<lambda>  s    !//r4   r   )r!   isFlatmingetElementsByClassr   Voicer0   s    r2   r   z&NoteworthyTranslator.getShortestStream  sG    %%&&& 226<<@)
 	
r4   c                    |d   }|d   }| j                         j                  }d|v }d}d }|D ]  }t        j                         }	| j	                  |	|       ||j                  |         }
| j                  |
      |	_        | j                  |	|
       | j                  rJ| j                  t        | j                        k  r(|	j                  | j                  | j                            t        |      dk(  r"| | j                         j                  |	       n || ||      }|j                  |	       |dz  } |rN|d   }t        j                         }d|_        | j	                  ||        || ||      }|j                  |       yy)	a  
        Translation of a music21 chord from a NWC one.

        >>> measure = stream.Measure()

        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> nwt.currentMeasure = measure
        >>> nwt.translateChord({'Dur': ['Half'], 'Pos': ['1,3,#5']})
        >>> measure[0]
        <music21.chord.Chord C5 E5 G#5>

        Chords also inherit accidentals:
        >>> nwt.translateChord({'Dur': ['Half'], 'Pos': ['1,3,5']})
        >>> measure[1]
        <music21.chord.Chord C5 E5 G#5>

        rJ   rK   Dur2r   c                   d }| j                   j                  t        j                        }|j	                  |      }|t        j                         }||_        t        |      dk(  rmg }| j                   D ].  }t        |t        j                        s|j                  |       0 |r,|j                  |       | j                   j                  |       | j                   j                  |       |j                  }|j                  }||z
  dkD  r6t        j                         }	||z
  |	_        d|	_        |j                  |	       |S )Nr   r   )r!   r   r   r   getElementByIdidr   r   r   GeneralNotera   remover   rW   	stepShift)

inner_selfvoiceIddurvoicevoicesnotesitemcdvdrests
             r2   getVoiceAtDurationz?NoteworthyTranslator.translateChord.<locals>.getVoiceAtDuration  s   E..AA&,,OF))'2E }"v;!#E * 9 9%dD,<,<=!LL. !: U+"1188?))007 ""B$$BBw{yy{%'"W"!"T"Lr4   r   Nr   )r   r   r   rI   r   indexr   r   r   r.   r-   r   r   ra   r   rW   r   )r1   r{   durationInfos
pitchInfoscurrentDurationisRestChordir   dcr   r   restDurInfors                 r2   rf   z#NoteworthyTranslator.translateChord  su   $ #5)&
002;;
* 	F AA%%a+ =..q12A??BAI$$Q* {{t11C4DD

4;;t'9'9:;=!Q&;+B&&(//2&tQ@FA) , $V,K		AAK%%a5"4O<AHHQK r4   c                    |d   }t        j                         }| j                  ||       | j                         j	                  |       y)a,  
        Translation of a music21 rest.  Adds the rest to the given measure.

        >>> measureIn = stream.Measure()
        >>> measureIn.append(note.Note('C#4', type='half'))

        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> nwt.currentMeasure = measureIn
        >>> nwt.translateRest({'Dur': '8th,Dotted'})
        >>> nwt.translateRest({'Dur': '4th'})
        >>> measureIn.show('text')
        {0.0} <music21.note.Note C#>
        {2.0} <music21.note.Rest dotted-eighth>
        {2.75} <music21.note.Rest quarter>

        rJ   N)r   rW   r   r   ra   )r1   r{   r   r  s       r2   ro   z"NoteworthyTranslator.translateRestV  s@    " "%(IIK!!!\2 ''*r4   c                   d}d|v r'|d   dk(  rd}n|d   dk(  rd}nt        d|d          d	}|d
   }|dk(  r|d	k(  r1| j                  j                  t        j                                d}n|dk(  r1| j                  j                  t        j
                                d}n|dk(  r| j                  j                  t        j                                d}nl|dk(  r|d	k(  r1| j                  j                  t        j                                d}n1|dk(  r0| j                  j                  t        j                                d}n|dk(  r| j                  j                  t        j                                d}n|dk(  r@|d	k7  rt        d      | j                  j                  t        j                                d}n|dk(  r@|d	k7  rt        d      | j                  j                  t        j                                d}n=|dk(  r8t        j                         }d|_        | j                  j                  |       d}|t        d|       || _        y)a  
        Add a new clef to the current measure and return the currentClef.

        Clef lines should look like: \|Clef\|Type:ClefType  or
        \|Clef\|Type:ClefType\|OctaveShift:Octave Down (or Up)

        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> nwt.currentMeasure = stream.Measure()
        >>> nwt.createClef({'Type': 'Treble'})
        >>> nwt.currentMeasure.show('text')
        {0.0} <music21.clef.TrebleClef>
        >>> nwt.currentClef
        'TREBLE'
        >>> nwt.createClef({'Type' : 'Bass', 'OctaveShift' : 'Octave Down'})
        >>> nwt.currentMeasure.show('text')
        {0.0} <music21.clef.TrebleClef>
        {0.0} <music21.clef.Bass8vbClef>
        >>> nwt.createClef({'Type' : 'Percussion'})
        >>> nwt.currentMeasure.show('text')
        {0.0} <music21.clef.TrebleClef>
        {0.0} <music21.clef.Bass8vbClef>
        {0.0} <music21.clef.PercussionClef>

        If no clef can be found then it raises a NoteworthyTranslate exception

        >>> nwt.createClef({'Type' : 'OrangeClef'})
        Traceback (most recent call last):
        music21.noteworthy.translate.NoteworthyTranslateException: Did
            not find a proper clef in type, OrangeClef

        NOctaveShiftzOctave Downr   z	Octave Upr   z'Did not get a proper octave shift from r   r   TypeTrebler   r   r   Bassr   r   r   Altoz$cannot shift octaves on an alto clefr   Tenorz$cannot shift octaves on a tenor clefr   
PercussionrG   r   z$Did not find a proper clef in type, )r<   r!   ra   r   
TrebleClefTreble8vbClefTreble8vaClefBassClefBass8vbClefBass8vaClefAltoClef	TenorClefPercussionClefliner'   )r1   r{   r'   octaveShiftclr  s         r2   rg   zNoteworthyTranslator.createClefn  s7   @ J&-(M9 M*k92=jm_MO O K>a##**4??+<=&"##**4+=+=+?@)!##**4+=+=+?@)6\a##**4==?;$"##**4+;+;+=>'!##**4+;+;+=>'6\a23YZZ&&t}}7 K7]a23YZZ&&t~~'78!K<##%AAF&&q)&K.1UVXUY/Z[[&r4   c                    d}|d   D ]  }|dk(  r|dz  }|dk(  s|dz  } t        j                  |      }| j                  j                  |       || _        y)a2  
        Adds a new key signature to the given measure.
        Returns the number of sharps (negative for flats)

        >>> measureIn = stream.Measure()
        >>> measureIn.append(note.Rest(quarterLength=3.0))

        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> nwt.currentMeasure = measureIn
        >>> nwt.createKey({'Signature':'F#,C#,G#,D#'})
        >>> nwt.currentKey.sharps
        4
        >>> measureIn.show('text')
        {0.0} <music21.note.Rest dotted-half>
        {3.0} <music21.key.KeySignature of 4 sharps>
        r   	Signaturer   r   r   N)r   r(   r!   ra   r)   )r1   r{   currentSharpsr|   r)   s        r2   rl   zNoteworthyTranslator.createKey  si    $ #K0IC"c!"	 1
 %%m4
"":.$r4   c                    |d   }|dk(  rd}n|dk(  rd}t        j                  |      }| j                  j                  |       y)a@  
        Adding a time signature in the score.

        >>> measure = stream.Measure()
        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> nwt.currentMeasure = measure
        >>> nwt.createTimeSignature({'Signature':'4/4'})
        >>> measure[0]
        <music21.meter.TimeSignature 4/4>
        r  	AllaBrevez2/2Commonz4/4N)r   TimeSignaturer!   ra   )r1   r{   timesms       r2   rt   z(NoteworthyTranslator.createTimeSignature  sL     ;'KEhE&""1%r4   c                $   | j                   K| j                   j                  | j                         | j                  j	                  d| j                          t        j                         | _         t        j                         | _        d| _        y)z.
        Add a new part to the score.
        Nr   )	r    ra   r!   r&   rw   r   PartMeasurer"   r0   s    r2   
createPartzNoteworthyTranslator.createPart  si     '##D$7$78JJa!1!12!;;=$nn.r4   c                f   i | _         d|vr| j                  j                  | j                         t	        j
                  | j                        | _        t        | j                        dkD  r%| j                  j                  | j                         | xj                  dz  c_        yt        | j                        dkD  rMt        j                  | j                  | j                        }| j                  j                  |       g | _        |d   }|dk(  re| j                  j                  | j                         t	        j
                         | _        t        j                  d      | j                  _        n|d	k(  ret        j                  d
      | j                  _        | j                  j                  | j                         t	        j
                         | _        n|dk(  re| j                  j                  | j                         t	        j
                         | _        t        j                  d      | j                  _        n|dk(  ret        j                  d
      | j                  _        | j                  j                  | j                         t	        j
                         | _        nG|dk(  rct        j                   d      | j                  _        | j                  j                  | j                         t	        j
                         | _        n|dk(  rct        j                   d      | j                  _        | j                  j                  | j                         t	        j
                         | _        nw|dk(  rct        j                   d      | j                  _        | j                  j                  | j                         t	        j
                         | _        nt#        d| d      | j                  | j                  _        | xj                  dz  c_        y)a  
        Translates bar lines into music21.

        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> nwt.currentPart = stream.Part()
        >>> nwt.currentMeasure = stream.Measure()
        >>> nwt.createBarlines({'Style':'MasterRepeatOpen'})
        >>> nwt.currentMeasure
        <music21.stream.Measure 0 offset=0.0>
        >>> nwt.currentMeasure.leftBarline
        <music21.bar.Repeat direction=start>

        Stylenumberr   r   NMasterRepeatOpenr   )	directionMasterRepeatCloseendLocalRepeatOpenLocalRepeatCloseDoubledoubleSectionOpenzheavy-lightSectionClosefinalzcannot find a style z in our list)r/   r    ra   r!   r   r)  r"   r   r$   r   RepeatBracketr#   r   RepeatleftBarlinerightBarlineBarliner<   r.  )r1   r{   	rbSpannerstyles       r2   re   z#NoteworthyTranslator.createBarlines  s    "$*$##D$7$78"(..8J8J"KD4(()A-%%,,T-@-@A!#t$$%)--d.C.CDL^L^_I##I.$&D!7#&&##D$7$78"(.."2D.1jj7.KD+))/2zzE/JD,##D$7$78"(.."2D''##D$7$78"(.."2D.1jj7.KD+((/2zzE/JD,##D$7$78"(.."2Dh/2{{8/DD,##D$7$78"(.."2Dm#/2{{=/ID,##D$7$78"(.."2Dn$/2{{7/CD,##D$7$78"(.."2D.1EeWL/YZZ%)%7%7"ar4   c                   |d   }|dk(  rt        j                         }n|dk(  rt        j                         }n|dk(  rt        j                         }ne|dk(  rt        j                         }nK|dk(  rt        j                         }n1|dk(  rt        j
                         }nt        dt        |             | j                  j                  |       y	)
a  
        Repetitions like 'Coda', 'Segno' and some others.

        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> nwt.currentMeasure = stream.Measure()
        >>> nwt.createOtherRepetitions({'Style' : 'ToCoda', 'Pos': '8',
        ...                             'Wide':'Y', 'Placement': 'BestFitForward'})
        >>> isinstance(nwt.currentMeasure[0], repeat.Coda)
        True
        r,  DCalFineCodaToCodaSegnoDSalCodaFinezCannot get style from N)
r   DaCapoAlFinerC  rE  DalSegnoAlCodarG  r<   strr!   ra   r1   r{   r@  gs       r2   rk   z+NoteworthyTranslator.createOtherRepetitionsI  s     7#J##%Af_AhAgAj %%'Af_A.1GJGX/YZZ""1%r4   c                    |d   }d}|dk(  rt        j                         }n|dk(  rt        j                         }n	 || j                  j	                  |       yy)aV  
        Adding dynamics like "crescendo" to the measure.

        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> nwt.currentMeasure = stream.Measure()
        >>> nwt.createDynamicVariance({'Style' : 'Crescendo', 'Pos': '-6'})
        >>> nwt.currentMeasure.show('text')
        {0.0} <music21.dynamics.Crescendo>
        r,  N	CrescendoDecrescendo)r	   rN  
Diminuendor!   ra   rK  s       r2   ri   z*NoteworthyTranslator.createDynamicVariancef  s`     7#K""$Am###%A=&&q) r4   c                t    d|v r4t        j                  |d         }| j                  j                  |       yy)a?  
        Adding dynamics like "fff", "pp", ... to the measure.

        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> nwt.currentMeasure = stream.Measure()
        >>> nwt.createDynamics({'Style': 'fff', 'Pos': '-8'})
        >>> nwt.currentMeasure[0]
        <music21.dynamics.Dynamic fff>
        r,  N)r	   rP   r!   ra   )r1   r{   rL  s      r2   rh   z#NoteworthyTranslator.createDynamics|  s:     j   G!45A&&q) !r4   c                   g }d}|d   }|j                  d      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  d      D ]b  }d}|j                  d	      D ]J  }|dk(  rd}d}|j                  d      D ]+  }|dk7  rd
| }	n|}	d}|dk(  rd}d}	|j                  |	       - L d |S )z
        Get a list of lyrics from a Lyric line

        >>> nwt = noteworthy.translate.NoteworthyTranslator()
        >>> lyricsList = nwt.createLyrics({'Text': '"Hello world"'})
        >>> lyricsList[0]
        'Hello'
        r   r[   r]   z
 r6   r   r   z -rL   z - )rc   replacer8   ra   )
r1   r{   r.   spaceallTextwordnouwordPartwlls
             r2   rm   z!NoteworthyTranslator.createLyrics  s     V$--$//&#.//$,//$,MM#&DC JJsOA:CE!-Aax!!XBw !"MM"% .	 , '  r4   c                   | j                          t        j                  d      | _        i | _        g | _        d| _        |j                  d      | j                  _	        |j                  d      | j                  _
        y )Nr   Name)r*  r   r(   r)   r/   r.   r-   r`   r    partNamepartAbbreviation)r1   r{   s     r2   rd   z NoteworthyTranslator.createStaff  sc    **1-!#$.NN6$:!,6NN6,B)r4   c                   t        |j                  dd            }t        j                  |      }t        |j                  dd            }t	        j
                  |      |_        | j                  j                  |       y )NPatchr   Trans)	r   r`   r   instrumentFromMidiProgramr   Intervaltranspositionr    ra   )r1   r{   patchstaffInstrureadTranspos        r2   rq   z*NoteworthyTranslator.createStaffInstrument  sc    JNN7A./ ::5A*..!45$,$5$5k$B!,r4   c                    |d   }t        j                  |      }t        |j                  d            dk  rdnd|_        |j                  d      |j
                  _        | j                  j                  |       y )Nr[   rK   r   abovebelow)	r   TextExpressionr   r`   	placementr@  	relativeYr!   ra   )r1   r{   textexprs       r2   rs   zNoteworthyTranslator.createText  sc    &!))$/$'
u(=$>$B)~~e4

""4(r4   c                    |j                  d      }|j                  d      }t        j                         }||_        ||_        | j
                  j                  |       y )NTitleAuthor)r`   r   Metadatatitleauthorr&   ra   )r1   r{   rv  rw  mds        r2   rp   z#NoteworthyTranslator.createSongInfo  sL    w') 	

"r4   c                    |d   }| j                   j                  #t        j                         | j                   _        | j                   g| _        |j                  d      d   }t        |      | _        y )NEndingsr   r   )r!   r<  r   r>  r$   r8   r   r#   )r1   r{   r2  
endingTypes       r2   rj   z!NoteworthyTranslator.createEnding  sa    #**2.1kkmD+!%!4!4 5YYs^A&
 _r4   c                    |d   }t        j                  t        |            }| j                  j	                  d|       y )NrZ   r-  r   )r   MetronomeMarkr   r!   rw   )r1   r{   tempo_valuemms       r2   rr   z NoteworthyTranslator.createTempo  s7     )  K(89""1b)r4   N)!__name__
__module____qualname____doc__r3   r@   rD   r9   r   r   r   r   r   r   rn   r   rf   ro   rg   rl   rt   r*  re   rk   ri   rh   rm   rd   rq   rs   rp   rj   rr    r4   r2   r   r   _   s    $(L(cJ.$`#>,$)V8"t)+Z	
Wr+0U'n%8&(
F P&:*,* DC-)-*r4   r   c                      e Zd Zy)r<   N)r  r  r  r  r4   r2   r<   r<     s    r4   r<   c                      e Zd Zd Zd Zy)Testc                   t        j                         dz  }|dz  }t               j                  |      }| j	                  t        |t        j                           d       | j	                  t        |t        j                     j                         j                        d       | j	                  t        |t        j                     j                               d       y )N
noteworthyzverySimple.nwctxtr   Ez<music21.clef.BassClef>)r   getSourceFilePathr   r@   assertEqualr   r   rV   rJ  firstr}   r   rO   )r1   nwcTranslatePath
simplePathmyScores       r2   	testBasiczTest.testBasic  s    !335D%(;;
&(22:>WTYY/0!4WTYY/557<<=sCWTYY/55782	4r4   c                B   d}t               }|j                  |      }|j                  d   j                  t        j
                        j                         j                  j                         }| j                  |j                  j                  j                  d       y)aJ  
        test a problem with accidentals at the end of one staff not
        being cleared at the beginning of the next

        showed up in Morley, "Since my tears and lamenting" where
        Staff 1 ended with a B-natural Picardy, and Staff
        2 began with a B in a flat key, but was showing up as B-natural also
        a  !NoteWorthyComposer(2.0)
|AddStaff|
|Clef|Type:Treble
|Key|Signature:Bb
|TimeSig|Signature:Common
|Tempo|Base:Half|Tempo:60|Pos:7|Visibility:Never
|Note|Dur:Half|Pos:2^|Opts:Stem=Down
|Bar
|Note|Dur:Half|Pos:2|Opts:Stem=Down
|Note|Dur:Half|Pos:n0|Opts:Stem=Down
|Bar
|AddStaff|
|Clef|Type:Treble
|Key|Signature:Bb
|TimeSig|Signature:Common
|Note|Dur:Half|Pos:0^|Opts:Stem=Down
|Bar
|Note|Dur:Half|Pos:0|Opts:Stem=Down
|Note|Dur:Half|Pos:0|Opts:Stem=Down
|Bar
!NoteWorthyComposer-Endr   g      N)r   rD   r   r   r   r)  r  r   r  r   r   alter)r1   infonwtsn1s        r2   testKeySignatureAtBeginningz Test.testKeySignatureAtBeginning  su    * #$OOD!WWQZ**6>>:@@BHHNNP,,22D9r4   N)r  r  r  r  r  r  r4   r2   r  r    s    4#:r4   r  c                      e Zd ZdZd Zy)TestExternalTc                    t        j                         dz  }|dz  }t               j                  |      }| j                  r|j	                          y y )Nr  z+NWCTEXT_Really_complete_example_file.nwctxt)r   r  r   r@   show)r1   r  completer  s       r2   testCompletezTestExternal.testComplete  sK    !335D#&SS '(228<99LLN r4   N)r  r  r  r  r  r  r4   r2   r  r    s    Dr4   r  __main__)&r  
__future__r   unittestmusic21r   r   r   r   r   r	   r
   r   music21.exceptions21r   r   r   r   r   r   r   r   r   r   r   r   r   music21.noteworthy.dictionariesr   EnvironmentenvironLocalr   r<   TestCaser  r  r  mainTestr  r4   r2   <module>r     s   ` #          1             8&{&&'=>z* z*|	#3 	.:8 .:b
8$$ 
 zGT r4   