JetUtils.py revision 8872ef327bd0a801363edf1c6ce8df0b74e51c8d
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"""
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) File:
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JetUtils.py
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Contents and purpose:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Utilities used throughout JetCreator
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
80f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) Copyright (c) 2008 Android Open Source Project
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Licensed under the Apache License, Version 2.0 (the "License");
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) you may not use this file except in compliance with the License.
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) You may obtain a copy of the License at
13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      http://www.apache.org/licenses/LICENSE-2.0
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Unless required by applicable law or agreed to in writing, software
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) distributed under the License is distributed on an "AS IS" BASIS,
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) See the License for the specific language governing permissions and
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) limitations under the License.
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)"""
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)from __future__ import with_statement
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import wx
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import os
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)import copy
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport ConfigParser
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import logging
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import time
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import tempfile
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from JetDefs import *
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from JetDebug import *
3558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochfrom midifile import TimeBase, trackGrid
3658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class JetCutCopy(object):
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """ Handles cut/copy/pasting of events and segments """
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def __init__ (self, objType, objSave, currentSegmentName):
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.objType = objType
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.objSave = copy.deepcopy(objSave)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.currentSegmentName = currentSegmentName
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def GetObj(self, objList):
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        """ Gets an object """
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        objSave = copy.deepcopy(self.objSave)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if self.objType == JetDefs.MAIN_SEGLIST:
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            oldName = objSave.segname
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            i = len(oldName) - 1
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            while i > 0:
5158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch                if not oldName[i].isdigit():
5258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch                    break
5358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch                i = i - 1
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            oldName = oldName[0:i+1]
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            i = 1
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            while True:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                newName = oldName + str(i)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if self.UniqueSegName(newName, objList):
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    break
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                i = i + 1
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            objSave.segname = newName
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        elif self.objType == JetDefs.MAIN_EVENTLIST:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            oldName = objSave.event_name
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            i = len(oldName) - 1
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            while i > 0:
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                if not oldName[i].isdigit():
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    break
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                i = i - 1
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            oldName = oldName[0:i+1]
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            i = 1
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            while True:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                newName = oldName + str(i)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                if self.UniqueEventName(newName, objList):
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    break
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                i = i + 1
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            objSave.event_name = newName
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        return objSave
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def UniqueSegName(self, nameVal, seglist):
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        for nm in seglist:
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if nm.segname == nameVal:
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                return False
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return True
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    def UniqueEventName(self, nameVal, eventlist):
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        for nm in eventlist:
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            if nm.event_name == nameVal:
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                return False
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        return True
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class JetState(object):
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """ Saves the state for cut/copy/paste """
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def __init__ (self, jet_file, currentSegmentIndex, currentEventIndex):
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.jet_file = copy.deepcopy(jet_file)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.currentSegmentIndex = currentSegmentIndex
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.currentEventIndex = currentEventIndex
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def Queue (jet, queueSeg):
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """ Queues a segment """
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    jet.QueueSegment(queueSeg.userID, queueSeg.seg_num, queueSeg.dls_num, queueSeg.repeat, queueSeg.transpose, queueSeg.mute_flags)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class QueueSeg(object):
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """ Object representing a segment """
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    def __init__ (self, name, userID, seg_num, dls_num=-1, repeat=0, transpose=0, mute_flags=0, status=''):
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.name = name
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.userID = userID
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.seg_num = seg_num
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.dls_num = dls_num
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.repeat = repeat
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.transpose = transpose
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.mute_flags = mute_flags
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.status = status
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        #DumpQueueSeg(self)
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def FindDlsNum(libraries, dlsfile):
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """ Looks for a dls file in the library list """
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for index, library in enumerate(libraries):
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if library == dlsfile:
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return index
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return -1
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)def SetRowSelection(list, row, state):
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """ Sets the selection status of a list row """
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if state:
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        list.SetItemState(row, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED)
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    else:
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        list.SetItemState(row, ~wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED)
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)def ClearRowSelections(list):
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """ Clears the list rows selection status """
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    index = list.GetFirstSelected()
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    while index != -1:
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        SetRowSelection(list, index, False)
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        index = list.GetNextSelected(index)
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)def getColumnText(list, index, col):
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """ Sets the text of a column """
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    item = list.GetItem(index, col)
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return item.GetText()
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def getColumnValue(list, index, col):
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """ Gets the text of a column """
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    item = list.GetItem(index, col)
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    v = str(item.GetText())
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if len(v) > 0:
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return int(item.GetText())
148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    else:
149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        return 0
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def StrNoneChk(fld):
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    """ Returns a blank string if none """
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if fld is None:
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return ""
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return str(fld)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def ConvertStrTimeToTuple(s):
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """ Converts a string time to a tuple """
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    try:
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        measures, beats, ticks = s.split(':',3)
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return (int(measures), int(beats), int(ticks))
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    except:
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return JetDefs.MBT_DEFAULT
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def FileRelativePath(target, base=os.curdir):
166b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    """ Returns relative file path """
167b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if not os.path.exists(target):
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        return target
169b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if not os.path.isdir(base):
171b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        return target
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base_list = (os.path.abspath(base)).split(os.sep)
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    target_list = (os.path.abspath(target)).split(os.sep)
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if os.name in ['nt','dos','os2'] and base_list[0] <> target_list[0]:
1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return target
177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    for i in range(min(len(base_list), len(target_list))):
178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if base_list[i] <> target_list[i]: break
179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    else:
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        i+=1
181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    rel_list = [os.pardir] * (len(base_list)-i) + target_list[i:]
182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return os.path.join(*rel_list)
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef FileFixPath(fileSpec):
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """ Tweaks slashes """
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return fileSpec.replace("\\", "/")
187b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
188b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)def FileKillClean(fileName):
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """ Deletes a file skipping errors """
190b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    try:
191b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        os.remove(fileName)
192b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    except:
193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        pass
194b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def FileJustRoot(fileName):
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    """ Gets just the root of the file name """
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return os.path.splitext(fileName)[0]
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    except:
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return ""
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def FileJustName(fileName):
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """ Gets just the filename, without the path """
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    try:
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return os.path.split(fileName)[1]
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    except:
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return ""
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def FileJustPath(fileName):
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """ Gets just the path, without the file name """
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return os.path.split(fileName)[0]
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except:
2140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        return ""
2150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)def FileJustExt(fileName):
2170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    """ Gets just the extension of the file """
2180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    try:
2190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        ext = os.path.splitext(fileName)[1]
2200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        return ext.upper()
2210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    except:
2220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        return ""
2230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)def FileDateTime(fileName):
2250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    """ Gets the date/time of a file """
2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    try:
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        filetime = time.ctime(os.path.getmtime(fileName))
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return filetime
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    except:
2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return ""
2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef FileExists(fileName):
2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    """ Checks if a file exists """
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return os.path.exists(fileName)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except:
2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return False
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def IniSetValue(configFile, section, option, value):
2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    """ Sets the value of a config file field """
2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    config = ConfigParser.ConfigParser()
2427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    config.read(configFile)
2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if not config.has_section(section):
2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        config.add_section(section)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    config.set(section, option, value)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cfgfile = open(configFile,'w')
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    config.write(cfgfile)
2487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    cfgfile.close()
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def IniGetValue(configFile, section, option, retType='str', default=''):
2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    """ Gets the value of a config file field """
2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ret = default
2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    config = ConfigParser.ConfigParser()
2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    config.read(configFile)
2557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if config.has_section(section):
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if config.has_option(section, option):
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = config.get(section, option)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if retType =='int':
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        try:
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = int(ret)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        except:
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ret = 0
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    elif retType == 'float':
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        try:
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ret = float(ret)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        except:
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ret = 0
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    elif retType == 'bool':
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        try:
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if ret[0].upper()=='T':
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                ret = True
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            else:
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                ret = False
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        except:
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ret = False
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    elif retType == 'list':
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        try:
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ret = eval(ret)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        except:
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ret = []
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ret
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def GetRecentJetFiles():
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """ Builds a list of recent jet files """
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fileList = []
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    config = ConfigParser.ConfigParser()
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    config.read(JetDefs.JETCREATOR_INI)
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if config.has_section(JetDefs.RECENT_SECTION):
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        for count in range(0, 10):
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            sFile = "File" + str(count)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if config.has_option(JetDefs.RECENT_SECTION, sFile):
2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                sFileName = config.get(JetDefs.RECENT_SECTION, sFile)
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                if FileExists(sFileName):
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    if sFileName != JetDefs.UNTITLED_FILE:
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        #fileList.append(FileRelativePath(config.get(JetDefs.RECENT_SECTION, sFile)))
2967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        fileList.append(config.get(JetDefs.RECENT_SECTION, sFile))
2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return fileList
2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef AppendRecentJetFile(jetFile):
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    """ Appends to a list of recent jet files """
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    addedFiles = []
3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    fileList = GetRecentJetFiles()
303424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    config = ConfigParser.ConfigParser()
304424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    config.read(JetDefs.JETCREATOR_INI)
305424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if config.has_section(JetDefs.RECENT_SECTION):
306424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        config.remove_section(JetDefs.RECENT_SECTION)
307424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    config.add_section(JetDefs.RECENT_SECTION)
308424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    config.set(JetDefs.RECENT_SECTION, "File0", jetFile)
309424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    addedFiles.append(jetFile)
310424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    count = 1
311424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    for file in fileList:
312424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        if file not in addedFiles:
313424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            sFile = "File" + str(count)
3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            config.set(JetDefs.RECENT_SECTION, sFile, file)
3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            addedFiles.append(file)
3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            count += 1
3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    FileKillClean(JetDefs.JETCREATOR_INI)
3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    cfgfile = open(JetDefs.JETCREATOR_INI,'w')
3197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    config.write(cfgfile)
3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    cfgfile.close()
3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def CompareMbt(mbt1, mbt2):
3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    """ Compates to measure/beat/tick values """
3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    try:
325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        m1, b1, t1 = mbt1.split(':',3)
326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        m2, b2, t2 = mbt2.split(':',3)
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        if int(m1) > int(m2):
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            return False
329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        elif int(m1) == int(m2) and int(b1) > int(b2):
330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            return False
331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        elif int(b1) == int(b2) and int(t1) > int(t2):
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            return False
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        elif int(m1) == int(m2) and int(b1) == int(b2) and int(t1) == int(t2):
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return False
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else:
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return True
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except:
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return False
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def MbtVal(mbt):
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """ Converts mbts to ticks """
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if type(mbt).__name__=='str' or type(mbt).__name__=='unicode':
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mbt1 = mbt
344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    else:
345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        mbt1 = "%d:%d:%d" % mbt
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    try:
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return TimeBase().ConvertStrTimeToTicks(mbt1)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except:
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)def TicksToMbt(ticks):
3520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    """ Converts ticks to mbts """
3530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return TimeBase().ConvertTicksToMBT(ticks)
3540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def TicksToStrMbt(ticks):
3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    """ Converts ticks to mbts """
3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return TimeBase().ConvertTicksToStr(ticks, '%02d:%02d:%02d')
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
359424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)def MbtDifference(mbt1, mbt2):
360424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    """ Returns difference between mbt values """
361424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return TimeBase().MbtDifference(mbt1, mbt2)
3627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef PlayMidiFile(midiFile, dlsFile=''):
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    """ Plays a midi file """
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        e = __import__('eas')
367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        if midiFile == '':
369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            return
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        eas = e.EAS()
3717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        if dlsFile > '':
3727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            eas.LoadDLSCollection(dlsFile)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        eas.StartWave()
3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        audio_file = eas.OpenFile(midiFile)
3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        audio_file.Prepare()
3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        audio_file.Play()
3777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        audio_file.Close()
3787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        eas.StopWave()
3797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        eas.Shutdown()
3807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    except:
3817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def SegmentOutputFile(segName, configFile):
3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    """ Computes a segment output file """
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    configPath = FileJustPath(configFile) + "/"
3867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    segOutput = configPath + "Seg_" + segName + ".mid"
3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return segOutput
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
389424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)def ComputeMuteFlags(jet_file, segName):
390424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    """ Computes mute flags """
391424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    muteFlag = 0
392424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    for jet_event in jet_file.GetEvents(segName):
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        muteFlag = SetMute(jet_event.track_num, muteFlag)
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return muteFlag
3957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def ComputeMuteFlagsFromList1(list):
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """ Computes mute flags from a list """
3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    muteFlag = 0
3997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    num = list.GetItemCount()
4007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    for iRow in range(num):
4017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        track_num = list.GetTrackNumber(iRow)
4027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        if list.IsChecked(iRow):
4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            muteFlag = SetMute(track_num, muteFlag)
4047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        else:
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            muteFlag = ClearMute(track_num, muteFlag)
4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return muteFlag
4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def ComputeMuteFlagsFromList(list):
4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    """ Computes mute flags from a list """
4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    muteFlags = 0
411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    num = list.GetItemCount()
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for iRow in range(num):
413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        track_num = list.GetTrackNumber(iRow)
414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        if list.IsChecked(iRow):
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            muteFlags = SetMute(track_num, muteFlags)
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return muteFlags
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)def SetMuteFlag(track, muteFlag, mute):
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """ Sets a mute flag """
4217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if mute:
4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        SetMute(track, muteFlag)
4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    else:
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ClearMute(track, muteFlag)
425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
426ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochdef SetMute(track, muteFlag):
427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """ Sets a mute flag """
428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    try:
429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        muteFlag |= 1 << (track)
430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return muteFlag
431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    except:
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        #bad argument
4337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        return muteFlag
4347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def ClearMute(track, muteFlag):
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """ Clears a mute flag """
4377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    try:
4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        muteFlag &= ~(1 << (track))
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return muteFlag;
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    except:
4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        #bad argument
4427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        return muteFlag
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def GetMute(track, muteFlag):
4457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    """ Get a mute flag """
4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    try:
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (muteFlag & ( 1 << (track))) == 0:
448424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            return False
449424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        else:
450424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            return True
451424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    except:
4527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        #bad argument
4537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return False
4547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def InfoMsg(msgTitle, msgText):
4567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    """ Display a simple informational message """
4577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    dlg = wx.MessageDialog(None,
4587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                           message=msgText,
4597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                           caption=msgTitle,
4607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                           style=wx.OK|wx.ICON_INFORMATION
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           )
4627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    dlg.ShowModal()
463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    dlg.Destroy()
4647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)def SendEvent (mycontrol, evt):
4667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    """ Sends an event """
467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    cmd = wx.CommandEvent(evt)
4687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    cmd.SetEventObject(mycontrol)
4697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    cmd.SetId(mycontrol.GetId())
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mycontrol.GetEventHandler().ProcessEvent(cmd)
4717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)def GetJetHelpText(dlgName, fld):
473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """ Gets the jet help text file """
474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return IniGetValue(JetDefs.JETCREATOR_HLP, dlgName, fld)
475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)def ExportJetArchive(fileName, jetConfigFile, jetFile):
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    """ Exports all files into a zip archive file """
4780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    z = __import__('zipfile')
4790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    zip = z.ZipFile(fileName, 'w')
4800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    #zip the original .JET file
4820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if FileExists(jetFile.config.filename):
4830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        zip.write(jetFile.config.filename, FileJustName(jetFile.config.filename))
4840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    #make copy of object so we can modify it
4867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    jet_file = copy.deepcopy(jetFile)
4877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    #zip the files, without paths
4897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    for segment in jet_file.GetSegments():
490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        if FileExists(segment.filename):
4917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            if not FileJustName(segment.filename) in zip.namelist():
4927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                zip.write(segment.filename, FileJustName(segment.filename))
4937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        if FileExists(segment.output):
4947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            if not FileJustName(segment.output) in zip.namelist():
495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                zip.write(segment.output, FileJustName(segment.output))
4967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    #zip the library files
498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    for library in jet_file.GetLibraries():
4997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        if FileExists(library):
500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            if not FileJustName(library) in zip.namelist():
5017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                zip.write(library, FileJustName(library))
5027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    #remove the paths on filenames
5047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    for segment in jet_file.GetSegments():
505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        segment.filename = FileJustName(segment.filename)
5067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        segment.dlsfile = FileJustName(segment.dlsfile)
5077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        segment.output = FileJustName(segment.output)
5087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    #remove paths
5107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    for index, library in enumerate(jet_file.libraries):
511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        jet_file.libraries[index] = FileJustName(library)
5127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    #create temporary .JTC file so we can modify paths to files
5147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    tmpConfigFile = JetDefs.TEMP_JET_CONFIG_FILE
5157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    FileKillClean(tmpConfigFile)
516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    #save the file
5187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    jet_file.SaveJetConfig(tmpConfigFile)
5197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    #zip it and rename it back to original name without path
521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    zip.write(tmpConfigFile, FileJustName(jetConfigFile))
522424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
523424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    #create a flag file so we know this is a jet archive
524424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    zip.write(tmpConfigFile, "JetArchive")
525424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    zip.close()
5277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    FileKillClean(tmpConfigFile)
5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef ValidateConfig(test_jet_file):
5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    """ Validates the contents of a config file """
532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    dImp = __import__('JetDialogs')
5337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    errors = []
5347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    fatalError = False
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for segment in test_jet_file.segments:
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        logging.debug(segment.filename)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if segment.filename is not None and len(segment.filename) > 0 and not FileExists(segment.filename):
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            errors.append(("Segment MIDI file not found", segment.filename))
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fatalError = True
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if segment.dlsfile is not None and len(segment.dlsfile) > 0 and not FileExists(segment.dlsfile):
541a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            errors.append(("Segment DLS file not found; removing from config", segment.dlsfile))
542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            segment.dlsfile = ""
543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    logging.debug(test_jet_file.config.filename)
545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if len(errors) == 0:
547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        return True
548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    else:
549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        dlg = dImp.JetErrors("Jet Definition File Errors")
550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        dlg.SetErrors(errors)
551a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        result = dlg.ShowModal()
552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        dlg.Destroy()
553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if fatalError:
554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            return False
555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        else:
556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            return True
557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)def release_getLogger(name):
559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """  passing original handler with debug() method replaced to empty function """
560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    def dummy(*k, **kw):
562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        pass
563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    global __orig_getLogger
565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    log = __orig_getLogger(name)
566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    setattr(log, 'debug', dummy)
567a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    setattr(log, 'info', dummy)
568a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    setattr(log, 'error', dummy)
569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    setattr(log, 'critical', dummy)
570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return log
571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)def install_release_loggers():
573a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """ Save original handler, installs newer one """
574a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    global __orig_getLogger
575a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    __orig_getLogger = logging.getLogger
576a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    setattr(logging, 'getLogger', release_getLogger)
577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)def restore_getLogger():
579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    """ Restores original handler """
580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    global __orig_getLogger
581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if __orig_getLogger:
582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        setattr(logging, 'getLogger', __orig_getLogger)
583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)def GetMidiFileLength(midiFile):
585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    """ Gets the length of a midi file via eas """
586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    e = __import__('eas')
587a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if not FileExists(midiFile):
589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        return 0
590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    eas = e.EAS()
592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    audio_file = eas.OpenFile(midiFile)
593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    audio_file.Prepare()
594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    midiLength = eas.audio_streams[0].ParseMetaData()
595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    audio_file.Close()
596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    eas.Shutdown()
597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return midiLength
598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)def GetMidiInfo(midiFile):
600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """ Gets midi file info """
601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    m = __import__('midifile')
602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    md = m.GetMidiInfo(midiFile)
603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return md
604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def PrintMidiInfo(midiFile):
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """ Prints info about a midi file """
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mi = GetMidiInfo(midiFile)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if mi.err == 0:
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print("ppqn: " + str(mi.ppqn))
610a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        print("beats_per_measure: " + str(mi.beats_per_measure))
611a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        print("ending mbt: " + str(mi.endMbt))
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print("ending mbt str: " + mi.endMbtStr)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print("maxMeasures: " + str(mi.maxMeasures))
614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        print("maxBeats: " + str(mi.maxBeats))
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print("maxTicks: " + str(mi.maxTicks))
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print("maxTracks: " + str(mi.maxTracks))
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print("totalTicks: " + str(mi.totalTicks))
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for track in mi.trackList:
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            print(track)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
6210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        print("Error opening")
6220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)def MidiSegInfo(segment):
6240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    """ Midi file info saved in config file for speed """
6250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    class segInfo:
6260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        iMsPerTick = 0
6270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        bpm = 4
6280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        ppqn = 480
6290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        total_ticks = 0
6300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        iLengthInMs = 0
6310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        iTracks = 0
6320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        trackList = []
6337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ver = "1.5"
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = segInfo()
6367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    savedVer = IniGetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "Ver")
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    savedDateTime = IniGetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "DateTime")
6387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    dateTime = FileDateTime(segment.filename)
6397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if ver != savedVer or dateTime != savedDateTime:
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mi = GetMidiInfo(segment.filename)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if mi.err == 0:
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "Ver", ver)
643424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "DateTime", str(dateTime))
644424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "PPQN", str(mi.ppqn))
645424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "BPM", str(mi.beats_per_measure))
646424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "totalTicks", str(mi.totalTicks))
647424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "maxTracks", str(mi.maxTracks))
648424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            iLengthInMs = GetMidiFileLength(segment.filename) * 1000
649424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "LengthInMs", str(iLengthInMs))
650424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            if iLengthInMs > 0:
651424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "MsPerTick", str(iLengthInMs / mi.totalTicks))
652424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            #have to write out the tracklist in format that can be saved in INI file
6537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            tl = []
6547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            for track in mi.trackList:
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                tl.append((track.track, track.channel, track.name))
6567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "Tracks", tl)
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    trackList = []
6597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    tl = IniGetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "Tracks", 'list', [])
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for t in tl:
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        trackList.append(trackGrid(t[0], t[1], t[2],False))
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iTracks = IniGetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "maxTracks", 'int', 0)
663a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    iMsPerTick = IniGetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "MsPerTick", 'float', 0)
664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bpm = IniGetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "BPM", 'int', 0)
665a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ppqn = IniGetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "PPQN", 'int', 480)
666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if iMsPerTick == 0 or bpm == 0 or ppqn == 0:
667a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        return ret
668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    tb = TimeBase(ppqn, bpm)
669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    total_ticks = tb.ConvertStrTimeToTicks(segment.length)
670a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if total_ticks == 0:
671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        total_ticks = tb.MbtDifference(tb.ConvertStrTimeToTuple(segment.start), tb.ConvertStrTimeToTuple(segment.end))
672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if total_ticks == 0:
673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        return ret
674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ret.iTracks = iTracks
676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ret.iMsPerTick = iMsPerTick
677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ret.bpm = bpm
678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ret.ppqn = ppqn
679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ret.total_ticks = total_ticks
680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ret.iLengthInMs = total_ticks * iMsPerTick
681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ret.trackList = trackList
682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return ret
683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef TimeStr(ms):
6857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    """ Returns a time string """
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    s=ms/1000
6877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    m,s=divmod(s,60)
6887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    h,m=divmod(m,60)
6897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    d,h=divmod(h,24)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if m > 0:
6917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return "%d Min %d Sec" % (m,s)
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else:
6937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return "%d Seconds" % (s)
6947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
695a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)def mbtFct(mbt, mod):
696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """ Converts times """
697a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if type(mbt).__name__=='str' or type(mbt).__name__=='unicode':
6987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        mbt = ConvertStrTimeToTuple(mbt)
699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        retType = 'str'
700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    else:
701a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        retType = 'int'
702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    m = mbt[0]+mod
7047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    b = mbt[1]+mod
7057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    t = mbt[2]
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if m < 0:
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        m = 0
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if b < 0:
7097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        b = 0
7107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if b > 4:
7117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        b = 4
7127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if t < 0:
7137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        t = 0
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if retType == 'str':
7167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return "%d:%d:%d" % (m, b, t)
7177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    else:
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return (m, b, t)
7197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef OsWindows():
7217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    """ Tells us whether windows or os x """
7227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if os.name == 'nt':
7237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return True ;
7247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    else:
7257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return False ;
726a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
727a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)def MacOffset():
728a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    """ Mac screen coordinates funky on some controls so we finagle a few pixels """
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if not OsWindows():
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return 3
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else:
7327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return 0
7337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def SafeJetShutdown(lock, jet):
7357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    """ Makes sure we do the jet shutdown properly """
736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    with lock:
7377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        #MAKE SURE WE CLEANUP
738a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        #try: jet.Clear_Queue()
739a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        #except: pass
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        try: jet.eas.StopWave()
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        except: pass
7437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        try: jet.Shutdown()
7457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        except: pass
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        jet = None
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def CreateTempJetFile(org_jet_file):
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """ Creates temporary jet file for playback testing """
7527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    dirname = JetDefs.TEMP_JET_DIR
7537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if not os.path.isdir(dirname):
754ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        os.mkdir(dirname)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmpConfigFile = dirname + FileJustName(org_jet_file.config_file)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileKillClean(tmpConfigFile)
758424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
759424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    jet_file = copy.deepcopy(org_jet_file)
760424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
761424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    for tmp in jet_file.segments:
762424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        tmp.output = dirname + FileJustName(tmp.output)
763424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
764424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    jet_file.config_file = tmpConfigFile
765a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    jet_file.config.filename = dirname + FileJustName(jet_file.config.filename)
7665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FileKillClean(jet_file.config.filename)
767a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
768a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    jet_file.SaveJetConfig(tmpConfigFile)
769a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    jet_file.WriteJetFileFromConfig(tmpConfigFile)
770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
771424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return jet_file
772424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
773424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)def CleanupTempJetFile(jet_file):
774424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    """ Cleans up temporary files """
7757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    FileKillClean(jet_file.config.filename)
7767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    FileKillClean(jet_file.config_file)
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for tmp in jet_file.segments:
7787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        FileKillClean(tmp.output)
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def GetNow():
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return time.asctime()
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
783a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)if __name__ == '__main__':
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """ Tests functions """
786a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    pass
787a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
7887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch