16b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi"""
26b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi File:
36b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi JetFile.py
46b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
56b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Contents and purpose:
66b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Auditions a jet file to simulate interactive music functions
76b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
86b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Copyright (c) 2008 Android Open Source Project
96b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Licensed under the Apache License, Version 2.0 (the "License");
116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi you may not use this file except in compliance with the License.
126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi You may obtain a copy of the License at
136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi      http://www.apache.org/licenses/LICENSE-2.0
156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi Unless required by applicable law or agreed to in writing, software
176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi distributed under the License is distributed on an "AS IS" BASIS,
186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi See the License for the specific language governing permissions and
206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi limitations under the License.
216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi"""
226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivifrom __future__ import with_statement
246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviimport logging
266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviimport ConfigParser
276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviimport struct
286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviimport os
296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviimport sys
306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviimport midifile
316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivifrom JetUtils import *
336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivifrom JetDefs import *
346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviVERSION = '0.1'
366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi# JET file defines
386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJET_HEADER_STRUCT = '<4sl'
396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJET_HEADER_TAG = 'JET '
406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJET_VERSION = 0x01000000
416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi# JET chunk tags
436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJET_INFO_CHUNK = 'JINF'
446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJET_SMF_CHUNK = 'JSMF'
456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJET_DLS_CHUNK = 'JDLS'
466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi# JINF defines
486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJINF_STRUCT = '<4sl4sl4sl4sl'
496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJINF_JET_VERSION = 'JVER'
506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJINF_NUM_SMF_CHUNKS = 'SMF#'
516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJINF_NUM_DLS_CHUNKS = 'DLS#'
526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi# JCOP defines
546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJCOP_STRUCT = '<4sl'
556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJCOP_CHUNK = 'JCOP'
566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi# JAPP defines
586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJAPP_STRUCT = '<4sl'
596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJAPP_CHUNK = 'JAPP'
606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi# config file defines
626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviOUTPUT_SECTION = 'output'
636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviOUTPUT_FILENAME = 'filename'
646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviOUTPUT_COPYRIGHT = 'copyright'
656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviOUTPUT_APP_DATA = 'app_data'
666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviOUTPUT_CHASE_CONTROLLERS = 'chase_controllers'
676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviOUTPUT_OMIT_EMPTY_TRACKS = 'omit_empty_tracks'
686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSEGMENT_SECTION = 'segment'
696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSEGMENT_FILENAME = 'filename'
706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSEGMENT_DLSFILE = 'dlsfile'
716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSEGMENT_NAME = 'segname'
726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSEGMENT_START = 'start'
736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSEGMENT_END = 'end'
746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSEGMENT_END_MARKER = 'end_marker'
756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSEGMENT_QUANTIZE = 'quantize'
766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSEGMENT_OUTPUT = 'output'
776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSEGMENT_LENGTH = 'length'
786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSEGMENT_DUMP_FILE = 'dump'
796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSEGMENT_TRANSPOSE = 'transpose'
806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSEGMENT_REPEAT = 'repeat'
816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviSEGMENT_MUTE_FLAGS = 'mute_flags'
826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviLIBRARY_SECTION = 'libraries'
836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviLIBRARY_FILENAME = 'lib'
846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviCLIP_PREFIX = 'clip'
856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviAPP_PREFIX = 'app'
866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi# JET events
886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJET_EVENT_MARKER = 102
896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJET_MARKER_LOOP_END = 0
906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel TriviJET_EVENT_TRIGGER_CLIP = 103
916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass JetSegment (object):
936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Class to hold segments """
946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__ (self, segname, filename, start=None, end=None, length=None, output=None, quantize=None, jetevents=[], dlsfile=None, dump_file=None, transpose=0, repeat=0, mute_flags=0):
956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.segname = segname
966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.filename = filename
976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.dlsfile = dlsfile
986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.start = start
996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.end = end
1006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.length = length
1016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.output = output
1026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.quantize = quantize
1036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.dump_file = dump_file
1046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.jetevents = jetevents
1056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        #API FIELDS FOR UI
1066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.transpose = transpose
1076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.repeat = repeat
1086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.mute_flags = mute_flags
1096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass JetEvent (object):
1116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Class to hold events """
1126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__(self, event_name, event_type, event_id, track_num, channel_num, event_start, event_end):
1136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.event_name = event_name
1146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.event_type = event_type
1156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.event_id = event_id
1166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.track_num = track_num
1176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.channel_num = channel_num
1186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.event_start = event_start
1196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.event_end = event_end
1206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass JetFileException (Exception):
1226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """ Exceptions class """
1236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__ (self, msg):
1246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.msg = msg
1256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __str__ (self):
1266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return self.msg
1276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass JetSegmentFile (midifile.MIDIFile):
1296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def ConvertMusicTimeToTicks (self, s):
1306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        measures, beats, ticks = s.split(':',3)
1316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return self.ConvertToTicks(int(measures), int(beats), int(ticks))
1326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def ExtractEvents (self, start, end, length, quantize, chase_controllers):
1346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if (start is None) and (end is None) and (length is None):
1356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            logging.debug('ExtractEvents: No change')
1366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            return
1376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if start is not None:
1396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            start = self.ConvertMusicTimeToTicks(start)
1406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        else:
1416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            start = 0
1426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if end is not None:
1436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            end = self.ConvertMusicTimeToTicks(end)
1446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        elif length is not None:
1456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            length = self.ConvertMusicTimeToTicks(length)
1466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            end = start + length
1476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if quantize is not None:
1496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            quantize = int(quantize)
1506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        else:
1516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            quantize = 0
1526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.Trim(start, end, quantize, chase_controllers=chase_controllers)
1546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        #self.DumpTracks()
1556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SyncClips (self):
1576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """Add controller events to the start of a clip to keep it synced."""
1586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        values = None
1596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        last_seq = 0
1606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for track in self.tracks:
1616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            for event in track.events:
1626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                # find start of clip and chase events from last save point
1646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if (event.msg_type == midifile.CONTROL_CHANGE) and \
1656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        (event.controller == JET_EVENT_TRIGGER_CLIP) and \
1666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        ((event.value & 0x40) == 0x40):
1676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    logging.debug('Syncing clip at %d ticks' % event.ticks)
1686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    values = track.events.ChaseControllers(event.seq, last_seq, values)
1696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    #BTH; Seems to fix chase controller bug when multiple clips within segment
1716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    #last_seq = event.seq
1726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    # generate event list from default values
1746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    clip_events = values.GenerateEventList(event.ticks)
1756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    #for evt in clip_events:
1776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    #    logging.info(evt)
1786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    track.events.InsertEvents(clip_events, event.seq + 1)
1806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def AddJetEvents (self, jetevents):
1826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for jet_event in jetevents:
1836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if jet_event.event_type == JetDefs.E_CLIP:
1846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                #DumpEvent(jet_event)
1856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                # sanity check
1876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if jet_event.track_num >= len(self.tracks):
1886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    raise JetFileException('Track number %d of out of range for clip' % jet_event.track_num)
1896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if jet_event.channel_num > 15:
1906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    raise JetFileException('Channel number %d of out of range for clip' % jet_event.channel_num)
1916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if jet_event.event_id > 63:
1926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    raise JetFileException('event_id %d of out of range for clip' % jet_event.event_id)
1936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                logging.debug('Adding trigger event for clip %d @ %s and %s' % (jet_event.event_id, jet_event.event_start, jet_event.event_end))
1956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
1966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                events = midifile.EventList()
1976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                events.append(midifile.ControlChangeEvent(
1986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    self.ConvertMusicTimeToTicks(jet_event.event_start),
1996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    0,
2006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    jet_event.channel_num,
2016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    JET_EVENT_TRIGGER_CLIP,
2026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    jet_event.event_id | 0x40))
2036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                events.append(midifile.ControlChangeEvent(
2056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    self.ConvertMusicTimeToTicks(jet_event.event_end),
2066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    sys.maxint,
2076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    jet_event.channel_num,
2086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    JET_EVENT_TRIGGER_CLIP,
2096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    jet_event.event_id))
2106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                # merge trigger events
2126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.tracks[jet_event.track_num].events.MergeEvents(events)
2136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            elif jet_event.event_type == JetDefs.E_EOS:
2156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if jet_event.track_num >= len(self.tracks):
2166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    raise JetFileException('Track number %d of out of range for end marker' % jet_event.track_num)
2176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if jet_event.channel_num > 15:
2186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    raise JetFileException('Channel number %d of out of range for end marker' % jet_event.channel_num)
2196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                events = midifile.EventList()
2216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                logging.debug('Adding end marker at %s' % jet_event.event_start)
2226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                events.append(midifile.ControlChangeEvent(
2236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    self.ConvertMusicTimeToTicks(jet_event.event_start),
2246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    0,
2256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    jet_event.channel_num,
2266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    JET_EVENT_MARKER,
2276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    JET_MARKER_LOOP_END))
2286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.tracks[jet_event.track_num].events.MergeEvents(events)
2296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            elif jet_event.event_type == JetDefs.E_APP:
2316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if jet_event.track_num >= len(self.tracks):
2326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    raise JetFileException('Track number %d of out of range for app marker' % jet_event.track_num)
2336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if jet_event.channel_num > 15:
2346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    raise JetFileException('Channel number %d of out of range for app marker' % jet_event.channel_num)
2356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if jet_event.event_id > 83 or jet_event.event_id < 80:
2366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    raise JetFileException('EventID %d out of range for application controller' % jet_event.event_id)
2376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                events = midifile.EventList()
2396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                logging.debug('Adding application controller at %s' % jet_event.event_start)
2406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                events.append(midifile.ControlChangeEvent(
2416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    self.ConvertMusicTimeToTicks(jet_event.event_start),
2426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    0,
2436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    jet_event.channel_num,
2446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    jet_event.event_id,
2456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    jet_event.event_id))
2466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.tracks[jet_event.track_num].events.MergeEvents(events)
2476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviclass JetFile (object):
2496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    """Write a JET file based on a configuration file."""
2506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def __init__ (self, config_file, options):
2516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.config_file = config_file
2526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.config = config = ConfigParser.ConfigParser()
2536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.config_file == "":
2546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.InitializeConfig(JetDefs.UNTITLED_FILE)
2556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if not FileExists(self.config_file):
2566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.InitializeConfig(self.config_file)
2576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        config.read(self.config_file)
2596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.ParseConfig(options)
2606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def DumpConfig (self):
2626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """Drump configuration to log file."""
2636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        # dump configuration
2646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        config = self.config
2656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for section in config.sections():
2666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            logging.debug('[%s]' % section)
2676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            for option, value in config.items(section):
2686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                logging.debug('%s: %s' % (option, value))
2696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def ParseConfig (self, options):
2716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """Validate the configuration."""
2726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        # check for output name
2736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        config = self.config
2746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if config.has_option(OUTPUT_SECTION, OUTPUT_FILENAME):
2756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.filename = config.get(OUTPUT_SECTION, OUTPUT_FILENAME)
2766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        else:
2776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            raise JetFileException('No output filename in configuration file')
2786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if config.filename == '' or config.filename == None:
2796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.filename = FileJustRoot(self.config_file) + ".JET"
2806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        config.chase_controllers = True
2816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if config.has_option(OUTPUT_SECTION, OUTPUT_CHASE_CONTROLLERS):
2826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            try:
2836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                config.chase_controllers = config.getboolean(OUTPUT_SECTION, OUTPUT_CHASE_CONTROLLERS)
2846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            except:
2856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                pass
2866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        config.delete_empty_tracks = False
2886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if config.has_option(OUTPUT_SECTION, OUTPUT_OMIT_EMPTY_TRACKS):
2896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            try:
2906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                config.delete_empty_tracks = config.getboolean(OUTPUT_SECTION, OUTPUT_OMIT_EMPTY_TRACKS)
2916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            except:
2926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                pass
2936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        config.copyright = None
2956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if config.has_option(OUTPUT_SECTION, OUTPUT_COPYRIGHT):
2966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.copyright = config.get(OUTPUT_SECTION, OUTPUT_COPYRIGHT)
2976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
2986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        config.app_data = None
2996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if config.has_option(OUTPUT_SECTION, OUTPUT_APP_DATA):
3006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.app_data = config.get(OUTPUT_SECTION, OUTPUT_APP_DATA)
3016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        # count segments
3036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        segments = []
3046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        seg_num = 0
3056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        while 1:
3066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # check for segment section
3086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            segment_name = SEGMENT_SECTION + str(seg_num)
3096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if not config.has_section(segment_name):
3106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                break
3116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # initialize some parameters
3136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            start = end = length = output = end_marker = dlsfile = dump_file = None
3146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            transpose = repeat = mute_flags = 0
3156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            jetevents = []
3166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # get the segment parameters
3186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            segname = config.get(segment_name, SEGMENT_NAME)
3196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            filename = config.get(segment_name, SEGMENT_FILENAME)
3206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if config.has_option(segment_name, SEGMENT_DLSFILE):
3216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                dlsfile = config.get(segment_name, SEGMENT_DLSFILE)
3226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if config.has_option(segment_name, SEGMENT_START):
3236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                start = config.get(segment_name, SEGMENT_START)
3246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if config.has_option(segment_name, SEGMENT_END):
3256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                end = config.get(segment_name, SEGMENT_END)
3266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if config.has_option(segment_name, SEGMENT_LENGTH):
3276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                length = config.get(segment_name, SEGMENT_LENGTH)
3286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if config.has_option(segment_name, SEGMENT_OUTPUT):
3296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                output = config.get(segment_name, SEGMENT_OUTPUT)
3306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if config.has_option(segment_name, SEGMENT_QUANTIZE):
3316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                quantize = config.get(segment_name, SEGMENT_QUANTIZE)
3326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if config.has_option(segment_name, SEGMENT_DUMP_FILE):
3336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                dump_file = config.get(segment_name, SEGMENT_DUMP_FILE)
3346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            #API FIELDS
3356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if config.has_option(segment_name, SEGMENT_TRANSPOSE):
3366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                transpose = config.get(segment_name, SEGMENT_TRANSPOSE)
3376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if config.has_option(segment_name, SEGMENT_REPEAT):
3386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                repeat = config.get(segment_name, SEGMENT_REPEAT)
3396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if config.has_option(segment_name, SEGMENT_MUTE_FLAGS):
3406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                mute_flags = config.get(segment_name, SEGMENT_MUTE_FLAGS)
3416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if config.has_option(segment_name, SEGMENT_END_MARKER):
3436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                end_marker = config.get(segment_name, SEGMENT_END_MARKER)
3446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                track_num, channel_num, event_time = end_marker.split(',',2)
3456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                #jetevents.append((JetDefs.E_EOS, 0, int(track_num), int(channel_num), event_time, ''))
3466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                jetevents.append(JetEvent(JetDefs.E_EOS, JetDefs.E_EOS, 0, int(track_num), int(channel_num), event_time, event_time))
3476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # check for jetevents
3496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            for jetevent, location in config.items(segment_name):
3506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if jetevent.startswith(CLIP_PREFIX):
3516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    event_name, event_id, track_num, channel_num, event_start, event_end = location.split(',', 5)
3526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    jetevents.append(JetEvent(event_name, JetDefs.E_CLIP, int(event_id), int(track_num), int(channel_num), event_start, event_end))
3536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # check for appevents
3556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            for jetevent, location in config.items(segment_name):
3566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if jetevent.startswith(APP_PREFIX):
3576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    event_name, event_id, track_num, channel_num, event_start, event_end = location.split(',', 5)
3586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    jetevents.append(JetEvent(event_name, JetDefs.E_APP, int(event_id), int(track_num), int(channel_num), event_start, event_end))
3596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            segments.append(JetSegment(segname, filename, start, end, length, output, quantize, jetevents, dlsfile, dump_file, int(transpose), int(repeat), int(mute_flags)))
3616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            seg_num += 1
3626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.segments = segments
3646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if not len(segments):
3656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            #TODO: Check for segments when writing
3666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            #raise JetFileException('No segments defined in configuration file')
3676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            pass
3686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        # count libraries
3706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        libraries = []
3716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        lib_num = 0
3726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        while 1:
3736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            library_name = LIBRARY_FILENAME + str(lib_num)
3746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if not config.has_option(LIBRARY_SECTION, library_name):
3756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                break
3766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            libraries.append(config.get(LIBRARY_SECTION, library_name))
3776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            lib_num += 1
3786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.libraries = libraries
3796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def WriteJetFileFromConfig (self, options):
3816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """Write JET file from config file."""
3826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        # open the output file and write the header
3846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        output_file = open(self.config.filename, 'wb')
3856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        jet_header = struct.pack(JET_HEADER_STRUCT, JET_HEADER_TAG, 0)
3866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        output_file.write(jet_header)
3876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        # write the JINF chunk
3896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        jet_info = struct.pack(JINF_STRUCT,
3906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            JET_INFO_CHUNK, struct.calcsize(JINF_STRUCT) - 8,
3916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            JINF_JET_VERSION, JET_VERSION,
3926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            JINF_NUM_SMF_CHUNKS, len(self.segments),
3936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            JINF_NUM_DLS_CHUNKS, len(self.libraries))
3946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        output_file.write(jet_info)
3956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
3966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        # write the JCOP chunk (if any)
3976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.config.copyright is not None:
3986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            size = len(self.config.copyright) + 1
3996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if size & 1:
4006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                size += 1
4016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                extra_byte = True
4026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            else:
4036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                extra_byte = False
4046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            jet_copyright = struct.pack(JCOP_STRUCT, JCOP_CHUNK, size)
4056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            output_file.write(jet_copyright)
4066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            output_file.write(self.config.copyright)
4076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            output_file.write(chr(0))
4086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if extra_byte:
4096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                output_file.write(chr(0))
4106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        # write the app data chunk (if any)
4126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.config.app_data is not None:
4136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            size = os.path.getsize(self.config.app_data)
4146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if size & 1:
4156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                size += 1
4166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                extra_byte = True
4176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            else:
4186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                extra_byte = False
4196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            jet_app_data = struct.pack(JAPP_STRUCT, JAPP_CHUNK, size)
4206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            output_file.write(jet_app_data)
4216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            with open(self.config.app_data, 'rb') as f:
4226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                output_file.write(f.read())
4236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if extra_byte:
4246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                output_file.write(chr(0))
4256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        # copy the MIDI segments
4276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        seg_num = 0
4286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
4296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            logging.debug('Writing segment %d' % seg_num)
4306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # open SMF file and read it
4326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            jet_segfile = JetSegmentFile(segment.filename, 'rb')
4336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            jet_segfile.ReadFromStream()
4346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # insert events
4366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            jet_segfile.AddJetEvents(segment.jetevents)
4376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # trim to length specified in config file
4396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            jet_segfile.ExtractEvents(segment.start, segment.end, segment.length, segment.quantize, self.config.chase_controllers)
4406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # chase controller events and fix them
4426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if self.config.chase_controllers:
4436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                jet_segfile.SyncClips()
4446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # delete empty tracks
4466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if self.config.delete_empty_tracks:
4476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                jet_segfile.DeleteEmptyTracks()
4486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # write separate output file if requested
4506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.output is not None:
4516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                jet_segfile.SaveAs(segment.output)
4526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # write dump file
4546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.dump_file is not None:
4556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                with open(segment.dump_file, 'w') as f:
4566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    jet_segfile.DumpTracks(f)
4576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # write the segment header
4596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            header_pos = output_file.tell()
4606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            smf_header = struct.pack(JET_HEADER_STRUCT, JET_SMF_CHUNK, 0)
4616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            output_file.write(smf_header)
4626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            start_pos = output_file.tell()
4636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # write SMF file to output file
4656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            jet_segfile.Write(output_file, offset=start_pos)
4666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            jet_segfile.close()
4676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            # return to segment header and write actual size
4696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            end_pos = output_file.tell()
4706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            file_size = end_pos - start_pos
4716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if file_size & 1:
4726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                file_size += 1
4736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                end_pos += 1
4746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            output_file.seek(header_pos, 0)
4756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            smf_header = struct.pack(JET_HEADER_STRUCT, JET_SMF_CHUNK, file_size)
4766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            output_file.write(smf_header)
4776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            output_file.seek(end_pos, 0)
4786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            seg_num += 1
4806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        # copy the DLS segments
4826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for library in self.libraries:
4836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if FileExists(library):
4846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                # open SMF file and get size
4856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                lib_file = (open(library,'rb'))
4866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                lib_file.seek(0,2)
4876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                file_size = lib_file.tell()
4886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                lib_file.seek(0)
4896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                # write the library header
4916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                dls_header = struct.pack(JET_HEADER_STRUCT, JET_DLS_CHUNK, file_size)
4926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                output_file.write(dls_header)
4936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                # copy DLS file to output file
4956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                output_file.write(lib_file.read())
4966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                lib_file.close()
4976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
4986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        # write the header with the read data size
4996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        file_size = output_file.tell()
5006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        output_file.seek(0)
5016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        jet_header = struct.pack(JET_HEADER_STRUCT, JET_HEADER_TAG, file_size - struct.calcsize(JET_HEADER_STRUCT))
5026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        output_file.write(jet_header)
5036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        output_file.close()
5046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetMidiFiles(self):
5066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Gets a list of midifiles """
5076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        midiFiles = []
5086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
5096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.filename not in midiFiles:
5106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                 midiFiles.append(segment.filename)
5116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return midiFiles
5126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetLibraries(self):
5146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Gets the libraries """
5156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return self.libraries
5166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetEvents(self, segName):
5186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Gets the events for a segment """
5196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
5206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.segname == segName:
5216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                return segment.jetevents
5226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return None
5236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetEvent(self, segName, eventName):
5256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Gets a single event from a segment """
5266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
5276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.segname == segName:
5286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                for event in segment.jetevents:
5296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    if event.event_name == eventName:
5306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        return event
5316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return None
5326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def AddEvent(self, segname, event_name, event_type, event_id, track_num, channel_num, event_start, event_end):
5346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Adds an event """
5356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
5366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.segname == segname:
5376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.jetevents.append(JetEvent(event_name, event_type, int(event_id), int(track_num), int(channel_num), event_start, event_end))
5386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def ReplaceEvents(self, segname, newEvents):
5406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Replaces all events """
5416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
5426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.segname == segname:
5436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.jetevents = newEvents
5446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                return segment
5456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def UpdateEvent(self, segname, orgeventname, event_name, event_type, event_id, track_num, channel_num, event_start, event_end):
5476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Updates an event """
5486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
5496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.segname == segname:
5506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                for jetevent in segment.jetevents:
5516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    if jetevent.event_name == orgeventname:
5526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        jetevent.event_name = event_name
5536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        jetevent.event_type = event_type
5546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        jetevent.event_id = event_id
5556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        jetevent.track_num = track_num
5566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        jetevent.channel_num = channel_num
5576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        jetevent.event_start = event_start
5586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        jetevent.event_end = event_end
5596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def DeleteSegmentsMatchingPrefix(self, prefix):
5616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Deletes all segments matching name """
5626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        iOnce = True
5636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        iAgain = False
5646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        while(iOnce or iAgain):
5656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            iOnce = False
5666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            iAgain = False
5676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            for segment in self.segments:
5686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if segment.segname[0:len(prefix)].upper() == prefix.upper():
5696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    self.segments.remove(segment)
5706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    iAgain = True
5716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def DeleteEvent(self, segname, event_name):
5736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Deletes an event """
5746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
5756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.segname == segname:
5766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                for jetevent in segment.jetevents:
5776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    if jetevent.event_name == event_name:
5786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        segment.jetevents.remove(jetevent)
5796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def DeleteEventsMatchingPrefix(self, segname, prefix):
5816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Deletes all events matching name """
5826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
5836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.segname == segname:
5846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                iOnce = True
5856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                iAgain = False
5866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                while(iOnce or iAgain):
5876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    iOnce = False
5886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    iAgain = False
5896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    for jetevent in segment.jetevents:
5906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        if jetevent.event_name[0:len(prefix)].upper() == prefix.upper():
5916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                            segment.jetevents.remove(jetevent)
5926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                            iAgain = True
5936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
5946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def MoveEvent(self, segname, movename, event_start, event_end):
5956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Move an event """
5966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
5976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.segname == segname:
5986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                for jetevent in segment.jetevents:
5996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    if jetevent.event_name == movename:
6006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        jetevent.event_start = event_start
6016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        jetevent.event_end = event_end
6026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                        return
6036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
6046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetSegments(self):
6056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Gets all segments """
6066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return self.segments
6076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
6086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def GetSegment(self, segName):
6096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Gets one segment by name """
6106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
6116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.segname == segName:
6126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                return segment
6136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        return None
6146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
6156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def AddSegment(self, segname, filename, start, end, length, output, quantize, jetevents, dlsfile, dump_file, transpose, repeat, mute_flags):
6166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Adds a segment """
6176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if length == JetDefs.MBT_ZEROSTR:
6186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            length = None
6196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if end == JetDefs.MBT_ZEROSTR:
6206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            end = None
6216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.segments.append(JetSegment(segname, filename, start, end, length, output, quantize, jetevents, dlsfile, dump_file, transpose, repeat, mute_flags))
6226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
6236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def UpdateSegment(self, orgsegname, segname, filename, start, end, length, output, quantize, jetevents, dlsfile, dump_file, transpose, repeat, mute_flags):
6246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Updates a segment """
6256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if length == JetDefs.MBT_ZEROSTR:
6266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            length = None
6276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if end == JetDefs.MBT_ZEROSTR:
6286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            end = None
6296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
6306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.segname == orgsegname:
6316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.segname = segname
6326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.filename = filename
6336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.start = start
6346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.end = end
6356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.length = length
6366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.output = output
6376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.quantize = quantize
6386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.dlsfile = dlsfile
6396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.transpose = transpose
6406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.repeat = repeat
6416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.mute_flags = mute_flags
6426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
6436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def MoveSegment(self, segname, start, end):
6446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Moves a segment """
6456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
6466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.segname == segname:
6476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.start = start
6486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                segment.end = end
6496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                return
6506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
6516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def DeleteSegment(self, segname):
6526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Deletes a segment """
6536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
6546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.segname == segname:
6556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                self.segments.remove(segment)
6566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
6576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def SaveJetConfig(self, configFile):
6586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Saves the jet config file """
6596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.config.filename == '' or self.config.filename == None:
6606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            self.config.filename = FileJustRoot(configFile) + ".JET"
6616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        config = ConfigParser.ConfigParser()
6626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        config.add_section(OUTPUT_SECTION)
6636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        config.set(OUTPUT_SECTION, OUTPUT_FILENAME, self.config.filename)
6646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        config.set(OUTPUT_SECTION, OUTPUT_CHASE_CONTROLLERS, self.config.chase_controllers)
6656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        config.set(OUTPUT_SECTION, OUTPUT_OMIT_EMPTY_TRACKS, self.config.delete_empty_tracks)
6666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.config.copyright is not None:
6676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.set(OUTPUT_SECTION, OUTPUT_COPYRIGHT, self.config.copyright)
6686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        if self.config.app_data is not None:
6696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.set(OUTPUT_SECTION, OUTPUT_APP_DATA, self.config.app_data)
6706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
6716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.libraries = []
6726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        seg_num = 0
6736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for segment in self.segments:
6746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            segment_name = SEGMENT_SECTION + str(seg_num)
6756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.add_section(segment_name)
6766b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.set(segment_name, SEGMENT_NAME, segment.segname)
6776b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.set(segment_name, SEGMENT_FILENAME, segment.filename)
6786b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
6796b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.set(segment_name, SEGMENT_DLSFILE, segment.dlsfile)
6806b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if FileExists(segment.dlsfile):
6816b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if not segment.dlsfile in self.libraries:
6826b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    self.libraries.append(segment.dlsfile)
6836b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.set(segment_name, SEGMENT_START, segment.start)
6846b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.end > JetDefs.MBT_ZEROSTR and len(segment.end) > 0:
6856b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                config.set(segment_name, SEGMENT_END, segment.end)
6866b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.length > JetDefs.MBT_ZEROSTR and len(segment.length) > 0:
6876b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                config.set(segment_name, SEGMENT_LENGTH, segment.length)
6886b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.set(segment_name, SEGMENT_OUTPUT, segment.output)
6896b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.set(segment_name, SEGMENT_QUANTIZE, segment.quantize)
6906b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            if segment.dump_file is not None:
6916b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                config.set(segment_name, SEGMENT_DUMP_FILE, segment.dump_file)
6926b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.set(segment_name, SEGMENT_TRANSPOSE, segment.transpose)
6936b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.set(segment_name, SEGMENT_REPEAT, segment.repeat)
6946b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.set(segment_name, SEGMENT_MUTE_FLAGS, segment.mute_flags)
6956b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
6966b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            clip_num = 0
6976b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            app_num = 0
6986b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            for jet_event in segment.jetevents:
6996b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                if jet_event.event_type == JetDefs.E_CLIP:
7006b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    clip_name = CLIP_PREFIX + str(clip_num)
7016b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    s = "%s,%s,%s,%s,%s,%s" % (jet_event.event_name, jet_event.event_id, jet_event.track_num, jet_event.channel_num, jet_event.event_start, jet_event.event_end)
7026b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    config.set(segment_name, clip_name, s)
7036b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    clip_num += 1
7046b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                elif jet_event.event_type == JetDefs.E_APP:
7056b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    app_name = APP_PREFIX + str(app_num)
7066b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    s = "%s,%s,%s,%s,%s,%s" % (jet_event.event_name, jet_event.event_id, jet_event.track_num, jet_event.channel_num, jet_event.event_start, jet_event.event_end)
7076b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    config.set(segment_name, app_name, s)
7086b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    app_num += 1
7096b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                elif jet_event.event_type == JetDefs.E_EOS:
7106b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    s = "%s,%s,%s" % (jet_event.track_num, jet_event.channel_num, jet_event.event_start)
7116b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi                    config.set(segment_name, SEGMENT_END_MARKER, s)
7126b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
7136b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            seg_num += 1
7146b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
7156b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        lib_num = 0
7166b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        config.add_section(LIBRARY_SECTION)
7176b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        for library in self.libraries:
7186b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            library_name = LIBRARY_FILENAME + str(lib_num)
7196b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            config.set(LIBRARY_SECTION, library_name, library)
7206b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi            lib_num += 1
7216b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
7226b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        FileKillClean(configFile)
7236b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        cfgfile = open(configFile,'w')
7246b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        config.write(cfgfile)
7256b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        cfgfile.close()
7266b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
7276b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    def InitializeConfig(self, configFile):
7286b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        """ Initializes the values for an empty flag """
7296b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.config.filename = FileJustRoot(configFile)  + ".JET"
7306b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.config.chase_controllers = True
7316b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.config.delete_empty_tracks = False
7326b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.config.copyright = None
7336b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.config.app_data = None
7346b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.segments = []
7356b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.libraries = []
7366b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.config_file = configFile
7376b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        self.SaveJetConfig(configFile)
7386b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
7396b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
7406b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
7416b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi#---------------------------------------------------------------
7426b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi# main
7436b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi#---------------------------------------------------------------
7446b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Triviif __name__ == '__main__':
7456b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    sys = __import__('sys')
7466b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    optparse = __import__('optparse')
7476b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
7486b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    # parse command line options
7496b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    parser = optparse.OptionParser(version=VERSION)
7506b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    parser.set_defaults(log_level=logging.INFO, log_file=None)
7516b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    parser.add_option('-d', '--debug', action="store_const", const=logging.DEBUG, dest='log_level', help='Enable debug output')
7526b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    parser.add_option('-l', '--log_file', dest='log_file', help='Write debug output to log file')
7536b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    (options, args) = parser.parse_args()
7546b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
7556b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    # get master logger
7566b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    logger = logging.getLogger('')
7576b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    logger.setLevel(options.log_level)
7586b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
7596b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    # create console logger
7606b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    console_logger = logging.StreamHandler()
7616b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    console_logger.setFormatter(logging.Formatter('%(message)s'))
7626b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    logger.addHandler(console_logger)
7636b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
7646b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    # create rotating file logger
7656b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    if options.log_file is not None:
7666b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        file_logger = logging.FileHandler(options.log_file, 'w')
7676b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        file_logger.setFormatter(logging.Formatter('%(message)s'))
7686b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        logger.addHandler(file_logger)
7696b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
7706b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    # process files
7716b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi    for arg in args:
7726b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        print arg
7736b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        jet_file = JetFile(arg, options)
7746b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi        jet_file.WriteJetFileFromConfig(options)
7756b065d0f7161fe54e6f58fd2b8ad6c650b2d3657Jean-Michel Trivi
776