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