B
    £ �a3  ã               @   s¢   d dl Zd dlmZmZmZmZmZmZm	Z	m
Z
mZmZmZ d dlmZmZmZ d dlmZmZ eƒ ZdZdd„ ZdZG d	d
„ d
eed�ZG dd„ deed�ZdS )é    N)ÚQObjectÚQUrlÚSlotÚQStringListModelÚPropertyÚSignalÚQTimerÚQThreadPoolÚ	QRunnableÚQMetaObjectÚQt)ÚLooperThreadÚloop_parametersÚlooper_parameters)ÚPropertyMetar   )Zredo_is_tapZuse_rateZuse_common_insZuse_common_outsZuse_safety_feedbackZpan_3Zpan_4Zinput_latencyZoutput_latencyZtrigger_latencyZautoset_latencyc             C   s   t t| |ƒ|ƒS )N)ÚmaxÚmin)ÚvÚ	min_valueÚ	max_value© r   ú/home/debian/UI/loopler.pyÚclamp   s    r   )Z	tap_tempoZ	save_loopZauto_disable_latencyZselect_next_loopZselect_prev_loopZselect_all_loopsc                   s.  e Zd ZeeƒZeeƒZeeƒZeeƒZ	eeƒZ
eeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZ eeƒZ!eeƒZ"eeƒZ#eeƒZ$eeƒZ%eeƒZ&eeƒZ'd‡ fdd„	Z(‡  Z)S )ÚLoopNc                s¸   t ƒ  |¡ ttj| j ¡ ƒ}d| _d| _t	t
ƒt	tƒ }xR|D ]J\}}|t
krB|tkrBt| ƒj|  | |¡ y| |¡ W qB   Y qBX qBW x"|D ]}t| ƒj|  | d¡ q–W d S )Nr   é   )ÚsuperÚ__init__ÚlistÚl_threadÚloopsÚ__dict__ÚitemsÚloop_lenÚchannel_countÚsetr   ÚunusedÚtypeÚsetterÚremove)ÚselfÚloop_numÚparentÚaZ
set_paramsÚkr   )Ú	__class__r   r   r   S   s    

zLoop.__init__)N)*Ú__name__Ú
__module__Ú__qualname__r   ÚintÚstateZ
next_stater#   Úfloatr"   Zloop_posZ	cycle_lenZ	free_timeZ
total_timeZrate_outputZin_peak_meterZout_peak_meterZ	is_soloedZ
rec_threshÚfeedbackÚdryÚwetÚ
input_gainÚrateZscratch_posÚdelay_triggerÚroundÚsyncZplayback_syncZuse_feedback_playZpan_1Zpan_2Zmute_quantizedZoverdub_quantizedÚpitch_shiftZstretch_ratioZwaitingZfade_samplesÚrelative_syncZquantizer   Ú__classcell__r   r   )r.   r   r   #   sF   r   )Ú	metaclassc                   sà  e Zd ZdZeeƒZeeƒZ	eeƒZ
eeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZeeƒZdZdZi Z‡ fdd„Zeƒ dd„ ƒZeƒ dd„ ƒZeeeƒd	d
„ ƒZdd„ Zeeedƒdd„ ƒZ eeƒdd„ ƒZ!eedƒdd„ ƒZ"eedƒdd„ ƒZ#eeƒdd„ ƒZ$eeƒdd„ ƒZ%eeƒdd„ ƒZ&eƒ dd„ ƒZ'eedƒdd „ ƒZ(eƒ d!d"„ ƒZ)d#d$„ Z*d%d&„ Z+d'd(„ Z,d)d*„ Z-d+d,„ Z.d-d.„ Z/d/d0„ Z0d1d2„ Z1eeeƒd3d4„ ƒZ2eƒ d5d6„ ƒZ3d7d8„ Z4d9d:„ Z5d;d<„ Z6‡  Z7S )=ÚLooplerFNc                s6   t ƒ  ¡  d| _d| _| j | j¡ | j | j¡ d S )Nr   F)	r   r   Úselected_loop_numÚmidi_learn_waitingÚloopAddedSignalÚconnectÚadd_loopÚloopRemovedSignalÚremove_loop)r)   )r.   r   r   r      s
    
zLoopler.__init__c             C   s  d| _ t ¡  dd„ ttjƒD ƒ| _d| _tj | j¡ tj	 | j
¡ tj | j¡ tj | j¡ tj | j¡ ttj ¡ ƒ}x6|D ].\}}|tkr„|tkr„t| ƒj|  | |¡ q„W d| _| jd k	�r|  | j¡ | j dd¡d d }tj |¡�rt |¡ d | _d S )	Nr   c             S   s   g | ]\}}t |ƒ‘qS r   )r   )Ú.0ÚiÚlr   r   r   ú
<listcomp>�   s    z)Loopler.start_loopler.<locals>.<listcomp>FTÚ.r   z.slb) rB   r   Zstart_serverÚ	enumerater   rC   Úloop_callbacksÚappendÚloop_responderÚlooper_callbacksÚlooper_responderÚloop_added_callbacksÚloop_added_responderÚloop_removed_callbacksÚloop_removed_responderÚmidi_binding_callbacksÚmidi_binding_responderr   r    r!   r   Úunused_looperr&   r'   Ú
is_runningÚsession_fileÚload_sessionÚrsplitÚosÚpathÚexistsZload_midi_bindings)r)   r,   r-   r   Zmidi_bindings_filer   r   r   Ústart_loopler‹   s(    
zLoopler.start_looplerc             C   sV   t j ¡  t j ¡  t j ¡  t j ¡  t j ¡  g | _d| _d| _	t  
¡  d| _d S )Nr   F)r   rO   ÚclearrR   rT   rV   rX   r   rB   rC   Zstop_serverr[   )r)   r   r   r   Ústop_loopler¦   s    




zLoopler.stop_looplerc             C   s.   yt j|  |¡ W n tk
r(   Y nX d S )N)r   r   ÚhitÚ
IndexError)r)   Úloop_idÚcommandr   r   r   Úui_loop_command³   s    zLoopler.ui_loop_commandc             C   s6   t |ƒ}ytj|  |¡ W n tk
r0   Y nX d S )N)r2   r   r   re   rf   )r)   rg   rh   r   r   r   Úloop_commandº   s
    zLoopler.loop_commandÚdoublec             C   s0   yt j|  ||¡ W n tk
r*   Y nX d S )N)r   r   Úloop_setrf   )r)   rg   Ú	parameterÚvaluer   r   r   Úui_setÁ   s    zLoopler.ui_setc             C   sT   y:t j| jdk r&t j|  dd¡ nt j|  dd¡ W n tk
rN   Y nX d S )Nr   r:   r   éÿÿÿÿ)r   r   r:   rl   rf   )r)   rg   r   r   r   Úui_set_delayÈ   s    zLoopler.ui_set_delayc             C   s    xt jD ]}| ||¡ qW d S )N)r   r   rl   )r)   rm   rn   Úloopr   r   r   Ú
ui_set_allÒ   s    zLoopler.ui_set_allc             C   s   t  ||¡ d S )N)r   r$   )r)   rm   rn   r   r   r   Úui_set_global×   s    zLoopler.ui_set_globalc             C   sb   || j krB| j | dk r$d| j |< n
d| j |< t || j | ¡ nd| j |< t || j | ¡ d S )Nr   r   rp   )Úchange_onlyr   r$   )r)   rm   r   r   r   Úui_set_global_changeÛ   s    


zLoopler.ui_set_global_changec             C   s   t  |¡ d S )N)r   Úselect_loop)r)   rg   r   r   r   rw   ç   s    zLoopler.select_loopc             C   s   t  |¡ d S )N)r   rF   )r)   Znum_channelsr   r   r   Úui_add_loopë   s    zLoopler.ui_add_loopc             C   s   t  ¡  d S )N)r   rH   )r)   r   r   r   Úui_remove_loopï   s    zLoopler.ui_remove_loopÚQVariantListc             C   s   ||f| _ d S )N)Úcurrent_command_params)r)   rh   Úargsr   r   r   Úui_set_current_commandó   s    zLoopler.ui_set_current_commandc             C   s
   d | _ d S )N)r{   )r)   r   r   r   Úui_unset_current_commandø   s    z Loopler.ui_unset_current_commandc             C   s`   y| j |d  }W n tk
r&   dS X |dd… \}}|t|ƒjkr\t|ƒj|  ||¡ dS )zO Listens for replies from SL about loops, then updates loop object accordingly.r   Nr   )r   rf   r&   r    r'   )r)   r|   rr   Úcontrolrn   r   r   r   rQ   ý   s    zLoopler.loop_responderc             C   s8   |dd… \}}|t | ƒjkr4t | ƒj|  | |¡ dS )z6 Listens for replies from SL about looper global stater   N)r&   r    r'   )r)   r|   r   rn   r   r   r   rS     s    zLoopler.looper_responderc             C   s   | j  |¡ d S )N)rD   Úemit)r)   r*   r   r   r   rU     s    zLoopler.loop_added_responderc             C   s
   d| _ d S )NF)rC   )r)   r|   r   r   r   rY     s    zLoopler.midi_binding_responderc             C   s   | j  t|ƒ¡ d S )N)r   rP   r   )r)   r*   r   r   r   rF     s    zLoopler.add_loopc             C   s   | j  |¡ d S )N)rG   r€   )r)   r*   r   r   r   rW     s    zLoopler.loop_removed_responderc             C   s   | j  ¡  d S )N)r   Úpop)r)   r*   r   r   r   rH     s    zLoopler.remove_loopc       	      C   s°   |dkr8| j d|  ||  }t|||ƒ}|  ||¡ nt|dkrx| j| j d|  ||  }t|||ƒ}|  |||¡ n4| jd j d|  ||  }t|||ƒ}|  ||¡ d S )Nrt   Ú_ro   r   )r    r   rt   r   ro   rs   )	r)   rh   rm   r*   ÚchangeÚ
knob_speedÚrminÚrmaxr   r   r   r   Úchange_from_knob  s    zLoopler.change_from_knobc             C   s   d| _ t ||¡ d S )NT)rC   r   Ú
midi_learn)r)   r   r*   r   r   r   Úui_bind_request/  s    zLoopler.ui_bind_requestc             C   s   d| _ t ¡  d S )NF)rC   r   Zcancel_midi_learn)r)   r   r   r   Úui_cancel_bind_request4  s    zLoopler.ui_cancel_bind_requestc             C   s   t  |¡ d S )N)r   Úsave_session)r)   Úfr   r   r   r‹   9  s    zLoopler.save_sessionc             C   s   t  |¡ d S )N)r   Úsave_midi_bindings)r)   rŒ   r   r   r   r�   <  s    zLoopler.save_midi_bindingsc             C   s   t  |¡ d S )N)r   r]   )r)   rŒ   r   r   r   r]   ?  s    zLoopler.load_session)8r/   r0   r1   r[   r   r   r   r   r2   rD   rG   rB   r4   r8   r7   r6   ÚtempoZeighth_per_cycleZsync_sourcer>   ÚboolrC   r{   r\   ru   r   r   rb   rd   Ústrri   rj   ro   rq   rs   rt   rv   rw   rx   ry   r}   r~   rQ   rS   rU   rY   rF   rW   rH   r‡   r‰   rŠ   r‹   r�   r]   r?   r   r   )r.   r   rA   i   sX   

rA   )Úos.pathr_   ÚPySide2.QtCorer   r   r   r   r   r   r   r	   r
   r   r   Zdooperr   r   r   Ú
propertiesr   r   r%   r   rZ   r   rA   r   r   r   r   Ú<module>   s   4F