§
    ƒØjy9  ã                  ó^  — 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  ej        d¦  «        Z G d„ de	j        ¦  «        Z ej        dd¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        ZdeeegZde
j        e
j        egZdZdZ dZ!dZ"e!e"z   Z#e# $                    ¦   «         Z%e#e%z   Z&dd œd!„Z'dd"œd#„Z(e)d$k    rddlZ ej*        d%¦  «         dS dS )&a'  
The Volpiano font is a specialized font for encoding Western Plainchant
easily with immediate visual feedback (see the CANTUS database).

This module parses chants encoded in Volpiano and can generate Volpiano
from any music21 Stream.

This module will move to a medren package hopefully by v7
é    )ÚannotationsN)Úbar)Úbase)Úclef)Úenvironment)Úexceptions21)Úlayout)Únote)Úpitch)Úspanner)Ústreamzvolpiano.pyc                  ó   — e Zd ZdS )ÚVolpianoExceptionN)Ú__name__Ú
__module__Ú__qualname__© ó    ú…/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/volpiano.pyr   r   %   s   € € € € € Ø€Dr   r   Ú
ErrorLevelzWARN LOGc                  ó   — e Zd ZdZdS )ÚNeumez\
    A spanner that represents a Neume.  No name of the neume, just that it is a Neume.
    N©r   r   r   Ú__doc__r   r   r   r   r   .   s   € € € € € ðð ð ð r   r   c                  ó   — e Zd ZdZdS )Ú	LineBreakz`
    Indicates that the line breaks at this point in the manuscript.

    Denoted by one 7.
    Nr   r   r   r   r   r   4   ó   € € € € € ðð ð
 	€Dr   r   c                  ó   — e Zd ZdZdS )Ú	PageBreakz`
    Indicates that the page breaks at this point in the manuscript

    Denoted by two 7s.
    Nr   r   r   r   r   r   =   r   r   r   c                  ó   — e Zd ZdZdS )ÚColumnBreakzb
    Indicates that the page breaks at this point in the manuscript

    Denoted by three 7s.
    Nr   r   r   r   r!   r!   F   r   r   r!   Ú9abcdefghjklmnopqrsz)ABCDEFGHJKLMNOPQRSÚwxÚiyzF)ÚbreaksToLayoutc               óˆ  — t          j        ¦   «         }t          j        ¦   «         }|}d}d}t          j        ¦   «         }d}d}	d}
| D �]/}|dk    r|dz  }Œ|dk    rY|st
          |         } |¦   «         }n*t          |         }|dk     r |d¬¦  «        }n
 |¦   «         }|                     |¦  «         d}|d	k    rd}|r|                     |¦  «         d}Œ’|d
v rd}d}|dv rE|dk    rt          j        ¦   «         }nt          j        ¦   «         }|}|                     |¦  «         Œã|dv rQt          j
        ¦   «         }|dk    rd|_        ||_        |                     |¦  «         t          j        ¦   «         }�Œ8|t          v s
|t          v �r&t          j        ¦   «         }d|_        |t          v r*t                               |¦  «        dz
  }d|j        _        n0t                               |¦  «        dz
  }d|_        d|j        _        |j        }||z   }||j        _        |j        j        dk    r!|	rt/          j        d¦  «        |j        _        n0|j        j        dk    r |
