§
    bíhh`  ã                   óî   — d Z ddlZddlmZ ddlmZmZ ddlZdZdZ	e	ez   Z
dZdZi 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)“Z G d*„ d+¦  «        Z G d,„ d-¦  «        ZdS ).z­
A Python library for interfacing with SooperLooper.

Tracks full state and provides interface to all loop commands. Almost a complete client, just missing saving sessions.
é    N)Ú
namedtuple)ÚEventÚLock) Ú
rec_threshÚfeedbackÚdryÚwetÚ
input_gainÚrateÚscratch_posÚdelay_triggerÚquantizeÚroundÚredo_is_tapÚsyncÚplayback_syncÚuse_rateÚfade_samplesÚuse_feedback_playÚuse_common_insÚuse_common_outsÚrelative_syncÚuse_safety_feedbackÚpan_1Úpan_2Úpan_3Úpan_4Úinput_latencyÚoutput_latencyÚtrigger_latencyÚautoset_latencyÚmute_quantizedÚoverdub_quantizedÚpitch_shiftÚstretch_ratio)ÚstateÚ
next_stateÚloop_lenÚloop_posÚ	cycle_lenÚ	free_timeÚ
total_timeÚrate_outputÚchannel_countÚin_peak_meterÚout_peak_meterÚ	is_soloedÚwaiting)ÚrecordÚoverdubÚmultiplyÚinsertÚreplaceÚreverseÚmuteÚundoÚredoÚoneshotÚtriggerÚ
substituteÚundo_allÚredo_allÚmute_onÚmute_offÚsoloÚpauseÚ	solo_nextÚ	solo_prevÚrecord_soloÚrecord_solo_nextÚrecord_solo_prevÚset_sync_posÚreset_sync_posscratch)ÚtempoÚeighth_per_cycler   r	   r
   Úsync_sourceÚ	tap_tempoÚ	save_loopÚauto_disable_latencyÚselect_next_loopÚselect_prev_loopÚselect_all_loopsÚselected_loop_numÚoutput_midi_clockÚsmart_eighthséÿÿÿÿÚunknownÚOffé   Ú	WaitStarté   Ú	Recordingé   ÚWaitStopé   ÚPlayingé   ÚOverdubbingé   ÚMultiplyingé   Ú	Insertingé   Ú	Replacingé	   ÚDelayé
   ÚMutedé   Ú
Scratchingé   ÚOneShoté   Ú
Substituteé   ÚPausedé   zOff and mutedc                   óì  ‡ — e Zd ZdZd-d„Zd„ Zˆ fd„Zd„ Zd	„ Zd
„ Z	d„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd.d„Zd„ Zd„ Zd„ Zd„ Zd„ Zed„ ¦   «         Zej        d„ ¦   «         Zed„ ¦   «         Zej        d„ ¦   «         Zed „ ¦   «         Zed!„ ¦   «         Zej        d"„ ¦   «         Zed#„ ¦   «         Z e j        d$„ ¦   «         Z ed%„ ¦   «         Z!e j        d&„ ¦   «         Z!d'„ Z"d(„ Z#d)„ Z$d*„ Z%d+„ Z&d,„ Z'ˆ xZ(S )/ÚLooperThreadzó
    Handles I/O with SooperLooper via OSC. Organizes loops.

    Uses a threaded liblo server to register for updates and automatically track looper and loop state.

    See documentation here: http://essej.net/sooperlooper/doc_osc.html

    éÞ&  éß&  Fc                 ó  — || _         || _        || _        t          j        | j         ¦  «        | _        t          ¦   «         | _        d| _        g | _	        g | _
        g | _        g | _        g | _        g | _        g | _        d S )Nr   )ÚportÚsl_portÚverboseÚlibloÚServerThreadÚserverr   Ú	ping_flagÚ
loop_countÚloopsÚloop_callbacksÚlooper_callbacksÚping_callbacksÚloop_added_callbacksÚloop_removed_callbacksÚmidi_binding_callbacks)Úselfr}   r~   r   s       ú/home/debian/UI/dooper.pyÚ__init__zLooperThread.__init__�   sz   € ØˆŒ	ØˆŒØˆŒåÔ(¨¬Ñ3Ô3ˆŒå™œˆŒàˆŒØˆŒ
à ˆÔØ "ˆÔØ ˆÔØ$&ˆÔ!Ø&(ˆÔ#Ø&(ˆÔ#Ð#Ð#ó    c                 óN   — d                      | j        | j        | j        ¦  «        S )Nz-LooperThread(port={}, sl_port={}, verbose={}))Úformatr}   r~   r   ©rŒ   s    r�   Ú__repr__zLooperThread.__repr__¤   s$   € Ø>×EÒEÀdÄiÐQUÔQ]Ð_cÔ_kÑlÔlÐlr�   c                 ó®   •— |dv r$t          ¦   «                              ||¦  «         d S |t          v r|                      ||¦  «         d S || j        |<   d S )N)rN   r   rU   rV   rW   )ÚsuperÚ__setattr__Úlooper_parametersÚsetÚ__dict__)rŒ   ÚnameÚvalÚ	__class__s      €r�   r–   zLooperThread.__setattr__¨   si   ø€ ØÐiÐiÐiÝ‰GŒG×Ò  cÑ*Ô*Ð*Ð*Ð*àÕ&Ð&Ð&Ø�HŠH�T˜3ÑÔÐÐÐð #&ˆDŒM˜$ÑÐÐr�   c                 óü  — t          j        dg¦  «         | j                             dd | j        ¦  «         | j                             dd | j        ¦  «         | j                             dd | j        ¦  «         | j                             dd | j        ¦  «         | j                             dd | j        ¦  «         | j         	                    ¦   «          |  
                    ¦   «          |                      ¦   «          d S )Nz/usr/bin/sooperlooperú/sl/pingú/sl/loopú
/sl/looperú/sl/loop_numú/sl/midi_bindings)Ú
subprocessÚPopenr‚   Ú
add_methodÚping_responderÚloop_responderÚlooper_responderÚloop_num_responderÚmidi_binding_responderÚstartÚ
initializeÚregister_updatesr’   s    r�   Ústart_serverzLooperThread.start_server²   så   € åÔÐ1Ð2Ñ3Ô3Ð3àŒ×Ò˜z¨4°Ô1DÑEÔEÐEØŒ×Ò˜z¨4°Ô1DÑEÔEÐEØŒ×Ò˜|¨T°4Ô3HÑIÔIÐIØŒ×Ò˜~¨t°TÔ5LÑMÔMÐMØŒ×ÒÐ2°D¸$Ô:UÑVÔVÐVàŒ×ÒÑÔÐØ�ŠÑÔÐØ×ÒÑÔÐÐÐr�   c                 ó˜  — | j                              dd ¦  «         | j                              dd ¦  «         | j                              dd ¦  «         | j                              dd ¦  «         | j                              dd ¦  «         |                      d¦  «         |                      ¦   «          | j                              ¦   «          d S )Nrž   rŸ   r    r¡   r¢   z/quit)r‚   Ú
del_methodÚsend_oscÚunregister_updatesÚstopr’   s    r�   Ústop_serverzLooperThread.stop_serverÀ   s¹   € ØŒ×Ò˜z¨4Ñ0Ô0Ð0ØŒ×Ò˜z¨4Ñ0Ô0Ð0ØŒ×Ò˜|¨TÑ2Ô2Ð2ØŒ×Ò˜~¨tÑ4Ô4Ð4ØŒ×ÒÐ2°DÑ9Ô9Ð9à�Š�gÑÔÐà×ÒÑ!Ô!Ð!ØŒ×ÒÑÔÐÐÐr�   c                 ó�  — d| _         g | _        d}|                      ¦   «         s0|dz   }|dk    rt          d¦  «         d S |                      ¦   «         ¯0t          D ]$}|                      d|| j        j        d¦  «         Œ%|                      dd| j        j        d¦  «         |                      dd	| j        j        d¦  «         | j         rkt          | j         ¦  «        D ]T}| j         	                    t          | |¦  «        ¦  «         t          D ]"}| j        |                              |¦  «         Œ#ŒUd S t          d
¦  «         d S )Nr   r[   é2   zNo ping reply from SooperLooperz/getr    z	/sl/0/getr   r   zLoop count is zero)r„   r…   ÚpingÚprintr—   r±   r‚   ÚurlÚrangeÚappendÚLoopÚloop_parametersÚget)rŒ   ÚattemptÚparamÚis       r�   r¬   zLooperThread.initializeÌ   s^  € ØˆŒØˆŒ
ØˆØ—)’)‘+”+ð 	Ø ‘kˆGØ˜Š|ˆ|ÝÐ7Ñ8Ô8Ð8Ø�ð	 —)’)‘+”+ð 	õ 'ð 	Hð 	HˆEØ�MŠM˜& %¨¬¬¸,ÑGÔGÐGÐGð 	�Š�k :¨t¬{¬ÀÑMÔMÐMØ�Š�k ?°D´K´OÀ\ÑRÔRÐRð Œ?ð 	(Ý˜4œ?Ñ+Ô+ð -ð -�Ø”
×!Ò!¥$ t¨Q¡-¤-Ñ0Ô0Ð0Ý,ð -ð -�EØ”J˜q”M×%Ò% eÑ,Ô,Ð,Ð,ð-ð-ð -õ
 Ð&Ñ'Ô'Ð'Ð'Ð'r�   c                 ó®   — | j         r#t          d                     ||¦  «        ¦  «         t          j        | j        t          j        |g|¢R Ž ¦  «         d S )NzSending OSC message: {} {})r   r¸   r‘   r€   Úsendr~   ÚMessage)rŒ   ÚpathÚargss      r�   r±   zLooperThread.send_oscç   sX   € ØŒ<ð 	CÝÐ.×5Ò5°d¸DÑAÔAÑBÔBÐBÝŒ
�4”<¥¤¨tÐ!;°dÐ!;Ð!;Ð!;Ñ<Ô<Ð<Ð<Ð<r�   c                 óÐ   — | j         r#t          d                     ||¦  «        ¦  «         |d         | _        | j                             ¦   «          | j        D ]} ||¦  «         Œd S )Nz ping Received OSC message: {} {}r]   )r   r¸   r‘   r„   rƒ   r˜   rˆ   ©rŒ   rÅ   rÆ   Úfs       r�   r¦   zLooperThread.ping_responderì   sv   € ØŒ<ð 	IÝÐ4×;Ò;¸DÀ$ÑGÔGÑHÔHÐHà˜qœ'ˆŒØŒ×ÒÑÔÐàÔ$ð 	ð 	ˆAØˆAˆd‰GŒGˆGˆGð	ð 	r�   c           	      ó  — | j         r.t          d                     ||| j        j        ¦  «        ¦  «         | j        }|d         | _        | j        |k    r·t          || j        ¦  «        D ]Ÿ}| j                             t          | |¦  «        ¦  «         | j
        D ]} ||¦  «         Œt          D ]X}| j        |                              |¦  «         |                      dt          |¦  «        z   dz   |d| j        j        d¦  «         ŒYŒ dS | j        |k     rt| j        }| j        D ]} ||¦  «         Œ| j                             ¦   «          t          D ]9}|                      dt          |¦  «        z   dz   || j        j        d¦  «         Œ8dS dS )	z- Listens for replies from SL about loop countz8loop num responder Received OSC message: {} {} server {}r]   ú/sl/ú/register_auto_updateéd   rŸ   ú/unregister_auto_updateN)r   r¸   r‘   r‚   r¹   r„   rº   r…   r»   r¼   r‰   r½   r¾   r±   ÚstrrŠ   Úpop)rŒ   rÅ   rÆ   Úprev_loop_countÚloop_numrÉ   rÀ   s          r�   r©   zLooperThread.loop_num_responderö   sÍ  € àŒ<ð 	rÝÐL×SÒSÐTXÐZ^Ð`dÔ`kÔ`oÑpÔpÑqÔqÐqØœ/ˆØ˜qœ'ˆŒØŒ?˜_Ò,Ð,Ý! /°4´?ÑCÔCð }ð }�à”
×!Ò!¥$ t¨XÑ"6Ô"6Ñ7Ô7Ð7ØÔ2ð  ð  �AØ�A�h‘K”K�K�KÝ,ð }ð }�EØ”J˜xÔ(×,Ò,¨UÑ3Ô3Ð3Ø—M’M &­3¨x©=¬=Ñ"8Ð;RÑ"RÐTYÐ[^Ð`dÔ`kÔ`oÐq{Ñ|Ô|Ð|Ð|ð}ð}ð }ð Œ_˜Ò.Ð.Ø”ˆHØÔ0ð ð �Ø��(‘”��ØŒJ�NŠNÑÔÐÝ(ð vð v�Ø—’˜f¥s¨8¡}¤}Ñ4Ð7PÑPÐRWÐY]ÔYdÔYhÐjtÑuÔuÐuÐuð /Ð.ð
vð vr�   c                 ó
  — 	 | j         |d                  }n# t          $ r Y dS w xY w|dd…         \  }}| j        r)|dk    r#t          d                     ||¦  «        ¦  «         ||j        |<   | j        D ]} ||¦  «         ŒdS )zO Listens for replies from SL about loops, then updates loop object accordingly.r   Nr[   r)   z*loop responder Received OSC message: {} {})r…   Ú
IndexErrorr   r¸   r‘   r™   r†   )rŒ   rÅ   rÆ   ÚloopÚcontrolÚvaluerÉ   s          r�   r§   zLooperThread.loop_responder  s¹   € ð	Ø”:˜d 1œgÔ&ˆDˆDøÝð 	ð 	ð 	ØˆFˆFð	øøøà˜a˜b˜bœ‰ˆ�àŒ<ð 	WØ˜*Ò$Ð$ÝÐB×IÒIÈ$ÐPTÑUÔUÑVÔVÐVà!&ˆŒ�gÑàÔ$ð 	ð 	ˆAØˆAˆd‰GŒGˆGˆGð	ð 	s   ‚ –
$£$c                 óÆ   — | j         r.t          d                     ||| j        j        ¦  «        ¦  «         |d         | j        |d         <   | j        D ]} ||¦  «         ŒdS )z6 Listens for replies from SL about looper global statez6looper responder Received OSC message: {} {} server {}r]   r[   N)r   r¸   r‘   r‚   r¹   r™   r‡   rÈ   s       r�   r¨   zLooperThread.looper_responder#  sv   € àŒ<ð 	pÝÐJ×QÒQÐRVÐX\Ð^bÔ^iÔ^mÑnÔnÑoÔoÐoà!% a¤ˆŒ�d˜1”gÑàÔ&ð 	ð 	ˆAØˆAˆd‰GŒGˆGˆGð	ð 	r�   c                 ó¶   — | j         r.t          d                     ||| j        j        ¦  «        ¦  «         |d         dk    r| j        D ]} ||¦  «         ŒdS dS )z0 Listens for replies from SL about midi bindingsz<midi binding responder Received OSC message: {} {} server {}r   ÚdoneN)r   r¸   r‘   r‚   r¹   r‹   rÈ   s       r�   rª   z#LooperThread.midi_binding_responder-  sy   € àŒ<ð 	vÝÐP×WÒWÐX\Ð^bÐdhÔdoÔdsÑtÔtÑuÔuÐuà�Œ7�fÒÐØÔ0ð ð �Ø��$‘”��ð Ððð r�   c                 ót   — dt          |¦  «        z   }|r|dt          |¦  «        z   z  } | j        |g|¢R Ž  d S )NrË   ú/)rÏ   r±   )rŒ   Úpath1Úpath2rÆ   Úmessages        r�   rÃ   zLooperThread.send:  sO   € Ø�3˜u™:œ:Ñ%ˆØð 	(Ø�s�S ™ZœZÑ'Ñ'ˆGØˆŒ�gÐ% Ð%Ð%Ð%Ð%Ð%Ð%r�   c                 ó4   — |                       d||¦  «         d S )Nz/set©r±   ©rŒ   rÖ   r×   s      r�   r˜   zLooperThread.set@  s   € Ø�Š�f˜g uÑ-Ô-Ð-Ð-Ð-r�   c           	      ó†  — t           D ]%}|                      d|d| j        j        d¦  «         Œ&|                      ddd| j        j        d¦  «         |                      d| j        j        d¦  «         | j        D ]G}t
          D ]=}|                      dt          |j        ¦  «        z   dz   |d| j        j        d	¦  «         Œ>ŒHd
S )a»   Ask SL to updates us on changes to global and loop states. While the documentation indicates that register_update should trigger whenever any client updates an input control, in practice the auto variety seems necessary to catch changes not initiated from SL's frontend. Auto is always necessary for loop states. We pass a polling interval of 100ms, but this is actually fixed on the backend. Updates only fire if the value has been changed. rÌ   rÍ   r    z/sl/0/register_auto_updater   z	/registerr¡   rË   rŸ   N©r—   r±   r‚   r¹   r…   r½   rÏ   Únumber©rŒ   rÀ   rÕ   s      r�   r­   zLooperThread.register_updatesC  sä   € õ 'ð 	^ð 	^ˆEØ�MŠMÐ1°5¸#¸t¼{¼ÐP\Ñ]Ô]Ð]Ð]à�ŠÐ2°JÀÀTÄ[Ä_ÐVbÑcÔcÐcØ�Š�k 4¤;¤?°NÑCÔCÐCà”Jð 	|ð 	|ˆDÝ(ð |ð |�Ø—’˜f¥s¨4¬;Ñ'7Ô'7Ñ7Ð:QÑQÐSXÐZ]Ð_cÔ_jÔ_nÐpzÑ{Ô{Ð{Ð{ð|ð	|ð 	|r�   c                 ó€  — t           D ]$}|                      d|| j        j        d¦  «         Œ%|                      dd| j        j        d¦  «         |                      d| j        j        d¦  «         | j        D ]F}t
          D ]<}|                      dt          |j        ¦  «        z   dz   || j        j        d¦  «         Œ=ŒGd	S )
z Ask SL to stop updating usrÎ   r    z/sl/0/unregister_auto_updater   z/unregisterr¡   rË   rŸ   Nrä   ræ   s      r�   r²   zLooperThread.unregister_updatesP  sÜ   € õ 'ð 	[ð 	[ˆEØ�MŠMÐ3°U¸D¼K¼OÈ\ÑZÔZÐZÐZà�ŠÐ4°jÀ$Ä+Ä/ÐS_Ñ`Ô`Ð`Ø�Š�m T¤[¤_°nÑEÔEÐEà”Jð 	yð 	yˆDÝ(ð yð y�Ø—’˜f¥s¨4¬;Ñ'7Ô'7Ñ7Ð:SÑSÐUZÐ\`Ô\gÔ\kÐmwÑxÔxÐxÐxðyð	yð 	yr�   r[   c                 óª   — | j                              ¦   «          |                      d| j        j        d¦  «         | j                              |¦  «        S )Nz/pingrž   )rƒ   Úclearr±   r‚   r¹   Úwait)rŒ   Útimeouts     r�   r·   zLooperThread.ping]  sF   € ØŒ×ÒÑÔÐØ�Š�g˜tœ{œ°
Ñ;Ô;Ð;ØŒ~×"Ò" 7Ñ+Ô+Ð+r�   c                 ó4   — |                       d|d¦  «         d S )Nz	/loop_addg     €E@rá   )rŒ   Únum_channelss     r�   Úadd_loopzLooperThread.add_loopb  s   € Ø�Š�k <°Ñ6Ô6Ð6Ð6Ð6r�   c                 ó2   — |                       dd¦  «         d S )Nz	/loop_delrX   rá   r’   s    r�   Úremove_loopzLooperThread.remove_loope  s   € Ø�Š�k 2Ñ&Ô&Ð&Ð&Ð&r�   c                 ó   — || _         d S ©N)rU   ©rŒ   Úns     r�   Úselect_loopzLooperThread.select_looph  s   € Ø!"ˆÔÐÐr�   c                 ó2   — |                       dd¦  «         d S )NrV   ç      ð?©r˜   r’   s    r�   Úenable_midi_clockzLooperThread.enable_midi_clockk  s   € Ø�ŠÐ$ cÑ*Ô*Ð*Ð*Ð*r�   c                 ó2   — |                       dd¦  «         d S )NrW   ç        rø   r’   s    r�   Údisable_smart_eighthsz"LooperThread.disable_smart_eighthsn  s   € Ø�Š� #Ñ&Ô&Ð&Ð&Ð&r�   c                 óB   — dt          | j        d         ¦  «                 S )N©ÚoffÚcycleÚ8thrÕ   r   )Úintr™   r’   s    r�   r   zLooperThread.quantizeq  s   € à.­s°4´=ÀÔ3LÑ/MÔ/MÔNÐNr�   c                 ó^   — d                      |¦  «        }|                      dd|¦  «         d S )Nrþ   z	/sl/0/setr   )Úindexr±   )rŒ   r›   Úqs      r�   r   zLooperThread.quantizeu  s1   € à+×1Ò1°#Ñ6Ô6ˆØ�Š�k :¨qÑ1Ô1Ð1Ð1Ð1r�   c                 óJ   — | j         d         }|dk    rdS t          |¦  «        S )NrU   rX   Úall©r™   r  ró   s     r�   rU   zLooperThread.selected_loop_numz  s(   € àŒMÐ-Ô.ˆØ�Š7ˆ7Ø�5å�q‘6”6ˆMr�   c                 óH   — |dk    rd}n|}|                       d|¦  «         d S )Nr  rX   rU   rø   )rŒ   r›   rô   s      r�   rU   zLooperThread.selected_loop_num‚  s2   € à�%Š<ˆ<ØˆAˆAàˆAØ�ŠÐ$ aÑ(Ô(Ð(Ð(Ð(r�   c                 óX   — | j         }t          |t          ¦  «        r| j        |         S d S rò   )rU   Ú
isinstancer  r…   ró   s     r�   Úselected_loopzLooperThread.selected_loopŠ  s2   € àÔ"ˆÝ�a�ÑÔð 	!Ø”:˜a”=Ð ð	!ð 	!r�   c                 ó:   — | j         d         }t          |¦  «        S ©NrN   r  ©rŒ   Úss     r�   rN   zLooperThread.sync_source�  s   € àŒM˜-Ô(ˆå�1‰vŒvˆr�   c                 ó6   — |}|                       d|¦  «         d S r  rø   ©rŒ   r›   r  s      r�   rN   zLooperThread.sync_source˜  s#   € ð
 ˆØ�Š� Ñ"Ô"Ð"Ð"Ð"r�   c                 ó:   — | j         d         }t          |¦  «        S ©NrV   r  r  s     r�   rV   zLooperThread.output_midi_clock   s   € àŒMÐ-Ô.ˆÝ�1‰vŒvˆr�   c                 ó6   — |}|                       d|¦  «         d S r  rø   r  s      r�   rV   zLooperThread.output_midi_clock¥  s$   € ð
 ˆØ�ŠÐ$ aÑ(Ô(Ð(Ð(Ð(r�   c                 ó:   — | j         d         }t          |¦  «        S ©NrW   r  r  s     r�   rW   zLooperThread.smart_eighths­  s   € àŒM˜/Ô*ˆÝ�1‰vŒvˆr�   c                 ó6   — |}|                       d|¦  «         d S r  rø   r  s      r�   rW   zLooperThread.smart_eighths²  s#   € ð
 ˆØ�Š� !Ñ$Ô$Ð$Ð$Ð$r�   c                 óH   — |                       d| j        j        d¦  «         d S )Nz/cancel_midi_learnr¢   ©r±   r‚   r¹   r’   s    r�   Úcancel_midi_learnzLooperThread.cancel_midi_learnº  s$   € à�ŠÐ*¨D¬K¬OÐ=PÑQÔQÐQÐQÐQr�   c                 óJ   — |                       d|| j        j        d¦  «         d S )Nz/save_sessionú/errorr  ©rŒ   Útarget_files     r�   Úsave_sessionzLooperThread.save_session¾  ó$   € Ø�Š�o {°D´K´OÀXÑNÔNÐNÐNÐNr�   c                 ó4   — |                       d|d¦  «         d S )Nz/save_midi_bindingsÚ rá   r  s     r�   Úsave_midi_bindingszLooperThread.save_midi_bindingsÁ  ó   € Ø�ŠÐ+¨[¸"Ñ=Ô=Ð=Ð=Ð=r�   c                 óJ   — |                       d|| j        j        d¦  «         d S )Nz/load_sessionr  r  r  s     r�   Úload_sessionzLooperThread.load_sessionÄ  r!  r�   c                 ó4   — |                       d|d¦  «         d S )Nz/load_midi_bindingsr#  rá   r  s     r�   Úload_midi_bindingszLooperThread.load_midi_bindingsÇ  r%  r�   c                 ó‚  — t          dg d¢¦  «        }d}|}d|_        d|_        d|_        ||_        d|_        d|_        d	|_        |d
k    rd|_        d|_        d
|_        �nO|dk    rd|_        d|_        �n9|dk    rd|_        d|_        d|_        �n|dk    rd|_        d|_        d|_        �nÿ|dk    rd|_        d|_        d|_        �nâ|dk    rd|_        d|_        d|_        �nÅ|dk    rd|_        d|_        �n¯|dk    rd|_        d|_        �n™|dk    rd|_        d|_        �nƒ|dk    rd|_        d|_        �nm|dk    rd|_        d |_        d!|_        �nP|d"k    rd"|_        d|_        d|_        �n3|d#k    rd|_        d#|_        d|_        d$|_        �n|d%k    rd%|_        d|_        nú|d&k    rd&|_        d|_        nå|d'k    rd'|_        d|_        nÐ|d(k    rd(|_        d|_        n»|d)k    r$d|_        d*|_        d|_        d|_        d|_        n‘|d+k    r$d|_        d*|_        d|_        d,|_        d,|_        ng|d-k    r$d|_        d*|_        d|_        d.|_        d.|_        n=|d*k    r||_        d/|_        d0|_        n!|d1v r||_        nd|_        ||_        d2|_        |j        dk    rd|_	        nd3|_	        |sod4 
                    |j        |j        |j	        |j        |j        |j        |j        |j        |j        ¦	  «	        }|                      d5|d6| j        j        d7¦  «         d S d S )8NÚMidiBinding)	ÚchannelÚtyperÀ   ÚcommandrÖ   ÚinstanceÚlboundÚuboundÚstyleFr   Úccr˜   rû   r÷   ÚnormrL   g      4@g      q@ÚtaptempoéþÿÿÿrO   rR   ÚonrS   ÚeighthrM   g      `@r   g      Ð@r   Úgainr	   r
   r   rX   r   rN   g      Àg      0@rV   r   g      @r"   r#   Úreplace_quantizedrW   Úrate_1r   Úrate_05g      à?Úrate_2g       @g      Ð?g      @)r   r   r   r   r   ÚnoteiŒxz {} {} {} {} {} {} {} {} {} 0 127z/learn_midi_bindingÚ	exclusiver¢   )r   r,  r-  r.  r/  r0  r1  r2  rÖ   rÀ   r‘   r±   r‚   r¹   )rŒ   rÖ   rÒ   ÚinfoÚ	donothingr›   Úinfo_strs          r�   Ú
midi_learnzLooperThread.midi_learnÊ  s	  € å˜-ð  *Eð  *Eð  *Eñ  Fô  FˆØˆ	ØˆàˆŒØˆŒ	ØˆŒØ ˆŒØˆŒØˆŒØˆŒ
à�7ŠNˆNØˆDŒKØˆDŒKØ"ˆDŒL‰Là�ZÒÐØˆDŒMØ&ˆDŒL‰LàÐ'Ò'Ð'ØˆDŒIØˆDŒMØ-ˆDŒL‰LàÐ'Ò'Ð'ØˆDŒIØˆDŒMØ-ˆDŒL‰Là�XŠoˆoØ-ˆDŒLØˆDŒKØˆDŒK‰Kà�^Ò#Ð#Ø)ˆDŒLØˆDŒKØ!ˆDŒK‰Kà�UŠlˆlØ ˆDŒLØˆDŒJ‰Jà�UŠlˆlØ ˆDŒLØˆDŒJ‰Jà�\Ò!Ð!Ø'ˆDŒLØˆDŒJ‰Jà�WŠnˆnØˆDŒMØ"ˆDŒL‰Là�VŠmˆmØ(ˆDŒLØˆDŒKØˆDŒK‰KàÐ(Ò(Ð(Ø.ˆDŒLØˆDŒKØˆDŒK‰Kà�ZÒÐØˆDŒMØ%ˆDŒLØˆDŒKØˆDŒK‰KàÐ%Ò%Ð%Ø+ˆDŒLØˆDŒMˆMàÐ(Ò(Ð(Ø.ˆDŒLØˆDŒMˆMàÐ(Ò(Ð(Ø.ˆDŒLØˆDŒMˆMà�_Ò$Ð$Ø*ˆDŒLØˆDŒMˆMà�XŠoˆoØˆDŒIØ!ˆDŒLØ ˆDŒLØˆDŒKØˆDŒKˆKà�YÒÐØˆDŒIØ!ˆDŒLØ ˆDŒLØˆDŒKØˆDŒKˆKà�XŠoˆoØˆDŒIØ!ˆDŒLØ ˆDŒLØˆDŒKØˆDŒKˆKØ�VŠmˆmØˆDŒLØˆDŒKØˆDŒKˆKØÐPÐPÐPØˆDŒLˆLàˆDŒIØˆDŒLØ!ˆDŒLð Œ<˜5Ò Ð ØˆDŒJˆJà#ˆDŒJð ð 	nð :×@Ò@ÀÄÈtÌyÐZ^ÔZdÐfjÔfrÐtxô  uAð  CGô  CPð  RVô  R]ð  _cô  _jð  lpô  lvñ  wô  wˆHð �MŠMÐ/°¸;ÈÌÌÐYlÑmÔmÐmÐmÐmð	nð 	nr�   )rz   r{   F)r[   ))Ú__name__Ú
__module__Ú__qualname__Ú__doc__rŽ   r“   r–   r®   r´   r¬   r±   r¦   r©   r§   r¨   rª   rÃ   r˜   r­   r²   r·   rî   rð   rõ   rù   rü   Úpropertyr   ÚsetterrU   r  rN   rV   rW   r  r   r$  r'  r)  rC  Ú__classcell__)rœ   s   @r�   ry   ry   …   sB  ø€ € € € € ðð ð)ð )ð )ð )ð*mð mð mð&ð &ð &ð &ð &ð ð  ð  ð
ð 
ð 
ð(ð (ð (ð6=ð =ð =ð
ð ð ðvð vð vð6ð ð ð$ð ð ðð ð ð&ð &ð &ð.ð .ð .ð|ð |ð |ðyð yð yð,ð ,ð ,ð ,ð
7ð 7ð 7ð'ð 'ð 'ð#ð #ð #ð+ð +ð +ð'ð 'ð 'ð ðOð Oñ „XðOð „_ð2ð 2ñ „_ð2ð ðð ñ „Xðð Ôð)ð )ñ Ôð)ð ð!ð !ñ „Xð!ð
 ðð ñ „Xðð Ôð#ð #ñ Ôð#ð ðð ñ „Xðð Ôð)ð )ñ Ôð)ð ðð ñ „Xðð Ôð%ð %ñ Ôð%ðRð Rð RðOð Oð Oð>ð >ð >ðOð Oð Oð>ð >ð >ðHnð Hnð Hnð Hnð Hnð Hnð Hnr�   ry   c                   óx   — e Zd Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zed„ ¦   «         Zed„ ¦   «         ZdS )r¼   rZ   c                 ó"   — || _         || _        d S rò   )Úlooperrå   )rŒ   rM  rå   r&   s       r�   rŽ   zLoop.__init__W  s   € ØˆŒØˆŒˆˆr�   c                 óB   — d                      | j        | j        ¦  «        S ©NzLoop({}, {})©r‘   rå   r&   r’   s    r�   r“   zLoop.__repr__\  s   € ð ×$Ò$ T¤[°$´*Ñ=Ô=Ð=r�   c                 óB   — d                      | j        | j        ¦  «        S rO  rP  r’   s    r�   Ú__str__zLoop.__str__a  s   € Ø×$Ò$ T¤[°$´*Ñ=Ô=Ð=r�   c                 ó(   ‡ ‡— ‰t           v rˆˆ fd„S d S )Nc                  ó.   •— ‰                      ‰ ¦  «        S rò   )Úhit)rš   rŒ   s   €€r�   ú<lambda>z"Loop.__getattr__.<locals>.<lambda>f  s   ø€ ˜4Ÿ8š8 D™>œ>€ r�   )Úloop_commands)rŒ   rš   s   ``r�   Ú__getattr__zLoop.__getattr__d  s)   øø€ Ø•=Ð Ð Ø)Ð)Ð)Ð)Ð)Ð)ð !Ð r�   c                 ó^   — |t           v r|                      d||¦  «         d S || j        |<   d S ©Nr˜   )Úloop_parameters_settablerÃ   r™   ©rŒ   rš   r›   s      r�   r–   zLoop.__setattr__i  s<   € ØÕ+Ð+Ð+Ø�IŠI�e˜T 3Ñ'Ô'Ð'Ð'Ð'à"%ˆDŒM˜$ÑÐÐr�   c                 ó`   — t          d||¦  «         | j                             d||¦  «         d S )Nzsending set valuer˜   )r¸   rM  rÃ   râ   s      r�   r˜   zLoop.seto  s5   € ÝÐ! 7¨EÑ2Ô2Ð2ØŒ×Ò˜ ¨Ñ/Ô/Ð/Ð/Ð/r�   c                 ó4   — |                       d||¦  «         d S rZ  ©rÃ   r\  s      r�   Úloop_setzLoop.loop_sets  s   € Ø�	Š	�%˜˜sÑ#Ô#Ð#Ð#Ð#r�   c                 óT   — |                       d|| j        j        j        d¦  «         d S )Nr¾   rŸ   )rÃ   rM  r‚   r¹   )rŒ   rÖ   s     r�   r¾   zLoop.getv  s(   € Ø�	Š	�%˜ $¤+Ô"4Ô"8¸*ÑEÔEÐEÐEÐEr�   c                 ó8   —  | j         j        | j        |g|¢R Ž  d S rò   )rM  rÃ   rå   )rŒ   ÚactionrÆ   s      r�   rÃ   z	Loop.sendy  s)   € ØˆŒÔ˜œ fÐ4¨tÐ4Ð4Ð4Ð4Ð4Ð4r�   c                 ó2   — |                       d|¦  «         d S )NrU  r_  )rŒ   r.  s     r�   rU  zLoop.hit|  s   € Ø�	Š	�%˜Ñ!Ô!Ð!Ð!Ð!r�   c                 óL   — t           t          | j        d         ¦  «                 S )Nr&   ©Ústate_codesr  r™   r’   s    r�   r&   z
Loop.state  s   € å�3˜tœ}¨WÔ5Ñ6Ô6Ô7Ð7r�   c                 óL   — t           t          | j        d         ¦  «                 S )Nr'   rf  r’   s    r�   r'   zLoop.next_stateƒ  s   € å�3˜tœ}¨\Ô:Ñ;Ô;Ô<Ð<r�   N)rZ   )rD  rE  rF  rŽ   r“   rR  rX  r–   r˜   r`  r¾   rÃ   rU  rH  r&   r'   © r�   r�   r¼   r¼   V  sè   € € € € € ðð ð ð ð
>ð >ð >ð
>ð >ð >ð*ð *ð *ð
&ð &ð &ð0ð 0ð 0ð$ð $ð $ðFð Fð Fð5ð 5ð 5ð"ð "ð "ð ð8ð 8ñ „Xð8ð ð=ð =ñ „Xð=ð =ð =r�   r¼   )rG  r€   Úcollectionsr   Ú	threadingr   r   r£   r[  Úloop_parameters_gettabler½   rW  r—   rg  ry   r¼   ri  r�   r�   ú<module>rm     s´  ððð ð €€€Ø "Ð "Ð "Ð "Ð "Ð "Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð ð!Ð ðFÐ ð  +Ð-EÑE€ð€ð:Ð ð&$ˆr�9ð $Ø�%ð$à�+ð$ð �+ð$ð �*ð	$ð
 �)ð$ð �-ð$ð �-ð$ð �+ð$ð �+ð$ð �'ð$ð �7ð$ð �<ð$ð �9ð$ð �<ð$ð �8ð$ð  �?ð!$€ð&Mnð Mnð Mnð Mnð Mnñ Mnô Mnð Mnðb/=ð /=ð /=ð /=ð /=ñ /=ô /=ð /=ð /=ð /=r�   