Index: trunk/LiveOSC/LiveOSC.py
===================================================================
--- trunk/LiveOSC/LiveOSC.py	(revision 30)
+++ trunk/LiveOSC/LiveOSC.py	(revision 32)
@@ -177,5 +177,11 @@
         for track in tracks:
             clipSlots.append(track.clip_slots)
-        return clipSlots            
+        return clipSlots
+
+    def trBlock(offset, blocksize):
+        block = []
+        for track in range(0, blocksize):
+            block.extend([str(LiveUtils.getTrack(trackOffset+track).name)])                            
+        self.oscServer.sendOSC("/live/name/trackblock", block)        
 
 ######################################################################
@@ -205,5 +211,7 @@
                 clipNumber = clipNumber + 1
             clipNumber = 0
-            trackNumber = trackNumber + 1        
+            trackNumber = trackNumber + 1
+
+        self.trBlock(0,len(LiveUtils.getTracks()))
 
 ######################################################################
@@ -546,3 +554,4 @@
         else:
             self.oscServer.sendOSC('/live/name/track', (tid, str(track.name)))
-            
+            self.trBlock(0,len(LiveUtils.getTracks()))
+            
Index: trunk/LiveOSC/LiveOSCCallbacks.py
===================================================================
--- trunk/LiveOSC/LiveOSCCallbacks.py	(revision 30)
+++ trunk/LiveOSC/LiveOSCCallbacks.py	(revision 32)
@@ -48,7 +48,12 @@
         self.callbackManager.add(self.stopClipCB, "/live/stop/clip")
         self.callbackManager.add(self.stopTrackCB, "/live/stop/track")
+        self.callbackManager.add(self.scenesCB, "/live/scenes")
+        self.callbackManager.add(self.tracksCB, "/live/tracks")
         self.callbackManager.add(self.nameSceneCB, "/live/name/scene")
+        self.callbackManager.add(self.nameSceneBlockCB, "/live/name/sceneblock")
         self.callbackManager.add(self.nameTrackCB, "/live/name/track")
+        self.callbackManager.add(self.nameTrackBlockCB, "/live/name/trackblock")
         self.callbackManager.add(self.nameClipCB, "/live/name/clip")
+        self.callbackManager.add(self.nameClipBlockCB, "/live/name/clipblock")    
         self.callbackManager.add(self.armTrackCB, "/live/arm")
         self.callbackManager.add(self.muteTrackCB, "/live/mute")
@@ -64,4 +69,7 @@
         self.callbackManager.add(self.playClipSlotCB, "/live/play/clipslot")
         self.callbackManager.add(self.viewTrackCB, "/live/track/view")
+        self.callbackManager.add(self.viewTrackCB, "/live/return/view")
+        self.callbackManager.add(self.mviewTrackCB, "/live/master/view")
+        self.callbackManager.add(self.viewClipCB, "/live/clip/view/")
         self.callbackManager.add(self.overdubCB, "/live/overdub")
         self.callbackManager.add(self.stateCB, "/live/state")
@@ -81,4 +89,8 @@
         self.callbackManager.add(self.mdevicelistCB, "/live/master/devicelist")
 
+        self.callbackManager.add(self.devicerangeCB, "/live/device/range")
+        self.callbackManager.add(self.devicerangeCB, "/live/return/device/range")
+        self.callbackManager.add(self.mdevicerangeCB, "/live/master/device/range")
+        
         self.callbackManager.add(self.deviceCB, "/live/device")
         self.callbackManager.add(self.deviceCB, "/live/return/device")
@@ -208,4 +220,29 @@
             track = msg[2]
             LiveUtils.stopTrack(track)
+
+    def scenesCB(self, msg):
+        """Called when a /live/scenes message is received.
+
+        Messages:
+        /live/scenes        no argument or 'query'  Returns the total number of scenes
+
+        """
+        if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
+            sceneTotal = len(LiveUtils.getScenes())
+            self.oscServer.sendOSC("/live/scenes", (sceneTotal))
+            return
+
+    def tracksCB(self, msg):
+        """Called when a /live/tracks message is received.
+
+        Messages:
+        /live/tracks       no argument or 'query'  Returns the total number of scenes
+
+        """
+        if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
+            trackTotal = len(LiveUtils.getTracks())
+            self.oscServer.sendOSC("/live/tracks", (trackTotal))
+            return
+
 
     def nameSceneCB(self, msg):
