§
    „Øj2²  ã                  óD  — d Z ddlmZ ddlZddl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  e	j        d¦  «        Z G d	„ d
e¦  «        Z G d„ de
j        ¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Zedk    rddlZ ej        ¦   «          dS dS )a    
Attempts at reading pure .nwc files in music21

First will solve uncompressed .nwc then compressed .nwc

Thanks to Juria90 and the nwc2xml project for solving so many of the documentation problems.
No part of this code is taken from that project, but this project would have been impossible
without his work.

Translates .nwc into .nwctxt and then uses Jordi Guillen's .nwctxt translator to go from
there to music21.

BETA -- does not work for many file elements and is untested.

Demo, showing the extent of problems.  The measure numbers are not set.  Lyrics are missing.
Drum is still poorly handled.
This is very beta.  Much better would be to convert the file into .xml or .nwctxt first.

::

    >>> #_DOCS_SHOW c = converter.parse('/Users/Hildegard/Desktop/test1.nwc')
    >>> p = common.getSourceFilePath() / 'noteworthy' / 'cuthbert_test1_v175.nwc' #_DOCS_HIDE
    >>> c = converter.parse(p) #_DOCS_HIDE
    >>> c.show('text')
    {0.0} <music21.metadata.Metadata object at ...>
    {0.0} <music21.stream.Part ...>
        {0.0} <music21.instrument.Violin 'Violin'>
        {0.0} <music21.stream.Measure 0 offset=0.0>
            {0.0} <music21.clef.TrebleClef>
            {0.0} <music21.tempo.MetronomeMark animato Quarter=120>
            {0.0} <music21.meter.TimeSignature 4/4>
            {0.0} <music21.note.Note G>
            {1.0} <music21.note.Note C>
            {2.0} <music21.note.Note C>
            {3.0} <music21.note.Note B>
        {4.0} <music21.stream.Measure 0 offset=4.0>
            {0.0} <music21.note.Note C>
    {0.0} <music21.stream.Part ...>
        {0.0} <music21.instrument.Violin 'Violin'>
        {0.0} <music21.stream.Measure 0 offset=0.0>
            {0.0} <music21.clef.TrebleClef>
            {0.0} <music21.meter.TimeSignature 4/4>
            {0.0} <music21.note.Note G>
            {1.0} <music21.note.Note A>
            {2.0} <music21.note.Note A>
            {3.5} <music21.note.Note G>
        {4.0} <music21.stream.Measure 0 offset=4.0>
            {0.0} <music21.note.Note G>
    {0.0} <music21.stream.Part ...>
        {0.0} <music21.instrument.Viola 'Viola'>
        {0.0} <music21.stream.Measure 0 offset=0.0>
            {0.0} <music21.clef.AltoClef>
            {0.0} <music21.meter.TimeSignature 4/4>
            {0.0} <music21.note.Note D>
            {2.0} <music21.note.Note C#>
            {2.6667} <music21.note.Note D>
            {3.3333} <music21.note.Note E>
        {4.0} <music21.stream.Measure 0 offset=4.0>
            {0.0} <music21.note.Note E>
    {0.0} <music21.stream.Part ...>
        {0.0} <music21.instrument.Violoncello 'Violoncello'>
        {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 G>
            {1.0} <music21.note.Note F>
            {2.0} <music21.note.Note E>
            {3.0} <music21.note.Note G>
        {4.0} <music21.stream.Measure 0 offset=4.0>
            {0.0} <music21.note.Note C>

    >>> #_DOCS_SHOW c = converter.parse('/Users/Hildegard/Desktop/jingle1.nwc')
    >>> p = common.getSourceFilePath() / 'noteworthy' / 'jingle_v175.nwc' #_DOCS_HIDE
    >>> c = converter.parse(p) #_DOCS_HIDE
    >>> c.show('text')
    {0.0} <music21.metadata.Metadata object at 0x7fe8c0a5ffa0>
    {0.0} <music21.stream.Part 0x7fe8c0920100>
        {0.0} <music21.instrument.Piano 'Piano'>
        {0.0} <music21.stream.Measure 0 offset=0.0>
            {0.0} <music21.expressions.TextExpression 'Lively'>
            {0.0} <music21.expressions.TextExpression 'F'>
            {0.0} <music21.clef.TrebleClef>
            {0.0} <music21.tempo.MetronomeMark animato Quarter=120>
            {0.0} <music21.key.KeySignature of 1 flat>
            {0.0} <music21.meter.TimeSignature 4/4>
            {0.0} <music21.note.Note A>
            {1.0} <music21.note.Note A>
            {2.0} <music21.note.Note A>
            {3.0} <music21.note.Rest quarter>
        {4.0} <music21.stream.Measure 0 offset=4.0>
            {0.0} <music21.note.Note A>
            {1.0} <music21.note.Note A>
            {2.0} <music21.note.Note A>
            {3.0} <music21.note.Rest quarter>
        {8.0} <music21.stream.Measure 1 offset=8.0>
            {0.0} <music21.note.Note A>
            {1.0} <music21.note.Note C>
            {2.0} <music21.note.Note F>
            {3.5} <music21.note.Note G>
        {12.0} <music21.stream.Measure 2 offset=12.0>
            {0.0} <music21.note.Note A>
            {3.0} <music21.note.Rest quarter>
        {16.0} <music21.stream.Measure 3 offset=16.0>
            {0.0} <music21.expressions.TextExpression 'Bb'>
            {0.0} <music21.note.Note B->
            {1.0} <music21.note.Note B->
            {2.0} <music21.note.Note B->
            {3.5} <music21.note.Note B->
        {20.0} <music21.stream.Measure 4 offset=20.0>
            {0.0} <music21.expressions.TextExpression 'F'>
            {0.0} <music21.note.Note B->
            {1.0} <music21.note.Note A>
            {2.0} <music21.note.Note A>
            {3.0} <music21.note.Note A>
            {3.5} <music21.note.Note A>
        {24.0} <music21.stream.Measure 5 offset=24.0>
            {0.0} <music21.expressions.TextExpression 'G'>
            {0.0} <music21.bar.Barline type=regular>
            {0.0} <music21.note.Note A>
            {1.0} <music21.note.Note G>
            {2.0} <music21.note.Note G>
            {3.0} <music21.note.Note A>
        {28.0} <music21.stream.Measure 6 offset=28.0>
            {0.0} <music21.expressions.TextExpression 'C7'>
            {0.0} <music21.note.Note G>
            {2.0} <music21.note.Note C>
            {4.0} <music21.bar.Repeat direction=end>
        {28.0} <music21.spanner.RepeatBracket 1
                <music21.stream.Measure 5 offset=24.0><music21.stream.Measure 6 offset=28.0>>
        {32.0} <music21.stream.Measure 7 offset=32.0>
            {0.0} <music21.expressions.TextExpression 'C7'>
            {0.0} <music21.bar.Barline type=regular>
            {0.0} <music21.note.Note C>
            {1.0} <music21.note.Note C>
            {2.0} <music21.note.Note B->
            {3.0} <music21.note.Note G>
        {36.0} <music21.stream.Measure 8 offset=36.0>
            {0.0} <music21.expressions.TextExpression 'F'>
            {0.0} <music21.note.Note F>
            {3.0} <music21.note.Rest quarter>
    {0.0} <music21.stream.Part 0x7fe8c0921660>
        {0.0} <music21.instrument.Piano 'Piano'>
        {0.0} <music21.stream.Measure 0 offset=0.0>
            {0.0} <music21.clef.BassClef>
            {0.0} <music21.key.KeySignature of 1 flat>
            {0.0} <music21.meter.TimeSignature 4/4>
            {0.0} <music21.chord.Chord F3 A3 C4>
        {4.0} <music21.stream.Measure 0 offset=4.0>
            {0.0} <music21.chord.Chord F3 A3 C4>
        {8.0} <music21.stream.Measure 1 offset=8.0>
            {0.0} <music21.chord.Chord F3 A3 C4>
        {12.0} <music21.stream.Measure 2 offset=12.0>
            {0.0} <music21.chord.Chord F3 A3 C4>
            {1.0} <music21.note.Rest quarter>
            {2.0} <music21.chord.Chord F3 A3 C4>
            {3.0} <music21.note.Rest quarter>
        {16.0} <music21.stream.Measure 3 offset=16.0>
            {0.0} <music21.chord.Chord F3 B-3 D4>
        {20.0} <music21.stream.Measure 4 offset=20.0>
            {0.0} <music21.chord.Chord F3 A3 C4>
            {1.0} <music21.note.Rest quarter>
            {2.0} <music21.note.Rest half>
        {24.0} <music21.stream.Measure 5 offset=24.0>
            {0.0} <music21.bar.Barline type=regular>
            {0.0} <music21.chord.Chord G3 B3>
            {2.0} <music21.note.Rest half>
        {28.0} <music21.stream.Measure 6 offset=28.0>
            {0.0} <music21.chord.Chord E3 B-3 C4>
            {4.0} <music21.bar.Repeat direction=end>
        {28.0} <music21.spanner.RepeatBracket 1
                 <music21.stream.Measure 5 offset=24.0><music21.stream.Measure 6 offset=28.0>>
        {32.0} <music21.stream.Measure 7 offset=32.0>
            {0.0} <music21.bar.Barline type=regular>
            {0.0} <music21.chord.Chord E3 B-3 C4>
            {1.0} <music21.note.Rest quarter>
            {2.0} <music21.note.Rest half>
        {36.0} <music21.stream.Measure 8 offset=36.0>
            {0.0} <music21.chord.Chord F3 A3 C4>
            {3.0} <music21.note.Rest quarter>

é    )ÚannotationsN)Ú	TypedDict)Úenvironment)Úexceptions21)Ú	constantsznoteworthy.translatec                  ó8   — e Zd ZU ded<   ded<   ded<   ded<   dS )ÚFontDictÚbytesÚnameÚintÚsizeÚstyleÚcharsetN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú—/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/noteworthy/binaryTranslate.pyr	   r	   Î   s4   € € € € € € Ø€K€K�KØ€I€I�IØ€J€J�JØ€L€L�L€L€Lr   r	   c                  ó   — e Zd ZdS )Ú"NoteworthyBinaryTranslateExceptionN)r   r   r   r   r   r   r   r   Õ   s   € € € € € Ø€Dr   r   c            	      ó®   — e Zd ZdZd)d„Zd*d„Zd+d,d„Zd-d„Zd-d„Zd-d„Z	d.d/d„Z
d-d/d„Zd-d0d„ZdddddddddœZd-d„Zd1d„Zd2d3d"„Zd#„ Zd)d$„Zd4d&„Zd'„ Zd(S )5ÚNWCConverteraµ  
    A converter object for binary .nwc files.  Do not normally use directly; use converter.parse.

    >>> nwcc = noteworthy.binaryTranslate.NWCConverter()
    >>> nwcc
    <music21.noteworthy.binaryTranslate.NWCConverter object at 0x...>
    >>> nwcc.fileContents
    b''
    >>> nwcc.parsePosition
    0
    >>> nwcc.version  # version of nwc file to be parsed
    200
    >>> nwcc.numberOfStaves
    0
    >>> nwcc.staves
    []
    ÚreturnÚNonec                óŽ  — d| _         d| _        d| _        d| _        d| _        d| _        g | _        d| _        g | _        d| _	        d| _
        d| _        d| _        d| _        d | _        d| _        d| _        d | _        d| _        d| _        d | _        d | _        d | _        d | _        d | _        d| _        d| _        i | _        d S )Nr   r   éÈ   é   s   Maestro)ÚfileContentsÚparsePositionÚversionÚnumberOfStavesÚtitlePageInfoÚpageNumberStartÚstavesÚcommentÚfontsÚlyricistÚgroupVisibilityÚallowLayeringÚmarginsÚnotationTypefaceÚextendLastSystemÚ
copyright1Ú
copyright2ÚincreaseNoteSpacingÚauthorÚtitleÚmeasureStartÚmeasureNumbersÚmirrorMarginsÚstaffLabelsÚsinsÚuserÚstaffHeightÚcurrentAlterations)ÚselfÚkeywordss     r   Ú__init__zNWCConverter.__init__ë   sÜ   € Ø#&ˆÔØˆÔØˆŒØˆÔØˆÔØ ˆÔØ&(ˆŒØ!ˆŒØ%'ˆŒ
Ø"ˆŒØ&)ˆÔØ"#ˆÔØ!ˆŒØ'1ˆÔØ $ˆÔØ!$ˆŒØ!$ˆŒØ#'ˆÔ Ø ˆŒØˆŒ
Ø ˆÔØ"ˆÔØ!ˆÔØˆÔØˆŒ	ØˆŒ	ØˆÔØ24ˆÔÐÐr   Úfpúpathlib.Path | strc                óÔ   — t          |d¦  «        5 }|                     ¦   «         | _        ddd¦  «         n# 1 swxY w Y   |                      ¦   «          |                      ¦   «         S )aš  
        Parse a file (calls .toStream)

        >>> #_DOCS_SHOW fp = '/Users/cuthbert/desktop/cuthbert_test1.nwc'
        >>> fp = str(common.getSourceFilePath()/'noteworthy'/'cuthbert_test1.nwc') #_DOCS_HIDE
        >>> nwcc = noteworthy.binaryTranslate.NWCConverter()
        >>> nwcc.fileContents
        b''
        >>> streamObj = nwcc.parseFile(fp)
        >>> len(nwcc.fileContents)  # binary
        1139
        >>> nwcc.fileContents[0:80]
        b'[NoteWorthy ArtWare]\x00\x00\x00[NoteWorthy
                 Composer]\x00\x01\x02\x02\x00\x00\x00N/A\x000_JldRQMSKq6M5a3FQqK_g\x00\x00\x00'
        >>> streamObj
        <music21.stream.Score ...>
        ÚrbN)ÚopenÚreadr    ÚparseÚtoStream)r<   r?   Úfs      r   Ú	parseFilezNWCConverter.parseFile
  s�   € õ& �"�d‰^Œ^ð 	)˜qØ !§¢¡¤ˆDÔð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)à�
Š
‰ŒˆØ�}Š}‰ŒÐs   ‘7·;¾;r   ÚbytesInr
   c                ó`   — || _         |                      ¦   «          |                      ¦   «         S )z^
        same as parseFile but takes a string (in Py3, bytes) of binary data instead.
        )r    rE   rF   )r<   rI   s     r   ÚparseStringzNWCConverter.parseString"  s'   € ð $ˆÔØ�
Š
‰ŒˆØ�}Š}‰ŒÐr   Tc                óŠ   — | j         }| j        }t          j        d|||dz   …         ¦  «        d         }|du r
|dz   | _        |S )ak  
        Helper module: read a little-endian short value to an integer

        >>> nwcc = noteworthy.binaryTranslate.NWCConverter()
        >>> nwcc.fileContents = b''
        >>> nwcc.parsePosition
        0
        >>> nwcc.readLEShort()
        258
        >>> nwcc.parsePosition
        2
        >>> nwcc.readLEShort()
        259
        >>> nwcc.parsePosition
        4

        Or to not update the parsePosition, send False:
        >>> nwcc.parsePosition = 0
        >>> nwcc.readLEShort(False)
        258
        >>> nwcc.readLEShort(False)
        258
        >>> nwcc.parsePosition
        0
        z<hé   r   T)r    r!   ÚstructÚunpack©r<   ÚupdateParsePositionÚfcÚppÚvalues        r   ÚreadLEShortzNWCConverter.readLEShort*  sR   € ð4 ÔˆØÔˆÝ”˜d B r¨"¨q©& y¤MÑ2Ô2°1Ô5ˆà $Ð&Ð&Ø!# a¡ˆDÔØˆr   c                ór   — | j         }| j        }t          |||dz   …         ¦  «        }|du r
|dz   | _        |S )zx
        changes a byte into an unsigned int
        (i.e., if the byte is > 127 then it's subtracted from 256)
        r   T)r    r!   ÚordrP   s        r   Ú	byteToIntzNWCConverter.byteToIntL  sI   € ð
 ÔˆØÔˆÝ�B�r˜"˜q™&�y”MÑ"Ô"ˆà $Ð&Ð&Ø!# a¡ˆDÔØˆr   c                óF   — |                       |¦  «        }|dk    r|dz
  }|S )zu
        changes a byte into a signed int
        (i.e., if the byte is > 127 then it's subtracted from 256)
        é   é   )rX   )r<   rQ   Úvals      r   ÚbyteToSignedIntzNWCConverter.byteToSignedIntY  s-   € ð
 �nŠnÐ0Ñ1Ô1ˆØ�Š9ˆ9Ø˜‘)ˆCØˆ
r   r   c                óX   — | j         }| j        }||||z   …         }|du r
||z   | _        |S )zc
        reads the next bytesToRead bytes and then (optionally) updates self.parsePosition
        T)r    r!   )r<   ÚbytesToReadrQ   rR   rS   rT   s         r   Ú	readByteszNWCConverter.readBytesc  sE   € ð ÔˆØÔˆØ�2�b˜;Ñ&Ð&Ô'ˆØ $Ð&Ð&Ø!# kÑ!1ˆDÔØˆr   c                óØ   — | j         }	 |                     d| j        ¦  «        }n# t          $ r d}Y nw xY w|dk    r|| j        d…         }n|| j        |…         }|du r
|dz   | _        |S )z¥
        reads self.fileContents up to, but not including, the next position of \x00.

        updates the parsePosition unless updateParsePosition is False
        r   éÿÿÿÿNTr   )r    Úindexr!   Ú
ValueError)r<   rQ   rR   ÚnulPositionÚrets        r   Ú	readToNULzNWCConverter.readToNULn  s�   € ð Ôˆð	ØŸ(š( 1 dÔ&8Ñ9Ô9ˆKˆKøÝð 	ð 	ð 	ØˆKˆKˆKð	øøøð ˜"ÒÐØ�TÔ'Ð(Ð(Ô)ˆCˆCà�TÔ'¨Ð3Ô4ˆCØ $Ð&Ð&Ø!,¨q¡ˆDÔØˆ
s   ‰% ¥4³4Úboolc                ó  — | j         }d| _         |                      ¦   «         }|dk    rdS |                      ¦   «         }|                      ¦   «         }|                      ¦   «         }|dk    rdS |du r|dk    r|| _         dS )Nr   s   [NoteWorthy ArtWare]Fz[NoteWorthy Composer]T)r!   rg   )r<   rQ   ÚstoredPPÚheader1ÚjunkÚheader2s         r   ÚisValidNWCFilezNWCConverter.isValidNWCFile…  s�   € ØÔ%ˆØˆÔØ—.’.Ñ"Ô"ˆØÐ-Ò-Ð-Ø�5Ø�~Š~ÑÔˆØ�~Š~ÑÔˆØ—.’.Ñ"Ô"ˆØÐ-Ò-Ð-Ø�5Ø %Ð'Ð'¨H¸ªM¨MØ!)ˆDÔØˆtr   éx   é‚   é–   é›   éª   é¯   r   éÉ   )i  i  i2  i7  iF  iK  i   i  c                óÐ   — | j         }d| _         |                      |¦  «        }|du r|| _         || j        v r| j        |         | _        nt	          d¦  «         d| _        | j        S )Né-   Fz:No Version Found! Most likely a newer version.  Using 2.01ru   )r!   rU   ÚversionFromHexr"   Úprint)r<   rQ   rj   ÚfileVersionRaws       r   ÚfileVersionzNWCConverter.fileVersionŸ  sv   € ØÔ%ˆØˆÔØ×)Ò)Ð*=Ñ>Ô>ˆØ %Ð'Ð'Ø!)ˆDÔØ˜TÔ0Ð0Ð0ØÔ.¨~Ô>ˆDŒLˆLåÐNÑOÔOÐOØˆDŒLàŒ|Ðr   c                ó&   — | xj         |z  c_         d S ©N)r!   )r<   ÚnumBytess     r   Ú	skipByteszNWCConverter.skipBytes­  s   € ØÐÔ˜hÑ&ÐÔÐÐr   ó    Únulc                ó~   — | j         }| j        }|||dz   …         |k    r|dz  }|||dz   …         |k    °|| _         d S )Nr   )r!   r    )r<   r�   rS   rR   s       r   ÚadvanceToNotNULzNWCConverter.advanceToNotNUL°  sY   € ØÔˆØÔˆà��B˜‘F�Œm˜sÒ"Ð"Ø�!‰GˆBð ��B˜‘F�Œm˜sÒ"Ð"àˆÔÐÐr   c                ót  — | j         dd…         dk    r-ddl}|                     | j         dd…         ¦  «        }|| _         d| _        |                      ¦   «          g | _        t          | j        ¦  «        D ]@}t          | ¬¦  «        }| 	                    ¦   «          | j         
                    |¦  «         ŒAdS )zO
        the main parse routine called by parseFile() or parseString()
        r   é   s   [NWZ] N)Úparent)r    ÚzlibÚ
decompressr!   ÚparseHeaderr&   Úranger#   ÚNWCStaffrE   Úappend)r<   r‡   ÚfcNewÚiÚ	thisStaffs        r   rE   zNWCConverter.parse¸  sÉ   € ð Ô˜Q˜q˜SÔ! \Ò1Ð1ØˆKˆKˆKØ—O’O DÔ$5°a°b°bÔ$9Ñ:Ô:ˆEØ %ˆDÔàˆÔØ×ÒÑÔÐØˆŒõ �tÔ*Ñ+Ô+ð 	*ð 	*ˆAÝ ¨Ð-Ñ-Ô-ˆIØ�OŠOÑÔÐØŒK×Ò˜yÑ)Ô)Ð)Ð)ð	*ð 	*r   c                ó<  — |                       ¦   «          |                      ¦   «          |                      d¦  «         |                      ¦   «         | _        |                      ¦   «         }|                      d¦  «         |                      ¦   «         | _        |                      ¦   «         | _        | j        dk    r|                      ¦   «         | _        |                      ¦   «         | _	        |                      ¦   «         | _
        |                      ¦   «         | _        |                      ¦   «         | _        |                      ¦   «         | _        |                      d¦  «        }|                      ¦   «         | _        |                      d¦  «        }|                      ¦   «         | _        | j        dk    r|                      ¦   «         | _        nd| _        |                      ¦   «         }|                      d¦  «        }| j        dk    r3|                      d	¦  «        | _        |                      ¦   «         | _        | j        dk    r|                      ¦   «         | _        |                      ¦   «         | _        | j        d
k    rd}n| j        dk    rd}nd}|                      ¦   «          |                      d¦  «         g | _        t5          |¦  «        D ]¦}|                      ¦   «         |                      ¦   «         |                      ¦   «         ddœ}|                      ¦   «         }|                      ¦   «         |d<   |d         dk    rd|d<   |d         dk    rd|d<   | j                             |¦  «         Œ§|                      ¦   «         | _        |                      ¦   «         | _        |                      ¦   «         | _        | j        dk    r|                      d¦  «         |                      ¦   «         | _        |                      d¦  «         dS )z]
        Sets a ton of information from the header, and advances the parse position.
        é   é
   r   é   r   rp   s   0.0 0.0 0.0 0.0rM   é    rs   é   r   )r   r   r   r   r   r   r   s   Times New Romanr   N) rn   r{   r   rg   r9   r3   r2   r"   r)   r/   r0   r'   rX   r.   r1   r`   r5   rU   r4   r,   r*   r+   r-   r:   rƒ   r(   rŠ   rŒ   r$   r7   r%   r#   )r<   Úunused_unknownÚunusedÚ	fontCountrŽ   ÚfontDicts         r   r‰   zNWCConverter.parseHeaderË  s–  € ð 	×ÒÑÔÐØ×ÒÑÔÐð 	�Š�qÑÔÐà—N’NÑ$Ô$ˆŒ	àŸšÑ)Ô)ˆà�Š�rÑÔÐØ—^’^Ñ%Ô%ˆŒ
Ø—n’nÑ&Ô&ˆŒØŒ<˜3ÒÐØ ŸNšNÑ,Ô,ˆDŒMØŸ.š.Ñ*Ô*ˆŒØŸ.š.Ñ*Ô*ˆŒØ—~’~Ñ'Ô'ˆŒà $§¢Ñ 0Ô 0ˆÔØ#'§>¢>Ñ#3Ô#3ˆÔ Ø—’ Ñ"Ô"ˆØ"ŸnšnÑ.Ô.ˆÔà—’ Ñ"Ô"ˆØ ×,Ò,Ñ.Ô.ˆÔØŒ<˜3ÒÐØŸ>š>Ñ+Ô+ˆDŒLˆLà-ˆDŒLà—’Ñ!Ô!ˆØ—’ Ñ"Ô"ˆØŒ<˜3ÒÐØ#'§>¢>°"Ñ#5Ô#5ˆDÔ Ø!%§¢Ñ!1Ô!1ˆDÔàŒ<˜3ÒÐØ$(§N¢NÑ$4Ô$4ˆDÔ!Ø×+Ò+Ñ-Ô-ˆÔàŒ<˜#ÒÐØˆIˆIØŒ\˜CÒÐØˆIˆIàˆIØ×ÒÑÔÐØ�Š�qÑÔÐØˆŒ
Ý�yÑ!Ô!ð 	(ð 	(ˆAàŸšÑ(Ô(ØŸšÑ)Ô)ØŸšÑ(Ô(Øð	"ð "ˆHð —^’^Ñ%Ô%ˆFØ"&§.¢.Ñ"2Ô"2ˆH�YÑØ˜Ô 3Ò&Ð&Ø#5�˜Ñ Ø˜Ô 1Ò$Ð$Ø#%�˜Ñ ØŒJ×Ò˜hÑ'Ô'Ð'Ð'ð "Ÿ^š^Ñ-Ô-ˆÔð  Ÿ>š>Ñ+Ô+ˆÔØ#×/Ò/Ñ1Ô1ˆÔØŒ<˜3ÒÐØ�NŠN˜1ÑÔÐØ"ŸnšnÑ.Ô.ˆÔà�Š�qÑÔÐÐÐr   ú	list[str]c                ó  — d}| j         r |d| j                              d¦  «        z   z  }| j        r |d| j                             d¦  «        z   z  }|g}| j        D ]0}|                     ¦   «         }|D ]}|                     |¦  «         ŒŒ1|S )NÚ z|SongInfo|Title:Úlatin_1z|Author:)r3   Údecoder2   r&   ÚdumprŒ   )r<   ÚinfosÚdumpObjectsÚsÚstaffDumpObjectsÚsdos         r   ÚdumpToNWCTextzNWCConverter.dumpToNWCText  sµ   € ØˆØŒ:ð 	GØÐ'¨$¬*×*;Ò*;¸IÑ*FÔ*FÑFÑFˆEØŒ;ð 	@Ø�Z $¤+×"4Ò"4°YÑ"?Ô"?Ñ?Ñ?ˆEØ�gˆØ”ð 	(ð 	(ˆAØ Ÿvšv™xœxÐØ'ð (ð (�Ø×"Ò" 3Ñ'Ô'Ð'Ð'ð(ð Ðr   c                óˆ   — ddl m} |                     ¦   «         }|                     |                      ¦   «         ¦  «        }|S )Nr   )Ú	translate)Úmusic21.noteworthyr§   ÚNoteworthyTranslatorÚ	parseListr¥   )r<   r§   Únwtr¢   s       r   rF   zNWCConverter.toStream+  sG   € Ø0Ð0Ð0Ð0Ð0Ð0Ø×,Ò,Ñ.Ô.ˆØ�MŠM˜$×,Ò,Ñ.Ô.Ñ/Ô/ˆØˆr   N)r   r   )r?   r@   )r   )rI   r
   )T)r   T)r   r
   )r   rh   )r   )r€   )r�   r
   ©r   rš   )r   r   r   Ú__doc__r>   rH   rK   rU   rX   r]   r`   rg   rn   rx   r{   r   rƒ   rE   r‰   r¥   rF   r   r   r   r   r   Ù   s™  € € € € € ðð ð"5ð 5ð 5ð 5ð>ð ð ð ð0ð ð ð ð ð ð  ð  ð  ðDð ð ð ðð ð ð ð	ð 	ð 	ð 	ð 	ðð ð ð ð ð.ð ð ð ð ð  "Ø!Ø!Ø!Ø!Ø!Ø!Ø!ðð €Nðð ð ð ð'ð 'ð 'ð 'ð ð  ð  ð  ð  ð*ð *ð *ð&Pð Pð Pð Pðdð ð ð ðð ð ð ð r   r   c                  ó:   — e Zd ZdZdd„Zd„ Zdd	„Zd
„ Zd„ Zd„ Z	dS )r‹   aC  
    A NWCStaff is a list of NWCObjects (see :meth:`parseObjects`) associated to metadata
    (see :meth:`parseHeader`). It may also contain some lyrics (see :meth:`parseLyrics`).
    It defines a :meth:`dump` method that return a list of string containing the
    nwctxt-formatted content of each object of the staff.
    r†   r   r   r   c                ó  — || _         g | _        g | _        d| _        d | _        d | _        d | _        d | _        d | _        d| _	        d | _
        d| _        d| _        d| _        d | _        d| _        d| _        d| _        d S )Nr   r   )r†   ÚlyricsÚobjectsÚinstrumentNameÚgroupÚlayerWithNextStaffÚtranspositionÚ
partVolumeÚ	stereoPanÚcolorÚalignSyllableÚnumberOfLyricsÚnumberOfObjectsÚlinesr   ÚstaffOffsetÚlabelÚlyricAlignment)r<   r†   s     r   r>   zNWCStaff.__init__9  sŽ   € Ø$*ˆŒØ)+ˆŒØ(*ˆŒØ%(ˆÔØˆŒ
Ø"&ˆÔØ!ˆÔØˆŒØˆŒØˆŒ
Ø!ˆÔØˆÔØ ˆÔØˆŒ
ØˆŒ	ØˆÔØˆŒ
ØˆÔÐÐr   c                ó~   — |                       ¦   «          |                      ¦   «          |                      ¦   «          d S r}   )r‰   ÚparseLyricsÚparseObjects)r<   s    r   rE   zNWCStaff.parseM  s>   € à×ÒÑÔÐà×ÒÑÔÐà×ÒÑÔÐÐÐr   rš   c                ó$  — g }| j         r| j                              d¦  «        nd}| j        r| j                             d¦  «        n|}d|z   }|                     |¦  «         d|z   }|t          j        v r4|dz  }|t          t          j                             |¦  «        ¦  «        z  }|dt          | j        ¦  «        z   z  }|                     |¦  «         | j	        D ]/}|j
        } ||¦  «        }|dk    r|                     |¦  «         Œ0|S )Nr�   zAcoustic Grand Pianoz|AddStaff|Name:z|StaffInstrument|Name:z|Patch:z|Trans:rœ   )r²   rž   r¾   rŒ   r   ÚMidiInstrumentsÚstrrc   rµ   r±   Ú
dumpMethod)	r<   r¡   Ú
instruNamer¾   ÚstaffStringÚstaffInstruStringÚoÚdmÚds	            r   rŸ   zNWCStaff.dumpV  s4  € Øˆð Ô,ð2�dÔ)×0Ò0°Ñ;Ô;Ð;à1ð 	ð 15´
ÐJ�”
×!Ò! )Ñ,Ô,Ð,À
ˆà'¨%Ñ/ˆØ×Ò˜;Ñ'Ô'Ð'à4°zÑAÐØ�Ô2Ð2Ð2Ø Ñ*ÐØ¥¥YÔ%>×%DÒ%DÀZÑ%PÔ%PÑ!QÔ!QÑQÐà˜Y­¨TÔ-?Ñ)@Ô)@Ñ@Ñ@Ðà×ÒÐ,Ñ-Ô-Ð-à”ð 	&ð 	&ˆAØ”ˆBØ��1‘”ˆAØ�BŠwˆwØ×"Ò" 1Ñ%Ô%Ð%øàÐr   c                ób  — | j         }|                     ¦   «         | _        |j        dk    r2|                     ¦   «         | _        |                     ¦   «         | _        |                     ¦   «         | _        |j        dk    rß|                     d¦  «         |                     ¦   «         | _	        | 
                    ¦   «         | _        | 
                    ¦   «         | _        | 
                    ¦   «         | _        | 
                    ¦   «         | _        |                     ¦   «         | _        | 
                    ¦   «         | _        | 
                    ¦   «         | _        �n|j        dk    rö|                     d¦  «         |                     ¦   «         }d|cxk     rt%          t&          j        ¦  «        k     rn n|dz
  nd}t&          j        |                              d¦  «        | _        |                     d¦  «         |                     ¦   «         | _        |                     d	¦  «         | 
                    ¦   «         | _        | 
                    ¦   «         | _        | j        dk    r4| 
                    ¦   «         | _        | 
                    ¦   «         | _        d S d| _        d| _        d S )
Nr   é   rt   é   r   r   r�   r’   r…   )r†   rg   r   r"   r¾   r²   r³   r   rX   r¼   rU   r´   rµ   r¶   r·   r¸   r¹   rº   Úlenr   rÄ   Úencoder]   r¿   r½   )r<   ÚpÚinstruPatchrc   s       r   r‰   zNWCStaff.parseHeaders  s  € ØŒKˆà—K’K‘M”MˆŒ	àŒ9˜ÒÐØŸš™œˆDŒJà"#§+¢+¡-¤-ˆDÔà—[’[‘]”]ˆŒ
ð Œ9˜ÒÐð" �KŠK˜‰OŒOˆOØŸš™œˆDŒJð '(§m¢m¡o¤oˆDÔ#Ø!"§¢¡¤ˆDÔØŸmšm™oœoˆDŒOØŸ]š]™_œ_ˆDŒNØŸš™œˆDŒJØ!"§¢¡¤ˆDÔØ"#§-¢-¡/¤/ˆDÔÑàŒY˜#ÒÐØ�KŠK˜‰OŒOˆOØŸ+š+™-œ-ˆKØ'(¨;Ð'WÐ'WÒ'WÐ'W½½YÔ=VÑ9WÔ9WÒ'WÐ'WÐ'WÐ'WÐ'W�K !‘O�OÐ]^ˆEÝ"+Ô";¸EÔ"B×"IÒ"IÈ)Ñ"TÔ"TˆDÔØ�KŠK˜‰OŒOˆOØ!"×!2Ò!2Ñ!4Ô!4ˆDÔØ�KŠK˜‰NŒNˆNØ!"§¢¡¤ˆDÔØ"#§-¢-¡/¤/ˆDÔàÔ Ò"Ð"Ø"#§-¢-¡/¤/ˆDÔØ Ÿ}š}™œˆDÔÐÐà"#ˆDÔØ ˆDÔÐÐr   c                ó’  — | j         }g }t          | j        ¦  «        D ]î}g }	 |                     ¦   «         }n1# t          j        $ r d}t                               d¦  «         Y nw xY w|dk    r�|                     ¦   «         }|j        }|                     ¦   «         }d}	d}
|	du rG|
dk    rA| 	                    ¦   «         }|
dz  }
|dk    rd}	n| 
                    |¦  «         |	du r|
dk    °A||z   |_        | 
                    |¦  «         Œï| j        dk    r|                     ¦   «         }|                     ¦   «         }|| _        |S )Nr   z/Could not read lyrics. Trying with zero length.Tiè  r   r   F)r†   rŠ   rº   rU   rN   ÚerrorÚenvironLocalÚwarnr!   rg   rŒ   r°   )r<   rÒ   r°   rŽ   Ú	syllablesÚlyricBlockSizeÚunused_lyricSizeÚparsePositionStartrl   Ú
continueItÚmaxReadÚsyllableÚjunk_2s                r   rÁ   zNWCStaff.parseLyrics°  sx  € àŒKˆØˆå�tÔ*Ñ+Ô+ð 	)ð 	)ˆAØˆIðUØ!"§¢¡¤��øÝ”<ð Uð Uð UØ!"�Ý×!Ò!Ð"SÑTÔTÐTÐTÐTðUøøøð
  Ò!Ð!Ø#$§=¢=¡?¤?Ð Ø%&¤_Ð"ð —}’}‘”�Ø!�
Ø�Ø  DÐ(Ð(¨W°qª[¨[Ø Ÿ{š{™}œ}�Hà˜q‘L�Gà 3’�Ø%*˜
˜
à!×(Ò(¨Ñ2Ô2Ð2ð ! DÐ(Ð(¨W°qª[¨[ð #5°~Ñ"E�”Ø—’˜iÑ(Ô(Ð(øð Ô Ò"Ð"Ø—=’=‘?”?ˆDØ—’‘”ˆàˆŒØˆs   £8¸+A&Á%A&c                ó0  — | j         }g }|                     ¦   «         | _        |j        dk    r| xj        dz  c_        t	          | j        ¦  «        D ]<}t          | |¬¦  «        }|                     ¦   «          |                     |¦  «         Œ=|| _        |S )Nrq   rM   ©ÚstaffParentÚparserParent)	r†   rU   r»   r"   rŠ   Ú	NWCObjectrE   rŒ   r±   )r<   rÒ   r±   rŽ   Ú
thisObjects        r   rÂ   zNWCStaff.parseObjectsÚ  sž   € ØŒKˆØˆØ Ÿ}š}™œˆÔØŒ9�sŠ?ˆ?ØÐ Ô  AÑ%Ð Ô õ �tÔ+Ñ,Ô,ð 	'ð 	'ˆAÝ"¨tÀ!ÐDÑDÔDˆJØ×ÒÑÔÐØ�NŠN˜:Ñ&Ô&Ð&Ð&ØˆŒàˆr   N)r†   r   r   r   r¬   )
r   r   r   r­   r>   rE   rŸ   r‰   rÁ   rÂ   r   r   r   r‹   r‹   2  s„   € € € € € ðð ð ð  ð  ð  ð(ð ð ðð ð ð ð::!ð :!ð :!ðz(ð (ð (ðTð ð ð ð r   r‹   c                  óÂ   — e Zd ZdZd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eeee	e
eeeeeeeeeeeeeegZdS )rä   aV  
    NWCObject class is a union that can be used for each type of object contained in a staff.

    An object binary blob starts with its type.
    The parse() method calls the appropriate method depending on the object type.
    Each parsing method should set up the 'dumpMethod' method that return the nwctxt version
    of the object.
    râ   r‹   rã   r   c                óZ  — || _         || _        d | _        d| _        d| _        d| _        d| _        d| _        d | _        d | _	        d | _
        d| _        d| _        d| _        d| _        d| _        d | _        d| _        d| _        d| _        d | _        d | _        d | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _         d | _!        d| _"        d| _#        d| _$        d| _%        d| _&        d | _'        d | _(        dd„}|| _)        d S )Nr   rœ   r   rÅ   c                ó   — dS )Nrœ   r   ©Ú
inner_selfs    r   ÚgenericDumpMethodz-NWCObject.__init__.<locals>.genericDumpMethod  s   € Ø�2r   )r   rÅ   )*râ   rã   ÚtypeÚ	placementÚposr   ÚlocalRepeatCountÚdataÚdata1Údata2Údata3ÚdelayÚclefTypeÚoffsetÚvisibleÚdurationÚdurationStrÚfontÚsharpsÚoctaveShiftÚoctaveShiftNameÚclefNameÚ
attribute1Ú
attribute2Ú
stemLengthÚdotsÚbitsÚdenominatorÚtieInfoÚvolumeÚbaseÚvelocityÚcountr   rT   ÚflatsÚ	keyStringÚ	numeratorÚalterationStrÚdotAttributeÚtextrÆ   )r<   râ   rã   rë   s       r   r>   zNWCObject.__init__ô  sK  € Ø%0ˆÔØ*6ˆÔØˆŒ	ØˆŒØˆŒØˆŒ
Ø !ˆÔØˆŒ	ØˆŒ
ØˆŒ
ØˆŒ
ØˆŒ
ØˆŒØˆŒØˆŒØˆŒØˆÔØˆŒ	ØˆŒØˆÔØ#ˆÔØˆŒØˆŒØˆŒØˆŒØˆŒ	ØˆŒ	ØˆÔØˆŒØˆŒØˆŒ	ØˆŒØˆŒ
ØˆŒ	ØˆŒ
ØˆŒ
ØˆŒØˆŒØˆÔØ ˆÔØˆŒ	ð	ð 	ð 	ð 	ð ,ˆŒˆˆr   c                óN  — | j         }|                     ¦   «         }|t          | j        ¦  «        k    s|dk     r't	          d|› dt          | j        ¦  «        › �¦  «        ‚|j        dk    r|                     ¦   «         | _        nd| _        | j        |         } || ¦  «         dS )zP
        determine what type of object I am, and set things accordingly
        r   zCannot translate objectType: z	; max is rs   N)rã   rU   rÐ   Ú
objMethodsr   r"   rX   r÷   )r<   rÒ   Ú
objectTypeÚobjectMethods       r   rE   zNWCObject.parse$  s¯   € ð ÔˆØ—]’]‘_”_ˆ
Ø�˜Tœ_Ñ-Ô-Ò-Ð-°¸a²°Ý4Ø[°
Ð[Ð[ÅSÈÌÑEYÔEYÐ[Ð[ñ]ô ]ð ]àŒ9˜ÒÐØŸ;š;™=œ=ˆDŒLˆLàˆDŒLà” zÔ2ˆàˆ�TÑÔÐÐÐr   c                ó’  — | j         }d| _        |                     ¦   «         | _        |                     ¦   «         | _        | j        t          t          j        ¦  «        k     rt          j        | j                 | _        | j        t          t          j	        ¦  «        k     rt          j	        | j                 | _
        d„ }|| _        dS )z,
        clef info,
        4 bytes
        ÚClefc                óf   — d}| j         r|d| j         z   dz   z  }| j        r|d| j        z   dz   z  }|S )Nz|Clef|zType:ú|zOctaveShift:)rþ   rý   ©rê   Úbuilds     r   rŸ   zNWCObject.clef.<locals>.dumpJ  sQ   € ØˆEØÔ"ð =Ø˜ :Ô#6Ñ6¸Ñ<Ñ<�ØÔ)ð KØ˜¨*Ô*DÑDÀsÑJÑJ�ØˆLr   N)rã   rì   rU   rõ   rü   rÐ   r   Ú	ClefNamesrþ   ÚOctaveShiftNamesrý   rÆ   ©r<   rÒ   rŸ   s      r   ÚclefzNWCObject.clef9  s£   € ð
 ÔˆàˆŒ	ØŸš™œˆŒØŸ=š=™?œ?ˆÔàŒ=�3�yÔ2Ñ3Ô3Ò3Ð3Ý%Ô/°´Ô>ˆDŒMØÔ�c¥)Ô"<Ñ=Ô=Ò=Ð=Ý#,Ô#=¸dÔ>NÔ#OˆDÔ ð	ð 	ð 	ð ˆŒˆˆr   c                óè  — | j         }d| _        |                     ¦   «         | _        |                     d¦  «         |                     ¦   «         | _        |                     d¦  «         | j        dk    r0| j        t          j        v rt          j        | j                 | _        nB| j        dk    r0| j        t          j	        v rt          j	        | j                 | _        nd| _        d„ }|| _
        dS )z0
        Key signature
        10 bytes
        ÚKeySigr   é   r   rœ   c                ó   — d| j         z   }|S )Nz|Key|Signature:)r  r  s     r   rŸ   zNWCObject.keySig.<locals>.dumpl  s   € Ø%¨
Ô(<Ñ<ˆEØˆLr   N)rã   rì   rX   r
  r   rû   r   ÚFlatMaskr  Ú	SharpMaskrÆ   r  s      r   ÚkeySigzNWCObject.keySigT  sÎ   € ð
 ÔˆØˆŒ	Ø—[’[‘]”]ˆŒ
Ø	�Š�A‰ŒˆØ—k’k‘m”mˆŒØ	�Š�A‰Œˆð Œ:˜Š>ˆ>˜dœj­IÔ,>Ð>Ð>Ý&Ô/°´
Ô;ˆDŒNˆNØŒ[˜1Š_ˆ_ ¤µ	Ô0CÐ!CÐ!CÝ&Ô0°´Ô=ˆDŒNˆNàˆDŒNð	ð 	ð 	ð ˆŒˆˆr   c                ó²   — | j         }d| _        |                     ¦   «         | _        |                     ¦   «         | _        i | j         _        d„ }|| _        dS )z*
        Bar line
        2 bytes
        ÚBarlinec                ó    — d}d| j         cxk     rt          t          j        ¦  «        k     r"n nt          j        | j                  }|d|z   z  }|S )Nz|Bar|r   z|Style:)r   rÐ   r   Ú	BarStyles)rê   r  ÚstyleStrings      r   rŸ   zNWCObject.barline.<locals>.dump~  s[   € ØˆEà�:Ô#Ð>Ð>Ò>Ð>¥c­)Ô*=Ñ&>Ô&>Ò>Ð>Ð>Ð>Ð>Ý'Ô1°*Ô2BÔC�Ø˜ [Ñ0Ñ0�ØˆLr   N)rã   rì   rX   r   rï   r;   rÆ   r  s      r   ÚbarlinezNWCObject.barliner  sY   € ð
 ÔˆØˆŒ	Ø—[’[‘]”]ˆŒ
Ø !§¢¡¤ˆÔà/1ˆÔÔ,ð	ð 	ð 	ð ˆŒˆˆr   c                ó’   — | j         }d| _        |                     ¦   «         | _        |                     d¦  «         d„ }|| _        dS )z)
        Endings
        2 bytes
        ÚEndingr   c                ó0   — dt          | j        ¦  «        z   S )Nz|Ending|Endings:)rÅ   r   ré   s    r   rŸ   zNWCObject.ending.<locals>.dump’  s   € Ø%­¨JÔ,<Ñ(=Ô(=Ñ=Ð=r   N)rã   rì   rX   r   r   rÆ   r  s      r   ÚendingzNWCObject.endingˆ  sM   € ð
 ÔˆØˆŒ	Ø—[’[‘]”]ˆŒ
Ø	�Š�A‰Œˆð	>ð 	>ð 	>ð ˆŒˆˆr   c                óL   — | j         }d| _        |                     d¦  «         dS )z,
        Instrument
        8 bytes
        Ú
Instrumenté   N)rã   rì   r   ©r<   rÒ   s     r   Ú
instrumentzNWCObject.instrument—  s(   € ð
 ÔˆØ ˆŒ	ð 	
�Š�A‰Œˆˆˆr   c                óê   — | j         }d| _        |                     ¦   «         | _        |                     ¦   «         | _        d| j        z  | _        |                     ¦   «         | _        d„ }|| _        dS )z0
        Time signature
        6 bytes
        ÚTimeSigr   c                ó*   — d| j         › d| j        › �}|S )Nz|TimeSig|Signature:ú/)r  r  r  s     r   rŸ   zNWCObject.timeSig.<locals>.dump®  s"   € ØY¨*Ô*>ÐYÐYÀÔAWÐYÐYˆEØˆLr   N)rã   rì   rU   r  r  r  r   rÆ   r  s      r   ÚtimeSigzNWCObject.timeSig¢  sj   € ð
 ÔˆØˆŒ	ØŸš™œˆŒØ—M’M‘O”OˆŒ	Ø ¤	™>ˆÔØ—]’]‘_”_ˆŒ
ð	ð 	ð 	ð ˆŒˆˆr   c                ón  — | j         }d| _        |                     ¦   «         | _        |                     ¦   «         | _        |                     ¦   «         | _        |                     ¦   «         | _        |j        dk     r|                     ¦   «         }| 	                    ¦   «         | _
        d„ }|| _        dS )zL
        Tempo indications
        5 bytes + null terminated string
        ÚTempors   c                ó   — d| j         › �S )Nz|Tempo|Tempo:)rT   ré   s    r   rŸ   zNWCObject.tempo.<locals>.dumpÃ  s   € Ø5 :Ô#3Ð5Ð5Ð5r   N)rã   rì   rX   rî   rí   rU   rT   r  r"   rg   r  rÆ   )r<   rÒ   rl   rŸ   s       r   ÚtempozNWCObject.tempo´  s’   € ð
 ÔˆØˆŒ	Ø—;’;‘=”=ˆŒØŸš™œˆŒØ—]’]‘_”_ˆŒ
Ø—K’K‘M”MˆŒ	ØŒ9�sŠ?ˆ?Ø—=’=‘?”?ˆDØ—K’K‘M”MˆŒ	ð	6ð 	6ð 	6ð ˆŒˆˆr   c                óT  — | j         }d| _        |j        dk     rt          d¦  «         dS |                     ¦   «         | _        |                     ¦   «         | _        |                     ¦   «         | _        |                     ¦   «         | _	        |                     ¦   «         | _
        dS )z*
        dynamics
        7 bytes
        ÚDynamicrs   z3Dynamics on version below 1.70 is not supported yetN)rã   rì   r"   ry   rX   rî   rí   r   rU   r  r  r2  s     r   ÚdynamiczNWCObject.dynamicÉ  s‚   € ð
 ÔˆØˆŒ	ØŒ9�sŠ?ˆ?ÝÐGÑHÔHÐHÐHÐHà—{’{‘}”}ˆDŒHØŸ[š[™]œ]ˆDŒNØŸš™œˆDŒJØŸMšM™OœOˆDŒMØŸ-š-™/œ/ˆDŒKˆKˆKr   c                ó¢  — t           j        | j                 }d}d}| j        dk    r#| j        d         | _        | j        d         dz  }n| j        d         | _        | j        d         dz  }| j        }|dz  dk    rd| _        n|d	z  dk    rd| _        nd| _        | j        dk    r|d
z  }n| j        dk    r|dz  }|dk    r|dz  }|r|dz  }|S )z6
        get duration string for note or rest
        r   FÚNoter   r”   é   r•   rM   r‘   z,Dottedz
,DblDottedz,Gracez,Triplet)r   ÚDurationValuesrø   rì   rÿ   r  rò   r  )r<   ÚdurStrÚgraceÚtripletÚordDots        r   ÚsetDurationForObjectzNWCObject.setDurationForObjectÙ  s  € õ
 Ô)¨$¬-Ô8ˆàˆØˆØŒ9˜ÒÐØ $¤°Ô 2ˆDÔØ”O AÔ&¨Ñ-ˆEˆEà $¤
¨1¤ˆDÔð ”*˜Q”- $Ñ&ˆàÔ"ˆà�T‰M˜QÒÐØˆDŒIˆIØ�t‰m˜qÒ Ð ØˆDŒIˆIàˆDŒIàŒ9˜Š>ˆ>Ø�iÑˆFˆFØŒY˜!Š^ˆ^Ø�lÑ"ˆFà�1Š9ˆ9Ø�hÑˆFàð 	!Ø�jÑ ˆFàˆr   c                ó0  — | j         }d| _        |j        dk     rt          d¦  «         ný|                     ¦   «         | _        |                     d¦  «        | _        |                     d¦  «        | _        | 	                    ¦   «         | _
        d| j
        z  | _
        |                     ¦   «         | _        |j        dk    r|                     d¦  «        | _        nd| _        |j        dk    r0| j        d	z  d
k    r|                     ¦   «         | _        nd| _        nd| _        |                      ¦   «         | _        | j        dz  }|t!          t"          j        ¦  «        k     rt"          j        |         | _        nd| _        | j        dk    r-| j         j                             | j
        dz  d¦  «        | _        | j        €d| _        | j        | j         j        | j
        dz  <   d| _        | j        d
         }|dz  d
k    rd| _        d„ }|| _        dS )z&
        Note
        8 bytes
        rA  rs   z%Cannot yet handle versions before 170rB  rM   rb   Nr   é@   r   r   rœ   é   ú^c                óz   — d| j         z   dz   }|d| j        z   t          | j        ¦  «        z   | j        z   dz   z  }|S )Nz
|Note|Dur:r  zPos:)rù   r  rÅ   rî   r  r  s     r   rŸ   zNWCObject.note.<locals>.dumpB  s[   € Ø  :Ô#9Ñ9¸CÑ?ˆEà�fØ"Ô0ñ1å˜JœNÑ+Ô+ñ,ð #Ô*ñ+ð .1ñ1ñ 2ˆEð ˆLr   )rã   rì   r"   ry   rX   rø   r`   rò   rÿ   r]   rî   r   ró   r  rH  rù   rÐ   r   ÚAlterationTextsr  r;   Úgetr  rÆ   )r<   rÒ   ÚalterationIndexÚordAtt1rŸ   s        r   ÚnotezNWCObject.note  sñ  € ð
 ÔˆØˆŒ	àŒ9�sŠ?ˆ?ÝÐ9Ñ:Ô:Ð:Ð:àŸKšK™MœMˆDŒMØŸš Q™œˆDŒJØŸkšk¨!™nœnˆDŒOà×(Ò(Ñ*Ô*ˆDŒHØ˜DœH‘}ˆDŒHØŸkšk™mœmˆDŒOØŒy˜CÒÐØŸ[š[¨™^œ^�”
�
à!�”
ØŒy˜CÒÐØ”O dÑ*¨qÒ0Ð0à&'§k¢k¡m¤m�D”O�Oð '(�D”O�Oà"#�”ð  ×4Ò4Ñ6Ô6ˆÔàœ/¨DÑ0ˆØ�S¥Ô!:Ñ;Ô;Ò;Ð;Ý!*Ô!:¸?Ô!KˆDÔÐà!#ˆDÔð Ô Ò#Ð#Ø!%Ô!2Ô!E×!IÒ!IÈ$Ì(ÐUVÉ,ÐXZÑ![Ô![ˆDÔØÔÐ%Ø!#ˆDÔØ=AÔ=OˆÔÔ,¨T¬X¸©\Ñ:àˆŒØ”/ !Ô$ˆØ�d‰N˜aÒÐØˆDŒLð	ð 	ð 	ð ˆŒˆˆr   c                ó6  — | j         }d| _        |j        dk    rt          d¦  «         nL|                     ¦   «         | _        |                     d¦  «        | _        |                     ¦   «         | _	        |  
                    ¦   «         | _        d„ }|| _        dS )z&
        Rest
        8 bytes
        ÚRestrq   z Does not work under version 1.50r“   c                ó    — d| j         z   dz   }|S )Nz
