Distribute pyjack with freewheel-related functionality
[jack_freewheel_button.git] / pyjack-0.5.2 / blender / blender-jacktrans.py
blob55cea07ab60ffd943890663c5b63725d823aabe1
1 #!BPY
2 # -*- coding: utf-8 -*-
3 """
4 Name: 'Jack Transport'
5 Blender: 249
6 Group: 'Misc'
7 Tooltip: 'Makes jack and blender synced'
8 """
9 __script__ = "Jack Transport"
10 __author__ = "falkTX"
11 __version__ = "0.1"
12 __url__ = ["Communicate problems and errors, BlenderArtists.org, Python forum"]
13 __email__= ["falktx@gmail.com", "blender-pyjack script"]
14 __bpydoc__ = """\
15 blender-jacktransport.py v0.1
17 Version History:
18 0.1: Initial release
19 """
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
26 import bpy
27 import jack, time, sys
28 import Blender
29 from Blender import *
31 play_button = Draw.Create(False)
32 BEV_PLAY = 1
33 BEV_EXIT = 2
34 BEV_PREV = 3
35 BEV_NEXT = 4
36 BEV_START = 5
37 ret_blender_curr = 0
38 ret_blender_next = 0
39 ret_jack_current = 0
40 prev_blen = 0
41 prev_jack = 0
43 try:
44 jack.attach("/var/run/jack-blender")
45 except jack.UsageError:
46 pass # continue using exist jack if script crashed but jack still online
48 def getFrames():
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
67 def refresh():
68 global ret_blender_curr
69 global ret_blender_next
70 global ret_jack_current
71 global prev_blen
72 global prev_jack
74 getFrames()
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:
104 refresh()
105 time.sleep(0.001)
107 def button_event (evt):
108 global play_button
110 currentJackFrame = jack.get_current_transport_frame()
112 if evt == BEV_PLAY: #play/pause
113 if play_button.val == 1:
114 jack.transport_start()
115 else:
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
131 jack.detach()
132 Draw.Exit()
134 def gui ():
135 global play_button
136 BGL.glClearColor(*map(lambda x: x/255.0, Window.Theme.Get()[0].get('buts').back))
137 BGL.glClear(BGL.GL_COLOR_BUFFER_BIT)
138 Draw.BeginAlign()
140 if jack.get_transport_state() == jack.TransportStopped:
141 play_button.val = 0
142 button_text = "play"
143 else:
144 play_button.val = 1
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")
152 Draw.EndAlign()
155 Draw.Register(gui, event, button_event)
157 refresh()