
    v1j[?                        d Z ddlZddlZddlZddlZdZdZddddd	d
dZg dZ	g dZ
g dZdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddd!ddd"ddddddddd#ddddddddd$ddddddddgZd%d&d'd(d)d*d+d,d-d.d/d0d1Zd2ed3efd4Zd5Zd6ed3efd7Zd8ej*                  d9ed3efd:Zd8ej*                  fd;Zd8ej*                  d9ed3efd<Zd8ej*                  d3efd=Zd8ej*                  d9ed3efd>Zd8ej*                  d9ed3efd?ZdMd@edAed3efdBZ	 	 dNd8ej*                  d9edCed@edz  d3ef
dDZ d8ej*                  d9ed3efdEZ!dF Z"dMdGedHedAed3efdIZ#dJed3efdKZ$dJed3efdLZ%y)OzsAudio analysis for Razzmatazz Kitmaker.

BPM, type classification, loop/one-shot, key, pitch, loudness, DC offset.
    N<      )   r   )r      )r     )r     )r     )r	   i N  subbasslowmidmidhighmidhigh)CzC#DzD#EFzF#GzG#AzA#B)gffffff@gףp=
@gףp=
@gp=
ף@gQ@g\(\@g)\(@g(\@gQ@gHzG@gRQ@g
ףp=
@)gRQ@gq=
ףp@g)\(@gQ@g@g=
ףp=@gRQ@g      @gףp=
@gQ@gQ
@g\(\	@kick333333?g?           )namer   r   r   r   fast_attacknoise	pitchdropsnare皙?皙?	closedHat      ?g333333?openHatclaptom皙?percrimg      ?shakercrashcowbell)r   kikzbd bassdrum	bass drum)r    snr sd )hathh hihatclosed)openohh)r&   )r'   )r)   tambclavebellshkr)r*   rimshot)r+   shake)r,   )r-   )ride)r   r    r#   r%   r&   r'   r)   r*   r+   r,   r-   r?   datareturnc                 t   t        j                  dd      5 }|j                  |        |j                  }d d d        	 t	        j
                  ddd      \  }}||f	 t        j                  |       S # 1 sw Y   @xY w# t        $ r Y S w xY w# 	 t        j                         w # t        $ r Y w w xY wxY w)Nz.wavF)suffixdeleteiD  Tkaiser_fast)srmonores_type)	tempfileNamedTemporaryFilewriter   librosaloadosunlinkOSError)r@   finpathyrF   s        */home/david/assistant/kitmaker/analysis.py
read_audiorU   <   s    		$	$F5	AQ	 
BVD=Q2"u	IIf 
B	A  			IIf 		sL   A5B B5A>	BBB7B('B7(	B41B73B44B7   raw_bpmc                     | dk  ryt        t        |             }|dk  r|dz  t        k  r|dz  S |dkD  r|dz  t        k\  r|dz  S t	        t        t        t        |            S )z0Clamp and round a raw BPM to a reasonable value.r   F         )introundBPM_MAXBPM_MINmaxmin)rW   bpms     rT   _readable_bpmrc   M   sd    !|
eGn
C
RxC!Gw&Qw
SyS1W'axwGS)**    rS   rF   c                 H   t        |       |z  }|dk  ry|dk  ryt        j                  j                  | |dd      }t        |      dk\  rt        j                  ||d      }t        j                  |      }t        j                  |      }t        j                  t        j                  ||z
              }|d	kD  r"|t        j                  ||z
        d
|z  k     }n|}t        |      d
k\  r>t        j                  |      }	|	d	kD  r$d|	z  }
t        |
cxk  rt        k  rt        |
      S  t        j                  j                  | |d      \  }}|t        j                  |d	k(        ryt!        t        j"                  |      j$                  d	         }t        |      S )Nr$   r          @   F)rS   rF   
hop_length	backtrack   )rF   rh   r   rZ   g      N@time)rS   rF   units)lenrL   onsetonset_detectframes_to_timenpdiffmedianabsmeanr_   r^   rc   beat
beat_trackallfloatasarrayflat)rS   rF   duronset_framesonset_times	intervalsmedmadcleanmean_interval	onset_bpmtempo_rb   s                 rT   
detect_bpmr   [   so   
a&2+C
Sy
Sy ==--bSTY-ZL
<A,,\bSQGGK(	ii	"iiy3/07bffY_5S@AEEu:?GGENMq  =0	i272(33 3 ||&&r&@HE1}uz*


5!&&q)
*Crd   c                     t        j                  t        j                  | dz              }|dk(  ry t        dt        j                  |      z  d      S )NrZ   r   r   r   )rq   sqrtru   r]   log10)rS   rmss     rT   
detect_rmsr   }   s@    
''"''!q&/
"C
axbhhsm#Q''rd   c           	         t        |       dk  rg S t        |dz        }t        dt        |       |z        }g }t        |      D ]U  }| ||z  |dz   |z   }t	        t        j                  t        j                  |dz                    }|j                  |       W |rt        |      nd}|D 	cg c]  }	t        |	|z  d       c}	S c c}	w )N   r!   r   rZ   rj   )
rm   r\   r`   rangery   rq   r   ru   appendr]   )
rS   rF   chunknr   iframevalmxvs
             rT   detect_amplitude_enveloper      s    
1v|	T	NEAs1vA
C1X!e)q1uo.BGGBGGEQJ/01

3  SaB&)*cE!b&!c***s   /Cc                 >    t        t        j                  |             S N)ry   rq   ru   )rS   s    rT   detect_dc_offsetr      s    rd   c                     t        |       |k  ryt        j                  | |ddd      \  }}}||   }t        |      dk(  ryt        t	        t        j                  |            d      S )Nr   2   r   )rF   fminfmaxfill_nar   r   )rm   rL   pyinr]   ry   rq   rs   )rS   rF   f0voicedr   	voiced_f0s         rT   detect_pitchr      s_    
1v{LLrsKMB6
I
9~ryy+,a00rd   c           	      j   t        j                  t        j                  |             }t        j                  |      }|j
                  dk(  r	dddi dddS t        j                  |      }|dk(  rd}t        t        j                  t        j                  j                  ||                  }t        t        j                  t        j                  j                  ||                  }t        t        j                  t        j                  j                  ||                  }i }t        j                         D ]@  \  }	\  }
}||
k\  ||k  z  }t        j                  ||d d f         |z  }t        |      ||	<   B t        t        j                  t        j                  j                  |                   }t!        |       dz  }|dkD  r<t        j                  t        j                  | d |             }t        j                  t        j                  | |d              }t        j                  |t        j                  |d      z        t#        t        j                  |      d      z  }t%        |j&                  d   |j&                  d         }t        j                  |d | t        j                  |d | d      z        t#        t        j                  |d |       d      z  }t#        d||z
        t#        |d      z  }nd	}t        j(                  j+                  | |d
d      }t!        |      dkD  rt#        dt-        |d               }n1t-        t        j.                  t        j                  |                   }t#        d|t-        d|z        z
        }t%        t!        |       |t-        d|z        z         }||k  rt        j                  | || dz        nd}t        j                  | || dz        }t        |t#        ||z   d      z        }||||||t        |      dS )N)rF   r   )centroidrolloff	bandwidthband_energyzcrr   r   )SrF   rZ   rg   axisr   Tsamples)rS   rF   ri   rl   g{Gzt?g{Gz?)r   r   r   r   r   r   r   )rq   rt   rL   stftfft_frequenciessizesumry   ru   featurespectral_centroidspectral_rolloffspectral_bandwidthBANDSitemszero_crossing_raterm   r`   ra   shapern   ro   r\   argmax)rS   rF   r   freqstotal_energyr   r   r   r   r   lohimaskenergyr   halfS_aS_bc_amin_lenc_br   r}   rn   prepost
energy_preenergy_postr   s                                rT   spectral_featuresr      sj   
w||AA##r*Evv{aaaa
 	

 66!9LqRWWW__>>r>JKLHBGGGOO<<qR<HIJGbgggoo@@1@LMNIK++-hr2
+$'
#l2!&MD (
 ::1=>
?Cq6Q;DczffW\\!ET(+,ffW\\!DE(+,ffURWWSq112Sa5HHciilCIIaL1ffU8G_rwws8G}1'EEFRVVTWX`Y`TaMbdeIff39%C3		==--bDPY-ZL
<1As<?+,BIIbffQi()
aURZ(
)Cs1vus52:./D.1Ek#e)*qJ&&5!+,Kc*{*BA&FFGK ""9% rd   featuresfilenamec                 "   | d   }|j                         i }t        D ]9  }t        j                  |d   d      }t	        fd|D              rdnd||d   <   ; g }t        D ]  }d}dD ]:  }|j                  |d      }	|j                  |d      }
|t        |	|
z
        d	z  z  }< | d
   }|t        ||d   z
        dz  z  }|t        | d   |d   z
        dz  z  }|t        | d   |d   z
        dz  z  }|d   dk(  r| d   dkD  r|| d   dz  z  }||j                  |d   d      dz  z  }|j                  ||d   f        |j                  d       |d   d   }d}|D cg c]  \  }}|||z
  k\  s| }}}|r|S |d   d   gS c c}}w )Nr   r    c              3   &   K   | ]  }|v  
 y wr   r   ).0pfn_lowers     rT   	<genexpr>z classify_type.<locals>.<genexpr>   s     (I1h   r   r   r   r
   rZ   r   r   rV   r      r   r&   r      rj   T)reverse      @)lowerTYPE_SIGNATUREFN_PATTERNSgetanyrt   r   sort)r   r   befn_boostsigpatternsscoresscorebandactualexpectedr   	top_score	thresholdscr   resultsr   s                    @rT   classify_typer      s   	-	 B~~HH??3v;3%((I(I%IqV  FGDVVD!_FwwtQ'HS(*+a//E H US\)*Q..Xm,s=/AABQFFXk*S-==>BBv;& Xm%<s%BXm,q00Ec&k1-11uc&k*+   KKKq	!II$*JFDbI	4I.ItFGJ71F1IaL>1 Ks   &F7Floop_oneshotc           
         t        |       |z  }|dk  ry|dk(  r|dk  ry|r7|j                  dd      }|j                  dd      }|dk  s|d	k  r	||d
z  kD  ryt        j                  j	                  | |d      }t        j                  |d      }t        t        j                  |            }	|	dk  ry|t        j                  |      z  }
t        t        j                  |
d      t        j                  |
d      z
        }|dk  ryt
        j                   }d}t        d      D ]  }t        t        j                  |
t        j                  t        |            d         }||kD  r|}t         |   }t        t        j                  |
t        j                  t"        |            d         }||kD  s|}t         |   dz   } |dk  ry|S )Nrf    oneshotr   r   r   r   r   r   g?   )rS   rF   n_chromar   r   Z   
   r   mg      @)rm   r   rL   r   
chroma_cqtrq   ru   ry   r   r`   
percentileinfr   	correlaterollKS_MAJORPITCH_CLASSESKS_MINOR)rS   rF   r   r   r|   centbwchromachroma_meanr   chroma_normchroma_range
best_scorebest_keyr   score_majorscore_minors                    rT   
detect_keyr     s   
a&2+C
Syy S3Y ||J*\\+q)#:$+"tcz/__''!R'@F''&q)K,-Lc{ 33K{B7"--UW:XXYLc&&JH2YBLLbggh6JKANO#$J$Q'HBLLbggh6JKANO#$J$Q'#-H  COrd   c           	         t        |       |z  }t        dt        |       dz        }|dk\  r| d | }| | d  }t        j                  t        j                  j                  |            }t        j                  t        j                  j                  |            }|t        t        j                  |      d      z  }|t        t        j                  |      d      z  }t        t        j                  ||z              }nd}t        j                  j                  | |d      }	d}
t        |	      dk\  r]t        j                  |	      }t        |      dk\  r:t        j                  |      t        t        j                  |      d	      z  }|d
k  }
t        j                  |       }t        j                  |t        j                   d      d      }|t        t        j                  |      d      z  }t        t        j                  |t        |       dz  d              }t        t        j                  |d t        |      dz               }|t        |d      z  }|dkD  r|dkD  ry|
r|d
kD  ry|dkD  r|dkD  r|dkD  ryy)Nrg   rj      g&.>r   F)rS   rF   ri   rZ   r   r   r   same)modegffffff?r$   looprf   r"   r(   r   )rm   ra   rq   rt   fftrfftr`   r   ry   rL   rn   ro   rr   stdru   convolvehanning)rS   rF   r|   winheadtailhead_magtail_mag
continuityr}   regularr   cvenvtail_energyhead_energydecay_ratios                    rT   detect_loop_oneshotr"  %  s   
a&2+C
 c3q6Q;
C
cz#w#x66"&&++d+,66"&&++d+,c"&&"2D99c"&&"2D99266(X"567

 ==--bE-JLG
<AGGL)	y>Q	"S);Q%??B3hG &&)C
++c2::c?
8C
BFF3K&
&CSXIqLM 234KLSXq[ 123KK 66K CC#I ;$ SyZ#%+*;rd   c                    t        | t              r-| j                         D ci c]  \  }}|t        |       c}}S t        | t              r| D cg c]  }t        |       c}S t        | t
        j                  f      rt        |       S t        | t
        j                  f      rt        |       S t        | t
        j                        r| j                         S | S c c}}w c c}w )z7Recursively convert numpy types to native Python types.)