|Rest|Dur:r  )rù   r  s     r   rŸ   zNWCObject.rest.<locals>.dump]  s   € Ø  :Ô#9Ñ9¸CÑ?ˆEØˆLr   N)rã   rì   r"   ry   rX   rø   r`   rò   rU   rö   rH  rù   rÆ   r  s      r   ÚrestzNWCObject.restM  s‘   € ð
 ÔˆØˆŒ	ØŒ9˜ÒÐÝÐ4Ñ5Ô5Ð5Ð5àŸKšK™MœMˆDŒMØŸš Q™œˆDŒJØŸ-š-™/œ/ˆDŒKà×4Ò4Ñ6Ô6ˆÔð	ð 	ð 	ð ˆŒˆˆr   c                óÄ  — | j         }d| _        d}|j        dk    r|                     d¦  «        | _        nM|j        dk    r(|                     d¦  «        | _        | j        d         }n|                     d¦  «        | _        |j        dk    rE| j        d	         d
z  dk    r)t          d¦  «         |                     ¦   «         | _        nd	| _        nd	| _        g | _        t          j
        rt          | t          ¦  «        sJ ‚t          |¦  «        D ]A}t          | |¬¦  «        }|                     ¦   «          | j                             |¦  «         ŒBd„ }|| _        dS )z?
        Chord member
        8 bytes + n Note objects
        ÚNoteChordMemberr   rs   r•   rt   r’   r1  r   r   rJ  zhave stemLength info!rá   c                óF  — d}i }| j         D ]h}|                     |j        ¦  «        €