rt/          j        d¦  «        |j        _        |                     |¦  «         |�t9          ||g¦  «        }d}�Œm|}�Œq|t:          v rµ|                     ¦   «         t>          v r|t@          v rd}
�Œ¢|                     ¦   «         tB          v r|t@          v rd}	�ŒÊ|                     ¦   «         t>          v r|tD          v rd}
�Œò|                     ¦   «         tB          v r|tD          v rd}	�ŒtG          d|z   dz   ¦  «        ‚�Œ1|dk    r,t
          |         } |¦   «         }|                     |¦  «         |r|                     |¦  «         |S )a   
    Returns a music21 Part from volpiano text.

    >>> veniSancti = volpiano.toPart('1---c--d---f--d---ed--c--d---f'
    ...                              '---g--h--j---hgf--g--h---')
    >>> veniSancti.show('text')
    {0.0} <music21.stream.Measure 0 offset=0.0>
        {0.0} <music21.clef.TrebleClef>
        {0.0} <music21.note.Note C>
        {1.0} <music21.note.Note D>
        {2.0} <music21.note.Note F>
        {3.0} <music21.note.Note D>
        {4.0} <music21.note.Note E>
        {5.0} <music21.note.Note D>
        {6.0} <music21.volpiano.Neume <music21.note.Note E><music21.note.Note D>>
        {6.0} <music21.note.Note C>
        {7.0} <music21.note.Note D>
        {8.0} <music21.note.Note F>
        {9.0} <music21.note.Note G>
        {10.0} <music21.note.Note A>
        {11.0} <music21.note.Note B>
        {12.0} <music21.note.Note A>
        {13.0} <music21.note.Note G>
        {14.0} <music21.note.Note F>
        {15.0} <music21.volpiano.Neume <music21.note.Note A><music21.note.Note G>>
        {15.0} <music21.note.Note G>
        {16.0} <music21.note.Note A>

    Clefs!

    >>> clefTest = volpiano.toPart('1---c--2---c')
    >>> clefTest.show('text')
    {0.0} <music21.stream.Measure 0 offset=0.0>
        {0.0} <music21.clef.TrebleClef>
        {0.0} <music21.note.Note C>
        {1.0} <music21.clef.BassClef>
        {1.0} <music21.note.Note E>
    >>> for n in clefTest.recurse().notes:
    ...     n.nameWithOctave
    'C4'
    'E2'

    Flats and Naturals:

    >>> accTest = volpiano.toPart('1---e--we--e--We--e')
    >>> [n.name for n in accTest.recurse().notes]
    ['E', 'E-', 'E-', 'E', 'E']

    Breaks and barlines

    >>> breakTest = volpiano.toPart('1---e-7-e-77-e-777-e-3-e-4')
    >>> breakTest.show('text')
    {0.0} <music21.stream.Measure 0 offset=0.0>
        {0.0} <music21.clef.TrebleClef>
        {0.0} <music21.note.Note E>
        {1.0} <music21.volpiano.LineBreak object at 0x105250fd0>
        {1.0} <music21.note.Note E>
        {2.0} <music21.volpiano.PageBreak object at 0x105262128>
        {2.0} <music21.note.Note E>
        {3.0} <music21.volpiano.ColumnBreak object at 0x105262240>
        {3.0} <music21.note.Note E>
        {4.0} <music21.bar.Barline type=regular>
    {4.0} <music21.stream.Measure 0 offset=4.0>
        {0.0} <music21.note.Note E>
        {1.0} <music21.bar.Barline type=double>

    As layout objects using breaksToLayout=True

    >>> breakTest = volpiano.toPart('1---e-7-e-77-e-777-e-3-e-4', breaksToLayout=True)
    >>> breakTest.show('text')
    {0.0} <music21.stream.Measure 0 offset=0.0>
        {0.0} <music21.clef.TrebleClef>
        {0.0} <music21.note.Note E>
        {1.0} <music21.layout.SystemLayout>
        {1.0} <music21.note.Note E>
        {2.0} <music21.layout.PageLayout>
        {2.0} <music21.note.Note E>
        {3.0} <music21.volpiano.ColumnBreak object at 0x105262240>
        {3.0} <music21.note.Note E>
        {4.0} <music21.bar.Barline type=regular>
    {4.0} <music21.stream.Measure 0 offset=4.0>
        {0.0} <music21.note.Note E>
        {1.0} <music21.bar.Barline type=double>

    Liquescence test:

    >>> breakTest = volpiano.toPart('1---e-E-')
    >>> breakTest.recurse().notes[0].editorial.liquescence
    False
    >>> breakTest.recurse().notes[0].notehead
    'normal'
    >>> breakTest.recurse().notes[1].editorial.liquescence
    True
    >>> breakTest.recurse().notes[1].notehead
    'x'

    * Changed in v5.7: corrected spelling of liquescence.
    Nr   FÚ7é   é   T)ÚisNewú-Ú1234Ú12Ú1Ú34Ú4ÚdoubleÚnoStemé   ÚxÚBÚflatÚEzUnknown accidental: z: Should not happen)$r   ÚPartÚMeasurer   Ú
TrebleClefÚclassByNumBreakTokensÚclassByNumBreakTokensLayoutÚappendÚBassClefr   ÚBarlineÚtypeÚrightBarlineÚnormalPitchesÚliquescentPitchesr
   ÚNoteÚstemDirectionÚindexÚ	editorialÚliquescenceÚnoteheadÚ