isinstancedictr   
_to_nativelistrq   floatingry   integerr\   ndarraytolist)objkr   s      rT   r&  r&  Y  s    #t-0YY[9[TQ:a= [99#t'*+s!
1s++#~&Sz#

}%3x#rzz"zz|J :+s   CC%input_bytesextc                 <   t        |       \  }}t        |      |z  }t        |      dk  rt        dt        |      d|dd dddd	      S t	        ||      }t        |      }d}d}	|d	k(  s|d
k\  r"t        ||      }|dkD  r|}
d}	n|}
|
dkD  rdnd}	n|dkD  r|}
d}	nd}
t        ||      }t        ||      }t        ||||      }t        |      }t        |      }t        ||      }t        ||      }t        |
||t        |d      ||t        |d      |||	dddd
      S )Nr   r   r   r   r   zAudio too short)	rb   sample_typer   durationkeyloudness_db	dc_offsetpitcherrorunknownr  r   r   likelyr   r   	heuristic)rb   typer  )
rb   r1  r   r2  r3  r4  r5  r6  amp_env
confidence)rU   rm   r&  guess_type_from_namer"  guess_bpm_from_namer   r   r   r  r   r   r   r   r]   )r.  r/  r   rS   rF   r|   r   bpm_from_namebpm_from_audiobpm_confidencerb   r   r1  r3  r4  r5  r6  r<  s                     rT   analyze_audiorC  h  sp   {#EAr
a&2+C
1v|/9%&

 
 
	 'q"-L (1MNNv#Ar*1C'N C),qXiN		# B'H(3K QL(
3CQ-K #IBE'2.G"$#qM"9a(!
  rd   r   c                     | j                         }dd l}|j                  d|      }|rMt        |j	                  d      xs |j	                  d            }t
        |cxk  rt        k  rt        |      S  yy)Nr   z+(\d{2,3})\s*[_\s]?bpm|bpm\s*[_\s]?(\d{2,3})r   rZ   r   )r   researchr\   groupr_   r^   ry   )r   r   rE  r   r   s        rT   r?  r?    sb    

A
		@!DA!''!**
+c$W$: %rd   c                 z   | j                         t        fddD              rdgS t        fddD              rdgS t        fddD              rd	gS t        fd
dD              rdgS dv rdgS t        fddD              rdgS t        fddD              rdgS t        fddD              rdgS dgS )Nc              3   &   K   | ]  }|v  
 y wr   r   )r   r-  r   s     rT   r   z'guess_type_from_name.<locals>.<genexpr>  s     
SRa16Rr   )r   r.   bdr/   r0   z kickr   c              3   &   K   | ]  }|v  
 y wr   r   )r   sr   s     rT   r   z'guess_type_from_name.<locals>.<genexpr>  s     
HGa16Gr   )r    r1   r2   z snarezsnare r    c              3   &   K   | ]  }|v  
 y wr   r   )r   hr   s     rT   r   z'guess_type_from_name.<locals>.<genexpr>  s     
XWa16Wr   )r5   zhi-hatzhi hatr4   r6   z
hat closedr#   c              3   &   K   | ]  }|v  
 y wr   r   )r   or   s     rT   r   z'guess_type_from_name.<locals>.<genexpr>  s     
<;a16;r   )r7   r8   r,   r?   r%   r&   c              3   &   K   | ]  }|v  
 y wr   r   )r   tr   s     rT   r   z'guess_type_from_name.<locals>.<genexpr>  s     
+?a16?r   )r'   ztom r'   c              3   &   K   | ]  }|v  
 y wr   r   )r   r   r   s     rT   r   z'guess_type_from_name.<locals>.<genexpr>  s     
lka16kr   )	r*   r=   r)   r-   r9   r+   r:   r;   r<   r)   c              3   &   K   | ]  }|v  
 y wr   r   )r   patr   s     rT   r   z'guess_type_from_name.<locals>.<genexpr>  s     
ML3!8Lr   )r  slicebreakpatternrv   rV  )r   r   )r   r   s    @rT   r>  r>    s    

A

SR
SSx

HG
HHy

XW
XX}

<;
<<{{x

+?
++w

lk
llx

ML
MMy7Nrd   )r   )r   N)&__doc__rN   rI   rL   numpyrq   r_   r^   r   r   r   r   r   r   bytestuplerU   	BPM_CLOSEry   r\   rc   r*  r   r   r'  r   r   r   r%  r   strr   r  r"  r&  rC  r?  r>  r   rd   rT   <module>r_     s)  
 
    
 	 RSS S33]^il{~S43]^il{~cS#^_jm|  AcS#^alo  B  CC#$\]hkz}~C##]^il{~C#$]^il{~C##]^im|  Ac3#s[^il{~sC3\_jm|  AsC3\]hkz}~ <%25! U u  	+5 +S +"** # % D("** (+ + + +

 u 1BJJ 1C 1E 18 8 8 8v2D 2C 2 2D <>'+%"** %# %S %%03%P12:: 13 13 1h@u @3 @# @t @F	c 	e 	s t rd   