g ||j        <   ||j                                      |j        t          |j        ¦  «        z   |j        z   ¦  «         Œi|D ])}|d|z   dz   d                     ||         ¦  «        z   z  }Œ*|S )Nú|Chordú|Dur:ú|Pos:ú,)	rò   rO  rù   rŒ   r  rÅ   rî   r  Újoin)rê   r  ÚnotesrÌ   Úns        r   rŸ   z'NWCObject.noteChordMember.<locals>.dump„  s´   € ØˆEØˆEØÔ%ð Vð V�Ø—9’9˜Qœ]Ñ+Ô+Ð3Ø+-�E˜!œ-Ñ(à�a”mÔ$×+Ò+¨A¬O½cÀ!Ä%¹j¼jÑ,HÈ1Ì9Ñ,TÑUÔUÐUÐUàð Dð D�Ø˜ 1™ wÑ.°·²¸%À¼(Ñ1CÔ1CÑCÑC��àˆLr   N)rã   rì   r"   r`   rñ   ry   rX   r  rò   ÚtÚTYPE_CHECKINGÚ
isinstancer‹   rŠ   rä   rE   rŒ   rÆ   )r<   rÒ   ÚnumberOfNotesrŽ   Ú	chordNoterŸ   s         r   ÚnoteChordMemberzNWCObject.noteChordMemberc  s^  € ð
 ÔˆØ%ˆŒ	ØˆØŒ9˜ÒÐØŸš R™œˆDŒJˆJØŒY˜#ÒÐØŸš R™œˆDŒJØ œJ qœMˆMˆMàŸš Q™œˆDŒJØŒ9˜ÒÐØ”