@@ -235,4 +272,18 @@
             name = msg[3]
             LiveUtils.getScene(sceneNumber).name = name
+
+    def nameSceneBlockCB(self, msg):
+        """Called when a /live/name/sceneblock message is received.
+
+        /live/name/clipblock    (int offset, int blocksize) Returns a list of blocksize scene names starting at offset
+        """
+        if len(msg) == 4:
+            block = []
+            sceneOffset = msg[2]
+            blocksize = msg[3]
+            for scene in range(0, blocksize):
+                block.extend([str(LiveUtils.getScene(sceneOffset+scene).name)])                            
+            self.oscServer.sendOSC("/live/name/sceneblock", block)
+            
             
     def nameTrackCB(self, msg):
@@ -263,4 +314,45 @@
             LiveUtils.getTrack(trackNumber).name = name
 
+    def nameTrackBlockCB(self, msg):
+        """Called when a /live/name/trackblock message is received.
+
+        /live/name/trackblock    (int offset, int blocksize) Returns a list of blocksize track names starting at offset
+        """
+        if len(msg) == 4:
+            block = []
+            trackOffset = msg[2]
+            blocksize = msg[3]
+            for track in range(0, blocksize):
+                block.extend([str(LiveUtils.getTrack(trackOffset+track).name)])                            
+            self.oscServer.sendOSC("/live/name/trackblock", block)
+
+
+    def nameClipBlockCB(self, msg):
+        """Called when a /live/name/clipblock message is received.
+
+        /live/name/clipblock    (int track, int clip, blocksize x/tracks, blocksize y/clipslots) Returns a list of clip names for a block of clips (int blockX, int blockY, clipname)
+
+        """
+        #Requesting a block of clip names X1 Y1 X2 Y2 where X1,Y1 is the first clip (track, clip) of the block, X2 the number of tracks to cover and Y2 the number of scenes
+        
+        if len(msg) == 6:
+            block = []
+            trackOffset = msg[2]
+            clipOffset = msg[3]
+            blocksizeX = msg[4]
+            blocksizeY = msg[5]
+            for clip in range(0, blocksizeY):
+                for track in range(0, blocksizeX):
+                        trackNumber = trackOffset+track
+                        clipNumber = clipOffset+clip
+                        if LiveUtils.getClip(trackNumber, clipNumber) != None:
+                            block.extend([str(LiveUtils.getClip(trackNumber, clipNumber).name)])
+                        else:
+                            block.extend([""])
+                            
+            self.oscServer.sendOSC("/live/name/clipblock", block)
+
+
+
     def nameClipCB(self, msg):
         """Called when a /live/name/clip message is received.
@@ -271,5 +363,6 @@
         /live/name/clip    (int track, int clip, string name)Sets clip number clip in track number track's name to name
 
-        """        
+        """
+        
         #Requesting all clip names
         if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
@@ -604,9 +697,39 @@
         Messages:
         /live/track/view     (int track)      Selects a track to view
-        """    
+        """
+        ty = msg[0] == '/live/return/view' and 1 or 0
+        track_num = msg[2]
+        
         if len(msg) == 3:
-            track_num = msg[2]
-            track = LiveUtils.getTrack(track_num)
+            if type == 1:
+                track = LiveUtils.getSong().return_tracks[track_num]
+            else:
+                track = LiveUtils.getSong().tracks[track_num]
+                
             track.view.select_instrument()
+            
+    def mviewTrackCB(self, msg):
+        """Called when a /live/master/view message is received.
+        
+        Messages:
+        /live/track/view     (int track)      Selects a track to view
+        """
+        track = LiveUtils.getSong().master_track
+        track.view.select_instrument()
+        
+    def viewClipCB(self, msg):
+        """Called when a /live/clip/view message is received.
+        
+        Messages:
+        /live/clip/view     (int track, int clip)      Selects a track to view
+        """
+        track = msg[2]
+        
+        if len(msg) == 4:
+            clip  = msg[3]
+        else:
+            clip  = 0
+        
+        LiveUtils.getSong().detail_clip = LiveUtils.getSong().tracks[track].clip_slots[clip].clip
 
     def overdubCB(self, msg):
@@ -700,4 +823,35 @@
             else:
                 LiveUtils.getSong().tracks[track].devices[device].parameters[param].value = value
+
+    def devicerangeCB(self, msg):
+        ty = msg[0] == '/live/return/device/range' and 1 or 0
+        track = msg[2]
+    
+        if len(msg) == 4:
+            device = msg[3]
+            po = [track, device]
+            
+            if ty == 1:
+                params = LiveUtils.getSong().return_tracks[track].devices[device].parameters
+            else:
+                params = LiveUtils.getSong().tracks[track].devices[device].parameters
+    
+            for i in range(len(params)):
+                po.append(i)
+                po.append(params[i].min)
+                po.append(params[i].max)
+            
+            self.oscServer.sendOSC(ty == 1 and "/live/return/device/range" or "/live/device/range", tuple(po))
+    
+        elif len(msg) == 5:
+            device = msg[3]
+            param  = msg[4]
+            
+            if ty == 1:
+                p = LiveUtils.getSong().return_tracks[track].devices[device].parameters[param]
+            else: 
+                p = LiveUtils.getSong().tracks[track].devices[device].parameters[param]
+        
+            self.oscServer.sendOSC(ty == 1 and "/live/return/device/range" or "/live/device/range", (track, device, param, p.min, p.max))
                 
     def devicelistCB(self, msg):
@@ -748,5 +902,26 @@
         
             LiveUtils.getSong().master_track.devices[device].parameters[param].value = value
-                
+
+    def mdevicerange(msg) == 3:
+            device = msg[2]
+            po = [device]
+            
+            params = LiveUtils.getSong().master_track.devices[device].parameters
+    
+            for i in range(len(params)):
+                po.append(i)
+                po.append(params[i].max)
+                po.append(params[i].min)
+            
+            self.oscServer.sendOSC("/live/master/device/range", tuple(po))
+    
+        elif len(msg) == 4:
+            device = msg[2]
+            param  = msg[3]
+            
+            p = LiveUtils.getSong().master_track.devices[device].parameters[param]
+        
+            self.oscServer.sendOSC("/live/master/device/range", (device, param, p.min, p.max))
+            
     def mdevicelistCB(self, msg):
         if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
@@ -771,13 +946,13 @@
 
     def loopStateCB(self, msg):
-    	trackNumber = msg[2]
-    	clipNumber = msg[3]
+        trackNumber = msg[2]
+        clipNumber = msg[3]
     
         if len(msg) == 4:
             self.oscServer.sendOSC("/live/loopstate", int(LiveUtils.getClip(trackNumber, clipNumber).looping))    
         
-    	elif len(msg) == 5:
-    		loopState = msg[4]
-    		LiveUtils.getClip(trackNumber, clipNumber).looping =  loopState
+        elif len(msg) == 5:
+            loopState = msg[4]
+            LiveUtils.getClip(trackNumber, clipNumber).looping =  loopState
 
     def loopStartCB(self, msg):
@@ -788,16 +963,15 @@
             self.oscServer.sendOSC("/live/loopstart", float(LiveUtils.getClip(trackNumber, clipNumber).loop_start))    
     
-    	elif len(msg) == 5:
-    		loopStart = msg[4]
-    		LiveUtils.getClip(trackNumber, clipNumber).loop_start = loopStart
+        elif len(msg) == 5:
+            loopStart = msg[4]
+            LiveUtils.getClip(trackNumber, clipNumber).loop_start = loopStart
             
     def loopEndCB(self, msg):
-    	trackNumber = msg[2]
-    	clipNumber = msg[3]    
+        trackNumber = msg[2]
+        clipNumber = msg[3]    
         if len(msg) == 4:
             self.oscServer.sendOSC("/live/loopend", float(LiveUtils.getClip(trackNumber, clipNumber).loop_end))    
         
-    	elif len(msg) == 5:
-    		loopEnd = msg[4]
-    		LiveUtils.getClip(trackNumber, clipNumber).loop_end =  loopEnd
- 
+        elif len(msg) == 5:
+            loopEnd = msg[4]
+            LiveUtils.getClip(trackNumber, clipNumber).loop_end =  loopEnd
Index: trunk/LiveOSC/OSCAPI.txt
===================================================================
--- trunk/LiveOSC/OSCAPI.txt	(revision 30)
+++ trunk/LiveOSC/OSCAPI.txt	(revision 32)
@@ -21,15 +21,23 @@
 /live/stop                                                              Stops playing the song
 /live/stop/clip         (int track, int clip)                           Stops clip number clip in track number track
-/live/stop/track        (int track, int clip)                           Stops track number track
+/live/stop/track        (int track)                                     Stops track number track
 
-/live/name/scene                                                        Returns a a series of all the scene names in the form /live/name/scene (int scene, string name)
+/live/scenes            blank or ('query')                              Returns the total number of scenes in the form /live/scenes (int)
+/live/tracks            blank or ('query')                              Returns the total number of tracks in the form /live/tracks (int)
+
+/live/name/scene        blank or ('query')                              Returns a a series of all the scene names in the form /live/name/scene (int scene, string name)
 /live/name/scene        (int scene)                                     Returns a single scene's name in the form /live/name/scene (int scene, string name)
 /live/name/scene        (int scene, string name)                        Sets scene number scene's name to name
+/live/name/sceneblock   (int track, int size)                           Returns a series of scene name starting at (int scene) of length (int size)
+
 /live/name/track                                                        Returns a a series of all the track names in the form /live/name/track (int track, string name, int color)
 /live/name/track        (int track)                                     Returns a single track's name in the form /live/name/track (int track, string name, int color)
 /live/name/track        (int track, string name)                        Sets track number track's name to name
+/live/name/trackblock   (int track, int size)                           Returns a series of track name starting at (int track) of length (int size)
+
 /live/name/clip                                                         Returns a a series of all the clip names in the form /live/name/clip (int track, int clip, string name)
 /live/name/clip         (int track, int clip)                           Returns a single clip's name in the form /live/name/clip (int clip, string name)
 /live/name/clip         (int track, int clip, string name)              Sets clip number clip in track number track's name to name
+/live/name/clipblock    (int track, int clip, int sizeX, int sizeY)    Returns a series of clipn names in a area starting at (int track, int clip) of size (sizeX, sizeY)
 
 /live/arm               (int track)                                     Get arm status for track number track
@@ -71,4 +79,9 @@
                                                                         [state: 0 = no clip, 1 = has clip, 2 = playing, 3 = triggered]
 /live/track/view        (int track)                                     Selects a track to view
+/live/return/view       (int track)                                     Selects a return track to view
+/live/master/view                                                       Selects the master track
+
+/live/clip/view         (int track, int clip)                           Selects a clip on track to view
+
 /live/clip/info         (int track, int clip)                           Gets the status of a single clip in the form  /live/clip/info (tracknumber, clipnumber, state)
                                                                         [state: 0 = no clip, 1 = has clip, 2 = playing, 3 = triggered]
@@ -81,4 +94,7 @@
                         int value) 
 
+/live/device/range      (int track, int device)                         Returns the min and max value of all parameters of device on track in the format /live/device/range (int track, int device, int/float min, int/float max, ...)
+/live/device/range      (int track, int device, int parameter)          Returns the min and max value of parameter of device on track in the format /live/device/range (int track, int device, int/float min, int/float max)
+
 /live/return/devicelist (int track)                                     Returns a list of all devices and names on track number track as: /live/device (int track, int device, str name, ...)
 /live/return/device     (int track, int device)                         Returns a list of all parameter values and names on device on track number track
@@ -88,4 +104,7 @@
                         int value) 
 
+/live/return/device/range (int track, int device)                       Returns the min and max value of all parameters of device on return track in the format /live/return/device/range (int track, int device, int/float min, int/float max, ...)
+/live/return/device/range (int track, int device, int parameter)        Returns the min and max value of parameter of device on return track in the format /live/return/device/range (int track, int device, int/float min, int/float max)                        
+
 /live/master/devicelist                                                 Returns a list of all devices and names on the master track as: /live/device (int device, str name, ...)
 /live/master/device     (int device)                                    Returns a list of all parameter values and names on device on the master track
@@ -93,5 +112,8 @@
 /live/master/device     (int device, int parameter)                     Returns the name and value of parameter on device on the master track as: /live/device (int device, int parameter, int value)
 /live/master/device     (int device, int parameter, int value)          Sets parameter on device on track number track to value
-                        
+
+/live/return/device/range (int device)                                  Returns the min and max value of all parameters of device on the master track in the format /live/master/device/range (int device, int/float min, int/float max, ...)
+/live/return/device/range (int device, int parameter)                   Returns the min and max value of parameter of device on the master track in the format /live/master/device/range (int device, int/float min, int/float max)          
+
 /live/clip/loopstart    (int track, int clip, float loopstart)          Set the loop start position for clip in track
 /live/clip/loopend      (int track, int clip, float loopend)            Set the loop end position for clip in track
