
    rhx*                        S SK Jr  S SKJr  S SKrS SKJr  S SKJr  S SKJr  S SKJ	r	  \R                  " S5      r " S	 S
5      r " S S\R                  5      r\S:X  a  S SKr\R                   " \5        gg)    )annotations)IterableN)chord)common)environment)pitchzanalysis.transpositionc                  J    \ rS rSrSrSSS jjrS rS rS rS r	S r
S	 rS
rg)TranspositionChecker   av  
Given a list of pitches, checks for the number of distinct transpositions.

>>> pList = [pitch.Pitch('C4'), pitch.Pitch('E4'), pitch.Pitch('G#4')]
>>> tc = analysis.transposition.TranspositionChecker(pList)
>>> tc.numDistinctTranspositions()
4
>>> allNormalOrderPitchTuples = tc.getPitchesOfDistinctTranspositions()
>>> allNormalOrderPitchTuples
[(<music21.pitch.Pitch C>, <music21.pitch.Pitch E>,
                                     <music21.pitch.Pitch G#>),
 (<music21.pitch.Pitch C#>, <music21.pitch.Pitch F>,
                                     <music21.pitch.Pitch A>),
 (<music21.pitch.Pitch D>, <music21.pitch.Pitch F#>,
                                     <music21.pitch.Pitch A#>),
 (<music21.pitch.Pitch E->, <music21.pitch.Pitch G>,
                                     <music21.pitch.Pitch B>)]
>>> myChord = chord.Chord(['C', 'E-', 'F#', 'A'])
>>> pList = myChord.pitches
>>> tc = analysis.transposition.TranspositionChecker(pList)
>>> allNormalOrderChords = tc.getChordsOfDistinctTranspositions()
>>> allNormalOrderChords
[<music21.chord.Chord C E- F# A>,
 <music21.chord.Chord C# E G A#>,
 <music21.chord.Chord D F G# B>]
c                    U(       d  [        S5      e[        R                  " U5      (       d  [        S5      eXl        / U l        / U l        / U l        g )Nz&Must have at least one element in listzMust be a list or tuple)	TypeErrorr   
isIterablepitchesallTranspositionsallNormalOrdersdistinctNormalOrders)selfr   s     X/home/james-whalen/.local/lib/python3.13/site-packages/music21/analysis/transposition.py__init__TranspositionChecker.__init__3   sS    8    ))566 /6')%'*,!    c                    / n[        S5       HI  n/ nU R                   H#  nUR                  UR                  U5      5        M%     UR                  U5        MK     Xl        U$ )a  
Gets all 12 transpositions (distinct or otherwise).

>>> p = [pitch.Pitch('D#')]
>>> tc = analysis.transposition.TranspositionChecker(p)
>>> tc.getTranspositions()
[[<music21.pitch.Pitch E->],
[<music21.pitch.Pitch E>],
[<music21.pitch.Pitch F>],
[<music21.pitch.Pitch F#>],
[<music21.pitch.Pitch G>],
[<music21.pitch.Pitch G#>],
[<music21.pitch.Pitch A>],
[<music21.pitch.Pitch B->],
[<music21.pitch.Pitch B>],
[<music21.pitch.Pitch C>],
[<music21.pitch.Pitch C#>],
[<music21.pitch.Pitch D>]]
   )ranger   append	transposer   )r   r   ithisTranspositionps        r   getTranspositions&TranspositionChecker.getTranspositionsB   s_    * rA "\\!((Q8 "$$%67	 
 "3  r   c                    U R                   (       d  U R                  5         U R                   n/ nU H6  n[        R                  " U5      nUR                  nUR                  U5        M8     X l        U$ )a]  
List the normal orders for all 12 transpositions

>>> pList = [pitch.Pitch('C4'), pitch.Pitch('E4'), pitch.Pitch('G#4')]
>>> tc = analysis.transposition.TranspositionChecker(pList)
>>> tc.listNormalOrders()
[[0, 4, 8], [1, 5, 9], [2, 6, 10], [3, 7, 11],
 [0, 4, 8], [1, 5, 9], [2, 6, 10], [3, 7, 11],
 [0, 4, 8], [1, 5, 9], [2, 6, 10], [3, 7, 11]]
)r   r    r   ChordnormalOrderr   r   )r   r   r   r   cthisNormalOrders         r   listNormalOrders%TranspositionChecker.listNormalOrders`   si     %%""$ 22!2-.AmmO""?3	 "3
  /r   c                   U R                   (       d  U R                  5         U R                   n[        5       nU Vs/ s H7  n[        U5      U;   a  M  UR	                  [        U5      5      (       a  M5  UPM9     nnX@l        U$ s  snf )a  
List the distinct normal orders (without duplication).

>>> pList = [pitch.Pitch('C4'), pitch.Pitch('E4'), pitch.Pitch('G#4')]
>>> tc = analysis.transposition.TranspositionChecker(pList)
>>> tc.listDistinctNormalOrders()
[[0, 4, 8], [1, 5, 9], [2, 6, 10], [3, 7, 11]]
)r   r'   settupleaddr   )r   r   seenxr   s        r   listDistinctNormalOrders-TranspositionChecker.listDistinctNormalOrdersw   s|     ##!!#..u+:  Q?a(-aD(8 !"<@HHU1X<N !"?  Q$8!## Qs   BB4Bc                n    U R                   (       d  U R                  5         [        U R                   5      $ )z
Gives the number of distinct transpositions (normal orders).

>>> pList = [pitch.Pitch('C4'), pitch.Pitch('E4'), pitch.Pitch('G#4')]
>>> tc = analysis.transposition.TranspositionChecker(pList)
>>> tc.numDistinctTranspositions()
4
)r   r/   len)r   s    r   numDistinctTranspositions.TranspositionChecker.numDistinctTranspositions   s*     (())+4,,--r   c                    U R                   (       d  U R                  5         U R                   n/ nU H*  n[        R                  " U5      nUR	                  U5        M,     U$ )al  
Outputs chords for each distinct transposition (normal order).

>>> pList = [pitch.Pitch('C4'), pitch.Pitch('E4'), pitch.Pitch('G#4')]
>>> tc = analysis.transposition.TranspositionChecker(pList)
>>> tc.getChordsOfDistinctTranspositions()
[<music21.chord.Chord C E G#>,
 <music21.chord.Chord C# F A>,
 <music21.chord.Chord D F# A#>,
 <music21.chord.Chord E- G B>]
)r   r/   r   r#   r   )r   r   allNormalOrderChordsr&   thisNormalOrderChords        r   !getChordsOfDistinctTranspositions6TranspositionChecker.getChordsOfDistinctTranspositions   s[     (())+#88!3O#(;;#?  ''(<=  4 $#r   c                f    U R                  5       nU Vs/ s H  o"R                  PM     nnU$ s  snf )a3  
Outputs pitch tuples for each distinct transposition (normal order).

>>> pList = [pitch.Pitch('C4'), pitch.Pitch('E4'), pitch.Pitch('G#4')]
>>> tc = analysis.transposition.TranspositionChecker(pList)
>>> tc.getPitchesOfDistinctTranspositions()
[(<music21.pitch.Pitch C>, <music21.pitch.Pitch E>, <music21.pitch.Pitch G#>),
 (<music21.pitch.Pitch C#>, <music21.pitch.Pitch F>, <music21.pitch.Pitch A>),
 (<music21.pitch.Pitch D>, <music21.pitch.Pitch F#>, <music21.pitch.Pitch A#>),
 (<music21.pitch.Pitch E->, <music21.pitch.Pitch G>, <music21.pitch.Pitch B>)]
)r8   r   )r   chordsr%   allNormalOrderPitchTupless       r   "getPitchesOfDistinctTranspositions7TranspositionChecker.getPitchesOfDistinctTranspositions   s5     7798>$?1YY!$?(( %@s   .)r   r   r   r   N) )r   zIterable[pitch.Pitch])__name__
__module____qualname____firstlineno____doc__r   r    r'   r/   r3   r8   r=   __static_attributes__r?   r   r   r
   r
      s*    4-!<.$$.$*)r   r
   c                  >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)Test   c                2    SSK Jn  U" U [        5       5        g )Nr   )testCopyAll)music21.test.commonTestrJ   globals)r   rJ   s     r   testCopyAndDeepcopyTest.testCopyAndDeepcopy   s    7D')$r   c                    [         R                  " S5      /n[        U5      nU R                  UR                  U5        [        UR                  5      nU R                  U[        U5      5        g )ND#)r   Pitchr
   assertEqualr   r2   )r   r   tcnumberOfPitchesInTcs       r   !testConstructTranspositionChecker&Test.testConstructTranspositionChecker   sT    [[!!$Q'!"**o,c!f5r   c                x   [         R                  " S5      /n[        U5      nUR                  5       nU R	                  [        U5      S5        U R                  US   S   [         R                  5        U R	                  US   S   R                  US   R                  5        U R	                  US   S   R                  US   R                  S-   5        [         R                  " S5      [         R                  " S5      /n[        U5      nUR                  5       nU R	                  [        U5      S5        U R                  US   S   [         R                  5        U R	                  US   S   R                  US   R                  5        U R	                  US   S   R                  US   R                  5        g )NrP   r   r      F)r   rQ   r
   r    rR   r2   assertIsInstancemidi)r   r   rS   r   s       r   testTranspositionsTest.testTranspositions   ss   [[!!$002./4/215u{{C*1-a055qtyyA*1-a055qtyy1}E[[C 01!!$002./4/215u{{C*1-a055qtyyA*1-a055qtyyAr   c                "   [         R                  " S5      [         R                  " S5      [         R                  " S5      /n[        U5      nUR                  5       nU R	                  [        U5      S5        U R                  US   S   S5        g )NC4E4G#4r   r      )r   rQ   r
   r'   rR   r2   
assertLess)r   pListrS   normalOrderss       r   testNormalOrdersTest.testNormalOrders   sm    T"EKK$5u{{57IJ!%(**,\*B/Q*B/r   c                   [         R                  " S5      [         R                  " S5      [         R                  " S5      /n[        U5      nUR                  5       nUR	                  5       nU R                  [        U5      S5        U R                  US5        U R                  U[        5        U R                  US   / SQ5        g )Nr_   r`   ra      r   )r   ri      )	r   rQ   r
   r/   r3   rR   r2   rZ   list)r   rd   rS   allDistinctNormalOrderslengthDistinctNormalOrderss        r   testDistinctNormalOrdersTest.testDistinctNormalOrders   s    T"EKK$5u{{57IJ!%("$"="="?%'%A%A%C"45q93Q75t<03Y?r   c                   [         R                  " S5      [         R                  " S5      [         R                  " S5      /n[        U5      nUR                  5       nU R	                  [        U5      S5        U R                  US   [        R                  5        U R                  US   R                  S   [         R                  5        g Nr_   r`   ra   ri   r   )
r   rQ   r
   r8   rR   r2   rZ   r   r#   r   )r   rd   rS   r6   s       r   testNormalOrderChordsTest.testNormalOrderChords   s    T"EKK$5u{{57IJ!%(!CCE12A6215u{{C215==a@%++Nr   c                p   [         R                  " S5      [         R                  " S5      [         R                  " S5      /n[        U5      nUR                  5       nU R	                  [        U5      S5        U R                  US   [        5        U R                  US   S   [         R                  5        g rq   )r   rQ   r
   r=   rR   r2   rZ   r+   )r   rd   rS   r<   s       r   testNormalOrdersPitchesTest.testNormalOrdersPitches   s    T"EKK$5u{{57IJ!%($&$I$I$K!67;7:EB7:1=u{{Kr   r?   N)r@   rA   rB   rC   rM   rU   r\   rf   rn   rr   ru   rE   r?   r   r   rG   rG      s)    %6B&0
@	O	Lr   rG   __main__)
__future__r   collections.abcr   unittestmusic21r   r   r   r   EnvironmentenvironLocalr
   TestCaserG   r@   mainTestr?   r   r   <module>r      sq    # $     &&'?@a) a)HIL8 IL\ zT r   