˜1” Ñ$¨Ò*Ð*ÝÐ-Ñ.Ô.Ð.Ø"#§+¢+¡-¤-�”�ð #$�”�àˆDŒOàˆŒ
ÝŒ?ð 	.Ý˜d¥HÑ-Ô-Ð-Ð-Ð-Ý�}Ñ%Ô%ð 	)ð 	)ˆAÝ!¨dÀÐCÑCÔCˆIØ�OŠOÑÔÐØŒJ×Ò˜iÑ(Ô(Ð(Ð(ð	ð 	ð 	ð ˆŒˆˆr   c                óð   — | j         }d| _        |j        dk     rt          d¦  «         dS |                     ¦   «         | _        |                     ¦   «         | _        |                     ¦   «         | _        dS )z'
        Pedal
        3 bytes
        ÚPedalrs   z/Pedal on version below 170 is not yet supportedN)rã   rì   r"   ry   rX   rî   rí   r   r2  s     r   ÚpedalzNWCObject.pedal–  sd   € ð
 ÔˆØˆŒ	ØŒ9�sŠ?ˆ?ÝÐCÑDÔDÐDÐDÐDà—{’{‘}”}ˆDŒHØŸ[š[™]œ]ˆDŒNØŸš™œˆDŒJˆJˆJr   c                óì   — | j         }d| _        |j        dk    r3|                     ¦   «         | _        |                     ¦   «         | _        nd| _        d| _        |                     ¦   «         | _        dS )z&
        Flow
        4 bytes
        ÚFlowDirrs   iøÿÿÿr   N)rã   rì   r"   rX   rî   rí   rU   r   r2  s     r   ÚflowDirzNWCObject.flowDir¤  sa   € ð
 ÔˆØˆŒ	ØŒ9˜ÒÐØ—{’{‘}”}ˆDŒHØŸ[š[™]œ]ˆDŒNˆNàˆDŒHØ!ˆDŒNà—]’]‘_”_ˆŒ
