§
    ƒØj7  ã                  ó"  — U d Z ddlm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
 ddlmZ dd	lmZ d
„ Z G d„ d¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Zg Zded<   edk    rddlZ ej        e¦  «         dS dS )zK
Automatically reduce a MeasureStack to a single chord or group of chords.
é    )ÚannotationsN)Úchord)ÚDocOrder)Úclef)Úmeter)Ústream)Útiec                 ó  — t          j        ¦   «         } t          j        d¦  «        }t	          j        d¦  «        }d|_        t	          j        d¦  «        }t	          j        d¦  «        }||||fD ]}|                      |¦  «         Œ| S )a8  
    returns a simple measure stream for testing:

    >>> s = analysis.reduceChordsOld.testMeasureStream1()
    >>> s.show('text')
    {0.0} <music21.meter.TimeSignature 4/4>
    {0.0} <music21.chord.Chord C4 E4 G4 C5>
    {2.0} <music21.chord.Chord C4 E4 F4 B4>
    {3.0} <music21.chord.Chord C4 E4 G4 C5>
    z4/4úC4 E4 G4 C5ç       @úC4 E4 F4 B4)r   ÚMeasurer   ÚTimeSignaturer   ÚChordÚquarterLengthÚappend)ÚsÚtÚc1Úc2Úc3Úcs         ú•/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/analysis/reduceChordsOld.pyÚtestMeasureStream1r      sƒ   € õ 	ŒÑÔ€AÝÔ˜EÑ"Ô"€AÝ	Œ�]Ñ	#Ô	#€BØ€BÔÝ	Œ�]Ñ	#Ô	#€BÝ	Œ�]Ñ	#Ô	#€BØ��R˜ˆ_ð ð ˆØ	�Š�‰ŒˆˆØ€Hó    c                  óP   — e Zd Zd„ Z	 	 	 dd„Zdd„Zd„ Zd„ Zd	„ Zd
„ Z	dd„Z
d„ ZdS )ÚChordReducerc                ór   — d| _         | j        | _        d| _        d | _        d | _        d | _        d | _        d S )NFé   )Ú
printDebugÚqlbsmpConsonanceÚweightAlgorithmÚ	maxChordsÚpositionInMeasureÚnumberOfElementsInMeasureÚ_lastPitchedObjectÚ_lastTs)Úselfs    r   Ú__init__zChordReducer.__init__0   s@   € ØˆŒØ#Ô4ˆÔØˆŒØ!%ˆÔØ)-ˆÔ&ð #'ˆÔØˆŒˆˆr   é   Nç      Ð?c                óp  — ddl m} |j        du r,|                     ¦   «         j                             ¦   «         }n|j                             ¦   «         }|                      ||¦  «        }t          |t          |¦  «        ¦  «        }t          ||j
        d¬¦  «        d|…         }|sW|                     ¦   «         }	|j        j        |	_        |D ]}
|                     |
¦  «         Œ|                     d|	¦  «         |S ||d                  }g }|D ]'}||         ||z  k    r|                     |¦  «         Œ' d}d}d}|D ]¨}
t#          d„ |
j        D ¦   «         ¦  «        }||v re||k    r_|€|
j        dk    r|
j        }d|
_        n|�	||_        d}|
}|
D ]&}d|_        |j        j        �d|j        j        _        Œ'|}||
j        z  }Œ‰||
j        z  }|                     |
¦  «         Œ©|�	||_        d}t1          d	t          |¦  «        ¦  «        D ]t}||         }
|
j        }|t3          |¦  «        z
  }t5          |d
¦  «        dv r?||d	z
           }|xj        |z  c_        t3          |¦  «        |
