You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1032 lines
50 KiB
1032 lines
50 KiB
"""
|
|
File:
|
|
JetDialogs.py
|
|
|
|
Contents and purpose:
|
|
Dialog boxes used in JetCreator
|
|
|
|
Copyright (c) 2008 Android Open Source Project
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
"""
|
|
|
|
import wx
|
|
import thread
|
|
import wx.lib.newevent
|
|
|
|
from JetDefs import *
|
|
from JetCtrls import *
|
|
from JetFile import *
|
|
from JetUtils import *
|
|
from JetPreview import *
|
|
from JetSegGraph import *
|
|
from eas import *
|
|
from JetStatusEvent import *
|
|
|
|
PLAY_SEGMENT = 1
|
|
PLAY_MIDI = 2
|
|
|
|
class JetEdit():
|
|
""" Class used to build dialog box controls from the definitions in JetDefs """
|
|
def __init__(self, panel, ctrlList, callbackClass):
|
|
LBL_OFFSET = 15
|
|
|
|
ctrls = getattr(JetDefs, ctrlList)
|
|
self.ctrls = {}
|
|
for Lbl, Text, Row, Col, Len, Min, Max, Id, Lst, Fct, Enabled, HelpText in ctrls:
|
|
try:
|
|
iDisplayLbl = True
|
|
if Text[0:3] == "btn":
|
|
self.ctrls[Text] = wx.Button(panel, Id, Lbl, wx.Point(Col, Row), size=Len)
|
|
if Fct > "":
|
|
self.ctrls[Text].Bind(wx.EVT_BUTTON, getattr(callbackClass, Fct), self.ctrls[Text], id=Id)
|
|
if Id == wx.ID_OK:
|
|
self.ctrls[Text].SetDefault()
|
|
iDisplayLbl = False
|
|
else:
|
|
if Text[0:3] == "txt":
|
|
self.ctrls[Text] = wx.TextCtrl(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET +3), wx.Size(Len,-1))
|
|
elif Text[0:4] == "spn1":
|
|
self.ctrls[Text] = JetSpinOneBased(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), min=Min, max=Max)
|
|
elif Text[0:3] == "spn":
|
|
self.ctrls[Text] = JetSpin(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), min=Min, max=Max)
|
|
elif Text[0:3] == "cmb":
|
|
self.ctrls[Text] = wx.ComboBox(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), Lst, wx.CB_DROPDOWN | wx.CB_READONLY )
|
|
self.ctrls[Text].SetValue(Lst[0])
|
|
if Fct > "":
|
|
self.ctrls[Text].Bind(wx.EVT_COMBOBOX, getattr(callbackClass, Fct), self.ctrls[Text])
|
|
elif Text[0:2] == "tm":
|
|
self.ctrls[Text] = TimeCtrl(panel, pos=(Col, Row + LBL_OFFSET), ctlName=Text)
|
|
elif Text[0:7] == "filecmb":
|
|
self.ctrls[Text] = JetFileCombo(panel, pos=(Col, Row + LBL_OFFSET), size=wx.Size(Len,-1), title=Lbl, spec=Lst, id=Id)
|
|
elif Text[0:7] == "filetxt":
|
|
self.ctrls[Text] = JetFileText(panel, pos=(Col, Row + LBL_OFFSET), size=wx.Size(Len,-1), title=Lbl, spec=Lst, id=Id)
|
|
elif Text[0:2] == "fr":
|
|
self.ctrls[Text] = wx.StaticBox(parent=panel, id=wx.ID_ANY, label=Lbl, pos=(Row, Col), size=Len)
|
|
iDisplayLbl = False
|
|
elif Text[0:3] == "chk":
|
|
self.ctrls[Text] = JetCheckBox(panel, Id, label=Lbl, pos=(Col, Row), size=wx.Size(Len,-1))
|
|
iDisplayLbl = False
|
|
if Fct > "":
|
|
self.ctrls[Text].Bind(wx.EVT_CHECKBOX , getattr(callbackClass, Fct), self.ctrls[Text])
|
|
elif Text[0:6] == "rdobox":
|
|
self.ctrls[Text] = wx.RadioBox(panel, Id, label=Lbl, pos=(Col, Row), size=Len, choices=Lst, majorDimension=1, style=wx.RA_SPECIFY_COLS)
|
|
iDisplayLbl = False
|
|
if Fct > "":
|
|
self.ctrls[Text].Bind(wx.EVT_RADIOBOX , getattr(callbackClass, Fct), self.ctrls[Text])
|
|
elif Text[0:3] == "opt":
|
|
self.ctrls[Text] = JetRadioButton(panel, Id, label=Lbl, pos=(Col, Row), size=wx.Size(Len,-1))
|
|
iDisplayLbl = False
|
|
self.ctrls[Text].SetValue(Lst)
|
|
if Fct > "":
|
|
self.ctrls[Text].Bind(wx.EVT_RADIOBUTTON , getattr(callbackClass, Fct), self.ctrls[Text])
|
|
elif Text[0:3] == "lst":
|
|
self.ctrls[Text] = wx.ListBox(panel, Id, pos=(Col, Row), size=Len)
|
|
iDisplayLbl = False
|
|
elif Text[0:4] == "grd2":
|
|
self.ctrls[Text] = JetTrackCtrl(panel, Id, pos=(Col, Row + LBL_OFFSET), size=Len, style=wx.LC_REPORT | wx.SUNKEN_BORDER)
|
|
iDisplayLbl = True
|
|
elif Text[0:3] == "grd":
|
|
self.ctrls[Text] = JetListCtrl(panel, Id, pos=(Col, Row), size=Len)
|
|
iDisplayLbl = False
|
|
elif Text[0:5] == "graph":
|
|
self.ctrls[Text] = SegmentGraph(panel, pos=(Col, Row), size=Len)
|
|
iDisplayLbl = False
|
|
elif Text[0:3] == "hlp":
|
|
self.ctrls[Text] = wx.ContextHelpButton(panel, Id, pos=(Col, Row))
|
|
iDisplayLbl = False
|
|
elif Text[0:3] == "lbl":
|
|
self.ctrls[Text] = wx.StaticText(panel, Id, Lbl, wx.Point(Col, Row), size=wx.Size(Len[0],Len[1]))
|
|
iDisplayLbl = False
|
|
elif Text[0:3] == "box":
|
|
self.ctrls[Text] = wx.StaticBox(panel, wx.ID_ANY, Lbl, pos=(Col, Row), size=Len)
|
|
iDisplayLbl = False
|
|
|
|
if iDisplayLbl:
|
|
self.ctrls[Lbl] = wx.StaticText(panel, Id, Lbl, wx.Point(Col, Row))
|
|
if not Enabled:
|
|
self.ctrls[Text].Enable(False)
|
|
|
|
helpText = IniGetValue(JetDefs.JETCREATOR_HLP, ctrlList, Lbl)
|
|
if helpText > "":
|
|
self.ctrls[Text].SetHelpText(helpText)
|
|
|
|
#except AttributeError:
|
|
#No stub function for testing
|
|
#print("def " + Fct + "(self, event): pass")
|
|
except:
|
|
raise
|
|
|
|
def GetValue(self, fld):
|
|
""" Gets the value of a control """
|
|
return self.ctrls[fld].GetValue()
|
|
|
|
def SetValue(self, fld, val):
|
|
""" Sets the value of a control """
|
|
self.ctrls[fld].SetValue(val)
|
|
|
|
class JetOpen(wx.Dialog):
|
|
""" Opens a jet definition file """
|
|
def __init__(self):
|
|
wx.Dialog.__init__(self, None, -1, JetDefs.DLG_JETOPEN)
|
|
self.fileName = ""
|
|
self.je = JetEdit(self, "JETOPEN_CTRLS", self)
|
|
fileList = GetRecentJetFiles()
|
|
self.je.ctrls[JetDefs.F_JLIST].AppendItems(fileList)
|
|
if len(fileList) > 0:
|
|
self.je.ctrls[JetDefs.F_JFILE].SetValue(fileList[0])
|
|
self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnOpen)
|
|
self.Bind(wx.EVT_LISTBOX, self.OnClick)
|
|
self.SetSize(JetDefs.JETOPEN_SIZE)
|
|
self.CenterOnParent()
|
|
|
|
def OnJetImport(self, event):
|
|
""" Exit the dialog with flag to import """
|
|
self.EndModal(JetDefs.ID_JET_IMPORT)
|
|
|
|
def OnClick(self, event):
|
|
""" Clicking on item in listbox """
|
|
sValue = self.je.ctrls[JetDefs.F_JLIST].GetString(self.je.ctrls[JetDefs.F_JLIST].GetSelection())
|
|
self.je.ctrls[JetDefs.F_JFILE].SetValue(sValue)
|
|
|
|
def OnOpen(self, event):
|
|
""" Double clicking on item in listbox """
|
|
sValue = self.je.ctrls[JetDefs.F_JLIST].GetString(self.je.ctrls[JetDefs.F_JLIST].GetSelection())
|
|
self.je.ctrls[JetDefs.F_JFILE].SetValue(sValue)
|
|
if self.Validate():
|
|
self.fileName = self.je.ctrls[JetDefs.F_JFILE].GetValue()
|
|
AppendRecentJetFile(self.fileName)
|
|
self.EndModal(JetDefs.ID_JET_OPEN)
|
|
|
|
def OnOk(self, event):
|
|
""" Clicking the ok button """
|
|
if self.Validate():
|
|
self.fileName = self.je.ctrls[JetDefs.F_JFILE].GetValue()
|
|
AppendRecentJetFile(self.fileName)
|
|
self.EndModal(JetDefs.ID_JET_OPEN)
|
|
|
|
def OnNew(self, event):
|
|
""" Exit the dialog with flag to create new blank jet file """
|
|
self.EndModal(JetDefs.ID_JET_NEW)
|
|
|
|
def Validate(self):
|
|
""" Validates the filename """
|
|
if len(self.je.ctrls[JetDefs.F_JFILE].GetValue()) == 0:
|
|
InfoMsg("Jet Filename", "The Jet filename is blank.")
|
|
self.je.ctrls[JetDefs.F_JFILE].SetFocus()
|
|
return False
|
|
if not FileExists(self.je.ctrls[JetDefs.F_JFILE].GetValue()):
|
|
InfoMsg("MIDI File", "The file does not exist.")
|
|
self.je.ctrls[JetDefs.F_JFILE].SetFocus()
|
|
return False
|
|
return True
|
|
|
|
class JetPreferences(wx.Dialog):
|
|
""" Preferences dialog box """
|
|
def __init__(self):
|
|
wx.Dialog.__init__(self, None, -1, JetDefs.DLG_PREFERENCES)
|
|
self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP)
|
|
self.je = JetEdit(self, "PREFERENCES_CTRLS", self)
|
|
self.SetSize(JetDefs.PREFERENCES_SIZE)
|
|
self.CenterOnParent()
|
|
|
|
def OnOk(self, event):
|
|
self.EndModal(wx.ID_OK)
|
|
|
|
def GetValue(self, fld):
|
|
return self.je.ctrls[fld].GetValue()
|
|
|
|
def SetValue(self, fld, val):
|
|
self.je.ctrls[fld].SetValue(val)
|
|
|
|
|
|
class JetAbout(wx.Dialog):
|
|
""" About dialog box """
|
|
def __init__(self):
|
|
wx.Dialog.__init__(self, None, -1, JetDefs.DLG_ABOUT)
|
|
img = __import__('img_splash')
|
|
bmp = img.getBitmap()
|
|
b = wx.StaticBitmap(self, -1, bmp)
|
|
self.SetSize((bmp.GetWidth(), bmp.GetHeight()))
|
|
self.CenterOnParent()
|
|
s = __import__('sys')
|
|
print(s.platform)
|
|
|
|
def OnOk(self, event):
|
|
self.EndModal(wx.ID_OK)
|
|
|
|
def GetValue(self, fld):
|
|
return self.je.ctrls[fld].GetValue()
|
|
|
|
def SetValue(self, fld, val):
|
|
self.je.ctrls[fld].SetValue(val)
|
|
|
|
|
|
class JetPropertiesDialog(wx.Dialog):
|
|
""" Properties dialog box """
|
|
def __init__(self):
|
|
wx.Dialog.__init__(self, None, -1, JetDefs.DLG_PROPERTIES)
|
|
self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP)
|
|
self.je = JetEdit(self, "JET_PROPERTIES_CTRLS", self)
|
|
self.SetSize(JetDefs.JET_PROPERTIES_SIZE)
|
|
self.CenterOnParent()
|
|
|
|
def OnOk(self, event):
|
|
self.EndModal(wx.ID_OK)
|
|
|
|
def GetValue(self, fld):
|
|
return self.je.ctrls[fld].GetValue()
|
|
|
|
def SetValue(self, fld, val):
|
|
self.je.ctrls[fld].SetValue(val)
|
|
|
|
|
|
class JetErrors(wx.Dialog):
|
|
""" Errors dialog box """
|
|
def __init__(self, title):
|
|
wx.Dialog.__init__(self, None, -1, title)
|
|
self.je = JetEdit(self, "ERRORDLG", self)
|
|
self.SetSize(JetDefs.ERRORDLG_SIZE)
|
|
self.CenterOnParent()
|
|
|
|
def OnOk(self, event):
|
|
self.EndModal(wx.ID_OK)
|
|
|
|
def SetErrors(self, errors):
|
|
self.je.ctrls[JetDefs.F_ERRGRID].AddCol("Error", JetDefs.ERRORCOLW)
|
|
self.je.ctrls[JetDefs.F_ERRGRID].AddCol("Description", JetDefs.ERRORCOLW)
|
|
self.je.ctrls[JetDefs.F_ERRGRID].AddRows(errors)
|
|
|
|
|
|
class SegEdit(wx.Dialog):
|
|
""" Dialog box to edit segments """
|
|
def __init__(self, title, currentJetConfigFile):
|
|
wx.Dialog.__init__(self, None, -1, title)
|
|
self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP)
|
|
self.currentJetConfigFile = currentJetConfigFile
|
|
self.je = JetEdit(self, "SEGDLG_CTRLS", self)
|
|
self.je.ctrls[JetDefs.F_MIDIFILE].cmb.Bind(wx.EVT_KILL_FOCUS, self.OnMidiChanged)
|
|
self.je.ctrls[JetDefs.F_MIDIFILE].cmb.Bind(wx.EVT_COMBOBOX, self.OnMidiChanged)
|
|
self.je.ctrls[JetDefs.F_MIDIFILE].SetEventFire(True)
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_TRACK, JetDefs.MUTEGRD_TRACK)
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_CHANNEL, JetDefs.MUTEGRD_CHANNEL)
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_NAME, JetDefs.MUTEGRD_NAME)
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].BindCheckBox(self.OnEventChecked)
|
|
self.je.ctrls[JetDefs.F_START].SetChangeCallbackFct(self.UpdateGraph)
|
|
self.je.ctrls[JetDefs.F_END].SetChangeCallbackFct(self.UpdateGraph)
|
|
self.je.ctrls[JetDefs.F_DISPEMPTYTRACKS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_DISPEMPTYTRACKS, JetDefs.F_DISPEMPTYTRACKS, 'bool', 'False'))
|
|
self.je.ctrls[JetDefs.F_GRAPHLABELS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'))
|
|
self.je.ctrls[JetDefs.F_GRAPHCLIPS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'))
|
|
self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True'))
|
|
self.replicatePrefix = ""
|
|
self.lstReplicate = []
|
|
self.chkReplaceMatching = False
|
|
|
|
EVT_JET_STATUS(self, self.OnJetStatusUpdate)
|
|
wx.EVT_CLOSE(self, self.OnClose)
|
|
|
|
self.Player = None
|
|
self.segment = None
|
|
self.graphSegment = None
|
|
self.jetevents = []
|
|
self.lastMidiFile = ""
|
|
self.lastMidiInfo = None
|
|
self.playMode = PLAY_SEGMENT
|
|
self.graphMode = PLAY_MIDI
|
|
self.SetSize(JetDefs.SEGDLG_SIZE)
|
|
self.CenterOnParent()
|
|
|
|
def OnClose(self, event):
|
|
""" Closing the dialog box """
|
|
self.ShutdownPlayer()
|
|
self.je.ctrls[JetDefs.F_START].UnBindKillFocus()
|
|
self.je.ctrls[JetDefs.F_END].UnBindKillFocus()
|
|
self.EndModal(wx.ID_CANCEL)
|
|
|
|
def ShutdownPlayer(self):
|
|
""" Shutdown player flag """
|
|
if self.Player is not None:
|
|
self.Player.SetKeepPlayingFlag(False)
|
|
|
|
def OnMidiChanged(self, event):
|
|
""" When new midi file selected, get its info """
|
|
self.UpdateMaxMbt()
|
|
event.Skip()
|
|
|
|
def UpdateMaxMbt(self):
|
|
""" Get midi info in thread so UI smoother """
|
|
thread.start_new_thread(self.UpdateMaxMbtThread, ())
|
|
|
|
def UpdateMaxMbtThread(self):
|
|
""" Thread to get midi file info """
|
|
if self.je.ctrls[JetDefs.F_MIDIFILE].GetValue() == self.lastMidiFile:
|
|
return
|
|
self.lastMidiFile = self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()
|
|
self.lastMidiInfo = GetMidiInfo(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue())
|
|
wx.PostEvent(self, JetStatusEvent(JetDefs.PST_MIDI_INFO, self.lastMidiInfo))
|
|
|
|
def GetValue(self, fld):
|
|
""" Gets a control value """
|
|
return self.je.ctrls[fld].GetValue()
|
|
|
|
def SetValue(self, fld, val):
|
|
""" Sets a control value """
|
|
self.je.ctrls[fld].SetValue(val)
|
|
if self.je.ctrls[fld] == self.je.ctrls[JetDefs.F_MIDIFILE]:
|
|
self.UpdateMaxMbt()
|
|
|
|
def OnOk(self, event):
|
|
""" Exits dialog box """
|
|
self.ShutdownPlayer()
|
|
if self.Validate():
|
|
self.je.ctrls[JetDefs.F_START].UnBindKillFocus()
|
|
self.je.ctrls[JetDefs.F_END].UnBindKillFocus()
|
|
self.EndModal(wx.ID_OK)
|
|
|
|
def Validate(self):
|
|
""" Validates the control values before exiting """
|
|
if not CompareMbt(self.je.ctrls[JetDefs.F_START].GetValue(), self.je.ctrls[JetDefs.F_END].GetValue()):
|
|
InfoMsg("Start/End", "The segment starting and ending times are illogical.")
|
|
self.je.ctrls[JetDefs.F_START].SetFocus()
|
|
return False
|
|
if len(self.je.ctrls[JetDefs.F_SEGNAME].GetValue()) == 0:
|
|
InfoMsg("Segment Name", "The segment must have a name.")
|
|
self.je.ctrls[JetDefs.F_SEGNAME].SetFocus()
|
|
return False
|
|
if len(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()) == 0:
|
|
InfoMsg("MIDI File", "The segment must have a midi file selected.")
|
|
self.je.ctrls[JetDefs.F_MIDIFILE].SetFocus()
|
|
return False
|
|
if not FileExists(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()):
|
|
InfoMsg("MIDI File", "The MIDI file does not exist.")
|
|
self.je.ctrls[JetDefs.F_MIDIFILE].SetFocus()
|
|
return False
|
|
if len(self.je.ctrls[JetDefs.F_DLSFILE].GetValue()) > 0:
|
|
if not FileExists(self.je.ctrls[JetDefs.F_DLSFILE].GetValue()):
|
|
InfoMsg("DLS File", "The DLS file does not exist.")
|
|
self.je.ctrls[JetDefs.F_DLSFILE].SetFocus()
|
|
return False
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].SetValue(ComputeMuteFlagsFromList(self.je.ctrls[JetDefs.F_MUTEFLAGS]))
|
|
return True
|
|
|
|
def SetSegment(self, mode):
|
|
""" Builds the segment info for graphing """
|
|
if mode == PLAY_SEGMENT:
|
|
jetevents = self.jetevents
|
|
segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME),
|
|
self.GetValue(JetDefs.F_MIDIFILE),
|
|
self.GetValue(JetDefs.F_START),
|
|
self.GetValue(JetDefs.F_END),
|
|
JetDefs.MBT_ZEROSTR,
|
|
self.GetValue(JetDefs.F_SEGNAME),
|
|
self.GetValue(JetDefs.F_QUANTIZE),
|
|
jetevents,
|
|
self.GetValue(JetDefs.F_DLSFILE),
|
|
None,
|
|
self.GetValue(JetDefs.F_TRANSPOSE),
|
|
self.GetValue(JetDefs.F_REPEAT),
|
|
self.GetValue(JetDefs.F_MUTEFLAGS))
|
|
else:
|
|
jetevents = []
|
|
segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME),
|
|
self.GetValue(JetDefs.F_MIDIFILE),
|
|
JetDefs.MBT_ZEROSTR,
|
|
self.lastMidiInfo.endMbtStr,
|
|
JetDefs.MBT_ZEROSTR,
|
|
self.GetValue(JetDefs.F_SEGNAME),
|
|
self.GetValue(JetDefs.F_QUANTIZE),
|
|
jetevents,
|
|
self.GetValue(JetDefs.F_DLSFILE),
|
|
None,
|
|
0,
|
|
0,
|
|
0)
|
|
return segment
|
|
|
|
def OnEventChecked(self, index, checked):
|
|
""" Track is checked so mute or unmute it """
|
|
if self.Player is not None:
|
|
trackNum = self.je.ctrls[JetDefs.F_MUTEFLAGS].GetTrackNumber(index)
|
|
self.Player.SetMuteFlag(trackNum, checked)
|
|
|
|
def OnPlay(self, event):
|
|
""" Play the segment button pressed """
|
|
if self.je.ctrls[JetDefs.F_PLAY].GetLabel() == JetDefs.BUT_STOP:
|
|
self.Player.SetKeepPlayingFlag(False)
|
|
return
|
|
|
|
if not self.Validate():
|
|
return
|
|
|
|
self.playMode = PLAY_SEGMENT
|
|
self.graphSegment = self.SetSegment(self.graphMode)
|
|
self.UpdateGraph()
|
|
self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAY], self.SetSegment(self.playMode))
|
|
self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self)
|
|
self.PlayerThread = thread.start_new_thread(self.Player .Start, ())
|
|
|
|
def OnPlayMidi(self, event):
|
|
""" Play the whole midi file pressed """
|
|
if self.je.ctrls[JetDefs.F_PLAYMIDI].GetLabel() == JetDefs.BUT_STOP:
|
|
self.Player.SetKeepPlayingFlag(False)
|
|
return
|
|
|
|
if not self.Validate():
|
|
return
|
|
|
|
self.playMode = PLAY_MIDI
|
|
self.graphSegment = self.SetSegment(self.graphMode)
|
|
self.UpdateGraph()
|
|
self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAYMIDI], self.SetSegment(self.playMode))
|
|
self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self)
|
|
self.PlayerThread = thread.start_new_thread(self.Player .Start, ())
|
|
|
|
def OnSetGraphType(self, event):
|
|
""" Sets the type of graph """
|
|
self.SetGraphType(event.GetInt())
|
|
|
|
def SetGraphType(self, iMode):
|
|
""" Sets the type of graph """
|
|
if iMode == 1:
|
|
self.graphMode = PLAY_SEGMENT
|
|
else:
|
|
self.graphMode = PLAY_MIDI
|
|
self.graphSegment = self.SetSegment(self.graphMode)
|
|
self.UpdateGraph()
|
|
|
|
def OnGraphUpdate(self, evt):
|
|
""" Calls graph control to draw """
|
|
self.je.ctrls[JetDefs.F_GRAPH].DoDrawing()
|
|
|
|
def UpdateGraph(self):
|
|
""" Updates values for graph control """
|
|
if self.graphMode == PLAY_SEGMENT:
|
|
self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(self.graphSegment, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True'))
|
|
else:
|
|
if self.playMode == PLAY_SEGMENT:
|
|
iMidiMode = True
|
|
else:
|
|
iMidiMode = False
|
|
self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(self.graphSegment,(self.GetValue(JetDefs.F_SEGNAME), self.GetValue(JetDefs.F_START), self.GetValue(JetDefs.F_END)), iMidiMode, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True'))
|
|
|
|
def OnJetStatusUpdate(self, evt):
|
|
""" All UI needed by thread must be called via Postevent or OS X crashes """
|
|
if evt.mode == JetDefs.PST_UPD_LOCATION:
|
|
self.je.ctrls[JetDefs.F_GRAPH].UpdateLocation(evt.data)
|
|
elif evt.mode == JetDefs.PST_PLAY:
|
|
if self.playMode == PLAY_SEGMENT:
|
|
self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_STOP)
|
|
self.je.ctrls[JetDefs.F_PLAYMIDI].Enabled = False
|
|
else:
|
|
self.je.ctrls[JetDefs.F_RDOGRAPH].Enabled = False
|
|
self.je.ctrls[JetDefs.F_PLAYMIDI].SetLabel(JetDefs.BUT_STOP)
|
|
self.je.ctrls[JetDefs.F_PLAY].Enabled = False
|
|
|
|
self.je.ctrls[JetDefs.F_PAUSE].Enabled = True
|
|
self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE)
|
|
elif evt.mode == JetDefs.PST_DONE:
|
|
self.je.ctrls[JetDefs.F_RDOGRAPH].Enabled = True
|
|
if self.playMode == PLAY_SEGMENT:
|
|
self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_PLAYSEG)
|
|
self.je.ctrls[JetDefs.F_PLAYMIDI].Enabled = True
|
|
else:
|
|
self.je.ctrls[JetDefs.F_PLAYMIDI].SetLabel(JetDefs.BUT_PLAYMIDI)
|
|
self.je.ctrls[JetDefs.F_PLAY].Enabled = True
|
|
|
|
self.je.ctrls[JetDefs.F_PAUSE].Enabled = False
|
|
self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE)
|
|
elif evt.mode == JetDefs.PST_PAUSE:
|
|
self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_RESUME)
|
|
elif evt.mode == JetDefs.PST_RESUME:
|
|
self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE)
|
|
elif evt.mode == JetDefs.PST_MIDI_INFO:
|
|
ClearRowSelections(self.je.ctrls[JetDefs.F_MUTEFLAGS])
|
|
self.md = evt.data
|
|
if self.md.err == 0:
|
|
self.je.ctrls[JetDefs.F_END].SetMaxMbt(self.md.maxMeasures+1,self.md.maxBeats,self.md.maxTicks)
|
|
if self.je.ctrls[JetDefs.F_END].GetValue() == JetDefs.MBT_ZEROSTR:
|
|
self.je.ctrls[JetDefs.F_END].SetValue((self.md.maxMeasures,0,0))
|
|
self.je.ctrls[JetDefs.F_START].SetMaxMbt(self.md.maxMeasures+1,self.md.maxBeats,self.md.maxTicks)
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems()
|
|
loadEmpty = IniGetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, 'bool', 'False')
|
|
for track in self.md.trackList:
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track, loadEmpty)
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].CheckTracks(self.je.ctrls[JetDefs.F_MUTEFLAGS].GetValue())
|
|
self.graphSegment = self.SetSegment(self.graphMode)
|
|
self.UpdateGraph()
|
|
|
|
def OnSetTrackDisplayOption(self, evt):
|
|
IniSetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, self.je.ctrls[JetDefs.F_DISPEMPTYTRACKS].GetValue())
|
|
loadEmpty = IniGetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, 'bool', 'False')
|
|
if self.md is not None:
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems()
|
|
if self.md.err == 0:
|
|
for track in self.md.trackList:
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track, loadEmpty)
|
|
|
|
def OnPause(self, evt):
|
|
""" Pauses the playback """
|
|
self.Player.Pause()
|
|
|
|
def OnSetGraphOptions(self, evt):
|
|
""" Sets graph options """
|
|
IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, self.je.ctrls[JetDefs.F_GRAPHLABELS].GetValue())
|
|
IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].GetValue())
|
|
IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, self.je.ctrls[JetDefs.F_GRAPHCLIPS].GetValue())
|
|
self.UpdateGraph()
|
|
|
|
def OnReplicate(self, evt):
|
|
dlg = JetReplicate("Replicate Segment")
|
|
dlg.SetValue(JetDefs.F_RPREPLACE, True)
|
|
dlg.SetName(self.GetValue(JetDefs.F_SEGNAME))
|
|
dlg.event_type = "SEGMENT"
|
|
dlg.event_max = self.je.ctrls[JetDefs.F_START].GetMaxMbt()
|
|
dlg.length = MbtDifference(ConvertStrTimeToTuple(self.GetValue(JetDefs.F_START)), ConvertStrTimeToTuple(self.GetValue(JetDefs.F_END)))
|
|
result = dlg.ShowModal()
|
|
if result == wx.ID_OK:
|
|
self.replicatePrefix = dlg.GetValue(JetDefs.F_RPPREFIX)
|
|
self.lstReplicate = dlg.lstReplicate
|
|
self.chkReplaceMatching = dlg.GetValue(JetDefs.F_RPREPLACE)
|
|
self.EndModal(wx.ID_OK)
|
|
else:
|
|
dlg.Destroy()
|
|
|
|
class EventEdit(wx.Dialog):
|
|
""" Event edit dialog box """
|
|
def __init__(self, title, currentJetConfigFile):
|
|
wx.Dialog.__init__(self, None, -1, title)
|
|
self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP)
|
|
self.title = title
|
|
self.currentJetConfigFile = currentJetConfigFile
|
|
self.je = JetEdit(self, "EVTDLG_CTRLS", self)
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_TRACK, JetDefs.MUTEGRD_TRACK)
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_CHANNEL, JetDefs.MUTEGRD_CHANNEL)
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_NAME, JetDefs.MUTEGRD_NAME)
|
|
self.je.ctrls[JetDefs.F_ESTART].SetChangeCallbackFct(self.UpdateGraph)
|
|
self.je.ctrls[JetDefs.F_EEND].SetChangeCallbackFct(self.UpdateGraph)
|
|
self.je.ctrls[JetDefs.F_GRAPHLABELS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'))
|
|
self.je.ctrls[JetDefs.F_GRAPHCLIPS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'))
|
|
self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True'))
|
|
EVT_JET_STATUS(self, self.OnJetStatusUpdate)
|
|
self.segment = None
|
|
self.Player = None
|
|
self.event_id = 1
|
|
self.replicatePrefix = ""
|
|
self.lstReplicate = []
|
|
self.chkReplaceMatching = False
|
|
|
|
wx.EVT_CLOSE(self, self.OnClose)
|
|
self.SetSize(JetDefs.EVTDLG_SIZE)
|
|
self.CenterOnParent()
|
|
|
|
def OnGraphUpdate(self, evt):
|
|
""" Calls the graph module to update the graph """
|
|
self.je.ctrls[JetDefs.F_GRAPH].DoDrawing()
|
|
|
|
def OnJetStatusUpdate(self, evt):
|
|
""" Updates to UI needed by play thread come through here otherwise OS X crashes """
|
|
if evt.mode == JetDefs.PST_UPD_LOCATION:
|
|
self.je.ctrls[JetDefs.F_GRAPH].UpdateLocation(evt.data)
|
|
elif evt.mode == JetDefs.PST_PLAY:
|
|
self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE)
|
|
self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_STOP)
|
|
self.je.ctrls[JetDefs.F_PAUSE].Enabled = True
|
|
self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enabled = True
|
|
self.je.ctrls[JetDefs.F_EMUTEBUT].Enabled = True
|
|
elif evt.mode == JetDefs.PST_DONE:
|
|
self.je.ctrls[JetDefs.F_EMUTEBUT].SetLabel(JetDefs.BUT_UNMUTE)
|
|
self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_PLAY)
|
|
self.je.ctrls[JetDefs.F_PAUSE].Enabled = False
|
|
self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE)
|
|
self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enabled = False
|
|
self.je.ctrls[JetDefs.F_EMUTEBUT].Enabled = False
|
|
elif evt.mode == JetDefs.PST_PAUSE:
|
|
self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_RESUME)
|
|
elif evt.mode == JetDefs.PST_RESUME:
|
|
self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE)
|
|
|
|
def OnPause(self, evt):
|
|
""" Pause the player """
|
|
self.Player.Pause()
|
|
|
|
def UpdateGraph(self):
|
|
""" Called back from player thread to update the graph """
|
|
if len(self.segment.jetevents) == 0:
|
|
self.segment.jetevents.append(JetEvent(self.je.ctrls[JetDefs.F_ENAME].GetValue(),
|
|
self.je.ctrls[JetDefs.F_ETYPE].GetValue(),
|
|
1,
|
|
self.je.ctrls[JetDefs.F_ETRACK].GetValue(),
|
|
self.je.ctrls[JetDefs.F_ECHANNEL].GetValue(),
|
|
self.je.ctrls[JetDefs.F_ESTART].GetValue(),
|
|
self.je.ctrls[JetDefs.F_EEND].GetValue()))
|
|
|
|
self.segment.jetevents[0].event_name = self.je.ctrls[JetDefs.F_ENAME].GetValue()
|
|
self.segment.jetevents[0].event_type = self.je.ctrls[JetDefs.F_ETYPE].GetValue()
|
|
self.segment.jetevents[0].event_start = self.je.ctrls[JetDefs.F_ESTART].GetValue()
|
|
self.segment.jetevents[0].event_end = self.je.ctrls[JetDefs.F_EEND].GetValue()
|
|
self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(self.segment, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True'))
|
|
|
|
def OnClose(self, event):
|
|
""" Called when dialog is closed """
|
|
self.ShutdownPlayer()
|
|
self.je.ctrls[JetDefs.F_ESTART].UnBindKillFocus()
|
|
self.je.ctrls[JetDefs.F_EEND].UnBindKillFocus()
|
|
self.EndModal(wx.ID_CANCEL)
|
|
|
|
def ShutdownPlayer(self):
|
|
""" Sets flag to kill play loop """
|
|
if self.Player is not None:
|
|
self.Player.SetKeepPlayingFlag(False)
|
|
|
|
def GetValue(self, fld):
|
|
""" Gets the value of a control """
|
|
return self.je.ctrls[fld].GetValue()
|
|
|
|
def SetValue(self, fld, val):
|
|
""" Sets the value of a control """
|
|
self.je.ctrls[fld].SetValue(val)
|
|
|
|
def SetEventId(self):
|
|
""" Sets the eventid value """
|
|
if self.title == JetDefs.MAIN_ADDEVENTTITLE:
|
|
iNextEventId = -1
|
|
for evt in self.segment.jetevents:
|
|
if evt.event_type == JetDefs.E_CLIP:
|
|
if iNextEventId < evt.event_id:
|
|
iNextEventId = evt.event_id
|
|
self.je.ctrls[JetDefs.F_EEVENTID].SetValue(iNextEventId + 1)
|
|
|
|
def OnEventSelect(self, event=None):
|
|
""" Adjusts the dialog box controls for various types of events """
|
|
eType = self.je.ctrls[JetDefs.F_ETYPE].GetValue()
|
|
if eType == JetDefs.E_EOS:
|
|
self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_EOS)
|
|
self.je.ctrls[JetDefs.F_ENAME].Enable(False)
|
|
self.je.ctrls[JetDefs.F_ESTART].Enable(False)
|
|
self.je.ctrls[JetDefs.F_EEND].Enable(True)
|
|
self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(False)
|
|
self.je.ctrls[JetDefs.F_EEVENTID].Enable(False)
|
|
elif eType == JetDefs.E_CLIP:
|
|
if len(self.je.ctrls[JetDefs.F_ENAME].GetValue()) == 0 or self.je.ctrls[JetDefs.F_ENAME].GetValue() == JetDefs.E_EOS or self.je.ctrls[JetDefs.F_ENAME].GetValue() == JetDefs.E_APP:
|
|
self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_CLIP)
|
|
self.je.ctrls[JetDefs.F_ENAME].Enable(True)
|
|
self.je.ctrls[JetDefs.F_ESTART].Enable(True)
|
|
self.je.ctrls[JetDefs.F_EEND].Enable(True)
|
|
self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(True)
|
|
self.je.ctrls[JetDefs.F_EEVENTID].Enable(True)
|
|
self.je.ctrls[JetDefs.F_EEVENTID].SetRange(JetDefs.EVENTID_MIN, JetDefs.EVENTID_MAX)
|
|
if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() < JetDefs.EVENTID_MIN:
|
|
self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.EVENTID_MIN)
|
|
if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() > JetDefs.EVENTID_MAX:
|
|
self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.EVENTID_MAX)
|
|
self.SetEventId()
|
|
elif eType == JetDefs.E_APP:
|
|
if len(self.je.ctrls[JetDefs.F_ENAME].GetValue()) == 0 or self.je.ctrls[JetDefs.F_ENAME].GetValue() == JetDefs.E_EOS:
|
|
self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_APP)
|
|
self.je.ctrls[JetDefs.F_ENAME].Enable(True)
|
|
self.je.ctrls[JetDefs.F_ESTART].Enable(True)
|
|
self.je.ctrls[JetDefs.F_EEND].Enable(False)
|
|
self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(False)
|
|
self.je.ctrls[JetDefs.F_EEVENTID].Enable(True)
|
|
self.je.ctrls[JetDefs.F_EEVENTID].SetRange(JetDefs.APPCONTROLLERID_MIN, JetDefs.APPCONTROLLERID_MAX)
|
|
if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() < JetDefs.APPCONTROLLERID_MIN:
|
|
self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.APPCONTROLLERID_MIN)
|
|
if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() > JetDefs.APPCONTROLLERID_MAX:
|
|
self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.APPCONTROLLERID_MAX)
|
|
|
|
def OnOk(self, event):
|
|
""" Exits the dialog box """
|
|
self.ShutdownPlayer()
|
|
if self.Validate():
|
|
self.je.ctrls[JetDefs.F_ESTART].UnBindKillFocus()
|
|
self.je.ctrls[JetDefs.F_EEND].UnBindKillFocus()
|
|
self.EndModal(wx.ID_OK)
|
|
|
|
def Validate(self):
|
|
""" Validates the control values prior to exiting """
|
|
if len(self.je.ctrls[JetDefs.F_ENAME].GetValue()) == 0:
|
|
InfoMsg("Event Name", "The event must have a name.")
|
|
self.je.ctrls[JetDefs.F_ENAME].SetFocus()
|
|
return False
|
|
if len(self.je.ctrls[JetDefs.F_ETYPE].GetValue()) == 0:
|
|
InfoMsg("Event Name", "The event type must be selected.")
|
|
self.je.ctrls[JetDefs.F_ETYPE].SetFocus()
|
|
return False
|
|
if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_CLIP:
|
|
if not CompareMbt(self.je.ctrls[JetDefs.F_ESTART].GetValue(), self.je.ctrls[JetDefs.F_EEND].GetValue()):
|
|
InfoMsg("Start/End", "The event starting and ending times are illogical.")
|
|
self.je.ctrls[JetDefs.F_ESTART].SetFocus()
|
|
return False
|
|
if MbtVal(self.je.ctrls[JetDefs.F_ESTART].GetValue()) < MbtVal(self.je.ctrls[JetDefs.F_START].GetValue()):
|
|
InfoMsg("Event Starting Time", "The event starting time is illogical.")
|
|
self.je.ctrls[JetDefs.F_ESTART].SetFocus()
|
|
return False
|
|
if MbtVal(self.je.ctrls[JetDefs.F_EEND].GetValue()) > MbtVal(self.je.ctrls[JetDefs.F_END].GetValue()):
|
|
InfoMsg("Event Ending Time", "The event ending time is illogical.")
|
|
self.je.ctrls[JetDefs.F_ESTART].SetFocus()
|
|
return False
|
|
if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_APP:
|
|
self.je.ctrls[JetDefs.F_EEND].SetValue(self.je.ctrls[JetDefs.F_ESTART].GetValue())
|
|
if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_EOS:
|
|
self.je.ctrls[JetDefs.F_ESTART].SetValue(self.je.ctrls[JetDefs.F_EEND].GetValue())
|
|
return True
|
|
|
|
def SetSegment(self, segment):
|
|
""" Sets the segment values, then calls the graph update """
|
|
self.segment = segment
|
|
md = GetMidiInfo(segment.filename)
|
|
if md.err == 0:
|
|
self.SetValue(JetDefs.F_SEGNAME, segment.segname)
|
|
self.SetValue(JetDefs.F_MUTEFLAGS, segment.mute_flags)
|
|
self.SetValue(JetDefs.F_MIDIFILE, segment.filename)
|
|
self.SetValue(JetDefs.F_DLSFILE, segment.dlsfile)
|
|
self.SetValue(JetDefs.F_START, segment.start)
|
|
self.SetValue(JetDefs.F_END, segment.end)
|
|
self.SetValue(JetDefs.F_QUANTIZE, segment.quantize)
|
|
self.SetValue(JetDefs.F_TRANSPOSE, segment.transpose)
|
|
self.SetValue(JetDefs.F_REPEAT, segment.repeat)
|
|
maxMeasures = abs(int(self.je.ctrls[JetDefs.F_END].GetValue('int')[0]))
|
|
self.je.ctrls[JetDefs.F_EEND].SetMaxMbt(maxMeasures+1,md.maxBeats,md.maxTicks)
|
|
self.je.ctrls[JetDefs.F_ESTART].SetMaxMbt(maxMeasures+1,md.maxBeats,md.maxTicks)
|
|
minMeasures = abs(int(self.je.ctrls[JetDefs.F_START].GetValue('int')[0]))
|
|
self.je.ctrls[JetDefs.F_EEND].SetMinMbt(minMeasures+1,0,0)
|
|
self.je.ctrls[JetDefs.F_ESTART].SetMinMbt(minMeasures+1,0,0)
|
|
self.je.ctrls[JetDefs.F_END].GetValue('int')
|
|
self.je.ctrls[JetDefs.F_ETRACK].SetRange(1, md.maxTracks)
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems()
|
|
for track in md.trackList:
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track)
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].CheckTracks(self.je.ctrls[JetDefs.F_MUTEFLAGS].GetValue())
|
|
self.je.ctrls[JetDefs.F_MUTEFLAGS].SetTextColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT))
|
|
self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(segment, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True'))
|
|
|
|
def OnPlay(self, event):
|
|
""" Plays the segment allowing interaction with events """
|
|
if self.je.ctrls[JetDefs.F_PLAY].GetLabel() == JetDefs.BUT_STOP:
|
|
self.Player.SetKeepPlayingFlag(False)
|
|
return
|
|
|
|
if not self.Validate():
|
|
return
|
|
|
|
jetevents = []
|
|
jetevents.append(JetEvent(self.GetValue(JetDefs.F_ENAME), self.GetValue(JetDefs.F_ETYPE),
|
|
self.event_id, int(self.GetValue(JetDefs.F_ETRACK)),
|
|
int(self.GetValue(JetDefs.F_ECHANNEL)),
|
|
self.GetValue(JetDefs.F_ESTART), self.GetValue(JetDefs.F_EEND)))
|
|
|
|
segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME),
|
|
self.GetValue(JetDefs.F_MIDIFILE),
|
|
self.GetValue(JetDefs.F_START),
|
|
self.GetValue(JetDefs.F_END),
|
|
JetDefs.MBT_ZEROSTR,
|
|
self.GetValue(JetDefs.F_SEGNAME),
|
|
self.GetValue(JetDefs.F_QUANTIZE),
|
|
jetevents,
|
|
self.GetValue(JetDefs.F_DLSFILE),
|
|
None,
|
|
self.GetValue(JetDefs.F_TRANSPOSE),
|
|
self.GetValue(JetDefs.F_REPEAT),
|
|
self.GetValue(JetDefs.F_MUTEFLAGS))
|
|
|
|
self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAY], segment)
|
|
self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self)
|
|
self.je.ctrls[JetDefs.F_GRAPH].ClickCallbackFct = self.GraphTriggerClip
|
|
self.Player.trigger_button = self.je.ctrls[JetDefs.F_ETRIGGERBUT]
|
|
self.Player.mute_button = self.je.ctrls[JetDefs.F_EMUTEBUT]
|
|
thread.start_new_thread(self.Player .Start, ())
|
|
|
|
def GraphTriggerClip(self, sClipName, iEventId):
|
|
""" Triggers a clip via graph """
|
|
if self.Player is not None:
|
|
self.Player.GraphTriggerClip(sClipName, iEventId)
|
|
|
|
def OnMute(self, event):
|
|
""" Mutes a track """
|
|
if self.Player is not None:
|
|
self.Player.MuteTrackViaButton(self.je.ctrls[JetDefs.F_EMUTEBUT],
|
|
int(self.je.ctrls[JetDefs.F_ETRACK].GetValue()))
|
|
|
|
def OnTriggerClip(self, event):
|
|
""" Triggers a clip """
|
|
if self.Player is not None:
|
|
self.Player.TriggerClip(self.event_id)
|
|
|
|
def OnSetGraphOptions(self, evt):
|
|
""" Sets graph options """
|
|
IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, self.je.ctrls[JetDefs.F_GRAPHLABELS].GetValue())
|
|
IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].GetValue())
|
|
IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, self.je.ctrls[JetDefs.F_GRAPHCLIPS].GetValue())
|
|
self.UpdateGraph()
|
|
|
|
def OnReplicate(self, evt):
|
|
dlg = JetReplicate("Replicate Event")
|
|
dlg.SetValue(JetDefs.F_RPREPLACE, True)
|
|
dlg.SetName(self.GetValue(JetDefs.F_ENAME))
|
|
dlg.event_type = self.GetValue(JetDefs.F_ETYPE)
|
|
dlg.event_max = self.segment.end
|
|
dlg.length = MbtDifference(ConvertStrTimeToTuple(self.GetValue(JetDefs.F_ESTART)), ConvertStrTimeToTuple(self.GetValue(JetDefs.F_EEND)))
|
|
result = dlg.ShowModal()
|
|
if result == wx.ID_OK:
|
|
self.replicatePrefix = dlg.GetValue(JetDefs.F_RPPREFIX)
|
|
self.lstReplicate = dlg.lstReplicate
|
|
self.chkReplaceMatching = dlg.GetValue(JetDefs.F_RPREPLACE)
|
|
self.EndModal(wx.ID_OK)
|
|
else:
|
|
dlg.Destroy()
|
|
|
|
class JetReplicate(wx.Dialog):
|
|
""" Replicate dialog box """
|
|
def __init__(self, title):
|
|
wx.Dialog.__init__(self, None, -1, title)
|
|
self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP)
|
|
self.je = JetEdit(self, "REPLICATE_CTRLS", self)
|
|
|
|
self.je.ctrls[JetDefs.F_RPINCREMENT].SetMinMbt(0,0,0)
|
|
self.je.ctrls[JetDefs.F_RPINCREMENT].SetValue((-1,-1,-1))
|
|
self.je.ctrls[JetDefs.F_RPNUMBER].SetValue(1)
|
|
for title, width, fld in JetDefs.REPLICATE_GRID:
|
|
self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddCol(title, width)
|
|
self.lstReplicate = []
|
|
|
|
self.SetSize(JetDefs.REPLICATE_SIZE)
|
|
self.CenterOnParent()
|
|
|
|
def OnOk(self, event):
|
|
self.EndModal(wx.ID_OK)
|
|
|
|
def GetValue(self, fld):
|
|
return self.je.ctrls[fld].GetValue()
|
|
|
|
def SetValue(self, fld, val):
|
|
self.je.ctrls[fld].SetValue(val)
|
|
|
|
def SetName(self, name):
|
|
for i in range(len(name), 1, -1):
|
|
if not name[i-1].isdigit() and name[i-1] <> ' ':
|
|
break
|
|
else:
|
|
name = name[0:i-1]
|
|
self.SetValue(JetDefs.F_RPPREFIX, name)
|
|
|
|
def Validate(self):
|
|
if self.GetValue(JetDefs.F_RPPREFIX) == '':
|
|
InfoMsg("Message", "Prefix is required.")
|
|
return False
|
|
return True
|
|
|
|
def OnPreview(self, event):
|
|
if not self.Validate():
|
|
return
|
|
start = MbtVal(self.GetValue(JetDefs.F_ESTART))
|
|
max = MbtVal(self.event_max)
|
|
increment = MbtVal((self.je.ctrls[JetDefs.F_RPINCREMENT].GetMeasure(), self.je.ctrls[JetDefs.F_RPINCREMENT].GetBeat(), self.je.ctrls[JetDefs.F_RPINCREMENT].GetTick()))
|
|
|
|
self.lstReplicate = []
|
|
iTo = int(self.GetValue(JetDefs.F_RPNUMBER))
|
|
for i in range(iTo):
|
|
evt_name = "%s %.2d" % (self.GetValue(JetDefs.F_RPPREFIX), i)
|
|
s_ticks = start + (i * increment)
|
|
s_mbt = TicksToMbt(s_ticks)
|
|
evt_start = "%d:%d:%d" % (s_mbt[0]+1, s_mbt[1]+1, s_mbt[2])
|
|
if self.event_type == JetDefs.E_CLIP or self.event_type == "SEGMENT":
|
|
e_ticks = s_ticks + self.length
|
|
e_mbt = TicksToMbt(e_ticks)
|
|
evt_end = "%d:%d:%d" % (e_mbt[0]+1, e_mbt[1]+1, e_mbt[2])
|
|
else:
|
|
e_ticks = s_ticks
|
|
evt_end = evt_start
|
|
if s_ticks <= max and e_ticks <= max:
|
|
self.lstReplicate.append((evt_name, evt_start, evt_end))
|
|
|
|
self.je.ctrls[JetDefs.F_RPGRDPREVIEW].DeleteAllItems()
|
|
self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddRows(self.lstReplicate)
|
|
|
|
class JetMove(wx.Dialog):
|
|
""" Move events dialog box """
|
|
def __init__(self, title):
|
|
wx.Dialog.__init__(self, None, -1, title)
|
|
self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP)
|
|
self.je = JetEdit(self, "MOVE_CTRLS", self)
|
|
|
|
self.je.ctrls[JetDefs.F_RPINCREMENT].SetMinMbt(-999,-4,-480)
|
|
self.je.ctrls[JetDefs.F_RPINCREMENT].SetValue((-1,-1,-1))
|
|
for title, width, fld in JetDefs.REPLICATE_GRID:
|
|
self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddCol(title, width)
|
|
self.lstMove = []
|
|
self.lstMoveMbt = []
|
|
self.lstMoveItems = []
|
|
|
|
self.SetSize(JetDefs.REPLICATE_SIZE)
|
|
self.CenterOnParent()
|
|
|
|
def OnOk(self, event):
|
|
self.EndModal(wx.ID_OK)
|
|
|
|
def GetValue(self, fld):
|
|
return self.je.ctrls[fld].GetValue()
|
|
|
|
def SetValue(self, fld, val):
|
|
self.je.ctrls[fld].SetValue(val)
|
|
|
|
def OnPreview(self, event):
|
|
increment = MbtVal((abs(self.je.ctrls[JetDefs.F_RPINCREMENT].GetMeasure()), abs(self.je.ctrls[JetDefs.F_RPINCREMENT].GetBeat()), abs(self.je.ctrls[JetDefs.F_RPINCREMENT].GetTick())))
|
|
if self.je.ctrls[JetDefs.F_RPINCREMENT].GetMeasure() < 0 or self.je.ctrls[JetDefs.F_RPINCREMENT].GetBeat() < 0 or self.je.ctrls[JetDefs.F_RPINCREMENT].GetTick() < 0:
|
|
increment = 0 - increment
|
|
self.lstMove = []
|
|
self.lstMoveMbt = []
|
|
for itm in self.lstMoveItems:
|
|
max = MbtVal(itm[3])
|
|
evt_name = itm[0]
|
|
start = MbtVal(itm[1])
|
|
s_ticks = start + increment
|
|
|
|
s_mbt = TicksToMbt(s_ticks)
|
|
evt_start = "%d:%d:%d" % (s_mbt[0]+1, s_mbt[1]+1, s_mbt[2])
|
|
evt_start_save = "%d:%d:%d" % s_mbt
|
|
|
|
end = MbtVal(itm[2])
|
|
e_ticks = end + increment
|
|
e_mbt = TicksToMbt(e_ticks)
|
|
evt_end = "%d:%d:%d" % (e_mbt[0]+1, e_mbt[1]+1, e_mbt[2])
|
|
evt_end_save = "%d:%d:%d" % e_mbt
|
|
|
|
if s_ticks <= max and e_ticks <= max and s_ticks >= 0 and e_ticks >= 0:
|
|
self.lstMove.append((evt_name, evt_start, evt_end))
|
|
self.lstMoveMbt.append((evt_name, evt_start_save, evt_end_save))
|
|
|
|
self.je.ctrls[JetDefs.F_RPGRDPREVIEW].DeleteAllItems()
|
|
self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddRows(self.lstMove)
|
|
|
|
if __name__ == '__main1__':
|
|
""" Test dialogs """
|
|
app = wx.PySimpleApp()
|
|
|
|
#dlg = JetOpen()
|
|
#dlg = JetPropertiesDialog()
|
|
#dlg = ExportDialog("Export Jet File")
|
|
#dlg = JetAbout()
|
|
|
|
dlg = JetReplicate("Replicate Event")
|
|
dlg.SetValue(JetDefs.F_RPREPLACE, True)
|
|
dlg.event_max = "5:0:0"
|
|
dlg.event_type = JetDefs.E_APP
|
|
dlg.length = 480
|
|
dlg.SetName("abc 02")
|
|
result = dlg.ShowModal()
|
|
if result == wx.ID_OK:
|
|
print("OK")
|
|
|
|
dlg.Destroy()
|
|
|
|
if __name__ == '__main1__':
|
|
""" Test Segment dialog """
|
|
app = wx.PySimpleApp()
|
|
|
|
helpProvider = wx.SimpleHelpProvider()
|
|
wx.HelpProvider_Set(helpProvider)
|
|
|
|
dlg = SegEdit("Segments", JetDefs.UNTITLED_FILE)
|
|
dlg.SetValue(JetDefs.F_SEGNAME, "Test Segment Name")
|
|
dlg.SetValue(JetDefs.F_MIDIFILE, '/Users/BHruska/JetContent/jenn_Burning Line.mid')
|
|
dlg.SetValue(JetDefs.F_MIDIFILE, 'C:/_Data/JetCreator/JetDemo1/jenn_Burning Line.mid')
|
|
dlg.SetValue(JetDefs.F_DLSFILE, '')
|
|
dlg.SetValue(JetDefs.F_START, '4:0:0')
|
|
dlg.SetValue(JetDefs.F_END, '8:0:0')
|
|
dlg.SetValue(JetDefs.F_QUANTIZE, 6)
|
|
|
|
result = dlg.ShowModal()
|
|
dlg.Destroy()
|
|
|
|
if __name__ == '__main__':
|
|
""" Test Event dialog """
|
|
app = wx.PySimpleApp()
|
|
|
|
jetevents = []
|
|
|
|
segment = JetSegment("Test Segment Name", 'C:/_Data/JetCreator/JetDemo1/jenn_Burning Line.mid',
|
|
'0:0:0', '4:0:0', None,
|
|
"Test Segment Name", 6, jetevents,
|
|
'', None, 0,0,3)
|
|
|
|
dlg = EventEdit("Event Edit", JetDefs.UNTITLED_FILE)
|
|
dlg.SetValue(JetDefs.F_ENAME, "Test Event Name")
|
|
dlg.SetValue(JetDefs.F_ETYPE, "TriggerClip")
|
|
dlg.SetSegment(segment)
|
|
|
|
result = dlg.ShowModal()
|
|
dlg.Destroy()
|
|
|
|
|
|
|