ˆ
ˆ
r   c                óV  — | j         }d| _        |                     ¦   «         | _        |                     ¦   «         | _        |j        dk    r|                     d¦  «        | _        dS |j        dk    r|                     d¦  «        | _        dS |                     d¦  «        | _        dS )z4
        Midi Instructions
        34 bytes
        ÚMPCrt   r”   rr   é   N)rã   rì   rX   rî   rí   r"   r`   rñ   r2  s     r   ÚmpczNWCObject.mpc´  sˆ   € ð
 ÔˆØˆŒ	Ø—;’;‘=”=ˆŒØŸš™œˆŒØŒ9˜ÒÐØŸš R™œˆDŒJˆJˆJØŒY˜Š_ˆ_ØŸš R™œˆDŒJˆJˆJàŸš R™œˆDŒJˆJˆJr   c                óê  — | j         }d| _        |j        dk    rf|                     ¦   «         | _        |                     ¦   «         | _        |                     ¦   «         | _        |                     ¦   «         | _        dS |                     ¦   «         | _        | j        dz  | _        |                     ¦   «         | _        |                     ¦   «         | _        |                     ¦   «         | _        dS )z1
        Tempo variation
        4 bytes
        ÚTempoVariationrs   é   N)rã   rì   r"   rX   rî   rí   r   rô   r2  s     r   ÚtempoVariationzNWCObject.tempoVariationÄ  s®   € ð
 ÔˆØ$ˆŒ	ØŒ9˜ÒÐØ—{’{‘}”}ˆDŒHØŸ[š[™]œ]ˆDŒNØŸš™œˆDŒJØŸš™œˆDŒJˆJˆJàŸš™œˆDŒJØœ dÑ*ˆDŒJØ—{’{‘}”}ˆDŒHØŸ[š[™]œ]ˆDŒNØŸš™œˆDŒJˆJˆJr   c                óÞ   — | j         }d| _        |                     ¦   «         | _        |j        dk    r|                     ¦   «         | _        nd| _        |                     ¦   «         | _        dS )z3
        Dynamic variation
        3 bytes
        ÚDynamicVariationrs   r   N©rã   rì   rX   rî   r"   rí   r   r2  s     r   ÚdynamicVariationzNWCObject.dynamicVariation×  sZ   € ð
 ÔˆØ&ˆŒ	Ø—;’;‘=”=ˆŒØŒ9˜ÒÐØŸ[š[™]œ]ˆDŒNˆNàˆDŒNØ—[’[‘]”]ˆŒ