_        |
xj        |z  c_        Œut7          |¦  «        D ]}
|
j        s|                     |
¦  «         Œ|S )af  
        Takes a measure and reduces it to only one chord or `numChords` chords.

        >>> s = analysis.reduceChordsOld.testMeasureStream1()
        >>> cr = analysis.reduceChordsOld.ChordReducer()

        Reduce to a maximum of 3 chords; though here we will
        only get one because the other chord is
        below the trimBelow threshold.

        >>> newS = cr.reduceMeasureToNChords(s, 3,
        ...    weightAlgorithm=cr.qlbsmpConsonance, trimBelow = 0.3)
        >>> newS.show('text')
        {0.0} <music21.chord.Chord C4 E4 G4 C5>
        >>> newS.notes.first().quarterLength
        4.0
        r   )ÚnoteFT)ÚkeyÚreverseNç        c                ó   — h | ]	}|j         ’Œ
S © ©Ú
pitchClass©Ú.0Úxs     r   ú	<setcomp>z6ChordReducer.reduceMeasureToNChords.<locals>.<setcomp>q   ó   € Ð7Ð7Ð7¨�q”|Ð7Ð7Ð7r   r*   r   )r+   g      À?gZd;ßOÕ?gTã¥›Ä °?gX9´Èv¾¯?)Úmusic21r-   ÚisFlatÚflattenÚnotesr   ÚcomputeMeasureChordWeightsÚminÚlenÚsortedÚgetÚRestÚdurationr   ÚremoveÚinsertr   ÚtupleÚpitchesÚoffsetr	   ÚpitchÚ
accidentalÚdisplayStatusÚrangeÚintÚroundÚlist)r(   Ú
measureObjÚ	numChordsr"   Ú	trimBelowr-   ÚmObjÚchordWeightsÚ
maxNChordsÚrr   ÚmaxChordWeightÚtrimmedMaxChordsÚpcTuplesÚcurrentGreedyChordÚcurrentGreedyChordPCsÚcurrentGreedyChordNewLengthÚpÚnÚiÚcOffsetCurrentÚcOffsetSyncopÚlastCs                          r   ÚreduceMeasureToNChordsz#ChordReducer.reduceMeasureToNChords;   s0  € ð, 	!Ð Ð Ð Ð Ð ØÔ Ð%Ð%Ø×%Ò%Ñ'Ô'Ô-×4Ò4Ñ6Ô6ˆDˆDàÔ#×*Ò*Ñ,Ô,ˆDà×6Ò6°t¸_ÑMÔMˆå˜	¥3 |Ñ#4Ô#4Ñ5Ô5ˆ	å˜L¨lÔ.>ÈÐMÑMÔMÈjÈyÈjÔYˆ
Øð 	Ø—	’	‘”ˆAØ"œmÔ9ˆAŒOØð ð �Ø—’˜A‘”��Ø�KŠK˜˜1ÑÔÐØˆKØ% j°¤mÔ4ˆàÐØ"ð 	ð 	ˆHØ˜HÔ%¨¸)Ñ)CÒCÐCØ ×'Ò'¨Ñ1Ô1Ð1Ð1ð à!ÐØ $ÐØ&)Ð#Øð 	ð 	ˆAÝÐ7Ð7¨Q¬YÐ7Ñ7Ô7Ñ8Ô8ˆAØÐ$Ð$Ð$¨Ð.CÒ)CÐ)Cà%Ð-°!´(¸c²/°/Ø23´(Ð/Ø"�A”H�HØ'Ð3Ø7RÐ&Ô4Ø25Ð/Ø%&Ð"Øð @ð @�AØ �A”EØ”wÔ)Ð5Ø;?˜œÔ*Ô8øØ()Ð%Ø+¨q¬Ñ>Ð+Ð+à+¨q¬Ñ>Ð+Ø—’˜A‘”��ØÐ)Ø/JÐÔ,Ø*-Ð'õ �q�#˜d™)œ)Ñ$Ô$ð 	1ð 	1ˆAØ�Q”ˆAØœXˆNØ*­S°Ñ-@Ô-@Ñ@ˆMÝ�] AÑ&Ô&Ð*MÐMÐMØ˜Q ™Uœ�ØÐ#Ô# }Ñ4Ð#Ô#Ý˜~Ñ.Ô.�”Ø�” =Ñ0�”øõ �d‘”ð 	ð 	ˆAØ”?ð Ø—’˜A‘”�øàˆr   c                ó&  — |€| j         }i }d| _        t          |¦  «        | _        t	          |¦  «        D ]L\  }}|| _        t          d„ |j        D ¦   «         ¦  «        }||vrd||<   ||xx          ||¦  «        z  cc<   ŒMd| _        d| _        |S )aÍ  

        >>> s = analysis.reduceChordsOld.testMeasureStream1().notes
        >>> cr = analysis.reduceChordsOld.ChordReducer()
        >>> cws = cr.computeMeasureChordWeights(s)
        >>> for pcs in sorted(cws):
        ...     print(f'{pcs!r:18}  {cws[pcs]:2.1f}')
             (0, 4, 7)  3.0
         (0, 11, 4, 5)  1.0

        Add beatStrength:

        >>> cws = cr.computeMeasureChordWeights(s, weightAlgorithm=cr.quarterLengthBeatStrength)
        >>> for pcs in sorted(cws):
        ...     print(f'{pcs!r:18}  {cws[pcs]:2.1f}')
             (0, 4, 7)  2.2
         (0, 11, 4, 5)  0.5

        Give extra weight to the last element in a measure:

        >>> cws = cr.computeMeasureChordWeights(s,
        ...              weightAlgorithm=cr.quarterLengthBeatStrengthMeasurePosition)
        >>> for pcs in sorted(cws):
        ...     print(f'{pcs!r:18}  {cws[pcs]:2.1f}')
             (0, 4, 7)  3.0
         (0, 11, 4, 5)  0.5

        Make consonance count a lot:

        >>> cws = cr.computeMeasureChordWeights(s, weightAlgorithm=cr.qlbsmpConsonance)
        >>> for pcs in sorted(cws):
        ...     print(f'{pcs!r:18}  {cws[pcs]:2.1f}')
                 (0, 4, 7)  3.0
             (0, 11, 4, 5)  0.5
        Nr   c                ó   — h | ]	}|j         ’Œ
