
    rh                       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	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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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KJr  \R6                  " S5      r " S S5      r " S S\5      r " S S\R>                  5      r  " S  S!\R>                  5      r!\"S":X  a  SSKr\RF                  " \ 5        gg)#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)tieznoteworthy.translatec                      \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S r"g!)"NoteworthyTranslator^   z]
stores all the data about the current parse context (whether we're in a slur, tuplet, etc.)
c                   S U l         S U l        SU l        SU l        / U l        [
        R                  " 5       U l        SU l        [        R                  " S5      U l        SU l        S U l        SU l        SU l        / U l        0 U l        g )Nr      TREBLEF)currentPartcurrentMeasuremeasureNumbercurrentEndingrepeatedMeasuresr   ScorescorecurrentClefr   KeySignature
currentKey
withinSlurbeginningSlurNote	withinTielyricPositionlyricsactiveAccidentalsselfs    V/home/james-whalen/.local/lib/python3.13/site-packages/music21/noteworthy/translate.py__init__NoteworthyTranslator.__init__c   s~    " "\\^
#**1-!%!#    c                     [         R                  " U5      nUR                  S5      nU R                  U5      $ ! [        [
        4 a    [        SU S35      ef = f)N
zcannot open z: )r   readFileEncodingSafesplit	parseListOSErrorFileNotFoundErrorNoteworthyTranslateException)r1   filePathdatadataLists       r2   	parseFileNoteworthyTranslator.parseFilew   s`    	L..x8Dzz$'H>>(++*+ 	L.hZr/JKK	Ls	   7:  Ac                D    UR                  5       nU R                  U5      $ N)
splitlinesr:   )r1   r?   r@   s      r2   parseString NoteworthyTranslator.parseString   s    ??$~~h''r5   c           	        U GH  nUR                  5       nUR                  S5      SL a  M*  UR                  S5      nUS   n0 nUSS  HV  n UR                  SS5      u  pxUS:X  a4  US;   a.  UR                  U5      c  U/XW'   M=  XW   R	                  U5        MR  XU'   MX      US:X  a  U R                  U5        M  US:X  a  U R                  U5        M  US:X  a)  U R                  U5        U =R                  S-  sl        GM  US:X  a  U R                  U5        GM  US:X  a  U R                  U5        GM7  US:X  a  U R                  U5        GMQ  US:X  a  U R                  U5        GMk  US:X  a  U R!                  U5        GM  US:X  a  U R#                  U5        GM  US:X  a  U R%                  U5      U l        GM  US:X  a)  U R)                  U5        U =R                  S-  sl        GM  US:X  a  U R+                  U5        GM  US:X  a  U R-                  U5        GM!  US:X  a  U R/                  U5        GM;  US:X  a  U R1                  U5        GMU  US:X  a  U R3                  U5        GMo  US:X  a  U R5                  U5        GM  GM     U R:                  (       a%  U R<                  R	                  U R:                  5        U R>                  RA                  SU R<                  5        U R>                  $ ! [
         a*    UR                  5       S	:X  a   GM  [        S
U SU 35      ef = f! [6         a  n	[9        SU-  5        [        U	eSn	A	ff = f)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 "%s"r   )!rstrip
startswithr9   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   r:   NoteworthyTranslator.parseList   s   6 BB}}S!U*xx}HqkGJ%ab\	M$-OOC$;MT')t~/E%>>$/705wJ,&,33E:+04( *"':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8 *w D ##D$7$78

!T--.
 zzs " M (B.:7	{$rdKM M	MX  :6*EF29:s   7K9K9K9%L0>L0,L0L0 L0:L0L0.L0L0"L0,L00L0
L0$L0>L0L02L09L-L-0
M:MMc                   SSK Jn  UR                  nUR                  S5      nUS   nSn[        R
                  " US   U   5      nU H  n	U	S:X  a  UR                  5       nM  U	S:X  a  U R                  SL a  Xl        SnM:  U	S	:X  a	  S
Ul	        MI  U	S:X  a	  SUl	        MX  U	S;   d  M`  [        R                  " SSUR                  5      n
UR                  U
5        M     Xl        U R                  SL aI  USL aD  [        R                  " U R                  U5      nU R                  R!                  U5        SU l        gUSL a  SU l        gSU l        g)a  
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   
noteworthy,FdictionaryNoteLengthGraceSlurTDottedr   	DblDottedrJ   )TripletzTriplet=FirstzTriplet=End   N)music21r   dictionariesr9   r   DurationgetGraceDurationr*   r+   dotsTuplettypeappendTupletr   r   r!   rc   )r1   generalNotedurationInfor   r   parts
lengthNotethisNoteIsSlurreddurationObjectkktupmusic21SlurObjs               r2   setDurationForObject)NoteworthyTranslator.setDurationForObject   s>    	'!..""3'1X
!!**<8N+OPZ+[\BW}!/!@!@!Bv??e+-8*$(!x&'#{"&'#BBooaN,?,?@++C0    . ??d"'8E'A$\\$*@*@+NN&&~6#DO$&"DO#DOr5   c                @   SnSnUS   S:X  a  U R                   SL a  SnSnSU l         [        U[        R                  5      (       a  UOSnU(       aX  Ub:  UR                   H)  nUR                  [        R                  " S5      U5        M+     O[        R                  " S5      Ul        U R                   SL af  USL a`  Ub:  UR                   H)  nUR                  [        R                  " S5      U5        M+     O[        R                  " S5      Ul        SU l         ggg)z:
sets the tie status for a noteOrChord from the pitchInfo
F^TNstartstop)r,   
isinstancer   rL   pitchessetTier   Tie)r1   noteOrChord	pitchInfothisNoteBeginsATiethisNoteIsTiedachordps          r2   setTieFromPitchInfo(NoteworthyTranslator.setTieFromPitchInfo  s     #R=C~~&%)"!N!DN *; D D$ !AMM#'''"2A6 ( #&'''"2>>T!n&=!AMM#''&/15 ( #&''&/"DN '>!r5   c                    UR                  S5      nUR                  S5      nUR                  S5      nUR                  S5      nU R                  U5      nU$ )a0  
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   getPitchFromPositionInfo-NoteworthyTranslator.getPitchFromPositionInfo<  sN     nnS!jjojjojjo((-r5   c                ~    / nUR                  S5       H%  nU R                  U5      nUR                  U5        M'     U$ )a2  
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   )r9   r   rc   )r1   r   	pitchListthisPosr   s        r2   "getMultiplePitchesFromPositionInfo7NoteworthyTranslator.getMultiplePitchesFromPositionInfoR  sB     	}}S)G--g6AQ * r5   c                   SnUS   S;   a$  US   nUSS nUS:X  a  SnOUS:X  a  S	nOUS
:X  a  Sn[        U5      nU R                  U5      u  pE[        R                  " 5       nXFl        XVl        UR                  nUS:w  a+  [        R                  " U5      Ul        X R                  U'   U$ XpR                  ;   a*  [        R                  " U R                  U   5      Ul        U$ U R                  R                  U5      nUb  Xl        U$ )z
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
rO   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   ,NoteworthyTranslator.getOnePitchFromPositione  s    
q6..QJab'CS  
s"!
s"!
3x!>>|LKKM   ++J7AL,6""5)  ,,, ++D,B,B5,IJAL
  "__==hGN)-r5   c                   SSK Jn  UR                  nSnU R                  nSnSnUS:X  a  SnSnSnOTUS:X  a  S	nSnSnOGUS
;   a  SnSnSnO:US:X  a  SnSnSnO-US:X  a  SnSnSnO US:X  a  SnSnSnOUS:X  a  SnSnSnOSnSnSnX:  d  XS	-   :  a2  X:  a
  US-   nUS-
  nXS	-   :  a
  US-
  nUS-   nX:  a  M(  XS	-   :  a  M2  X6   U   nX4$ )a,  
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)
r   r      rO   r   	TREBLE8dwdictionaryTreble	TREBLE8up   )BASS
PERCUSSIONr   r   dictionaryBassBASS8dwrJ   BASS8upALTOdictionaryAltoTENORdictionaryTenor      )r   r   r   r'   )	r1   r   r   r   r   r'   
dictionaryminPositionnoteNames	            r2   r   1NoteworthyTranslator.getStepAndOctaveFromPosition  sK    	'!..&&
+%FK+JK'FK+J22FK)JI%FK)JI%FK)JF"FK)JG#FK*JFK+J(L!O,L)+a/!Q/+a/! (L!O,L  +L9!!r5   c                0   US   nUS   nU R                  U5      nU R                  S:X  a8  [        R                  " 5       nUR                  Ul        UR                  Ul        O[        R                  " U5      nU R                  XR5        U R                  XS5        U R                  (       aK  U R                  [        U R                  5      :  a(  UR                  U R                  U R                     5        U R                  5       R!                  U5        g)a  
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#>

