
    3j`*                        d dl m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	  ej                  d      Z G d	 d
      Z G d dej                        Zedk(  rd dlZ ej                   e       yy)    )annotations)IterableN)chord)common)environment)pitchzanalysis.transpositionc                  >    e Zd ZdZd
ddZd Zd Zd Zd Zd Z	d Z
y	)TranspositionCheckera  
    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                    |st        d      t        j                  |      st        d      || _        g | _        g | _        g | _        y )Nz&Must have at least one element in listzMust be a list or tuple)	TypeErrorr   
isIterablepitchesallTranspositionsallNormalOrdersdistinctNormalOrders)selfr   s     K/DATA/.local/lib/python3.12/site-packages/music21/analysis/transposition.py__init__zTranspositionChecker.__init__2   sR    8    )566 /6')%'*,!    c                    g }t        d      D ]F  }g }| j                  D ]"  }|j                  |j                  |             $ |j                  |       H || _        |S )aw  
        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   getTranspositionsz&TranspositionChecker.getTranspositionsA   sa    * rA "\\!((Q8 "$$%67	 
 "3  r   c                    | j                   s| j                          | j                   }g }|D ]4  }t        j                  |      }|j                  }|j                  |       6 || _        |S )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   listNormalOrdersz%TranspositionChecker.listNormalOrders_   sk     %%""$ 22!2-.AmmO""?3	 "3
  /r   c                    | j                   s| j                          | j                   }t               }|D cg c]+  }t        |      |v s|j	                  t        |            s|- }}|| _        |S c c}w )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   listDistinctNormalOrdersz-TranspositionChecker.listDistinctNormalOrdersv   sx     ##!!#..u+:  Q?a(-aD(8DHHU1X<N !"?  Q$8!## Qs   0A2c                d    | j                   s| j                          t        | j                         S )a  
        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   numDistinctTranspositionsz.TranspositionChecker.numDistinctTranspositions   s*     (())+4,,--r   c                    | j                   s| j                          | j                   }g }|D ](  }t        j                  |      }|j	                  |       * |S )a  
        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   !getChordsOfDistinctTranspositionsz6TranspositionChecker.getChordsOfDistinctTranspositions   s[     (())+#88!3O#(;;#?  ''(<=  4 $#r   c                b    | j                         }|D cg c]  }|j                   }}|S c c}w )a{  
        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>)]
        )r2   r   )r   chordsr"   allNormalOrderPitchTupless       r   "getPitchesOfDistinctTranspositionsz7TranspositionChecker.getPitchesOfDistinctTranspositions   s7     7798>$?1QYY!$?(( %@s   ,N) )r   zIterable[pitch.Pitch])__name__
__module____qualname____doc__r   r   r$   r+   r.   r2   r6   r7   r   r   r
   r
      s*    4-!<.$$.$*)r   r
   c                  6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	Testc                2    ddl m}  || t                      y )Nr   )testCopyAll)music21.test.commonTestr?   globals)r   r?   s     r   testCopyAndDeepcopyzTest.testCopyAndDeepcopy   s    7D')$r   c                    t        j                  d      g}t        |      }| j                  |j                  |       t        |j                        }| j                  |t        |             y )ND#)r   Pitchr
   assertEqualr   r-   )r   r   tcnumberOfPitchesInTcs       r   !testConstructTranspositionCheckerz&Test.testConstructTranspositionChecker   sT    [[!!$Q'!"**o,c!f5r   c                r   t        j                  d      g}t        |      }|j                         }| j	                  t        |      d       | j                  |d   d   t         j                         | j	                  |d   d   j                  |d   j                         | j	                  |d   d   j                  |d   j                  dz          t        j                  d      t        j                  d      g}t        |      }|j                         }| j	                  t        |      d       | j                  |d   d   t         j                         | j	                  |d   d   j                  |d   j                         | j	                  |d   d   j                  |d   j                         y )NrD   r   r      F)r   rE   r
   r   rF   r-   assertIsInstancemidi)r   r   rG   r   s       r   testTranspositionsz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                   t        j                  d      t        j                  d      t        j                  d      g}t        |      }|j                         }| j	                  t        |      d       | j                  |d   d   d       y )NC4E4G#4r   r      )r   rE   r
   r$   rF   r-   
assertLess)r   pListrG   normalOrderss       r   testNormalOrderszTest.testNormalOrders   sm    T"EKK$5u{{57IJ!%(**,\*B/Q*B/r   c                   t        j                  d      t        j                  d      t        j                  d      g}t        |      }|j                         }|j	                         }| j                  t        |      d       | j                  |d       | j                  |t               | j                  |d   g d       y )NrQ   rR   rS      r   )r   rZ      )	r   rE   r
   r+   r.   rF   r-   rM   list)r   rV   rG   allDistinctNormalOrderslengthDistinctNormalOrderss        r   testDistinctNormalOrderszTest.testDistinctNormalOrders   s    T"EKK$5u{{57IJ!%("$"="="?%'%A%A%C"45q93Q75t<03Y?r   c                   t        j                  d      t        j                  d      t        j                  d      g}t        |      }|j                         }| j	                  t        |      d       | j                  |d   t        j                         | j                  |d   j                  d   t         j                         y NrQ   rR   rS   rZ   r   )
r   rE   r
   r2   rF   r-   rM   r   r    r   )r   rV   rG   r0   s       r   testNormalOrderChordszTest.testNormalOrderChords   s    T"EKK$5u{{57IJ!%(!CCE12A6215u{{C215==a@%++Nr   c                j   t        j                  d      t        j                  d      t        j                  d      g}t        |      }|j                         }| j	                  t        |      d       | j                  |d   t               | j                  |d   d   t         j                         y ra   )r   rE   r
   r6   rF   r-   rM   r'   )r   rV   rG   r5   s       r   testNormalOrdersPitcheszTest.testNormalOrdersPitches   s    T"EKK$5u{{57IJ!%($&$I$I$K!67;7:EB7:1=u{{Kr   N)
r8   r9   r:   rB   rI   rO   rX   r_   rb   rd   r7   r   r   r=   r=      s)    %6B&0
@	O	Lr   r=   __main__)
__future__r   collections.abcr   unittestmusic21r   r   r   r   EnvironmentenvironLocalr
   TestCaser=   r8   mainTestr7   r   r   <module>rn      su    # $     &{&&'?@a) a)HIL8 IL\ zGT r   