S r2   r3   r5   s     r   r8   z:ChordReducer.computeMeasureChordWeights.<locals>.<setcomp>È   r9   r   r0   )ÚquarterLengthOnlyr$   r@   r%   Ú	enumeraterG   rH   )r(   rQ   r"   Ú
presentPCsr`   r   r^   s          r   r>   z'ChordReducer.computeMeasureChordWeights›   s»   € ðH Ð"Ø"Ô4ˆOØˆ
à!"ˆÔÝ),¨Z©¬ˆÔ&å˜jÑ)Ô)ð 	0ð 	0‰DˆAˆqØ%&ˆDÔ"ÝÐ7Ð7¨Q¬YÐ7Ñ7Ô7Ñ8Ô8ˆAØ˜
Ð"Ð"Ø #�
˜1‘Ø�qˆMˆMŒM˜_˜_¨QÑ/Ô/Ñ/ˆMˆM‰MˆMà!"ˆÔØ)*ˆÔ&àÐr   c                ó   — |j         S ©N)r   ©r(   r   s     r   rg   zChordReducer.quarterLengthOnlyÒ   s
   € ØŒÐr   c                ó    — |j         |j        z  S rk   )r   ÚbeatStrengthrl   s     r   ÚquarterLengthBeatStrengthz&ChordReducer.quarterLengthBeatStrengthÕ   s   € ØŒ ¤Ñ/Ð/r   c                ó`   — | j         | j        dz
  k    r|j        S |                      |¦  «        S )Nr*   )r$   r%   r   ro   rl   s     r   Ú(quarterLengthBeatStrengthMeasurePositionz5ChordReducer.quarterLengthBeatStrengthMeasurePositionØ   s4   € ØÔ! TÔ%CÀaÑ%GÒGÐGØ”?Ð"à×1Ò1°!Ñ4Ô4Ð4r   c                ó6   — d}|                       |¦  «        |z  S )z8
        Everything from before plus consonance
        g      ð?)rq   )r(   r   ÚconsonanceScores      r   r!   zChordReducer.qlbsmpConsonanceÞ   s"   € ð ˆØ×<Ò<¸QÑ?Ô?À/ÑQÐQr   é   Fc                óL  — d}t          j        ¦   «         }|j                             ¦   «         }|s|S d| _        t          |                     t           j        ¦  «        ¦  «        }d| _        t          |¦  «        D ] }| 
                    |d¬¦  «        }	|	                     ¦   «         j        s	|dk    rn0 nf|                      |	||||¦  «        }