rM   rN   r   N)r   r'   r   	Unpitchedr   displayStepr   displayOctaverY   r   r   r.   r-   lenaddLyricgetShortestStreamrc   )r1   r}   r   r   r   r   s         r2   rp   "NoteworthyTranslator.translateNote  s    * "%(u%	)))4|+ AFFAMhhAO		!A 	!!!2 	  . ;;4--DKK0@@JJt{{4#5#567 ''*r5   c                    U R                   R                  (       a  U R                   $ [        U R                   R                  [        R
                  5      S S9$ )Nc                    U R                   $ rD   )quarterLength)r   s    r2   <lambda>8NoteworthyTranslator.getShortestStream.<locals>.<lambda>  s    !//r5   r   )r!   isFlatmingetElementsByClassr   Voicer0   s    r2   r   &NoteworthyTranslator.getShortestStream   sG    %%&&& 226<<@)
 	
r5   c                8   US   nUS   nU R                  5       R                  nSU;   nSnS nU GH  n[        R                  " 5       n	U R	                  X5        X2R                  U5         n
U R                  U
5      U	l        U R                  X5        U R                  (       aK  U R                  [        U R                  5      :  a(  U	R                  U R                  U R                     5        [        U5      S:X  a#  Ub   U R                  5       R                  U	5        OU" XU5      nUR                  U	5        US-  nGM     U(       aM  US   n[        R                  " 5       nSUl        U R	                  X5        U" XU5      nUR                  U5        gg)	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>

rM   rN   Dur2r   c                   S nU R                   R                  [        R                  5      nUR	                  U5      nUc  [        R                  " 5       nXl        [        U5      S:X  az  / nU R                    H5  n[        U[        R                  5      (       d  M$  UR                  U5        M7     U(       a,  UR                  U5        U R                   R                  U5        U R                   R                  U5        UR                  nUR                  nXx-
  S:  a6  [        R                  " 5       n	Xx-
  U	l        SU	l        UR                  U	5        U$ )Nr   r   )r!   r   r   r   getElementByIdidr   r   r   GeneralNoterc   remover   rZ   	stepShift)

inner_selfvoiceIddurvoicevoicesnotesitemcdvdrests
             r2   getVoiceAtDuration?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w{yy{%'W"!"T"Lr5   r   Nr   )r   r   r   rL   r   indexr   r   r   r.   r-   r   r   rc   r   rZ   r  )r1   r}   durationInfos
pitchInfoscurrentDurationisRestChordir  dcr   r   restDurInfors                 r2   rh   #NoteworthyTranslator.translateChord  si   $ #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&t@FA) , $V,K		AAK%%a5"4O<AHHQK r5   c                    US   n[         R                  " 5       nU R                  X25        U R                  5       R	                  U5        g)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>

rM   N)r   rZ   r   r   rc   )r1   r}   r   r  s       r2   rq   "NoteworthyTranslator.translateRestd  s>    & "%(IIK!!!2 ''*r5   c                   SnSU;   a)  US   S:X  a  SnOUS   S:X  a  SnO[        SUS    35      eS	nUS
   nUS:X  a  US	:X  a2  U R                  R                  [        R                  " 5       5        SnGOUS:X  a2  U R                  R                  [        R
                  " 5       5        SnGOUS:X  a0  U R                  R                  [        R                  " 5       5        SnGO|US:X  a  US	:X  a2  U R                  R                  [        R                  " 5       5        SnGO>US:X  a2  U R                  R                  [        R                  " 5       5        SnGOUS:X  a0  U R                  R                  [        R                  " 5       5        SnOUS:X  aB  US	:w  a  [        S5      eU R                  R                  [        R                  " 5       5        SnOUS:X  aB  US	:w  a  [        S5      eU R                  R                  [        R                  " 5       5        SnO?US:X  a9  [        R                  " 5       nSUl        U R                  R                  U5        SnUc  [        SU 35      eX l        g)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   
PercussionrJ   r   z$Did not find a proper clef in type, )r=   r!   rc   r   
TrebleClefTreble8vbClefTreble8vaClefBassClefBass8vbClefBass8vaClefAltoClef	TenorClefPercussionClefliner'   )r1   r}   r'   octaveShiftclr  s         r2   ri   NoteworthyTranslator.createClef~  s7   L 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[[&r5   c                    SnUS    H  nUS:X  a  US-  nM  US:X  d  M  US-  nM     [         R                  " U5      nU R                  R                  U5        X@l        g)a  
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!   rc   r)   )r1   r}   currentSharpsr~   r)   s        r2   rn   NoteworthyTranslator.createKey  sg    $ #K0IC"c!"	 1
 %%m4
"":.$r5   c                    US   nUS:X  a  SnOUS:X  a  Sn[         R                  " U5      nU R                  R                  U5        g)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>
r3  	AllaBrevez2/2Commonz4/4N)r   TimeSignaturer!   rc   )r1   r}   timesms       r2   rv   (NoteworthyTranslator.createTimeSignature  sL     ;'KEhE&""1%r5   c                *   U R                   bK  U R                   R                  U R                  5        U R                  R	                  SU R                   5        [
        R                  " 5       U l         [
        R                  " 5       U l        SU l        g)z
Add a new part to the score.
Nr   )	r    rc   r!   r&   ry   r   PartMeasurer"   r0   s    r2   
createPartNoteworthyTranslator.createPart  si     '##D$7$78JJa!1!12!;;=$nn.r5   c                x   0 U l         SU;  a  U R                  R                  U R                  5        [        R
                  " U R                  S9U l        [        U R                  5      S:  a%  U R                  R                  U R                  5        U =R                  S-  sl        g[        U R                  5      S:  aK  [        R                  " U R                  U R                  S9nU R                  R                  U5        / U l        US   nUS:X  ad  U R                  R                  U R                  5        [        R
                  " 5       U l        [        R                  " SS9U R                  l        GOUS	:X  ad  [        R                  " S
S9U R                  l        U R                  R                  U R                  5        [        R
                  " 5       U l        GO$US:X  ad  U R                  R                  U R                  5        [        R
                  " 5       U l        [        R                  " SS9U R                  l        GOUS:X  ad  [        R                  " S
S9U R                  l        U R                  R                  U R                  5        [        R
                  " 5       U l        GOPUS:X  ae  [        R                   " S5      U R                  l        U R                  R                  U R                  5        [        R
                  " 5       U l        OUS:X  ae  [        R                   " S5      U R                  l        U R                  R                  U R                  5        [        R
                  " 5       U l        OzUS:X  ae  [        R                   " S5      U R                  l        U R                  R                  U R                  5        [        R
                  " 5       U l        O[#        SU S35      eU R                  U R                  l        U =R                  S-  sl        g)ag  
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    rc   r!   r   r?  r"   r   r$   r   RepeatBracketr#   r   RepeatleftBarlinerightBarlineBarliner=   rE  )r1   r}   	rbSpannerstyles       r2   rg   #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r5   c                   US   nUS:X  a  [         R                  " 5       nOUS:X  a  [         R                  " 5       nOUS:X  a  [         R                  " 5       nOkUS:X  a  [         R                  " 5       nOOUS:X  a  [         R                  " 5       nO3US:X  a  [         R
                  " 5       nO[        S[        U5       35      eU R                  R                  U5        g	)
aY  
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
rC  DCalFineCodaToCodaSegnoDSalCodaFinezCannot get style from N)
r   DaCapoAlFiner[  r]  DalSegnoAlCodar_  r=   strr!   rc   r1   r}   rW  gs       r2   rm   +NoteworthyTranslator.createOtherRepetitionsc  s     7#J##%Af_AhAgAj %%'Af_A.1GJGX/YZZ""1%r5   c                    US   nSnUS:X  a  [         R                  " 5       nOUS:X  a  [         R                  " 5       nO Ub  U R                  R	                  U5        gg)a  
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>
rC  N	CrescendoDecrescendo)r	   rg  
Diminuendor!   rc   rc  s       r2   rk   *NoteworthyTranslator.createDynamicVariance  s`     7#K""$Am###%A=&&q) r5   c                z    SU;   a5  [         R                  " US   5      nU R                  R                  U5        gg)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>
rC  N)r	   rS   r!   rc   )r1   r}   rd  s      r2   rj   #NoteworthyTranslator.createDynamics  s:     j   G!45A&&q) !r5   c                   / nSnUS   nUR                  S5      nUR                  SS5      nUR                  SS5      nUR                  SS5      nUR                  S5       Hj  nSnUR                  S	5       HP  nUS:X  a  SnSnUR                  S5       H.  nUS:w  a  S
U 3n	OUn	SnUS:X  a  SnSn	UR                  U	5        M0     MR     Ml     U$ )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^   "z
 r7   r   r   z -rO   z - )re   replacer9   rc   )
r1   r}   r.   spaceallTextwordnouwordPartwlls
             r2   ro   !NoteworthyTranslator.createLyrics  s     V$--$//&#.//$,//$,MM#&DC JJsOA:CE!-Aax!!XBw !"MM"% .	 , '  r5   c                   U R                  5         [        R                  " S5      U l        0 U l        / U l        SU l        UR                  S5      U R                  l	        UR                  S5      U R                  l
        g )Nr   Name)r@  r   r(   r)   r/   r.   r-   rb   r    partNamepartAbbreviation)r1   r}   s     r2   rf    NoteworthyTranslator.createStaff  sc    **1-!#$.NN6$:!,6NN6,B)r5   c                   [        UR                  SS5      5      n[        R                  " U5      n[        UR                  SS5      5      n[        R
                  " U5      Ul        U R                  R                  U5        g )NPatchr   Trans)	r   rb   r   instrumentFromMidiProgramr   Intervaltranspositionr    rc   )r1   r}   patchstaffInstrureadTranspos        r2   rs   *NoteworthyTranslator.createStaffInstrument  sc    JNN7A./ ::5A*..!45$,$5$5k$B!,r5   c                    US   n[         R                  " U5      n[        UR                  S5      5      S:  a  SOSUl        UR                  S5      UR
                  l        U R                  R                  U5        g )Nr^   rN   r   abovebelow)	r   TextExpressionr   rb   	placementrW  	relativeYr!   rc   )r1   r}   textexprs       r2   ru   NoteworthyTranslator.createText  sc    &!))$/$'
u(=$>$B)~~e4

""4(r5   c                    UR                  S5      nUR                  S5      n[        R                  " 5       nX$l        X4l        U R
                  R                  U5        g )NTitleAuthor)rb   r   Metadatatitleauthorr&   rc   )r1   r}   r  r  mds        r2   rr   #NoteworthyTranslator.createSongInfo  sH    w') 	

"r5   c                    US   nU R                   R                  c$  [        R                  " 5       U R                   l        U R                   /U l        UR                  S5      S   n[        U5      U l        g )NEndingsr   r   )r!   rS  r   rU  r$   r9   r   r#   )r1   r}   rI  
endingTypes       r2   rl   !NoteworthyTranslator.createEnding  sa    #**2.1kkmD+!%!4!4 5YYs^A&
 _r5   c                    US   n[         R                  " [        U5      S9nU R                  R	                  SU5        g )Nr]   rD  r   )r   MetronomeMarkr   r!   ry   )r1   r}   tempo_valuemms       r2   rt    NoteworthyTranslator.createTempo  s7     )  K(89""1b)r5   )r/   r+   r'   r#   r)   r!   r    r-   r.   r"   r$   r&   r*   r,   N)#__name__
__module____qualname____firstlineno____doc__r3   rA   rF   r:   r   r   r   r   r   r   rp   r   rh   rq   ri   rn   rv   r@  rg   rm   rk   rj   ro   rf   rs   ru   rr   rl   rt   __static_attributes__ r5   r2   r   r   ^   s    $(L(eN1$f#>,&)V?"B++^	
Wr+4['z%8&*
I V&<*.*  DC-)-*r5   r   c                      \ rS rSrSrg)r=   i  r  N)r  r  r  r  r  r  r5   r2   r=   r=     s    r5   r=   c                       \ rS rSrS rS rSrg)Testi  c                   [         R                  " 5       S-  nUS-  n[        5       R                  U5      nU R	                  [        U[        R                     5      S5        U R	                  [        U[        R                     R                  5       R                  5      S5        U R	                  [        U[        R                     R                  5       5      S5        g )Nr   zverySimple.nwctxtr   Ez<music21.clef.BassClef>)r   getSourceFilePathr   rA   assertEqualr   r   rY   rb  firstr   r   rR   )r1   nwcTranslatePath
simplePathmyScores       r2   	testBasicTest.testBasic   s    !335D%(;;
&(22:>WTYY/0!4WTYY/557<<=sCWTYY/55782	4r5   c                B   Sn[        5       nUR                  U5      nUR                  S   R                  [        R
                  5      R                  5       R                  R                  5       nU R                  UR                  R                  R                  S5        g)a  
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   rF   r   r   r   r?  r  r	  r  r   r   alter)r1   infonwtsn1s        r2   testKeySignatureAtBeginning Test.testKeySignatureAtBeginning	  su    * #$OOD!WWQZ**6>>:@@BHHNNP,,22D9r5   r  N)r  r  r  r  r  r  r  r  r5   r2   r  r    s    4#:r5   r  c                      \ rS rSrSrS rSrg)TestExternali/  Tc                    [         R                  " 5       S-  nUS-  n[        5       R                  U5      nU R                  (       a  UR	                  5         g g )Nr   z+NWCTEXT_Really_complete_example_file.nwctxt)r   r  r   rA   show)r1   r  completer  s       r2   testCompleteTestExternal.testComplete2  sK    !335D#&SS '(228<99LLN r5   r  N)r  r  r  r  r  r  r  r  r5   r2   r  r  /  s    Dr5   r  __main__)$r  
__future__r   unittestr   r   r   r   r   r   r	   r
   r   music21.exceptions21r   r   r   r   r   r   r   r   r   r   r   r   r   EnvironmentenvironLocalr   r=   TestCaser  r  r  mainTestr  r5   r2   <module>r     s   ` #          1            &&'=>X* X*x	#3 	.:8 .:b
8$$ 
 zT r5   