|
|
@@ -1,4 +1,4 @@ |
|
|
|
#!/usr/bin/env python |
|
|
|
#!/usr/bin/env python2 |
|
|
|
|
|
|
|
# Copyright (C) 2013 Jonathan Moore Liles # |
|
|
|
# # |
|
|
@@ -24,7 +24,7 @@ from datetime import date |
|
|
|
import shutil |
|
|
|
|
|
|
|
if len(sys.argv) == 1: |
|
|
|
print "Usage: import-ardour-session [PATH_TO_ARDOUR_FILE] [NAME_OF_NON_TIMELINE_PROJECT]" |
|
|
|
print( "Usage: import-ardour-session [PATH_TO_ARDOUR_FILE] [NAME_OF_NON_TIMELINE_PROJECT]" ) |
|
|
|
sys.exit( 1 ) |
|
|
|
|
|
|
|
Overwrite=False |
|
|
@@ -45,13 +45,13 @@ try: |
|
|
|
os.makedirs( NonTimelineProjectPath + "/sources"); |
|
|
|
except: |
|
|
|
if not Overwrite: |
|
|
|
print "Output path already exists!" |
|
|
|
print( "Output path already exists!" ) |
|
|
|
sys.exit( 1 ) |
|
|
|
|
|
|
|
try: |
|
|
|
tree = et.parse( ArdourFilePath ); |
|
|
|
except: |
|
|
|
print "Invalid XML input" |
|
|
|
print( "Invalid XML input" ) |
|
|
|
sys.exit( 1 ) |
|
|
|
|
|
|
|
root = tree.getroot(); |
|
|
@@ -59,39 +59,39 @@ root = tree.getroot(); |
|
|
|
Sources = {} |
|
|
|
DiskStreams = {} |
|
|
|
|
|
|
|
print "Gathering session info" |
|
|
|
print( "Gathering session info" ) |
|
|
|
if root.tag != "Session": |
|
|
|
print "Not an Ardour session?" |
|
|
|
print( "Not an Ardour session?" ) |
|
|
|
sys.exit(1) |
|
|
|
|
|
|
|
print "Ardour session file version is " + root.attrib["version"] |
|
|
|
print "This program is known to work with versions <= 3.0.1" |
|
|
|
print( "Ardour session file version is " + root.attrib["version"] ) |
|
|
|
print( "This program is known to work with versions <= 3.0.1" ) |
|
|
|
|
|
|
|
ProjectName = root.attrib["name"] |
|
|
|
|
|
|
|
print "Converting Ardour session \"" + ProjectName + "\" to Non Timeline format. Please be patient." |
|
|
|
print( "Converting Ardour session \"" + ProjectName + "\" to Non Timeline format. Please be patient." ) |
|
|
|
|
|
|
|
|
|
|
|
print "Gathering sources." |
|
|
|
print( "Gathering sources." ) |
|
|
|
for node in root.findall( "./Sources/Source" ): |
|
|
|
Sources[node.attrib["id"]] = node; |
|
|
|
# print "\tFound source " + node.attrib["name"] |
|
|
|
# print( "\tFound source " + node.attrib["name"] ) |
|
|
|
|
|
|
|
print "Gathering version 3 diskstreams." |
|
|
|
print( "Gathering version 3 diskstreams." ) |
|
|
|
for node in root.findall( "./Routes/Route/Diskstream" ): |
|
|
|
DiskStreams[node.attrib["id"]] = node; |
|
|
|
print "\tFound diskstream " + node.attrib["name"]; |
|
|
|
print( "\tFound diskstream " + node.attrib["name"] ) |
|
|
|
|
|
|
|
print "Gathering version 2 diskstreams." |
|
|
|
print( "Gathering version 2 diskstreams." ) |
|
|
|
for node in root.findall( "./DiskStreams/AudioDiskstream" ): |
|
|
|
DiskStreams[node.attrib["id"]] = node; |
|
|
|
# print "\tFound diskstream " + node.attrib["name"]; |
|
|
|
# print( "\tFound diskstream " + node.attrib["name"]; ) |
|
|
|
|
|
|
|
|
|
|
|
print "Gathering version 1 diskstreams." |
|
|
|
print( "Gathering version 1 diskstreams." ) |
|
|
|
for node in root.findall( "./DiskStreams/DiskStream" ): |
|
|
|
DiskStreams[node.attrib["id"]] = node; |
|
|
|
# print "\tFound diskstream " + node.attrib["name"]; |
|
|
|
# print( "\tFound diskstream " + node.attrib["name"]; ) |
|
|
|
|
|
|
|
LoggableID = 1; |
|
|
|
|
|
|
@@ -104,7 +104,7 @@ def NewID(): |
|
|
|
|
|
|
|
History = "{\n" |
|
|
|
|
|
|
|
print "Processing tempo." |
|
|
|
print( "Processing tempo." ) |
|
|
|
|
|
|
|
for node in root.findall("./TempoMap/Tempo"): |
|
|
|
TempoID = NewID() |
|
|
@@ -120,7 +120,7 @@ for node in root.findall("./TempoMap/Meter"): |
|
|
|
History += ( "\tTime_Point " + TimeID + " create :start 0 :beats_per_bar " + BPB + " :beat_type " + node.attrib["note-type"] + "\n") |
|
|
|
|
|
|
|
|
|
|
|
print "Processing playlists." |
|
|
|
print( "Processing playlists." ) |
|
|
|
for node in root.findall( "./Playlists/Playlist" ): |
|
|
|
|
|
|
|
try: |
|
|
@@ -129,12 +129,12 @@ for node in root.findall( "./Playlists/Playlist" ): |
|
|
|
try: |
|
|
|
Track = DiskStreams[node.attrib["orig-track-id"]] |
|
|
|
except: |
|
|
|
print "\tSkipping playlist " + node.attrib["name"] + " for unknown diskstream" |
|
|
|
print( "\tSkipping playlist " + node.attrib["name"] + " for unknown diskstream" ) |
|
|
|
continue |
|
|
|
|
|
|
|
|
|
|
|
if node.attrib["name"] == Track.attrib["playlist"]: |
|
|
|
print "\tFound playlist " + node.attrib["name"] |
|
|
|
print( "\tFound playlist " + node.attrib["name"] ) |
|
|
|
|
|
|
|
# for chan in range(0, int( Track.attrib["channels"] )): |
|
|
|
TrackID = NewID() |
|
|
@@ -164,7 +164,7 @@ for node in root.findall( "./Playlists/Playlist" ): |
|
|
|
elif os.path.exists( APath2 + SourceName ): |
|
|
|
SourceName = APath2 + SourceName |
|
|
|
else: |
|
|
|
print "source not found!" |
|
|
|
print( "source not found!" ) |
|
|
|
|
|
|
|
SourceList.append( "'" + SourceName + "'" ); |
|
|
|
|
|
|
@@ -174,13 +174,13 @@ for node in root.findall( "./Playlists/Playlist" ): |
|
|
|
OutputName = NonTimelineProjectPath + "/sources/" + SourceName |
|
|
|
|
|
|
|
if not os.path.exists( OutputName ): |
|
|
|
print "Combining multifile source into multichannel source" |
|
|
|
print( "Combining multifile source into multichannel source" ) |
|
|
|
os.system( "sox -S -M " + " ".join(SourceList) + " " + "'" + OutputName + "'" ) |
|
|
|
|
|
|
|
else: |
|
|
|
SourceName = Sources[n2.attrib["source-0"]].attrib["name"]; |
|
|
|
if not os.path.exists( NonTimelineProjectPath + "/sources/" + SourceName ): |
|
|
|
print "\t\tCopying source: " + SourceName; |
|
|
|
print( "\t\tCopying source: " + SourceName ) |
|
|
|
|
|
|
|
try: |
|
|
|
shutil.copy( os.path.dirname(ArdourFilePath) + "/interchange/" + ProjectName + "/audiofiles/" + SourceName, |
|
|
@@ -197,17 +197,17 @@ for node in root.findall( "./Playlists/Playlist" ): |
|
|
|
" :offset " + n2.attrib["start"] + |
|
|
|
" :sequence " + SequenceID + "\n") |
|
|
|
else: |
|
|
|
print "\tSkipping inactive playlist" |
|
|
|
print( "\tSkipping inactive playlist" ) |
|
|
|
|
|
|
|
History += ("}\n") |
|
|
|
|
|
|
|
print "Comitting to disk." |
|
|
|
print( "Comitting to disk." ) |
|
|
|
|
|
|
|
with open( NonTimelineProjectPath + "/info", 'w' ) as InfoFile: |
|
|
|
try: |
|
|
|
SampleRate = root.attrib["sample-rate"] |
|
|
|
except: |
|
|
|
print "Couldn't find sample rate... Using default." |
|
|
|
print( "Couldn't find sample rate... Using default." ) |
|
|
|
SampleRate = "48000" |
|
|
|
|
|
|
|
InfoFile.write( "created by\n\tNon-Timeline 1.2.0\ncreated on\n\t" + date.today().ctime() + "\nversion\n\t2\nsample rate\n\t" + SampleRate + "\n" ) |
|
|
@@ -215,5 +215,5 @@ with open( NonTimelineProjectPath + "/info", 'w' ) as InfoFile: |
|
|
|
with open( NonTimelineProjectPath + "/history", 'w' ) as HistoryFile: |
|
|
|
HistoryFile.write( History ) |
|
|
|
|
|
|
|
print "Done. You've been freed. Go make music!" |
|
|
|
print( "Done. You've been freed. Go make music!" ) |
|
|
|
|