|                     |
¦  «         | j        r0t!          |dd¬¦  «         |dz  dk    r|dk    rt!          d¦  «         Œ¡|                     ¦   «          |                     t           j        ¦  «                             ¦   «         }
|
r*|
                     dt'          j        |d¬	¦  «        ¦  «         |                     d¬
¦  «         |S )z;
        Return a multipart reduction of a stream.
        r   NT)ÚindicesNotNumbersú Ú )Úendé   )ÚallowTreble8vb©ÚinPlace)r   ÚPartÚpartsÚfirstr&   r@   ÚgetElementsByClassr   r'   rM   ÚmeasureÚrecurseÚnotesAndRestsÚreduceThisMeasureÚ
coreAppendr    ÚprintÚcoreElementsChangedrF   r   ÚbestClefÚmakeNotation)r(   ÚinStreamr#   ÚclosedPositionÚforceOctaver`   r^   Úp0ÚlenMeasuresÚmIÚms              r   ÚmultiPartReductionzChordReducer.multiPartReductionå   s”  € ð ˆÝŒK‰MŒMˆØŒ^×!Ò!Ñ#Ô#ˆØð 	ØˆHØ"&ˆÔÝ˜"×/Ò/µ´Ñ?Ô?Ñ@Ô@ˆØˆŒÝ�{Ñ#Ô#ð 	ð 	ˆAØ×!Ò! !°tÐ!Ñ<Ô<ˆBØ—:’:‘<”<Ô-ð  Ø˜’6�6Øà�Eà×*Ò*¨2¨q°)¸^È[ÑYÔY�Ø—’˜Q‘”�àŒð Ý�a˜ "Ð%Ñ%Ô%Ð%Ø�r‘6˜Q’;�; 1¨¢6 6Ý˜"‘I”I�IøØ	×ÒÑÔÐØ× Ò ¥¤Ñ0Ô0×6Ò6Ñ8Ô8ˆØð 	?Ø�HŠH�Q�œ a¸Ð=Ñ=Ô=Ñ>Ô>Ð>Ø	�Š˜tˆÑ$Ô$Ð$Øˆr   c                óz  — t          j        ¦   «         }||_        |                     ¦   «         }|                      ||| j        d¬¦  «        }d }	d}
|D ]á}t          j        |¦  «        }t          |t          j
        ¦  «        rL|durH|dur|                     |d¬¦  «         n|                     d¬¦  «         |                     d¬¦  «         |                     |¦  «        }|	�*t          ||
z
  d¦  «        dk    r|	xj        ||
z
  z  c_        |}	||j        z   }
|                     ||d¬	¦  «         Œâ|j                             ¦   «                              t(          j        ¦  «        }|�>t          |j        j        |
z
  d¦  «        dk    r|	xj        |j        j        |
z
  z  c_        |                     ¦   «          | j        �ð|d
         }| j        j        r;|j        r4| j        j        |j        k    rt7          j        d¦  «        | j        _        n¡| j        j        r•|j        rŽt=          | j        ¦  «        t=          |¦  «        k    rid}t?          t=          | j        ¦  «        ¦  «        D ]%}| j        j         |         |j         |         k    rd}Œ&|rt7          j        d¦  «        | j        _        |d         | _        |j                             ¦   «          !                    t           j        ¦  «                             ¦   «         j"        }|| j#        k    r t          j        |¦  «        |_"        || _#        |S )Ng333333Ó?)r"   rS   r0   FT)r�   r}   r|   é   )Ú