lowestLiner   ÚdiatonicNoteNumÚstepÚ
AccidentalÚ
accidentalr   ÚaccidentalTokensÚlowerÚeflatTokensÚnaturalTokensÚbflatTokensÚ
flatTokensr   )ÚvolpianoTextr%   ÚpÚmÚcurrentMeasureÚcurrentNeumeSpannerÚnoteThatWouldGoInSpannerÚlastClefÚcontinuousNumberOfBreakTokensÚbIsFlatÚeIsFlatÚtokenÚ
breakClassÚ
breakTokenÚcÚblÚnÚdistanceFromLowestLineÚclefLowestLinerK   s                       r   ÚtoPartrg   \   s  € õH 	Œ‰Œ€AÝŒÑÔ€Aà€NØÐØ#ÐÝŒÑ Ô €HØ$%Ð!ð €GØ€Gàð WLñ WLˆØ�CŠ<ˆ<Ø)¨QÑ.Ð)ØØ*¨QÒ.Ð.Ø!ð .Ý2Ð3PÔQ�
Ø'˜Z™\œ\�
�
å8Ð9VÔW�
Ø0°1Ò4Ð4Ø!+ °$Ð!7Ñ!7Ô!7�J�Jà!+ ¡¤�Jà×!Ò! *Ñ-Ô-Ð-à()Ð%à�CŠ<ˆ<Ø'+Ð$Ø"ð +Ø×%Ò%Ð&9Ñ:Ô:Ð:Ø&*Ð#Øà�Fˆ?ˆ?Ø'+Ð$Ø"&Ðà�Dˆ=ˆ=Ø˜Š|ˆ|Ý”OÑ%Ô%��å”M‘O”O�àˆHØ�HŠH�Q‰KŒKˆKˆKà�dˆ]ˆ]Ý”‘”ˆBØ˜Š|ˆ|Ø"�”ØˆAŒNØ�HŠH�Q‰KŒKˆKÝ”Ñ Ô ˆA‰Aà•mÐ#Ð# uÕ0AÐ'AÑ'AÝ”	‘”ˆAØ&ˆAŒOà�Ð%Ð%Ý)6×)<Ò)<¸UÑ)CÔ)CÀaÑ)GÐ&Ø*/�”Ô'Ð'å):×)@Ò)@ÀÑ)GÔ)GÈ!Ñ)KÐ&Ø �”
Ø*.�”Ô'à%Ô0ˆNØ,Ð/EÑEˆOà&5ˆAŒGÔ#ØŒwŒ|˜sÒ"Ð" wÐ"Ý%*Ô%5°fÑ%=Ô%=�”Ô"Ð"Ø”” Ò$Ð$¨Ð$Ý%*Ô%5°fÑ%=Ô%=�”Ô"à�HŠH�Q‰KŒKˆKà'Ð3Ý&+Ð-EÀqÐ,IÑ&JÔ&JÐ#Ø+/Ð(Ñ(à+,Ð(Ñ(àÕ&Ð&Ð&Ø�{Š{‰}Œ}¥Ð+Ð+°½Ð0FÐ0FØ�‘Ø—’‘”¥+Ð-Ð-°%½=Ð2HÐ2HØ�‘Ø—’‘”¥+Ð-Ð-°%½:Ð2EÐ2EØ�‘Ø—’‘”¥+Ð-Ð-°%½:Ð2EÐ2EØ�‘å'Ø*¨UÑ2Ð5JÑJñLô Lð Lñ 'ð % qÒ(Ð(Ý*Ð+HÔIˆ
Ø�Z‘\”\ˆ
Ø×Ò˜jÑ)Ô)Ð)àð Ø	�Š�‰Œˆà€Hr   )ÚlayoutToBreaksc               ó
  ‡‡‡‡— g Št           j        fd„Šˆfd„Šˆfd„}dddddd	œŠd.ˆˆˆfd„	}t          j        ¦   «         }d
}d
}|                      ¦   «         D �]}|j        }d|v r9|}d|v r ‰d¦  «         Œ d|v r ‰d¦  «         Œ0 ‰|t           j        ¦  «         ŒGd|v r!|j        dv r ‰d¦  «         Œ` ‰d¦  «         Œld|v �r|}	|	j        }
|
j	        }||j
        z
  }|dz   }|dk     s|t          t          ¦  «        k    r ‰|	t           j        ¦  «         ŒÅ|	j        dk    s|	j        r#d|	j        v r|	j        j        rt"          |         }nt          |         }|
j        �¥|
j        j        dk    r•|
j        dvr# ‰|t           j        ¦  «          ‰|¦  «         �ŒJ|
j        j        dk    r# ‰|t           j        ¦  «          ‰|¦  «         �Œ}|
j        dk    r|s ||¦  «         d}nT|
j        dk    r|s ||¦  «         d}n9|
j        dk    r|r ||d¬¦  «         d
}n|
j        dk    r|r ||d¬¦  «         d
} ‰|¦  «         |	                     d ¦  «        }|r|	|d                              ¦   «         ur�Œ,|	j        s ‰d!¦  «         �Œ@|	j        d         }|j        }|d"v r ‰d#¦  «         �Œe ‰d$¦  «         �Œrd%|v r|r |¦   «           ‰d&¦  «         �Œ�d'|v r|r |¦   «           ‰d(¦  «         �Œ¬d)|v r |¦   «           ‰d&¦  «         �ŒÇd*|v r |¦   «           ‰d(¦  «         �Œâd+|v r |¦   «           ‰d,¦  «         �Œý ‰|t           j        ¦  «         �Œd-                     ‰¦  «        S )/a  
    Convert a Stream to Volpiano.

    These tests show how the same input converts back out:

    >>> volpianoInput = '1--c--d---f--d---ed--c--d---f---g--h--j---hgf--g--h---'
    >>> veniSancti = volpiano.toPart(volpianoInput)
    >>> volpiano.fromStream(veniSancti)
    '1---c-d-f-d-ed-c-d-f-g-h-j-hg-f-g-h-'

    >>> breakTest = volpiano.toPart('1---e-E--')
    >>> volpiano.fromStream(breakTest)
    '1---e-E-'

    >>> accTest = volpiano.toPart('1---e--we--e--We--e')
    >>> volpiano.fromStream(accTest)
    '1---e-we-e-We-e-'
    c                ó¤   — d| ›d�}|t           j        k    rt                               |dz   ¦  «         d S t                               |¦  «         d S )NzCould not convert token z to Volpiano.z! this can lead to incorrect data.)r   ÚWARNÚenvironLocalÚwarnÚ
printDebug)ÚinnerElÚ
errorLevelÚmsgs      r   ÚerrorzfromStream.<locals>.errorI  sY   € ØA¨ÐAÐAÐAˆØ�œÒ(Ð(Ý×Ò˜cÐ$GÑGÑHÔHÐHÐHÐHå×#Ò# CÑ(Ô(Ð(Ð(Ð(r   c                ó<   •— | D ]}‰                      |¦  «         Œd S )N)r=   )ÚtokensÚtÚvolpianoTokenss     €r   ÚapzfromStream.<locals>.apP  s3   ø€ Øð 	%ð 	%ˆAØ×!Ò! !Ñ$Ô$Ð$Ð$ð	%ð 	%r   c                 ót   •— ‰ r0‰ d         dk    r(‰                       ¦   «          ‰ r‰ d         dk    °"d S d S d S d S )Néÿÿÿÿr+   )Úpop)rv   s   €r   Ú
popHyphenszfromStream.<locals>.popHyphensT  se   ø€ Øð 	! °Ô!3°sÒ!:Ð!:Ø×ÒÑ Ô Ð ð ð 	! °Ô!3°sÒ!:Ð!:Ð!:Ð!:ð 	!ð 	!ð 	!ð 	!Ð!:Ð!:r   ÚyÚwÚir4   Úz)éýÿÿÿr   é   é   é   Fc                ó˜   •— | ‰vr ‰| › d�t           j        ¦  «         d S ‰|          }|r|                     ¦   «         } ‰|¦  «         d S )Nz above lowest line)r   rk   Úupper)ÚdistÚ
setNaturalÚaccidentalTokenrw   ÚdistToAccidentalrr   s      €€€r   ÚsetAccFromPitchz#fromStream.<locals>.setAccFromPitcha  sj   ø€ ØÐ'Ð'Ð'ØˆE�TÐ-Ð-Ð-­z¬Ñ?Ô?Ð?ØˆFØ*¨4Ô0ˆØð 	6Ø-×3Ò3Ñ5Ô5ˆOØ
ˆˆ?ÑÔÐÐÐr   ÚClefr:   z1---r>   z2---r?   )r1   Úfinalz---4z---3rD   r3   r   rH   N)r5   r7   ry   r5   Tr7   )r‡   r   r+   )ÚsingleÚendz---z--ÚSystemLayoutz7---Ú
PageLayoutz77---r   r   r!   z777---Ú )F)r   ÚLOGr   r:   ÚrecurseÚclassesrk   r@   r   rK   rJ   ÚlenrB   rI   ÚhasEditorialInformationrG   rH   rC   rN   ÚalterrL   ÚnameÚgetSpannerSitesÚgetLastÚlyricÚlyricsÚsyllabicÚjoin)Úsrh   r{   rŠ   r[   r]   r^   ÚelÚ	elClassesrd   rV   Údnnre   ÚindexInPitchStringÚ	tokenNameÚneumeSpannerÚlyricObjectÚsylrw   r‰   rr   rv   s                     @@@@r   Ú
fromStreamr¨   3  sÄ  øøøø€ ð( €Nå",¤.ð )ð )ð )ð )ð%ð %ð %ð %ð %ð!ð !ð !ð !ð !ð ØØØØðð Ððð ð ð ð ð ð ð õ ŒÑ Ô €Hà€GØ€Gà�iŠi‰kŒkð W&ñ W&ˆØ”Jˆ	Ø�YÐÐØˆHØ˜yÐ(Ð(Ø��6‘
”
�
�
Ø˜yÐ(Ð(Ø��6‘
”
�
�
à��b�*œ/Ñ*Ô*Ð*Ð*à˜)Ð#Ð#ØŒwÐ-Ð-Ð-Ø��6‘
”
�
�
à��6‘
”
�
�
à�yÐ Ñ ØˆAØ”ˆAØÔ#ˆCØ%(¨8Ô+>Ñ%>Ð"Ø!7¸!Ñ!;ÐØ! AÒ%Ð%Ð);½sÅ=Ñ?QÔ?QÒ)QÐ)QØ��a�œÑ)Ô)Ð)ØàŒz˜SÒ Ð  QÔ%>Ð Ø*7¸1¼;Ð*FÐ*FØ*+¬+Ô*Að +Gå-Ð.@ÔA�	�	å)Ð*<Ô=�	àŒ|Ð'¨A¬LÔ,>À!Ò,CÐ,CØ”6 Ð+Ð+Ø�E˜"�jœoÑ.Ô.Ð.Ø�B�y‘M”M�MÙØ”\Ô'¨2Ò-Ð-Ø�E˜"�jœoÑ.Ô.Ð.Ø�B�y‘M”M�MÙà”6˜S’=�=¨�=Ø#�OÐ$:Ñ;Ô;Ð;Ø"�G�GØ”V˜s’]�]¨7�]Ø#�OÐ$:Ñ;Ô;Ð;Ø"�GøØ”˜3’� 7�Ø�Ð 6À4ÐHÑHÔHÐHØ��Ø”˜3’� 7�Ø�Ð 6À4ÐHÑHÔHÐHØ�ØˆBˆy‰MŒMˆMà×,Ò,¨WÑ5Ô5ˆLØð 
 ¨°a¬×)@Ò)@Ñ)BÔ)BÐ BÐ BÙØ”Wð Ø��3‘”�‘àœh qœk�Ø!Ô*�ØÐ+Ð+Ð+Ø�B�u‘I”I�I‘Ià�B�t‘H”H�H‘Hà˜yÐ(Ð(¨^Ð(ØˆJ‰LŒLˆLØˆBˆv‰JŒJˆJ‰JØ˜YÐ&Ð&¨>Ð&ØˆJ‰LŒLˆLØˆBˆw‰KŒKˆK‰KØ˜IÐ%Ð%ØˆJ‰LŒLˆLØˆBˆv‰JŒJˆJ‰JØ˜IÐ%Ð%ØˆJ‰LŒLˆLØˆBˆw‰KŒKˆK‰KØ˜iÐ'Ð'ØˆJ‰LŒLˆLØˆBˆx‰LŒLˆL‰LàˆE�"•j”nÑ%Ô%Ð%Ñ%à�7Š7�>Ñ"Ô"Ð"r   Ú__main__ÚimportPlusRelative)+r   Ú
__future__r   ÚenumÚmusic21r   r   r   r   r   r	   r
   r   r   r   ÚEnvironmentrl   ÚMusic21Exceptionr   ÚEnumr   ÚSpannerr   ÚMusic21Objectr   r   r!   r;   r�   r�   r<   rB   rC   rQ   rS   rT   r…   rR   rO   rg   r¨   r   ÚmainTestr   r   r   ú<module>r´      sÊ  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à&ˆ{Ô& }Ñ5Ô5€ð	ð 	ð 	ð 	ð 	˜Ô5ñ 	ô 	ð 	ð ˆTŒY�| ZÑ0Ô0€
ðð ð ð ð ˆGŒOñ ô ð ð	ð 	ð 	ð 	ð 	�Ô"ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	�Ô"ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	�$Ô$ñ 	ô 	ð 	ð ˜y¨)°[ÐAÐ Ø# VÔ%8¸&Ô:KÈ[ÐYÐ à%€Ø)Ð à€Ø€Ø˜;Ñ&€
Ø× Ò Ñ"Ô"€Ø Ñ-Ð ð ,1ð Sð Sð Sð Sð Sðn %*ð U#ð U#ð U#ð U#ð U#ðp ˆzÒÐØ€N€N€Nð €GÔÐ)Ñ*Ô*Ð*Ð*Ð*ð	 Ðr   