3123d0cb1f2d2b479570707dc2e55c640495b72d
[ardour.git] / tools / synthesize_sources.pl
1 #!/usr/bin/env perl
2 # Ardour session synthesizer
3 # (c)Sampo Savolainen 2007-2008
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 my $usage = "usage: synthesize_sources.pl samplerate [session name, the name must match the directory and the .ardour file in it] [options: -sine for 440hz sine waves in wave files]\n";
17
18 my ($samplerate, $sessionName, @options) = @ARGV;
19
20 if ( ! -d $sessionName || ! -f $sessionName."/".$sessionName.".ardour" ) {
21         print $usage;
22         exit;
23 }
24
25 my $waveType = "silent";
26
27 foreach my $o (@options) {
28         if ($o eq "-sine") {
29                 $waveType = "sine";
30         } elsif ($o eq "-silent") {
31                 $waveType = "silent";
32         } else {
33                 print "unknown parameter ".$o."\n";
34                 print $usage;
35                 exit;
36
37         }
38         
39 }
40
41 my $sessionFile = $sessionName."/".$sessionName.".ardour";
42
43
44 my $handler = new ARDOUR::SourceInfoLoader($sessionName);
45
46 my $parser = XML::Parser::PerlSAX->new( Handler => $handler );
47
48 $parser->parse(Source => { SystemId => $sessionFile });
49
50 if ( ! -d $sessionName."/interchange" ) {
51         mkdir $sessionName."/interchange/" || die "couldn't create ".$sessionName."/interchange";
52 }
53
54 if ( ! -d $sessionName."/interchange/".$sessionName ) {
55         mkdir $sessionName."/interchange/".$sessionName || die "couldn't create ".$sessionName."/interchange/".$sessionName;
56 }
57
58 if ( ! -d $sessionName."/interchange/".$sessionName."/audiofiles" ) {
59         mkdir $sessionName."/interchange/".$sessionName."/audiofiles" || die "couldn't create ".$sessionName."/interchange/".$sessionName."/audiofiles";
60 }
61
62 if ( ! -d $sessionName."/peaks") {
63         mkdir $sessionName."/peaks/" || die "couldn't create ".$sessionName."/peaks";
64 }
65
66 my $audioFileDirectory = $sessionName."/interchange/".$sessionName."/audiofiles";
67
68 my %sources = %{$handler->{Sources}};
69
70 foreach my $tmp (keys %sources) {
71         
72         print "Generating ".$audioFileDirectory."/".$sources{$tmp}->{name}."\n";
73
74         my @cmd = 
75               ("sox", 
76                "-t", "raw",        # /dev/zero is raw :)
77                "-r", $samplerate,  # set sample rate
78                "-c", "1",          # 1 channel
79                "-b",               # input in bytes
80                "-s",               # signed
81                "/dev/zero",        # input signal
82
83                "-w",               # output 16 bit
84                "-t", "wav",        # format wav
85                $audioFileDirectory."/".$sources{$tmp}->{name}, # filename
86                "trim", "0", $sources{$tmp}->{calculated_length}."s" # trim silence to wanted sample amount
87                );
88
89         if ($waveType eq "sine") {
90                 @cmd = (@cmd, "synth","sin","%0", "vol", "0.2", "fade","q","0.01s", $sources{$tmp}->{calculated_length}."s" , "0.01s");
91         }
92
93         system(@cmd);
94 }
95
96
97