ignoreSortr   Ústartéÿÿÿÿ)$r   r   ÚnumberÚchordifyrd   r!   ÚcopyÚdeepcopyÚ
isinstancer   r   rŒ   ÚremoveRedundantPitchesÚgetOffsetBySiterO   r   Ú
coreInsertr   r€   ÚgetContextByClassr   r   ÚbarDurationrˆ   r&   ÚisNoterJ   r	   ÚTieÚisChordr@   rM   rH   r�   ÚtimeSignaturer'   )r(   r�   ÚmeasureIndexr#   rŒ   r�   r‘   ÚmIChordÚnewPartÚcLastÚcLastEndÚcElÚcElCopyÚ	newOffsetÚ	tsContextÚfirstPitchedÚallSameÚpitchIÚsourceMeasureTss                      r   r…   zChordReducer.reduceThisMeasure  s>  € ÝŒNÑÔˆØˆŒà—+’+‘-”-ˆØ×-Ò-¨gØ.7Ø>BÔ>SØ8;ð .ñ =ô =ˆð
 ˆØˆØð 	>ð 	>ˆCÝ”m CÑ(Ô(ˆGÝ˜#�uœ{Ñ+Ô+ð =°ÀeÐ0KÐ0KØ eÐ+Ð+Ø×*Ò*°{ÈDÐ*ÑQÔQÐQÐQà×*Ò*°4Ð*Ñ8Ô8Ð8Ø×.Ò.°tÐ.Ñ<Ô<Ð<Ø×+Ò+¨GÑ4Ô4ˆIð Ð Ý˜ XÑ-¨qÑ1Ô1°SÒ8Ð8ØÐ'Ô'¨9°xÑ+?Ñ?Ð'Ô'ØˆEØ  7Ô#8Ñ8ˆHØ�LŠL˜ G¸ˆLÑ=Ô=Ð=Ð=à”H—N’NÑ$Ô$×6Ò6µuÔ7JÑKÔKˆ	ØÐ Ý�YÔ*Ô8¸8ÑCÀQÑGÔGÈ3ÒNÐNØÐ#Ô# yÔ'<Ô'JÈXÑ'UÑUÐ#Ô#ð 	
×ÒÑÔÐð Ô"Ð.Ø˜Qœ4ˆLØÔ&Ô-ð 
G°,Ô2Eð 
GØÔ*Ô0°LÔ4FÒFÐFÝ25´'¸'Ñ2BÔ2B�DÔ+Ô/øØÔ(Ô0ð G°\Ô5Ið GÝ�tÔ.Ñ/Ô/µ3°|Ñ3DÔ3DÒDÐDØ"�GÝ"'­¨DÔ,CÑ(DÔ(DÑ"EÔ"Eð ,ð ,˜ØÔ2Ô:¸6ÔBÀlÔFZÐ[aÔFbÒbÐbØ&+˜GøØð GÝ69´g¸gÑ6FÔ6F˜Ô/Ô3Ø"# B¤%ˆÔàœ(Ÿ.š.Ñ*Ô*×=Ò=½f¼nÑMÔM×SÒSÑUÔUÔcˆØ˜dœlÒ*Ð*Ý"œm¨OÑ<Ô<ˆAŒOØ*ˆDŒLàˆr   )r*   Nr+   rk   )rt   FF)Ú__name__Ú
__module__Ú__qualname__r)   rd   r>   rg   ro   rq   r!   r’   r…   r2   r   r   r   r   /   s¿   € € € € € ð	ð 	ð 	ð *+Ø/3Ø)-ð	]ð ]ð ]ð ]ð@5ð 5ð 5ð 5ðnð ð ð0ð 0ð 0ð5ð 5ð 5ðRð Rð Rð ð  ð  ð  ðF;ð ;ð ;ð ;ð ;r   r   c                  ó   — e Zd Zd„ ZdS )ÚTestc                óì   — t          j        ¦   «         }t          j        d¦  «        }d|_        t          j        d¦  «        }t          j        d¦  «        }|||fD ]}|                     |¦  «         Œd S )Nr   r   r   )r   r   r   r   r   r   )r(   r   r   r   r   r   s         r   ÚtestSimpleMeasurezTest.testSimpleMeasureG  st   € ÝŒNÑÔˆÝŒ[˜Ñ'Ô'ˆØˆÔÝŒ[˜Ñ'Ô'ˆÝŒ[˜Ñ'Ô'ˆØ�b˜"�ð 	ð 	ˆAØ�HŠH�Q‰KŒKˆKˆKð	ð 	r   N)r³   r´   rµ   r¹   r2   r   r   r·   r·   E  s#   € € € € € ðð ð ð ð r   r·   c                  ó   — e Zd ZdZd„ ZdS )ÚTestExternalTc                óô  — ddl m} |                     d¦  «                             dd¦  «        }d}|�r|j        d                              t          j        ¦  «                             ¦   «                              t          j
        ¦  «        }|rW|d         }|j        d                              t          j        ¦  «                             ¦   «                              |¦  «         |j        d                              t          j        ¦  «                             ¦   «                              dt          j        ¦   «         ¦  «         t          ¦   «         }|                     |d¬¦  «        }dd	l m} dd
