§
    ƒØj/S  ã                  óØ  — d dl mZ d dl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mZmZ  ej        d¦  «        Z G d	„ d
ej        ¦  «        Zeeef         Zeedf         Zeeedf         df         ZdZ ee¦  «        Z ed¦  «        d.d„¦   «         Z ed¦  «        d/d„¦   «         Z  ed¦  «        d0d„¦   «         Z! ed¦  «        d1d„¦   «         Z" ed¦  «        d2d„¦   «         Z# ed¦  «        d3d„¦   «         Z$d4d#„Z%d4d$„Z&d5d&„Z'd5d'„Z(d6d)„Z)d5d*„Z* ed¦  «        d7d+„¦   «         Z+ ed¦  «        d7d,„¦   «         Z,e-d-k    rd dl	Z	 e	j.        ¦   «          dS dS )8é    )ÚannotationsN)Ú	lru_cache)Úcommon)ÚMeterDivision)Úenvironment)ÚMeterExceptionÚMusic21ExceptionÚTimeSignatureExceptionzmeter.toolsc                  ó.   — e Zd ZU ded<   ded<   ded<   dS )ÚMeterTerminalTupleÚintÚ	numeratorÚdenominatorr   ÚdivisionN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    úˆ/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/meter/tools.pyr   r      s3   € € € € € € Ø€N€N�NØÐÐÑØÐÐÑÐÐr   r   .)é   é   é   é   é   é    é@   é€   i   ÚvalueÚstrÚreturnc                óB  — t          j        | d¬¦  «        \  }}|                     ¦   «         }|st          j        }nf|                     ¦   «         }d|                     ¦   «         v rt          j        }n/d|                     ¦   «         v rt          j        }nt          j        }t          j	        d|¦  «        }|�Ut          |                     d¦  «        ¦  «        }t          |                     d¦  «        ¦  «        }t          |||¦  «        S t          d	| › �¦  «        ‚)
aí  
    Returns a three-element MeterTerminalTuple of numerator, denominator, and optional
    division of the meter.

    >>> meter.tools.slashToTuple('3/8')
    MeterTerminalTuple(numerator=3, denominator=8, division=<MeterDivision.NONE>)
    >>> meter.tools.slashToTuple('7/32')
    MeterTerminalTuple(numerator=7, denominator=32, division=<MeterDivision.NONE>)
    >>> meter.tools.slashToTuple('slow 6/8')
    MeterTerminalTuple(numerator=6, denominator=8, division=<MeterDivision.SLOW>)
    z0123456789/.)ÚnumbersÚslowÚfastz(\d+)/(\d+)Nr   r   z1slashToTuple() cannot find two part fraction for )r   ÚgetNumFromStrÚstripr   ÚNONEÚlowerÚSLOWÚFASTÚreÚmatchr   Úgroupr   r   )r    ÚvalueNumbersÚ
valueCharsr   ÚmatchesÚnÚds          r   ÚslashToTupler5   (   s  € õ  &Ô3°EØ<Jð Lñ  Lô  LÑ€L�*à×%Ò%Ñ'Ô'€LØð 	*Ý Ô%ˆˆà×%Ò%Ñ'Ô'ˆ
Ø�Z×%Ò%Ñ'Ô'Ð'Ð'Ý$Ô)ˆHˆHØ�z×'Ò'Ñ)Ô)Ð)Ð)Ý$Ô)ˆHˆHå$Ô)ˆHåŒh�~ |Ñ4Ô4€GØÐÝ�—’˜aÑ Ô Ñ!Ô!ˆÝ�—’˜aÑ Ô Ñ!Ô!ˆÝ! ! Q¨Ñ1Ô1Ð1å
ÐTÈUÐTÐTÑ
UÔ
UÐUr   ÚNumDenomTuplec                ó  — g }|                       ¦   «         } |                      d¦  «        }|D ]C}	 t          |¦  «        }|                     |j        |j        f¦  «         Œ4# t          $ r Y Œ@w xY wt          |¦  «        S )at  
    Change a compount meter into a list of simple numberator, demoninator values

    >>> meter.tools.slashCompoundToFraction('3/8+2/8')
    ((3, 8), (2, 8))
    >>> meter.tools.slashCompoundToFraction('5/8')
    ((5, 8),)
    >>> meter.tools.slashCompoundToFraction('5/8+2/4+6/8')
    ((5, 8), (2, 4), (6, 8))

    * Changed in v7: new location and returns a tuple.
    ú+)r(   Úsplitr5   Úappendr   r   r   Útuple)r    ÚpostÚ	valueListÚpartÚms        r   ÚslashCompoundToFractionr@   M   s’   € ð €DØ�KŠK‰MŒM€EØ—’˜CÑ Ô €IØð ð ˆð	Ý˜TÑ"Ô"ˆAØ�KŠK˜œ a¤mÐ4Ñ5Ô5Ð5Ð5øÝð 	ð 	ð 	ØˆDð	øøøå�‰;Œ;Ðs   ±0A"Á"
A/Á.A/ÚvalueSrcútuple[NumDenomTuple, bool]c                óŠ  — g }d}|                       ¦   «                              d¦  «        }|D ]§}d|v rY	 t          |¦  «        }n&# t          $ r}t	          d| › d�¦  «        |‚d}~ww xY w|                     |j        |j        f¦  «         Œ_	 |                     t          |¦  «        df¦  «         d}Œ‡# t          $ r t          d| › d	�¦  «        ‚w xY wg }t          |¦  «        D ]L\  }\  }	}
|
€+||d
z   d…         D ]\  }}|�|}
 nŒt          d| › �¦  «        ‚|                     |	|
f¦  «         ŒMt          |¦  «        |fS )au  
    Given a mixture if possible meter fraction representations, return a tuple
    of two elements: The first element is a tuple of pairs of numerator, denominators
    that are implied by the time signature.

    The second element is False if the value was a simple time signature (like 4/4)
    or a composite meter where all numerators had their own denominators.

    >>> meter.tools.slashMixedToFraction('4/4')
    (((4, 4),), False)

    >>> meter.tools.slashMixedToFraction('3/8+2/8')
    (((3, 8), (2, 8)), False)

    >>> meter.tools.slashMixedToFraction('3+2/8')
    (((3, 8), (2, 8)), True)

    >>> meter.tools.slashMixedToFraction('3+2+5/8')
    (((3, 8), (2, 8), (5, 8)), True)

    >>> meter.tools.slashMixedToFraction('3+2+5/8+3/4')
    (((3, 8), (2, 8), (5, 8), (3, 4)), True)

    >>> meter.tools.slashMixedToFraction('3+2+5/8+3/4+2+1+4/16')
    (((3, 8), (2, 8), (5, 8), (3, 4), (2, 16), (1, 16), (4, 16)), True)

    >>> meter.tools.slashMixedToFraction('3+2+5/8+3/4+2+1+4')
    Traceback (most recent call last):
    music21.exceptions21.MeterException: cannot match denominator to numerator in: 3+2+5/8+3/4+2+1+4

    >>> meter.tools.slashMixedToFraction('3.0/4.0')
    Traceback (most recent call last):
    music21.exceptions21.TimeSignatureException: Cannot create time signature from "3.0/4.0"

    * Changed in v7: new location and returns a tuple as first value.
    Fr8   ú/z#Cannot create time signature from "ú"NTzØCannot parse this file -- this error often comes up if the musicxml pickled file is out of date after a change in musicxml/__init__.py . Clear your temp directory of .p and .p.gz files and try again. Time Signature: ú r   z*cannot match denominator to numerator in: )r(   r9   r5   r   r
   r:   r   r   r   Ú
ValueErrorr	   Ú	enumerater;   )rA   ÚpreÚsummedNumeratorr    r>   ÚtupÚmer<   ÚiÚintNumÚintDenomÚ_Ú	nextDenoms                r   ÚslashMixedToFractionrR   g   sÚ  € ðL ,.€CØ€OØ�NŠNÑÔ×"Ò" 3Ñ'Ô'€EØð 4ð 4ˆØ�$ˆ;ˆ;ðOÝ" 4Ñ(Ô(��øÝ!ð Oð Oð OÝ,ØE¸(ÐEÐEÐEñGô GØLNðOøøøøðOøøøð �JŠJ˜œ s¤Ð7Ñ8Ô8Ð8Ð8ð	4Ø—
’
�C ™IœI tÐ,Ñ-Ô-Ð-Ø"&��øÝð 4ð 4ð 4Ý&ð3ð (0ð	3ð 3ð 3ñ4ô 4ð 4ð4øøøð €Dõ "+¨3¡¤ð 	(ð 	(ÑˆÑˆF�HØÐà"% a¨!¡e f f¤+ð ^ð ^‘��IØÐ(Ø(�HØ�Eð )õ %Ð%\ÐRZÐ%\Ð%\Ñ]Ô]Ð]Ø�Š�V˜XÐ&Ñ'Ô'Ð'Ð'å�‰;Œ;˜Ð'Ð's#   µAÁ
A(ÁA#Á#A(Â&B5Â5CÚfListútuple[tuple[str, int], ...]c                ój  — g }| D ]S\  }}|r4|d         d         |k    r"|d         d                               |¦  «         Œ;|                      |g|f¦  «         ŒTg }|D ]H}d„ |d         D ¦   «         }d                     |¦  «        }|d         }|                      ||f¦  «         ŒIt          |¦  «        S )ab  
    Given a tuple of fraction values, compact numerators by sum if denominators
    are the same

    >>> from music21.meter.tools import fractionToSlashMixed
    >>> fractionToSlashMixed(((3, 8), (2, 8), (5, 8), (3, 4), (2, 16), (1, 16), (4, 16)))
    (('3+2+5', 8), ('3', 4), ('2+1+4', 16))

    * Changed in v7: new location and returns a tuple.
    éÿÿÿÿr   r   c                ó,   — g | ]}t          |¦  «        ‘ŒS r   )r!   )Ú.0Úxs     r   ú
