2 # -*- coding: utf-8 -*-
7 Tooltip: 'Makes jack and blender synced'
9 __script__
= "Jack Transport"
12 __url__
= ["Communicate problems and errors, BlenderArtists.org, Python forum"]
13 __email__
= ["falktx@gmail.com", "blender-pyjack script"]
15 blender-jacktransport.py v0.1
21 # Depends from PyJack-0.2
22 # Uses code from bpyjack.py by IL'dar AKHmetgaleev (aka AkhIL)
24 # Tried to get this as fast (and simple) as possible
27 import jack
, time
, sys
31 play_button
= Draw
.Create(False)
44 jack
.attach("/var/run/jack-blender")
45 except jack
.UsageError
:
46 pass # continue using exist jack if script crashed but jack still online
49 global ret_blender_curr
50 global ret_blender_next
51 global ret_jack_current
53 currblenframe
= Get("curframe")
54 currjackframe
= jack
.get_current_transport_frame()
56 rate
= jack
.get_sample_rate()
58 fps
= Scene
.GetCurrent().getRenderingContext().fps
59 fpsBase
= Scene
.GetCurrent().getRenderingContext().fpsBase
60 factor
= int(rate
/(fps
/fpsBase
))
62 ret_blender_curr
= currblenframe
*factor
63 ret_blender_next
= currjackframe
/factor
64 ret_jack_current
= currjackframe
68 global ret_blender_curr
69 global ret_blender_next
70 global ret_jack_current
76 #print "blender old", prev_blen
77 #print "blender frame is", ret_blender_curr
78 #print "jack old", prev_jack
79 #print "jack frame is", ret_jack_current
81 if (prev_jack
!= ret_jack_current
): #Jack changed, externally
82 Set("curframe", ret_blender_next
)
83 #Window.Redraw(Window.Types.ACTION)
84 Window
.Redraw(Window
.Types
.BUTS
)
85 #Window.Redraw(Window.Types.IMAGE)
86 #Window.Redraw(Window.Types.IMASEL)
87 #Window.Redraw(Window.Types.INFO)
88 Window
.Redraw(Window
.Types
.SEQ
)
89 #Window.Redraw(Window.Types.TEXT)
90 Window
.Redraw(Window
.Types
.VIEW3D
)
91 elif (prev_blen
!= ret_blender_curr
): #Blender changed, internally
92 jack
.transport_locate(ret_blender_curr
)
93 while jack
.get_current_transport_frame() != ret_blender_curr
:
94 time
.sleep(0.01) # waiting till pyjack applyed transport
96 id = Window
.GetAreaID()
97 Window
.QAdd(id, Draw
.TIMER3
, 0, 1)
99 prev_blen
= ret_blender_curr
100 prev_jack
= ret_jack_current
102 def event (evt
, dummy
):
103 if evt
== Draw
.TIMER3
:
107 def button_event (evt
):
110 currentJackFrame
= jack
.get_current_transport_frame()
112 if evt
== BEV_PLAY
: #play/pause
113 if play_button
.val
== 1:
114 jack
.transport_start()
116 jack
.transport_stop()
118 elif evt
== BEV_START
: #back to 0
119 jack
.transport_locate(0)
121 elif evt
== BEV_PREV
: #go back
122 nextJackFrame
= currentJackFrame
- 200000
123 if (nextJackFrame
< 0): nextJackFrame
= 0
124 jack
.transport_locate(nextJackFrame
)
126 elif evt
== BEV_NEXT
: #go forward
127 nextJackFrame
= currentJackFrame
+ 200000
128 jack
.transport_locate(nextJackFrame
)
130 elif evt
== BEV_EXIT
: #quit script
136 BGL
.glClearColor(*map(lambda x
: x
/255.0, Window
.Theme
.Get()[0].get('buts').back
))
137 BGL
.glClear(BGL
.GL_COLOR_BUFFER_BIT
)
140 if jack
.get_transport_state() == jack
.TransportStopped
:
145 button_text
= "pause"
147 Draw
.PushButton("s", BEV_START
, 1, 1, 20, 20, "Go to 0")
148 Draw
.PushButton("<", BEV_PREV
, 20, 1, 20, 20, "Go back")
149 Draw
.PushButton(">", BEV_NEXT
, 40, 1, 20, 20, "Go forward")
150 play_button
= Draw
.Toggle(button_text
, BEV_PLAY
, 60, 1, 75, 20, play_button
.val
, "Play / Pause")
151 Draw
.PushButton("x", BEV_EXIT
, 135, 1, 25, 20, "Exit from script")
155 Draw
.Register(gui
, event
, button_event
)