l m}	 |                     d¦  «        }
|t&          j                 D ]$}|	                     ||
d¬¦  «        j        |_        Œ%|                     d|¦  «         | j        r|                     ¦   «          d S d S )Nr   )ÚcorpuszPMFC_06_Giovanni-05_Donnar*   é   Tr   )r#   )r.   )ÚromanÚG)ÚpreferSecondaryDominants)r:   r½   ÚparseÚmeasuresr   r�   r   r   r€   r   ÚClefrE   rF   ÚTreble8vbClefr   r’   r.   r¿   ÚKeyr   r   ÚromanNumeralFromChordÚfigureÚlyricÚshow)r(   r½   r   ÚfixClefÚ
startClefsÚclef1Úcrr^   r.   r¿   ÚcmÚ	thisChords               r   ÚtestTrecentoMadrigalz!TestExternal.testTrecentoMadrigalS  sá  € Ø"Ð"Ð"Ð"Ð"Ð"ð �LŠLÐ4Ñ5Ô5×>Ò>¸qÀ"ÑEÔEˆð ˆØñ 	bØœ œ×6Ò6µv´~ñ 9ô 9ß9>º¹¼×ASÒASÕTXÔT]ÑA^ÔA^ð àð TØ" 1œ�Ø”˜”
×-Ò-­f¬nÑ=Ô=×CÒCÑEÔE×LÒLÈUÑSÔSÐSØŒG�AŒJ×)Ò)­&¬.Ñ9Ô9×?Ò?ÑAÔA×HÒHÈÍDÔL^ÑL`ÔL`ÑaÔaÐaõ ‰^Œ^ˆà×!Ò! !¨qÐ!Ñ1Ô1ˆàÐÐÐÐÐØ!Ð!Ð!Ð!Ð!Ð!Ø�WŠW�S‰\Œ\ˆØ�5œ;œð 	`ð 	`ˆIØ#×9Ò9¸)Ø:<ØSWð :ñ Yô YäY_ð ŒOˆOð
 	
�Š��A‰ŒˆØŒ9ð 	Ø�FŠF‰HŒHˆHˆHˆHð	ð 	r   N)r³   r´   rµ   rÊ   rÑ   r2   r   r   r»   r»   P  s(   € € € € € Ø€Dð&ð &ð &ð &ð &r   r»   r   Ú
_DOC_ORDERÚ__main__)Ú__doc__Ú
__future__r   rš   Úunittestr:   r   Úmusic21.common.typesr   r   r   r   r	   r   r   ÚTestCaser·   r»   rÒ   Ú__annotations__r³   ÚmainTestr2   r   r   ú<module>rÛ      s‹  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€à Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð,Tð Tð Tð Tð Tñ Tô Tð Tðl	ð 	ð 	ð 	ð 	ˆ8Ôñ 	ô 	ð 	ð)ð )ð )ð )ð )�8Ô$ñ )ô )ð )ð\ €
Ð Ð Ð Ñ ð ˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr   