MIDI branch becomes trunk
[ardour.git] / tools / synthesize_sources.pl
1 #!/usr/bin/env perl
2 # Ardour session synthesizer
3 # (c)Sampo Savolainen 2007
4 #
5 # GPL
6 # This reads an Ardour session file and creates zero-signal source files
7 # for each missing source file. The length of each file is determined
8 # by how far regions using that source file go into the sample data.
9
10 use XML::Parser::PerlSAX;
11 use XML::Handler::XMLWriter;
12 use IO::Handle;
13
14 use ARDOUR::SourceInfoLoader;
15
16
17 my ($samplerate, $sessionName) = @ARGV;
18
19 if ( ! -d $sessionName || ! -f $sessionName."/".$sessionName.".ardour" ) {
20         print "usage: synthesize_sources.pl samplerate [session name, the name must match the directory and the .ardour file in it]\n";
21         exit;
22 }
23
24 my $sessionFile = $sessionName."/".$sessionName.".ardour";
25
26
27 my $handler = new ARDOUR::SourceInfoLoader($sessionName);
28
29 my $parser = XML::Parser::PerlSAX->new( Handler => $handler );
30
31 $parser->parse(Source => { SystemId => $sessionFile });
32
33 if ( ! -d $sessionName."/interchange" ) {
34         mkdir $sessionName."/interchange/" || die "couldn't create ".$sessionName."/interchange";
35 }
36
37 if ( ! -d $sessionName."/interchange/".$sessionName ) {
38         mkdir $sessionName."/interchange/".$sessionName || die "couldn't create ".$sessionName."/interchange/".$sessionName;
39 }
40
41 if ( ! -d $sessionName."/interchange/".$sessionName."/audiofiles" ) {
42         mkdir $sessionName."/interchange/".$sessionName."/audiofiles" || die "couldn't create ".$sessionName."/interchange/".$sessionName."/audiofiles";
43 }
44
45 if ( ! -d $sessionName."/peaks") {
46         mkdir $sessionName."/peaks/" || die "couldn't create ".$sessionName."/peaks";
47 }
48
49 my $audioFileDirectory = $sessionName."/interchange/".$sessionName."/audiofiles";
50
51 my %sources = %{$handler->{Sources}};
52
53 foreach my $tmp (keys %sources) {
54         
55         print "Generating ".$audioFileDirectory."/".$sources{$tmp}->{name}.".wav\n";
56
57         system("sox", 
58                "-t", "raw",        # /dev/zero is raw :)
59                "-r", $samplerate,  # set sample rate
60                "-c", "1",          # 1 channel
61                "-b",               # input in bytes
62                "-s",               # signed
63                "/dev/zero",        # input signal
64
65                "-w",               # output 16 bit
66                "-t", "wav",        # format wav
67                $audioFileDirectory."/".$sources{$tmp}->{name}, # filename
68                "trim", "0", $sources{$tmp}->{calculated_length}."s" # trim silence to wanted sample amount
69                );
70
71
72 }
73
74
75