<listcomp>z(fractionToSlashMixed.<locals>.<listcomp>Î   s   € Ð,Ð,Ð,˜q•C˜‘F”FÐ,Ð,Ð,r   r8   )r:   Újoinr;   )	rS   rI   r3   r4   r<   r>   ÚnStrListÚnStrÚdInts	            r   ÚfractionToSlashMixedr_   µ   sÜ   € ð (*€CØð !ð !‰ˆˆ1àð 	!�3�r”7˜1”: ’?�?Ø�ŒG�AŒJ×Ò˜aÑ Ô Ð Ð ð �JŠJ˜˜˜Q�xÑ Ô Ð Ð ð #%€DØð "ð "ˆØ,Ð, D¨¤GÐ,Ñ,Ô,ˆØ�xŠx˜Ñ!Ô!ˆØ�AŒwˆØ�Š�T˜4�LÑ!Ô!Ð!Ð!å�‰;Œ;Ðr   ÚnumDenomTupleÚNumDenomc                óz  — g }g }t          ¦   «         }| D ]D\  }}|                     |¦  «         |                     |¦  «         |                     |¦  «         ŒEt          |¦  «        dk    rt	          |¦  «        }|d         }||fS t          j        |Ž }d}t          ||¦  «        D ]\  }}	||||	z  z  z  }Œ||fS )a²  
    Given a tuple of tuples of numerator and denominator,
    find the sum; does NOT reduce to its lowest terms.

    >>> from music21.meter.tools import fractionSum
    >>> fractionSum(((3, 8), (5, 8), (1, 8)))
    (9, 8)
    >>> fractionSum(((1, 6), (2, 3)))
    (5, 6)
    >>> fractionSum(((3, 4), (1, 2)))
    (5, 4)
    >>> fractionSum(((1, 13), (2, 17)))
    (43, 221)
    >>> fractionSum(())
    (0, 1)

    This method might seem like an easy place to optimize and simplify
    by just doing a fractions.Fraction() sum (I tried!), but not reducing to
    its lowest terms is a feature of this method. 3/8 + 3/8 = 6/8, not 3/4:

    >>> fractionSum(((3, 8), (3, 8)))
    (6, 8)
    r   r   )Úsetr:   ÚaddÚlenÚsumÚmathÚlcmÚzip)
r`   ÚnListÚdListÚdListUniquer3   r4   ÚdRedÚnRedÚnSrcÚdSrcs
             r   ÚfractionSumrq   Ö   sÚ   € ð2 €EØ€EÝ‘%”%€Kàð ð ‰ˆˆ1Ø�Š�Q‰ŒˆØ�Š�Q‰ŒˆØ�Š˜ÑÔÐÐå
ˆ;ÑÔ˜1ÒÐÝ�‰JŒJˆØ�!ŒHˆà�1ˆvˆåŒx˜Ð%ˆàˆÝ˜e UÑ+Ô+ð 	*ð 	*‰JˆD�$Ø�D˜D D™LÑ)Ñ)ˆDˆDØ�dˆ|Ðr   Úfloatc                ól   — t          j        | ¦  «                             d¦  «        }|j        |j        fS )a.  
    Given a floating point proportional value between 0 and 1, return the
    best-fit slash-base fraction up to 16.

    >>> from music21.meter.tools import proportionToFraction
    >>> proportionToFraction(0.5)
    (1, 2)
    >>> proportionToFraction(0.25)
    (1, 4)
    >>> proportionToFraction(0.75)
    (3, 4)
    >>> proportionToFraction(0.125)
    (1, 8)
    >>> proportionToFraction(0.375)
    (3, 8)
    >>> proportionToFraction(0.625)
    (5, 8)
    >>> proportionToFraction(0.333)
    (1, 3)
    >>> proportionToFraction(0.83333)
    (5, 6)
    r   )Ú	fractionsÚFractionÚlimit_denominatorr   r   )r    Úfs     r   ÚproportionToFractionrx     s1   € õ0 	Ô˜5Ñ!Ô!×3Ò3°BÑ7Ô7€AØŒK˜œÐ'Ð'r   r3   r   r4   útuple[str, ...]c                óæ   — g }|t           d         k     rP| dz  }|dz  }|t           d         k    r5|                     |› d|› �¦  «         |dz  }|dz  }|t           d         k    °5t          |¦  «        S )a‹  
    This simply gets restatements of the same fraction in smaller units,
    up to the largest valid denominator.

    >>> meter.tools.divisionOptionsFractionsUpward(2, 4)
    ('4/8', '8/16', '16/32', '32/64', '64/128')
    >>> meter.tools.divisionOptionsFractionsUpward(3, 4)
    ('6/8', '12/16', '24/32', '48/64', '96/128')

    Note that this returns a tuple of strings not MeterOptions
    rV   r   rD   ©ÚvalidDenominatorsr:   r;   ©r3   r4   ÚoptsÚnModÚdMods        r   ÚdivisionOptionsFractionsUpwardr�   &  s�   € ð €DàÕ˜RÔ Ò Ð Ø�1‰uˆØ�1‰uˆØÕ'¨Ô+Ò+Ð+Ø�KŠK˜4Ð(Ð( $Ð(Ð(Ñ)Ô)Ð)Ø�A‰IˆDØ�A‰IˆDð Õ'¨Ô+Ò+Ð+õ �‰;Œ;Ðr   c                ó  — g }|t           d         k    rc| dz  dk    rZ| dz  }|dz  }|t           d         k    r?|                     |› d|› �¦  «         |dz  dk    rn|dz  }|dz  }|t           d         k    °?t          |¦  «        S )a  
    Get restatements of the same fraction in larger units

    >>> meter.tools.divisionOptionsFractionsDownward(2, 4)
    ('1/2',)
    >>> meter.tools.divisionOptionsFractionsDownward(12, 16)
    ('6/8', '3/4')

    Note that this returns a tuple of strings not MeterOptions
    r   r   rD   r{   r}   s        r   Ú divisionOptionsFractionsDownwardrƒ   >  s¬   € ð €DØÕ˜QÔÒÐ A¨¡E¨Q¢J JØ�A‰vˆØ�A‰vˆØÕ'¨Ô*Ò*Ð*Ø�KŠK˜4Ð(Ð( $Ð(Ð(Ñ)Ô)Ð)Ø�a‰x˜1Š}ˆ}ØØ˜1‘9ˆDØ˜1‘9ˆDð Õ'¨Ô*Ò*Ð*õ �‰;Œ;Ðr   ÚMeterOptionsc                ó  — g }|t           d         k     rd| dk    r^d}|dz  }|t           d         k    rF|                     t          | › d|› �g|z  ¦  «        ¦  «         |dz  }|dz  }|t           d         k    °Ft          |¦  «        S )zÑ
    >>> meter.tools.divisionOptionsAdditiveMultiplesDownward(1, 16)
    (('1/32', '1/32'), ('1/64', '1/64', '1/64', '1/64'),
     ('1/128', '1/128', '1/128', '1/128', '1/128', '1/128', '1/128', '1/128'))
    rV   r   r   rD   r{   )r3   r4   r~   rM   r€   s        r   Ú(divisionOptionsAdditiveMultiplesDownwardr†   V  sŸ   € ð €DàÕ˜RÔ Ò Ð  Q¨!¢V VØˆØ�1‰uˆØÕ'¨Ô+Ò+Ð+Ø�KŠK� !˜}˜} d˜}˜}˜o°Ñ1Ñ2Ô2Ñ3Ô3Ð3Ø˜!‘8ˆDØ�‰FˆAð Õ'¨Ô+Ò+Ð+õ �‰;Œ;Ðr   c                óâ   — g }| dk    rY| dz  dk    rPd}|}| |z  }|dk    rAt          |› d|› �g|z  ¦  «        }||vr|                     |¦  «         ||z  }||z  }|dk    °At          |¦  «        S )zÞ
    Additive multiples with the same denominators.

    >>> meter.tools.divisionOptionsAdditiveMultiples(4, 16)
    (('2/16', '2/16'),)
    >>> meter.tools.divisionOptionsAdditiveMultiples(6, 4)
    (('3/4', '3/4'),)
    é   r   r   r   rD   )r;   r:   )r3   r4   r~   ÚdivrM   r   Úseqs          r   Ú divisionOptionsAdditiveMultiplesr‹   h  sž   € ð €DØˆ1‚u€u��Q‘˜!’�ØˆØˆØ�C‰xˆØ�QŠhˆhÝ˜D˜˜ 1˜˜˜¨!Ñ+Ñ,Ô,ˆCØ˜$ˆˆØ—’˜CÑ Ô Ð Ø˜3‘;ˆDØ�‰HˆAð �QŠhˆhõ �‰;Œ;Ðr   útuple[tuple[str, ...], ...]c                ó$  — g }| dz  dk    rw|dz  dk    rn| dz  }|dz  }|dk    r^|dk    rX|                      t          d› d|› �gt          |¦  «        z  ¦  «        ¦  «         |dz  dk    rn|dz  }|dz  }|dk    r|dk    °Xt          |¦  «        S )a  
    >>> meter.tools.divisionOptionsAdditiveMultiplesEvenDivision(4, 16)
    (('1/8', '1/8'),)
    >>> meter.tools.divisionOptionsAdditiveMultiplesEvenDivision(4, 4)
    (('1/2', '1/2'),)
    >>> meter.tools.divisionOptionsAdditiveMultiplesEvenDivision(3, 4)
    ()
    r   r   r   rD   )r:   r;   r   r}   s        r   Ú,divisionOptionsAdditiveMultiplesEvenDivisionrŽ     s»   € ð €Dð 	ˆ1�u�‚z€z�a˜1‘f ’k�kØ�A‰vˆØ�A‰vˆØ�aŠiˆi˜D 1šH˜HØ�KŠK� !˜}˜} d˜}˜}˜oµ°D±	´	Ñ9Ñ:Ô:Ñ;Ô;Ð;Ø�a‰x˜1Š}ˆ}ØØ˜1‘9ˆDØ˜1‘9ˆDð �aŠiˆi˜D 1šH˜Hõ �‰;Œ;Ðr   c                ó   — g }| dk    rx|dk    rr|}| }| dk    r| }nd}|t           d         k    rR||k    rLd|› �g|z  }|                     t          |¦  «        ¦  «         |dz  }|dz  }|t           d         k    r||k    °Lt          |¦  «        S )a=  
    >>> meter.tools.divisionOptionsAdditiveMultiplesUpward(4, 16)
    (('1/16', '1/16', '1/16', '1/16'),
     ('1/32', '1/32', '1/32', '1/32', '1/32', '1/32', '1/32', '1/32'),
     ('1/64', '1/64', '1/64', '1/64', '1/64', '1/64', '1/64', '1/64',
      '1/64', '1/64', '1/64', '1/64', '1/64', '1/64', '1/64', '1/64'))
    >>> meter.tools.divisionOptionsAdditiveMultiplesUpward(3, 4)
    (('1/4', '1/4', '1/4'),
     ('1/8', '1/8', '1/8', '1/8', '1/8', '1/8'),
     ('1/16', '1/16', '1/16', '1/16', '1/16', '1/16',
      '1/16', '1/16', '1/16', '1/16', '1/16', '1/16'))
    r   r   rV   ú1/r   r{   )r3   r4   r~   ÚdCurrentÚnCountÚnCountLimitrŠ   s          r   Ú&divisionOptionsAdditiveMultiplesUpwardr”   —  s¾   € ð €DØˆ1‚u€u��a’�ØˆØˆØˆrŠ6ˆ6ØˆKˆKàˆKð Õ+¨BÔ/Ò/Ð/°F¸kÒ4IÐ4IØ"˜�?�?Ð# fÑ,ˆCØ�KŠK�˜c™
œ
Ñ#Ô#Ð#à˜‰MˆHØ�a‰KˆFð Õ+¨BÔ/Ò/Ð/°F¸kÒ4IÐ4Iõ �‰;Œ;Ðr   c                ó"  — g }| dz  dk    rd| dk    r^g }t          t          | dz  ¦  «        ¦  «        D ]}|                     d|› �¦  «         Œ|                     t          |¦  «        ¦  «         | dk    rHdD ]E}g }|D ]}|                     |› d|› �¦  «         Œ|                     t          |¦  «        ¦  «         ŒF| dk    rHdD ]E}g }|D ]}|                     |› d|› �¦  «         Œ|                     t          |¦  «        ¦  «         ŒF| d	k    rHd
D ]E}g }|D ]}|                     |› d|› �¦  «         Œ|                     t          |¦  «        ¦  «         ŒF|                     t          | |¦  «        ¦  «         |                     t          | |¦  «        ¦  «         |                     | › d|› �f¦  «         |                     t          | |¦  «        ¦  «         |                     t          | |¦  «        ¦  «         |                     d„ t          | |¦  «        D ¦   «         ¦  «         |                     d„ t          | |¦  «        D ¦   «         ¦  «         t          t          j                             d„ |D ¦   «         ¦  «        ¦  «        S )ad  
    This is a primitive approach to algorithmic division production.
    This can be extended.

    It is assumed that these values are provided in order of priority

    >>> meter.tools.divisionOptionsAlgo(4, 4)
    (('1/4', '1/4', '1/4', '1/4'),
     ('1/8', '1/8', '1/8', '1/8', '1/8', '1/8', '1/8', '1/8'),
     ('1/16', '1/16', '1/16', '1/16', '1/16', '1/16', '1/16', '1/16',
      '1/16', '1/16', '1/16', '1/16', '1/16', '1/16', '1/16', '1/16'),
     ('1/2', '1/2'),
     ('4/4',),
     ('2/4', '2/4'),
     ('2/2',),
     ('1/1',),
     ('8/8',),
     ('16/16',),
     ('32/32',),
     ('64/64',),
     ('128/128',))

    >>> meter.tools.divisionOptionsAlgo(1, 4)
    (('1/4',),
     ('1/8', '1/8'),
     ('1/16', '1/16', '1/16', '1/16'),
     ('1/32', '1/32', '1/32', '1/32', '1/32', '1/32', '1/32', '1/32'),
     ('1/64', '1/64', '1/64', '1/64', '1/64', '1/64', '1/64', '1/64',
      '1/64', '1/64', '1/64', '1/64', '1/64', '1/64', '1/64', '1/64'),
     ('1/128', '1/128', '1/128', '1/128', '1/128', '1/128', '1/128', '1/128',
      '1/128', '1/128', '1/128', '1/128', '1/128', '1/128', '1/128', '1/128',
      '1/128', '1/128', '1/128', '1/128', '1/128', '1/128', '1/128', '1/128',
      '1/128', '1/128', '1/128', '1/128', '1/128', '1/128', '1/128', '1/128'),
     ('2/8',), ('4/16',), ('8/32',), ('16/64',), ('32/128',))

    >>> meter.tools.divisionOptionsAlgo(2, 2)
    (('1/2', '1/2'),
     ('1/4', '1/4', '1/4', '1/4'),
     ('1/8', '1/8', '1/8', '1/8', '1/8', '1/8', '1/8', '1/8'),
     ('1/16', '1/16', '1/16', '1/16', '1/16', '1/16', '1/16', '1/16',
      '1/16', '1/16', '1/16', '1/16', '1/16', '1/16', '1/16', '1/16'),
     ('2/2',),
     ('1/1',),
     ('4/4',), ('8/8',), ('16/16',), ('32/32',), ('64/64',), ('128/128',))

    >>> meter.tools.divisionOptionsAlgo(3, 8)
    (('1/8', '1/8', '1/8'), ('1/16', '1/16', '1/16', '1/16', '1/16', '1/16'),
     ('1/32', '1/32', '1/32', '1/32', '1/32', '1/32',
      '1/32', '1/32', '1/32', '1/32', '1/32', '1/32'),
     ('3/8',), ('6/16',), ('12/32',), ('24/64',), ('48/128',))

    >>> meter.tools.divisionOptionsAlgo(6, 8)
    (('3/8', '3/8'),
     ('1/8', '1/8', '1/8', '1/8', '1/8', '1/8'),
     ('1/16', '1/16', '1/16', '1/16', '1/16', '1/16',
      '1/16', '1/16', '1/16', '1/16', '1/16', '1/16'),
     ('1/4', '1/4', '1/4'),
     ('6/8',),
     ('3/4',),
     ('12/16',), ('24/32',), ('48/64',), ('96/128',))

    >>> meter.tools.divisionOptionsAlgo(12, 8)
    (('3/8', '3/8', '3/8', '3/8'),
     ('1/8', '1/8', '1/8', '1/8', '1/8', '1/8', '1/8', '1/8', '1/8', '1/8', '1/8', '1/8'),
     ('1/4', '1/4', '1/4', '1/4', '1/4', '1/4'),
     ('1/2', '1/2', '1/2'),
     ('12/8',),
     ('6/8', '6/8'),
     ('6/4',),
     ('3/2',),
     ('24/16',), ('48/32',), ('96/64',), ('192/128',))

    >>> meter.tools.divisionOptionsAlgo(5, 8)
    (('2/8', '3/8'),
     ('3/8', '2/8'),
     ('1/8', '1/8', '1/8', '1/8', '1/8'),
     ('1/16', '1/16', '1/16', '1/16', '1/16', '1/16', '1/16', '1/16', '1/16', '1/16'),
     ('5/8',),
     ('10/16',), ('20/32',), ('40/64',), ('80/128',))

    >>> meter.tools.divisionOptionsAlgo(18, 4)
    (('3/4', '3/4', '3/4', '3/4', '3/4', '3/4'),
     ('1/4', '1/4', '1/4', '1/4', '1/4', '1/4', '1/4', '1/4', '1/4', '1/4',
      '1/4', '1/4', '1/4', '1/4', '1/4', '1/4', '1/4', '1/4'),
     ('1/2', '1/2', '1/2', '1/2', '1/2', '1/2', '1/2', '1/2', '1/2'),
     ('18/4',),
     ('9/4', '9/4'),
     ('4/4', '4/4', '4/4', '4/4'),
     ('2/4', '2/4', '2/4', '2/4', '2/4', '2/4', '2/4', '2/4'),
     ('9/2',),
     ('36/8',),
     ('72/16',),
     ('144/32',),
     ('288/64',),
     ('576/128',))

    >>> meter.tools.divisionOptionsAlgo(3, 128)
    (('1/128', '1/128', '1/128'), ('3/128',))
    rˆ   r   z3/é   ))r   rˆ   )rˆ   r   rD   é   ))r   r   rˆ   )rˆ   r   r   )r   rˆ   r   é
   ))r   r   rˆ   rˆ   c                ó   — g | ]}|f‘ŒS r   r   ©rX   Úos     r   rZ   z'divisionOptionsAlgo.<locals>.<listcomp>M  s   € ÐFÐFÐF˜!�!�ÐFÐFÐFr   c                ó   — g | ]}|f‘ŒS r   r   rš   s     r   rZ   z'divisionOptionsAlgo.<locals>.<listcomp>O  s   € ÐDÐDÐD˜!�!�ÐDÐDÐDr   c              3  ó&   K  — | ]}|d k    ¯|V — ŒdS )r   Nr   rš   s     r   ú	<genexpr>z&divisionOptionsAlgo.<locals>.<genexpr>P  s&   è è € Ð#?Ð#?¨!°q¸B²w°w A°w°w°w°wÐ#?Ð#?r   )Úranger   r:   r;   Úextendr”   rŽ   r‹   r†   rƒ   r�   r   ÚmiscÚunique)r3   r4   r~   rŠ   Újr/   r   s          r   ÚdivisionOptionsAlgor¤   ·  sË  € ðJ €Dð 	ˆ1�u�‚z€z�a˜!’e�eØˆÝ•s˜1˜q™5‘z”zÑ"Ô"ð 	!ð 	!ˆAØ�JŠJ�x˜A�x�xÑ Ô Ð Ð Ø�Š•E˜#‘J”JÑÔÐàˆA‚v€vØ%ð 	$ð 	$ˆEØˆCØð *ð *�Ø—
’
˜d˜=˜= Q˜=˜=Ñ)Ô)Ð)Ð)Ø�KŠK�˜c™
œ
Ñ#Ô#Ð#Ð#ØˆA‚v€vØ6ð 	$ð 	$ˆEØˆCØð *ð *�Ø—
’
˜d˜=˜= Q˜=˜=Ñ)Ô)Ð)Ð)Ø�KŠK�˜c™
œ
Ñ#Ô#Ð#Ð#àˆB‚w€wØ$ð 	$ð 	$ˆEØˆCØð *ð *�Ø—
’
˜d˜=˜= Q˜=˜=Ñ)Ô)Ð)Ð)Ø�KŠK�˜c™
œ
Ñ#Ô#Ð#Ð#ð 	‡K‚KÕ6°q¸!Ñ<Ô<Ñ=Ô=Ð=ð 	‡K‚KÕ<¸QÀÑBÔBÑCÔCÐCà‡K‚K�A��˜���ÑÔÐð 	‡K‚KÕ0°°AÑ6Ô6Ñ7Ô7Ð7ð 	‡K‚KÕ8¸¸AÑ>Ô>Ñ?Ô?Ð?à‡K‚KÐFÐFÕ?ÀÀ1ÑEÔEÐFÑFÔFÑGÔGÐGà‡K‚KÐDÐDÕ=¸aÀÑCÔCÐDÑDÔDÑEÔEÐEÝ•”×#Ò#Ð#?Ð#?¨tÐ#?Ñ#?Ô#?Ñ?Ô?Ñ@Ô@Ð@r   c                ó´   — g }| dk    rB|                      d|› �d|› �d|› �f¦  «         |                      d|› �d|› �d|› �f¦  «         t          |¦  «        S )aÌ  
    Provide fixed set of meter divisions that will not be easily
    obtained algorithmically.

    Currently, does nothing except to allow partitioning 5/8 as 2/8, 2/8, 1/8 as a possibility
    (sim for 5/16, etc.)

    >>> meter.tools.divisionOptionsPreset(5, 8)
    (('2/8', '2/8', '1/8'), ('2/8', '1/8', '2/8'))
    >>> meter.tools.divisionOptionsPreset(3, 4)
    ()

    >>> ms2 = meter.MeterSequence('5/32')
    >>> ms2.getPartitionOptions()
    (('2/32', '3/32'), ('3/32', '2/32'), ('1/32', '1/32', '1/32', '1/32', '1/32'),
     ('1/64', '1/64', '1/64', '1/64', '1/64', '1/64', '1/64', '1/64', '1/64', '1/64'),
     ('5/32',), ('10/64',), ('20/128',), ('2/32', '2/32', '1/32'), ('2/32', '1/32', '2/32'))
    r–   z2/r�   )r:   r;   )r3   r4   r~   s      r   ÚdivisionOptionsPresetr¦   S  st   € ð( €DØˆA‚v€vØ�Š�X˜!�X�X˜x A˜x˜x¨¨a¨¨Ð2Ñ3Ô3Ð3Ø�Š�X˜!�X�X˜x A˜x˜x¨¨a¨¨Ð2Ñ3Ô3Ð3Ý�‰;Œ;Ðr   Ú__main__)r    r!   r"   r   )r    r!   r"   r6   )rA   r!   r"   rB   )rS   r6   r"   rT   )r`   r6   r"   ra   )r    rr   r"   ra   )r3   r   r4   r   r"   ry   )r3   r   r4   r   r"   r„   )r3   r   r4   r   r"   rŒ   )r"   r„   )/Ú
__future__r   rt   Ú	functoolsr   rg   r-   ÚtypingÚtÚmusic21r   Úmusic21.common.enumsr   r   Úmusic21.exceptions21r   r	   r
   ÚEnvironmentÚenvironLocalÚ
NamedTupler   r;   r   ra   r6   r!   r„   r|   Ú	frozensetÚvalidDenominatorsSetr5   r@   rR   r_   rq   rx   r�   rƒ   r†   r‹   rŽ   r”   r¤   r¦   r   ÚmainTestr   r   r   ú<module>rµ      s5  ðð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø €€€Ø 	€	€	€	Ø Ð Ð Ð à Ð Ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ð Ð Ø YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ YÐ Yà&ˆ{Ô& }Ñ5Ô5€ðð ð ð ð ˜œñ ô ð ð ��c�Œ?€Ø�h �mÔ$€Ø�U˜3 ˜8”_ cÐ)Ô*€à1Ð Ø �yÐ!2Ñ3Ô3Ð ð €ˆ3�„ð!Vð !Vð !Vñ „ð!VðH €ˆ3�„ðð ð ñ „ðð2 €ˆ3�„ðJ(ð J(ð J(ñ „ðJ(ðZ €ˆ3�„ðð ð ñ „ðð@ €ˆ3�„ð,ð ,ð ,ñ „ð,ð^ €ˆ3�„ð(ð (ð (ñ „ð(ð>ð ð ð ð0ð ð ð ð0ð ð ð ð$ð ð ð ð.ð ð ð ð0ð ð ð ð@ €ˆ3�„ðXAð XAð XAñ „ðXAðv €ˆ3�„ðð ð ñ „ðð6 ˆzÒÐØ€N€N€NØ€GÔÑÔÐÐÐð Ðr   