B
    £ �aqx  ã               @   sÔ  d dl Z d dlmZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
Z
d dlZd dlZd dlZdZd dlmZ e d¡Ze d¡Ze d¡Ze d	¡Ze d
¡Ze d¡Ze d¡Ze d¡Ze d¡Ze d¡Ze d¡Ze d	¡Ze d¡Z e d¡Z!e d¡Z"e d¡Z#e d¡Z$e d¡Z%e d¡Z&e d¡Z'e d¡Z(e d¡Z)e d¡Z*e d¡Z+e d¡Z,e d¡Z-e d¡Z.e d ¡Z/e 0d!¡Z1e 0d"¡Z2e 0d#¡Z3e 0d$¡Z4e d%¡Z5e d&¡Z6e 0d'¡Z7G d(d)„ d)ej8ƒZ9eƒ Z:dZ;da<d*d+„ Z=d,d-„ Z>d.d/„ Z?d0d1„ Z@d2d3„ ZAd4d5„ ZBd6d7„ ZCd8d9„ ZDd:d;„ ZEd<d=„ ZFd>d?„ ZGd@dA„ ZHdBdC„ ZIdDdE„ ZJdFdG„ ZKdHdI„ ZLdJdK„ ZMdLdM„ ZNdNdO„ ZOdPdQ„ ZPdRdS„ ZQdTdU„ ZRdVdW„ ZSdXdY„ ZTdZd[„ ZUd\d]„ ZVd^d_„ ZWd`da„ ZXdbdc„ ZYddde„ ZZdfdg„ Z[dhdi„ Z\djdk„ Z]dldm„ Z^dndo„ Z_dpdq„ Z`drds„ Zadtdu„ Zbecƒ Zddvdw„ Zedxdy„ Zfdzd{„ Zgd|d}„ Zhd~d„ Zid€d�„ Zjd‚dƒ„ Zkd„d…„ Zldamd†d‡„ Zndaodˆd‰„ Zpe�sÂdŠZqxejr sd‹¡�s´e tdŒ¡ �q˜W e td�¡ ndŽZqe  ueq¡Z dS )�é    N)ÚQueue)ÚStringIOF)ÚIS_REMOTE_TESTzatom:AtomPortzingen:maxRunLoadzingen:meanRunLoadzingen:minRunLoadz	ingen:Arczingen:Blockzingen:canvasXzingen:canvasYzingen:enabledz
ingen:filez
ingen:headz
ingen:tailzingen:valuezlv2:AudioPortzlv2:InputPortzlv2:OutputPortzlv2:prototypezmidi:bindingzmidi:controllerNumberz	patch:Putzpatch:Patchzpatch:Deletez	patch:Setz
patch:bodyzpatch:propertyzpatch:subjectzpatch:valuez2http://polyeffects.com/ns/core#assigned_footswitchz0http://polyeffects.com/ns/core#looper_footswitchz(http://polyeffects.com/ns/core#spotlightz,http://polyeffects.com/ns/core#physical_portzrdf:typezrdfs:commentz'http://polyeffects.com/lv2/polyconvo#irc               @   s   e Zd Zdd„ Zdd„ ZdS )ÚExceptionThreadc             O   s   t jj| f|ž|Ž d S )N)Ú	threadingÚThreadÚ__init__)ÚselfÚargsÚkwargs© r   ú /home/debian/UI/ingen_wrapper.pyr   b   s    zExceptionThread.__init__c             C   sB   y| j r| j | j| jŽ W n" tk
r<   t t ¡ ¡ Y nX d S )N)Ú_targetÚ_argsÚ_kwargsÚ	ExceptionÚloggingÚerrorÚ	tracebackÚ
format_exc)r	   r   r   r   Úrune   s
    zExceptionThread.runN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   a   s   r   c             C   sd   t  ¡ | d }x4t  ¡ |k rDy| jdd�S  tjk
r@   Y qX qW | jtd|d t  ¡  ƒd�S )Né   )Útimeoutr   )ÚtimeÚ	monotonicÚgetÚqueueÚEmptyÚmax)Úqr   Zstoploopr   r   r   Úget_timed_interruptabler   s    
r#   c              C   sR   xLt rP y*ttdƒ} | d }| dd … }||Ž  W q tjk
rH   Y qX qW d S )Nr   r   )Ú_FINISHr#   r"   r   r    )ÚitemsÚfuncr
   r   r   r   ÚDestinationThread|   s    
r'   c             C   s"   t  tj| dt|ƒ ¡  f¡ d S )Nzingen:enabled )r"   ÚputÚingenÚstrÚlower)Ú	effect_idÚactiver   r   r   Ú
set_bypassŠ   s    r.   c             C   s   t  tj| d d| f¡ d S )Nz/controlzrdfs:comment """%s""")r"   r(   r)   )Úcurrent_sub_graphÚdescriptionr   r   r   Úset_description‘   s    r1   c             C   s   t  tj| d d| f¡ d S )Nz/controlzdoap:maintainer """%s""")r"   r(   r)   )r/   r0   r   r   r   Ú
set_author—   s    r2   c             C   s   t  tj| d d| f¡ d S )Nz/controlzdoap:category """%s""")r"   r(   r)   )r/   r0   r   r   r   Úset_tagsš   s    r3   c             C   s   t  tj| d| f¡ d S )Nz=<http://polyeffects.com/ns/core#assigned_footswitch> """%s""")r"   r(   r)   )r,   Úfoot_switchr   r   r   Úset_footswitch_control�   s    r5   c             C   s   t  tj| d d| f¡ d S )Nz/controlz;<http://polyeffects.com/ns/core#looper_footswitch> """%s""")r"   r(   r)   )r/   r4   r   r   r   Úset_looper_footswitch    s    r6   c             C   s   t  tj| d| f¡ d S )Nz7<http://polyeffects.com/ns/core#physical_port> """%s""")r"   r(   r)   )r,   Úportr   r   r   Úset_physical_port£   s    r8   c             C   s   t  tj| dt|ƒf¡ d S )Nz"http://drobilla.net/ns/ingen#value)r"   r(   r)   Úsetr*   )r7   Úvaluer   r   r   Úset_parameter_value¦   s    r;   c             C   s   t  tj| f¡ d S )N)r"   r(   r)   r   )Úpathr   r   r   Ú	get_state«   s    r=   c             C   s   t  tj| d||f f¡ d S )Nz<ingen:canvasX "%s"^^xsd:float; ingen:canvasY "%s"^^xsd:float)r"   r(   r)   )r,   ÚxÚyr   r   r   Úset_plugin_position°   s    r@   c             C   s   t  tj| d| d f¡ d S )Nzqingen:canvasX "900.0"^^xsd:float ;
    ingen:canvasY "150.0"^^xsd:float ;
    a ingen:Block ;
    lv2:prototype <ú>)r"   r(   r)   )r,   Z
effect_urlr   r   r   Ú
add_plugin³   s    
rB   c             C   s   t  tj| df¡ d S )NzIingen:enabled true ;
    ingen:polyphony "1"^^xsd:int ;
    a ingen:Graph)r"   r(   r)   Zput_internal)r,   r   r   r   Úadd_sub_graph»   s    
rC   c             C   s   t  tj| ddf¡ d S )Nz%http://lv2plug.in/ns/ext/midi#bindingz)<http://lv2plug.in/ns/ext/patch#wildcard>)r"   r(   r)   r9   )r7   r   r   r   Ú
midi_learnÃ   s    rD   c             C   s   t  tj| ddf¡ d S )Nzmidi:binding patch:wildcardÚ )r"   r(   r)   Zpatch)r7   r   r   r   Úmidi_forgetÇ   s    rF   c             C   s   t  tj| ddf¡ d S )Nz(http://polyeffects.com/ns/core#spotlightÚ1)r"   r(   r)   r9   )r7   r   r   r   Úspotlight_addÊ   s    rH   c             C   s   t  tj| ddf¡ d S )Nz(http://polyeffects.com/ns/core#spotlightÚ0)r"   r(   r)   r9   )r7   r   r   r   Úspotlight_removeÍ   s    rJ   c             C   s   t  tj| d||f f¡ d S )Nziingen:canvasX "%s"^^xsd:float ;
    ingen:canvasY "%s"^^xsd:float ;
    a lv2:InputPort ; a lv2:AudioPort)r"   r(   r)   )Úport_idr>   r?   r   r   r   Ú	add_inputÐ   s    
rL   c             C   s   t  tj| d||f f¡ d S )Nzjingen:canvasX "%s"^^xsd:float ;
    ingen:canvasY "%s"^^xsd:float ;
    a lv2:OutputPort ; a lv2:AudioPort)r"   r(   r)   )rK   r>   r?   r   r   r   Ú
add_outputÖ   s    
rM   c             C   s   t  tj| d||f f¡ d S )Nz¦ingen:canvasX "%s"^^xsd:float ;
    ingen:canvasY "%s"^^xsd:float ;
    atom:bufferType atom:Sequence ;
    lv2:name "MIDI In" ;
    a lv2:InputPort ; a atom:AtomPort)r"   r(   r)   )rK   r>   r?   r   r   r   Úadd_midi_inputÛ   s    
rN   c             C   s   t  tj| d||f f¡ d S )Nz¨ingen:canvasX "%s"^^xsd:float ;
    ingen:canvasY "%s"^^xsd:float ;
    atom:bufferType atom:Sequence ;
    lv2:name "MIDI Out" ;
    a lv2:OutputPort ; a atom:AtomPort)r"   r(   r)   )rK   r>   r?   r   r   r   Úadd_midi_outputâ   s    
rO   c             C   s   t  tj| d||f f¡ d S )Nz¨ingen:canvasX "%s"^^xsd:float ;
    ingen:canvasY "%s"^^xsd:float ;
    atom:bufferType atom:Sequence ;
    lv2:name "MIDI Out" ;
    a lv2:OutputPort ; a atom:AtomPort)r"   r(   r)   )rK   r>   r?   r   r   r   Úadd_midi_output2é   s    
rP   c             C   s   t  tj| d||f f¡ d S )Nziingen:canvasX "%s"^^xsd:float ;
    ingen:canvasY "%s"^^xsd:float ;
    a lv2:OutputPort ; a lv2:AtomPort)r"   r(   r)   )rK   r>   r?   r   r   r   Úadd_top_loop_extra_midið   s    
rQ   c             C   s   t  tj| d||f f¡ d S )Nz¯ingen:canvasX "%s"^^xsd:float ;
    ingen:canvasY "%s"^^xsd:float ;
    atom:bufferType atom:Sequence ;
    lv2:name "loop_extra_midi" ;
    a lv2:OutputPort ; a atom:AtomPort)r"   r(   r)   )rK   r>   r?   r   r   r   Úadd_loop_extra_midiö   s    
rR   c             C   s`   | } t j |tdƒd … ¡}d| d }t tj| d d|f¡ t tj| dd| d f¡ d S )	Nzfile://z…[
             a patch:Set ;
             patch:property <http://polyeffects.com/lv2/polyconvo#ir>;
             patch:value <file://z> ]z/controlz%http://drobilla.net/ns/ingen#activityz'http://polyeffects.com/lv2/polyconvo#irú<rA   )ÚurllibÚparseÚquoteÚlenr"   r(   r)   r9   )r,   Ú	file_nameÚis_cabÚbodyr   r   r   Úset_fileþ   s
    r[   c             C   s"   t | ƒ ¡  dd¡} t dd| ¡S )aY  
    Return the given string converted to a string that can be used for a clean
    filename. Remove leading and trailing spaces; convert other spaces to
    underscores; and remove anything that is not an alphanumeric, dash,
    underscore, or dot.
    >>> get_valid_filename("john's portrait in 2004.jpg")
    'johns_portrait_in_2004.jpg'
    ú Ú_z(?u)[^-\w.]rE   )r*   ÚstripÚreplaceÚreÚsub)Úsr   r   r   Úget_valid_filename  s    	rc   c             C   s:   t |ƒ}t|ƒdkr6t tj|d|  d | d f¡ d S )Nr   zfile:///mnt/presets/ú/z.ingen)rc   rW   r"   r(   r)   Úcopy)Z
pedal_nameÚnamer/   Úclean_filenamer   r   r   Úsave_pedalboard  s    rh   c             C   s   t  tj| |f¡ d S )N)r"   r(   r)   re   )rf   r/   r   r   r   Úload_pedalboard#  s    ri   c             C   s    t  tj| d|rdndf¡ d S )Nz&http://drobilla.net/ns/ingen#broadcastÚtrueÚfalse)r"   r(   r)   r9   )r7   Úis_broadcastr   r   r   Úset_broadcast(  s    rm   c             C   s   t  tj| f¡ d S )N)r"   r(   r)   Údelete)r,   r   r   r   Úremove_plugin,  s    ro   c             C   s   t  tj| |f¡ d S )N)r"   r(   r)   Úconnect)Úsrc_portÚtarget_portr   r   r   Úconnect_port3  s    rs   c             C   s   t  tj| |f¡ d S )N)r"   r(   r)   Ú
disconnect)rq   rr   r   r   r   Údisconnect_port8  s    ru   c             C   s   t  tj| f¡ d S )N)r"   r(   r)   Zdisconnect_all)r,   r   r   r   Údisconnect_plugin;  s    rv   c               C   s   d S )Nr   r   r   r   r   Úset_midi_cc?  s    rw   c               C   s   d S )Nr   r   r   r   r   Úset_bpmB  s    rx   c               C   s   d S )Nr   r   r   r   r   Úget_parameter_valueE  s    ry   c              C   sj   xdt rdt_ P t ¡ } xJ|  d¡D ]<}t|ƒdkr"t|ƒdk rNd|ks"d|ks"d|ks"t|ƒ q"W qW d S )NTz

é
   éP   zingen:BundleEndzingen:BundleStartz@prefix)r$   r)   ZrecvÚsplitrW   Úparse_ingen)Úrrb   r   r   r   Úingen_recv_threadK  s    $r   c             C   sr  | t k�rnddddddddddddddd	d
dddddddœ}| |krH�n&|  dd¡d }ddddddddddddd d!d"d#g}||ks–d$|ks–d%|k�rnd&}|d"kr¶d'}td(| | ƒ n |d#krÒd)}t| d(| ƒ n„d*|krîd*}t| d(| ƒ nhd+|k�rd+}td(| | ƒ nJd%|k�r&d%}t| d,ƒ n0d-|k�rDd.}td(| | ƒ nd/}t| d(| ƒ t d0| |||d1f¡ n d S )2Nzingen:out_1 system:playback_3zingen:out_2 system:playback_4zingen:out_3 system:playback_6zingen:out_4 system:playback_8zsystem:capture_2 ingen:in_1zsystem:capture_4 ingen:in_2zsystem:capture_3 ingen:in_3zsystem:capture_5 ingen:in_4zttymidi:MIDI_in ingen:midi_inzttymidi:MIDI_out ingen:midi_outzttymidi:MIDI_in ingen:controlz/ingen:loop_common_in_1 sooperlooper:common_in_1z/ingen:loop_common_in_2 sooperlooper:common_in_2z1sooperlooper:common_out_1 ingen:loop_common_out_1z1sooperlooper:common_out_2 ingen:loop_common_out_2z%ingen:extra_midi sooperlooper:midi_in)z/main/out_1z/main/out_2z/main/out_3z/main/out_4z/main/out_5z/main/out_6z/main/out_7z/main/out_8z
/main/in_1z
/main/in_2z
/main/in_3z
/main/in_4z
/main/in_5z
/main/in_6z/main/midi_inz/main/midi_outz/main/controlz/main/loop_common_in_1z/main/loop_common_in_2z/main/loop_common_out_1z/main/loop_common_out_2z/main/loop_extra_midird   r   Zin_1Zin_2Zin_3Zin_4Zin_5Zin_6Zout_1Zout_2Zout_3Zout_4Úout_5Zout_6Zout_7Zout_8Úmidi_inÚmidi_outZloop_common_Úloop_extra_midirE   Ú
midi_inputz/main/Úmidi_outputÚloop_common_inÚloop_common_outz/main/loop_extra_midiÚinÚinputÚoutputrB   T)Úconnected_portsÚrsplitrs   Úui_queuer(   )r7   r>   r?   Úphysical_portZport_mapZport_suffixZio_portsÚpluginr   r   r   Úconnect_jack_port`  sf    
$


r�   c             C   s    t t|  d |d f¡ƒd  ¡ ƒS )Nr   )r*   ÚtupleÚrangeÚobject)ÚmodelÚpr   r   r   Ú	get_value¦  s    r–   c             C   s   t |  d |d f¡ƒd  ¡ S )Nr   )r‘   r’   r“   )r”   r•   r   r   r   Úget_nodeª  s    r—   c                s   t ‡ fdd„| D ƒƒdkS )Nc                s   g | ]}|  ¡ ˆ kr|‘qS r   )Ú	predicate)Ú.0Úb)r•   r   r   ú
<listcomp>¯  s    z!has_predicate.<locals>.<listcomp>r   )rW   )rZ   r•   r   )r•   r   Úhas_predicate®  s    rœ   c                s   t ‡ fdd„| D ƒƒdkS )Nc                s   g | ]}|  ¡ ˆ kr|‘qS r   )r“   )r™   rš   )Úor   r   r›   ²  s    zhas_object.<locals>.<listcomp>r   )rW   )rZ   r�   r   )r�   r   Ú
has_object±  s    rž   c                s   t ‡ fdd„| D ƒd  ¡ ƒS )Nc                s   g | ]}|  ¡ ˆ kr|‘qS r   )r˜   )r™   rš   )r•   r   r   r›   µ  s    z"get_body_value.<locals>.<listcomp>r   )r*   r“   )rZ   r•   r   )r•   r   Úget_body_value´  s    rŸ   c             C   s.   yt | tƒ}t|  |d d f¡ƒS    d S d S )N)r—   Ú
patch_bodyr‘   r’   )r”   Zb_nr   r   r   Úget_body·  s
    
r¡   c          	   C   s  t  ¡ }y| | ¡}W n   td| ƒ tdƒ d S | d d t¡�r®t|tƒ}|}| d td ¡�r
t	|ƒ}|d krvd S |dk�rd}d}d}d}	xp|D ]h}
|
 
¡ tkr¼d}	tt|
 ¡ ƒƒ}q–|
 
¡ tkrÞtt|
 ¡ ƒƒ}d}	q–|
 
¡ tkr–tt|
 ¡ ƒƒ}d}	q–W |	�rjt d|||f¡ nNt|tƒ�rDt|tƒ}t d||f¡ n&t|tƒ�rjt|tƒ}t d	||f¡ t|tƒ�r�t|tƒ}t d
||f¡ t|tƒ�r’d}d}d}d }d}x¤|D ]œ}
|
 
¡ tk�rÖt|
 ¡ ƒ}nz|
 
¡ tk�rött|
 ¡ ƒƒ}nZ|
 
¡ tk�rtt|
 ¡ ƒƒ}n:|
 
¡ tk�r2t|
 ¡ ƒ}n|
 
¡ tk�r¶t|
 ¡ ƒdk}�q¶W t d|||||f¡ |d k	�rªd| }t d||f¡ �q
t|tƒ�rêt|tƒ}t d||f¡ t|t ƒ�rªt|t ƒ}t d|t!t|ƒƒf¡ �q
t|t"ƒ�rXd}d}xD|D ]<}
|
 
¡ t#k�r$t|
 ¡ ƒ}n|
 
¡ t$k�rt|
 ¡ ƒ}�qW t d||f¡ �q
t|t%ƒ�spt|t&ƒ�r|d }d }d }d }d }d }x¸|D ]°}
|
 ¡ t'k�r¦d}n–|
 ¡ t(k�rºd}n‚|
 ¡ t%k�rÎd}nn|
 ¡ t&k�râd}nZ|
 
¡ tk�rtt|
 ¡ ƒƒ}n:|
 
¡ tk�r"tt|
 ¡ ƒƒ}n|
 
¡ t)k�rŽt|
 ¡ ƒ}�qŽW |d k	�rª|�sX|�rª|d k	�rª|d k	�rªt*||||ƒ n.t|tƒ�r
t|tƒ}t d|t|ƒdkf¡ �n\| d d t+¡�rút|tƒ}|}| d t,t¡�rþt|t-ƒ}t d|t|ƒdkf¡ | d t,t.¡�r,t|t-ƒ}t d|t|ƒf¡ | d t,t ¡�r`t|t-ƒ}t d|t!t|ƒƒf¡ n–| d t,t¡�r”t|t-ƒ}t d|tt|ƒƒf¡ nb| d t,t/¡�r
y&t|t0ƒ}t d|t!t|ƒƒf¡ W n* t1k
�rô   t d|t!dƒf¡ Y nX �n| d d t2¡�rÌ| d td ¡�s>t|tƒ}|d k	�rÊt d|f¡ nŒt	|ƒ}|d k�rTd S t|t"ƒ�r
d}d}xD|D ]<}
|
 
¡ t#k�rŽt|
 ¡ ƒ}n|
 
¡ t$k�rnt|
 ¡ ƒ}�qnW |�r
|�r
t d||f¡ n>| d d t3¡�r
t|tƒ}|}| d t/d ¡�r
t d|df¡ d S )NZparsingz###
###
###
failed to parsez/enginer   FTÚdsp_loadÚset_commentÚassign_footswitchÚlooper_footswitchrE   rk   rB   zfile://r[   Úvalue_changeÚ	spotlightÚadd_connectionÚenabled_changeÚpedalboard_loadedÚbroadcast_updaterD   é   ro   Úremove_connectionéÿÿÿÿ)4ÚserdZWorldÚloadsÚprintZaskÚ	patch_Putr–   Úpatch_subjectr    r¡   r˜   Úingen_max_run_loadÚfloatr*   r“   Úingen_mean_run_loadÚingen_min_run_loadr�   r(   rœ   Úrdfs_commentrŸ   Úpoly_assigned_footswitchÚpoly_looper_footswitchrž   Úingen_BlockÚlv2_prototypeÚingen_canvasYÚingen_canvasXÚir_urlÚingen_enabledÚingen_valueÚpoly_spotlightÚintÚ	ingen_ArcÚ
ingen_headÚ
ingen_tailÚlv2_AudioPortÚatom_AtomPortÚlv2_OutputPortÚlv2_InputPortÚpoly_physical_portr�   Ú	patch_SetÚpatch_propertyÚpatch_valueÚ
ingen_fileÚmidi_bindingÚmidi_controllerNumberÚ
IndexErrorÚpatch_DeleteÚpatch_Patch)Zto_parseZworldÚmZ	r_subjectÚsubjectrZ   Úmax_loadÚ	mean_loadÚmin_loadÚsendr•   r:   r>   r?   r�   ÚirÚ
is_enabledÚheadÚtailZis_inZis_audioZis_midirŽ   r   r   r   r}   ¾  s(   
























r}   c             C   s   | a ttd�at ¡  d S )N)Útarget)r�   r   r   Úr_threadÚstart)Zr_qr   r   r   Ústart_recv_thread�  s    
râ   c               C   s   t td�at ¡  d S )N)rß   )r   r'   Ús_threadrá   r   r   r   r   Ústart_send_thread˜  s    
rä   zunix:///tmp/ingen.sockz/tmp/ingen.sockgš™™™™™¹?gš™™™™™É?ztcp://10.1.1.246:16180)vr)   r   r   r¯   r   r`   r   Ú
subprocessÚior   r   r   Úurllib.parserT   Úos.pathÚosÚ	connectedÚstatic_globalsr   ZcurierÈ   r´   r¶   r·   rÄ   r»   r¾   r½   rÀ   rÏ   rÅ   Zingen_minRunLoadrÆ   rÁ   rÇ   rÊ   rÉ   r¼   rÐ   rÑ   r²   rÔ   rÓ   rÌ   r    rÍ   r³   rÎ   Zurir¹   rº   rÂ   rË   Zrdf_typer¸   r¿   r   r   r"   r$   r�   r#   r'   r.   r1   r2   r3   r5   r6   r8   r;   r=   r@   rB   rC   rD   rF   rH   rJ   rL   rM   rN   rO   rP   rQ   rR   r[   rc   rh   ri   rm   ro   rs   ru   rv   rw   rx   ry   r   r9   r‹   r�   r–   r—   rœ   rž   rŸ   r¡   r}   rà   râ   rã   rä   Zserverr<   ÚexistsÚsleepZRemoter   r   r   r   Ú<module>   sÜ    



































F R