ˆ
ˆ
r   c                óÞ   — | j         }d| _        |                     ¦   «         | _        |j        dk    r|                     ¦   «         | _        nd| _        |                     ¦   «         | _        dS )z-
        Performance
        3 bytes
        ÚPerformancers   r   Nrw  r2  s     r   ÚperformancezNWCObject.performanceå  sZ   € ð
 ÔˆØ!ˆŒ	Ø—;’;‘=”=ˆŒØŒ9˜ÒÐØŸ[š[™]œ]ˆDŒNˆNàˆDŒNØ—[’[‘]”]ˆŒ
ˆ
ˆ
r   c                ó  ‡ — ‰ j         }d‰ _        |                     ¦   «         ‰ _        |                     ¦   «         ‰ _        |                     ¦   «         ‰ _        |                     ¦   «         ‰ _        ˆ fd„}‰ j        �	|‰ _	        dS dS )z?
        Text
        3 bytes + null terminated string
        ÚTextc                ór   •— d| j                              d¦  «        z   dz   t          ‰j        ¦  «        z   }|S )Nz|Text|Text:r�   r\  )r  rž   rÅ   rî   )rê   r  r<   s     €r   rŸ   zNWCObject.textObj.<locals>.dump   s9   ø€ Ø! J¤O×$:Ò$:¸9Ñ$EÔ$EÑEÈÑOÕRUÐVZÔV^ÑR_ÔR_Ñ_ˆEØˆLr   N)
rã   rì   r]   rî   rX   rð   rú   rg   r  rÆ   r  s   `  r   ÚtextObjzNWCObject.textObjó  sŠ   ø€ ð
 ÔˆØˆŒ	Ø×$Ò$Ñ&Ô&ˆŒØ—K’K‘M”MˆŒ	à—K’K‘M”MˆŒ	Ø—K’K‘M”MˆŒ	ð	ð 	ð 	ð 	ð 	ð Œ9Ð Ø"ˆDŒOˆOˆOð !Ð r   c                ód  — |                       ¦   «          d| _        t          j        rt	          | t
          ¦  «        sJ ‚t          | | j        ¬¦  «        }| j        d         |_	        | j        |_
        |                     ¦   «         |_        | j
                             |¦  «         d„ }|| _        dS )z-
        Rest chord
        10 bytes
        ÚRestChordMemberrá   r   c                óÐ  — d}i }| j         D ]h}|                     |j        ¦  «        €
g ||j        <   ||j                                      |j        t          |j        ¦  «        z   |j        z   ¦  «         Œid}|D ]l}|t          |¦  «        dz
  k    r(|d|z   dz   d 	                    ||         ¦  «        z   z  }n'|d|z   dz   d 	                    ||         ¦  «        z   z  }|dz  }Œm|S )	NrZ  r   r   z|Dur2:z|Pos2:r]  r[  r\  )
rò   rO  rù   rŒ   r  rÅ   rî   r  rÐ   r^  )rê   r  r_  rÌ   rŽ   r`  s         r   rŸ   z'NWCObject.restChordMember.<locals>.dump  sÿ   € ØˆEØˆEØÔ%ð Vð V�Ø—9’9˜Qœ]Ñ+Ô+Ð3Ø+-�E˜!œ-Ñ(à�a”mÔ$×+Ò+¨A¬O½cÀ!Ä%¹j¼jÑ,HÈ1Ì9Ñ,TÑUÔUÐUÐUàˆAØð ð �Ø�˜E™
œ
 Q™Ò&Ð&Ø˜X¨™\¨HÑ4°s·x²xÀÀaÄÑ7IÔ7IÑIÑI�E�Eà˜W q™[¨7Ñ2°S·X²X¸eÀA¼hÑ5GÔ5GÑGÑG�EØ�Q‘��àˆLr   N)rf  rì   ra  rb  rc  r‹   rä   rã   rñ   rø   rò   rH  rù   rŒ   rÆ   )r<   rV  rŸ   s      r   ÚrestChordMemberzNWCObject.restChordMember  s®   € ð
 	×ÒÑÔÐØ%ˆŒ	ÝŒ?ð 	.Ý˜d¥HÑ-Ô-Ð-Ð-Ð-Ý T¸Ô8IÐJÑJÔJˆØœ
 1œˆŒØ”ZˆŒ
Ø×4Ò4Ñ6Ô6ˆÔØŒ
×Ò˜$ÑÔÐð	ð 	ð 	ð& ˆŒˆˆr   N)râ   r‹   rã   r   )r   r   r   r­   r>   rE   r  r$  r*  r.  r3  r8  r<  r?  rH  rR  rV  rf  ri  rl  rp  rt  rx  r{  r  rƒ  r  r   r   r   rä   rä   ë  s±  € € € € € ðð ð.,ð .,ð .,ð .,ð`ð ð ð*ð ð ð6ð ð ð<ð ð ð,ð ð ð	ð 	ð 	ðð ð ð$ð ð ð**ð *ð *ð &ð &ð &ðPJð Jð JðXð ð ð,/ð /ð /ðf'ð 'ð 'ð%ð %ð %ð )ð )ð )ð 'ð 'ð 'ð&#ð #ð #ð#ð #ð #ð#ð #ð #ð*"ð "ð "ðN ØØØØØØØØØØ!ØØØØ Ø"ØØØ!ð%€J€J€Jr   rä   Ú__main__)r­   Ú
__future__r   ÚpathlibrN   Útypingra  r   Úmusic21r   r   r¨   r   ÚEnvironmentrÖ   r	   ÚMusic21Exceptionr   r   r‹   rä   r   ÚmainTestr   r   r   ú<module>rŒ     s¾  ððtð tðj #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  à (Ð (Ð (Ð (Ð (Ð (à&ˆ{Ô&Ð'=Ñ>Ô>€ðð ð ð ð ˆyñ ô ð ð	ð 	ð 	ð 	ð 	¨Ô)Fñ 	ô 	ð 	ðVð Vð Vð Vð Vñ Vô Vð Vðr
vð vð vð vð vñ vô vð vðrW	ð W	ð W	ð W	ð W	ñ W	ô W	ð W	ðt ˆzÒÐØ€N€N€NØ€GÔÑÔÐÐÐð Ðr   