Open Peda1996 opened 4 years ago
Hallo Peter,
thank you for y<our interest in the project.
For sure I have some information about pyVEGAS.
Some info you can find here:
https://www.hlinke.de/dokuwiki/doku.php?id=en:vegas_python
What information are you looking for?
If you need any additional help, please ask. I am happy to help you.
Kind regards
Harold
By the way: Nach deinem Namen zu urteilen, können wir auch in Deutsch diskutieren.
Von: Peter Wassermair notifications@github.com Gesendet: Freitag, 13. März 2020 11:41 An: haroldlinke/VEGASPython VEGASPython@noreply.github.com Cc: Subscribed subscribed@noreply.github.com Betreff: [haroldlinke/VEGASPython] Where do i find a documentation for pyVEGAS? (#1)
Hello,
I just stumbled upon your great project. As I am an Python Enthusiast, I really appreciate your work :).
Do you know, where I can get the documentation for pyVegas?
— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/haroldlinke/VEGASPython/issues/1 , or unsubscribe https://github.com/notifications/unsubscribe-auth/AKNR4QSO5CC37XSFTSGVKF3RHIETVANCNFSM4LG7USZQ . https://github.com/notifications/beacon/AKNR4QX7ZLEB6PN6AFHQDDTRHIETVA5CNFSM4LG7USZ2YY3PNVWWK3TUL52HS4DFUVEXG43VMWVGG33NNVSW45C7NFSM4IUZ6U7A.gif
Ah, perfekt :) Ich habe vorher noch nie mit Vegas Scripting gearbeitet, aus diesem Grund war mir neu das eine Dokumentation nicht direkt online zur Verfügung steht. Hat sich mitlerweile gelöst.
Hab jetzt mithilfe von Python ein Skript geschrieben, welches .mid Daten einlest und dann zu den jeweiligen Positionen den gerade ausgewählten Clip kopiert. Bin echt begeistert von der guten Python Integration :). Auf jeden Fall kann ich nun automatisiert Teile, wie z.b. in diesem Video sind zusammenschneiden lassen (mithilfe von mido, pydub, tkinter): https://www.youtube.com/watch?v=fm7mnRqty1E (Kanal gehört einen Bekannten von mir, und der Arbeitet sonst an so einem Video so 6 Stunden^^)
Gibt es irgendwelche Möglichkeiten, die Erweiterungen direkt in die Vegas GUI zu integrieren? Derzeit verwende ich ein tkinter Fenster, welches sich beim Ausführen der Erweiterung öffnet.
Hallo Peter,
when I read your mail a 2nd time I saw that you might look for information about how to access the VEGAS API and how it works.
You can find this information on this page:
https://www.hlinke.de/dokuwiki/doku.php?id=en:vegas_python_tutorial
In the section further links you will find links to all information that Magix and Sony provide for the VEGAS API.
I have adapted the FAQ they provided for VEGASPython: https://www.hlinke.de/dokuwiki/doku.php?id=en:vegas_python_faq
Maybe this can help you for your first steps.
If you have further questions please do not hesitate to ask.
Kind regards
Harold
Von: Harold Linke harold.linke@t-online.de Gesendet: Samstag, 14. März 2020 16:47 An: 'haroldlinke/VEGASPython' reply@reply.github.com; 'haroldlinke/VEGASPython' VEGASPython@noreply.github.com Cc: 'Subscribed' subscribed@noreply.github.com Betreff: AW: [haroldlinke/VEGASPython] Where do i find a documentation for pyVEGAS? (#1)
Hallo Peter,
thank you for y<our interest in the project.
For sure I have some information about pyVEGAS.
Some info you can find here:
https://www.hlinke.de/dokuwiki/doku.php?id=en:vegas_python
What information are you looking for?
If you need any additional help, please ask. I am happy to help you.
Kind regards
Harold
By the way: Nach deinem Namen zu urteilen, können wir auch in Deutsch diskutieren.
Von: Peter Wassermair <notifications@github.com mailto:notifications@github.com > Gesendet: Freitag, 13. März 2020 11:41 An: haroldlinke/VEGASPython <VEGASPython@noreply.github.com mailto:VEGASPython@noreply.github.com > Cc: Subscribed <subscribed@noreply.github.com mailto:subscribed@noreply.github.com > Betreff: [haroldlinke/VEGASPython] Where do i find a documentation for pyVEGAS? (#1)
Hello,
I just stumbled upon your great project. As I am an Python Enthusiast, I really appreciate your work :).
Do you know, where I can get the documentation for pyVegas?
— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/haroldlinke/VEGASPython/issues/1 , or unsubscribe https://github.com/notifications/unsubscribe-auth/AKNR4QSO5CC37XSFTSGVKF3RHIETVANCNFSM4LG7USZQ . https://github.com/notifications/beacon/AKNR4QX7ZLEB6PN6AFHQDDTRHIETVA5CNFSM4LG7USZ2YY3PNVWWK3TUL52HS4DFUVEXG43VMWVGG33NNVSW45C7NFSM4IUZ6U7A.gif
Hallo Peter,
da haben sich unsers Mails überschnitten.
Die Integration ist ganz einfach, Du musst das Pythonscript nur in das directory VEGASPython_PN legen. Beim Neustart von VEGAS wird es automatisch erkannt und kann unter Extras->Erweiterungen kann es dann direkt aufgerufen werden.
Hilft Dir das weiter?
Wenn Du ein gutes Script hast, dass Du veröffentlichen möchtest, kann ich das gerne auf meine Seite mit hinzufügen.
Viele Grüsse
Harold
Von: Peter Wassermair notifications@github.com Gesendet: Samstag, 14. März 2020 16:58 An: haroldlinke/VEGASPython VEGASPython@noreply.github.com Cc: haroldlinke harold.linke@t-online.de; Comment comment@noreply.github.com Betreff: Re: [haroldlinke/VEGASPython] Where do i find a documentation for pyVEGAS? (#1)
Ah, perfekt :) Ich habe vorher noch nie mit Vegas Scripting gearbeitet, aus diesem Grund war mir neu das eine Dokumentation nicht direkt online zur Verfügung steht. Hat sich mitlerweile gelöst.
Hab jetzt mithilfe von Python ein Skript geschrieben, welches .mid Daten einlest und dann zu den jeweiligen Positionen den gerade ausgewählten Clip kopiert. Bin echt begeistert von der guten Python Integration :). Auf jeden Fall kann ich nun automatisiert Teile, wie z.b. in diesem Video sind zusammenschneiden lassen (mithilfe von mido, pydub, tkinter): https://www.youtube.com/watch?v=fm7mnRqty1E (Kanal gehört einen Bekannten von mir, und der Arbeitet sonst an so einem Video so 6 Stunden^^)
Gibt es irgendwelche Möglichkeiten, die Erweiterungen direkt in die Vegas GUI zu integrieren? Derzeit verwende ich ein tkinter Fenster, welches sich beim Ausführen der Erweiterung öffnet.
— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/haroldlinke/VEGASPython/issues/1#issuecomment-599085498 , or unsubscribe https://github.com/notifications/unsubscribe-auth/AKNR4QSRGMRLOHMZQEA3KYLRHOSOXANCNFSM4LG7USZQ . https://github.com/notifications/beacon/AKNR4QVIBMB6CGSAJCBHNV3RHOSOXA5CNFSM4LG7USZ2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEO2VDOQ.gif
Hallo, soweit hab ichs verstanden 👌 Ich wollte jedoch wissen ob es möglich ist, das Script direkt wie die python debugging Umgebung in die Vegas UI einzubinden.
Wenn ich das richtig verstehe, möchtest Du ein dockable Fenster erzeugen, in dem sich Dein Tkinter Frame befindet.
Ein dockable Fenster zu erzeugen ist kein Problem:
Kopiere diesen Code in das interactive fenster und lasse ihn ausführen:
from System.Windows.Forms import *
clr.AddReference('ScriptPortal.Vegas')
import ScriptPortal.Vegas
from ScriptPortal.Vegas import *
clr.AddReference('System.Drawing')
import System.Drawing
dockView = DockableControl("HellowWorldView")
label = Label()
label.Dock = DockStyle.Fill
label.Text = "test text"
dockView.Controls.Add(label)
pyVEGAS.LoadDockView(dockView)
Das Problem ist, Tkinter zu sagen, dass es neue Frames in dieses Fenster einbauen soll.
Bis jetzt habe ich noch keine Möglichkeit gefunden, die mit Tkinter zu machen.
Wenn Du eine Möglichkeit findest, wäre ich sehr daran interessiert.
Viele Grüsse
Harold
Von: Peter Wassermair notifications@github.com Gesendet: Samstag, 14. März 2020 17:20 An: haroldlinke/VEGASPython VEGASPython@noreply.github.com Cc: haroldlinke harold.linke@t-online.de; Comment comment@noreply.github.com Betreff: Re: [haroldlinke/VEGASPython] Where do i find a documentation for pyVEGAS? (#1)
Hallo, soweit hab ichs verstanden 👌 Ich wollte jedoch wissen ob es möglich ist, das Script direkt wie die python debugging Umgebung in die Vegas UI einzubinden.
— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/haroldlinke/VEGASPython/issues/1#issuecomment-599089645 , or unsubscribe https://github.com/notifications/unsubscribe-auth/AKNR4QRYSPGIGRY2UB7CM4DRHOVBXANCNFSM4LG7USZQ . https://github.com/notifications/beacon/AKNR4QW6L33EF4CFYVTW53DRHOVBXA5CNFSM4LG7USZ2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEO2WD3I.gif
Danke für die Info.
Dann werde ich das ganze wohl mit der externen Gui belassen, da ich keine Erfahrung mit der Art von Fenstern habe und das ganze jetzt nicht noch umschreiben will ^^.
So siehts derzeit aus:
Man kann Midis importieren, und das ausgewählte Feld wird je nach Spur kopiert.
Code ist halt teilweise nicht ganz so schön, aber funktionieren tuts ^^.
from collections import defaultdict
from tkinter import filedialog
# open gui
from tkinter import *
from tkinter.ttk import Combobox
from typing import Callable
import pydub
from mido import MidiFile
import clr
clr.AddReference('ScriptPortal.Vegas')
import ScriptPortal.Vegas
from ScriptPortal.Vegas import *
clr.AddReference('System.Drawing')
import System.Drawing
class GUI:
def __init__(self, window, pyVEGAS):
self.window = window
self.pyVEGAS = pyVEGAS
self.midi_file = None
self.positions = None
window.title("Midi To Clip")
window.geometry('350x160')
# file chooser:
self.label_midi_chooser = Label(window, text="Choose Midi File")
self.label_midi_chooser.grid(column=0, row=0)
self.btn = Button(window, text="Choose Midi File", command=self.file_chooser)
self.btn.grid(column=1, row=0)
# choosen midi file
self.choosen_midi_file = Label(window, text="No file choosen")
self.choosen_midi_file.grid(row=1, columnspan=2)
# set tempo
self.label_video_bpm = Label(window, text="Set Midi BPM")
self.label_video_bpm.grid(row=2, column=0)
self.bpm = Entry(window)
self.bpm.grid(row=2, column=1)
# video offset
self.label_video_offset = Label(window, text="Set Video Offset in s")
self.label_video_offset.grid(row=3, column=0)
self.offset = Entry(window)
self.offset.grid(row=3, column=1)
# choose midi track
self.label_midi_track = Label(window, text="Set midi track")
self.label_midi_track.grid(row=4, column=0)
self.track = Combobox(window, values=[])
self.track.grid(row=4, column=1)
# use selection
self.selection = IntVar()
self.selection_button = Checkbutton(window, text="only insert in selection", variable=self.selection)
self.selection_button.grid(row=5)
# set execute button
self.btn = Button(window, text="Execute Script", command=self.exec)
self.btn.grid(column=1, row=6)
window.grid_columnconfigure(1, weight=1)
window.mainloop()
def exec(self):
self.btn.configure(text="Read Midi")
self.read_midi()
self.btn.configure(text="Get Track Positions")
positions = self.positions[int(self.track.current())]
if len(positions) <= 0:
return
offset = int(float(self.offset.get()) * 1000)
_from = None
_to = None
if self.selection.get() == 1:
_from = self.pyVEGAS.Transport.LoopRegionStart.ToMilliseconds()
_to = self.pyVEGAS.Transport.LoopRegionLength.ToMilliseconds() + _from
if _from > _to:
_from, _to = _to, _from
self.btn.configure(text="Getting selected Track")
# self.pyVEGAS.Project.AddVideoTrack()
selected = []
for track in self.pyVEGAS.Project.Tracks:
for ev in track.Events:
if ev.Selected:
selected.append((track, ev))
self.btn.configure(text="Copy selected Track")
for track, ev in selected:
last_start = None
for start, end in positions:
start = start + offset
if last_start is not None and _from is not None and _to is not None:
if last_start < _from or last_start > _to:
last_start = start
print("skipping:", "start", start, "_from", _from, "start", start, "_to", _to)
continue
if last_start is not None and start - last_start > 1:
# copy track
copy = ev.Copy(track, Timecode.FromMilliseconds(last_start))
# self.pyVEGAS.UpdateUI()
# cut the track
dLength = Timecode.FromMilliseconds(start - last_start)
dStart = copy.Start.ToMilliseconds()
# print(str(start - last_start))
copy.AdjustStartLength(Timecode(dStart), dLength, True)
self.pyVEGAS.UpdateUI()
last_start = start
if _from is not None and _to is not None:
if last_start < _from or last_start > _to:
pass # well didn't want to write the not xD
else:
copy = ev.Copy(track, Timecode.FromMilliseconds(last_start))
self.pyVEGAS.UpdateUI()
self.btn.configure(text="Done")
def file_chooser(self):
self.midi_file = filedialog.askopenfilename(filetypes=(("midi files", "*.mid"), ("all files", "*.*")))
self.choosen_midi_file.configure(text=self.midi_file)
self.track.configure(values=self.get_midi_tracks())
def get_midi_tracks(self):
mid = MidiFile(self.midi_file)
return [i.name for i in mid.tracks]
def read_midi(self):
bpm = float(self.bpm.get())
mid = MidiFile(self.midi_file)
self.positions = []
def ticks_to_ms(ticks):
tick_ms = (60000.0 / bpm) / mid.ticks_per_beat
return ticks * tick_ms
for track in mid.tracks:
t = []
# position of rendering in ms
current_pos = 0.0
current_notes = defaultdict(dict)
# current_notes = {
# channel: {
# note: (start_time, message)
# }
# }
for msg in track:
# TODO CHANGE THIS FROM MS TO NORMAL TICKS, TO REDUCE ERRORS!!
current_pos += ticks_to_ms(msg.time)
# ticks_to_ms(current_pos)
try:
if msg.type == 'note_on' and msg.velocity != 0:
current_notes[msg.channel][msg.note] = (current_pos, msg)
if msg.type == 'note_off' or (msg.velocity == 0 and msg.type == 'note_on'):
start_pos, start_msg = current_notes[msg.channel].pop(msg.note)
duration = current_pos - start_pos # - 125
t.append((start_pos, current_pos))
except AttributeError:
pass
except KeyError:
pass
self.positions.append(t)
return self.positions
def FromVegas(pyVEGAS):
GUI(Tk(), pyVEGAS)
if __name__ == "__main__":
FromVegas(pyVEGAS)
Das Problem derzeit ist halt, das es von vielen externen Libraries abhängig ist, also falls du es zu den Skripten hinzufügen möchtest, müsste das irgendwo dabei stehen das die Libraries extra installiert werden müssen.
LG
Hallo Peter,
danke für das Pythonlisting.
Man kann es etwas vereinfachen.
Du brauchst kein Threading. Der Pythoninterpreter ist schon in einem eigenen Thread, so dass das Fenster unabhängig vom VEGAS funktioniert.
Auf den Import von pydub, collections and typing kann man dann verzichten.
Bleibt noch Mido was aber kein Problem ist. Ich habe es bei mir mal eingebunden.
Allerdings habe ich noch nicht herausbekommen, was das Programm eigentlich genau machen soll.
Auserdem gibt es noch ein Problem, dass das Fenster nicht geschlossen wird, wenn VEGAS beendet wird.
Da muss ich mir mal überlegen, was man da machen kann.
Viele Grüsse
Harold
Von: Peter Wassermair notifications@github.com Gesendet: Samstag, 14. März 2020 20:28 An: haroldlinke/VEGASPython VEGASPython@noreply.github.com Cc: haroldlinke harold.linke@t-online.de; Comment comment@noreply.github.com Betreff: Re: [haroldlinke/VEGASPython] Where do i find a documentation for pyVEGAS? (#1)
Danke für die Info.
Dann werde ich das ganze wohl mit der externen Gui belassen, da ich keine Erfahrung mit der Art von Fenstern habe und das ganze jetzt nicht noch umschreiben will ^^.
So siehts derzeit aus:
https://user-images.githubusercontent.com/1789749/76688934-e1720c80-6631-11ea-904f-1aa9c739b39b.png
Code ist halt teilweise nicht ganz so schön, aber funktionieren tuts ^^.
from collections import defaultdict
from tkinter import filedialog
from tkinter import *
from tkinter.ttk import Combobox
from typing import Callable
import pydub
from mido import MidiFile
import clr
clr.AddReference('ScriptPortal.Vegas')
import ScriptPortal.Vegas
from ScriptPortal.Vegas import *
clr.AddReference('System.Drawing')
import System.Drawing
class GUI:
def __init__(self, window, pyVEGAS):
self.window = window
self.pyVEGAS = pyVEGAS
self.midi_file = None
self.positions = None
window.title("Midi To Clip")
window.geometry('350x160')
# file chooser:
self.label_midi_chooser = Label(window, text="Choose Midi File")
self.label_midi_chooser.grid(column=0, row=0)
self.btn = Button(window, text="Choose Midi File", command=self.file_chooser)
self.btn.grid(column=1, row=0)
# choosen midi file
self.choosen_midi_file = Label(window, text="No file choosen")
self.choosen_midi_file.grid(row=1, columnspan=2)
# set tempo
self.label_video_bpm = Label(window, text="Set Midi BPM")
self.label_video_bpm.grid(row=2, column=0)
self.bpm = Entry(window)
self.bpm.grid(row=2, column=1)
# video offset
self.label_video_offset = Label(window, text="Set Video Offset in s")
self.label_video_offset.grid(row=3, column=0)
self.offset = Entry(window)
self.offset.grid(row=3, column=1)
# choose midi track
self.label_midi_track = Label(window, text="Set midi track")
self.label_midi_track.grid(row=4, column=0)
self.track = Combobox(window, values=[])
self.track.grid(row=4, column=1)
# use selection
self.selection = IntVar()
self.selection_button = Checkbutton(window, text="only insert in selection", variable=self.selection)
self.selection_button.grid(row=5)
# set execute button
self.btn = Button(window, text="Execute Script", command=self.exec)
self.btn.grid(column=1, row=6)
window.grid_columnconfigure(1, weight=1)
window.mainloop()
def exec(self):
self.btn.configure(text="Read Midi")
self.read_midi()
self.btn.configure(text="Get Track Positions")
positions = self.positions[int(self.track.current())]
if len(positions) <= 0:
return
offset = int(float(self.offset.get()) * 1000)
_from = None
_to = None
if self.selection.get() == 1:
_from = self.pyVEGAS.Transport.LoopRegionStart.ToMilliseconds()
_to = self.pyVEGAS.Transport.LoopRegionLength.ToMilliseconds() + _from
if _from > _to:
_from, _to = _to, _from
self.btn.configure(text="Getting selected Track")
# self.pyVEGAS.Project.AddVideoTrack()
selected = []
for track in self.pyVEGAS.Project.Tracks:
for ev in track.Events:
if ev.Selected:
selected.append((track, ev))
self.btn.configure(text="Copy selected Track")
for track, ev in selected:
last_start = None
for start, end in positions:
start = start + offset
if last_start is not None and _from is not None and _to is not None:
if last_start < _from or last_start > _to:
last_start = start
print("skipping:", "start", start, "_from", _from, "start", start, "_to", _to)
continue
if last_start is not None and start - last_start > 1:
# copy track
copy = ev.Copy(track, Timecode.FromMilliseconds(last_start))
# self.pyVEGAS.UpdateUI()
# cut the track
dLength = Timecode.FromMilliseconds(start - last_start)
dStart = copy.Start.ToMilliseconds()
# print(str(start - last_start))
copy.AdjustStartLength(Timecode(dStart), dLength, True)
self.pyVEGAS.UpdateUI()
last_start = start
if _from is not None and _to is not None:
if last_start < _from or last_start > _to:
pass # well didn't want to write the not xD
else:
copy = ev.Copy(track, Timecode.FromMilliseconds(last_start))
self.pyVEGAS.UpdateUI()
self.btn.configure(text="Done")
def file_chooser(self):
self.midi_file = filedialog.askopenfilename(filetypes=(("midi files", "*.mid"), ("all files", "*.*")))
self.choosen_midi_file.configure(text=self.midi_file)
self.track.configure(values=self.get_midi_tracks())
def get_midi_tracks(self):
mid = MidiFile(self.midi_file)
return [i.name for i in mid.tracks]
def read_midi(self):
bpm = float(self.bpm.get())
mid = MidiFile(self.midi_file)
self.positions = []
def ticks_to_ms(ticks):
tick_ms = (60000.0 / bpm) / mid.ticks_per_beat
return ticks * tick_ms
for track in mid.tracks:
t = []
# position of rendering in ms
current_pos = 0.0
current_notes = defaultdict(dict)
# current_notes = {
# channel: {
# note: (start_time, message)
# }
# }
for msg in track:
# TODO CHANGE THIS FROM MS TO NORMAL TICKS, TO REDUCE ERRORS!!
current_pos += ticks_to_ms(msg.time)
# ticks_to_ms(current_pos)
try:
if msg.type == 'note_on' and msg.velocity != 0:
current_notes[msg.channel][msg.note] = (current_pos, msg)
if msg.type == 'note_off' or (msg.velocity == 0 and msg.type == 'note_on'):
start_pos, start_msg = current_notes[msg.channel].pop(msg.note)
duration = current_pos - start_pos # - 125
t.append((start_pos, current_pos))
except AttributeError:
pass
except KeyError:
pass
self.positions.append(t)
return self.positions
def threaded(fn: Callable) -> Callable:
def wrapper(*args, **kwargs):
import threading
thread = threading.Thread(target=fn, args=args, kwargs=kwargs)
thread.start()
return thread
return wrapper
@threaded
def FromVegas(pyVEGAS):
GUI(Tk(), pyVEGAS)
if name == "main":
FromVegas(pyVEGAS)
Das Problem derzeit ist halt, das es von vielen externen Libraries abhängig ist, also falls du es zu den Skripten hinzufügen möchtest, müsste das irgendwo dabei stehen das die Libraries extra installiert werden müssen.
LG
— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/haroldlinke/VEGASPython/issues/1#issuecomment-599124757 , or unsubscribe https://github.com/notifications/unsubscribe-auth/AKNR4QX72SKKIL3CUSGCGXLRHPLETANCNFSM4LG7USZQ . https://github.com/notifications/beacon/AKNR4QWKOCGZU4WP4FBGIEDRHPLETA5CNFSM4LG7USZ2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEO26WFI.gif
Das ganze Skript ist teilweise bisschen willkürlich entstanden, dadurch noch einige unnötige Imports und die komische Struktur^^.
Threading wollte ich aufgrund eines Bugs in Sony Vegas einbinden, welcher sobald das Fenster offen ist die korrekte Zeigeranzeige stoppt.
Threading als fix hat leider nix gebracht, wodurch ich das wieder entfernt habe.
Ich hab ein kleines Video dazu gemacht, wo man das ganze in Aktion sieht. Grundsätzlich soll dieses Tool dafür verwendet werden automatisch die Videos an den Midi Startpositionen einzufügen. https://www.youtube.com/watch?v=vPV8A2ScD9Y
Das mit dem Schließen des Fensters ist denke ich ein Problem von Tkinter.
Vielleicht sollte ich mir mal das andere Fenster Verwaltungs-system anschauen.
Hello,
I just stumbled upon your great project. As I am an Python Enthusiast, I really appreciate your work :).
Do you know, where I can get the documentation for pyVegas?