Hello, this is my very first non trivial program. It's a little python
script that uses sox to create an "audio collage" out of the mp3s in
the directories you pass to it on the command line. I know the code is
very crude, but nonetheless I'm very happy I made it work
Any suggestions on how I could get it to check recursively in the
directories?
renato
#! /usr/bin/env python
# This little python script searches in the directories passed to it on the command line (NOT recursively) for mp3 files
# and uses sox to extract random chunks of random length and concatenate them together, with crossfading, creating
# a sort of audio collage from your audio files (which remain untouched!). The default output is 'collage.mp3'
# Please bear with the code, it's full of non-elegant solutions - I'm a python newbie
# sox is a great tool with many effects with which it would be possible to create a crazier collage
#max length in seconds of the audio chunks that will make up the collage. (Percieved length will be smaller due
#to crossfades
max = 14
##WARNING## *all* input files have to be longer than max
import os
import commands
import random
import sys
#let's make a working directory
tmp = 'audiocollagetemporaryfolder/'
os.system('mkdir -p {0}'.format(tmp))
def duration(x):
"""Returns duration of an mp3 in seconds, ignoring warnings in the ouput"""
os.system('touch {0}soxiout'.format(tmp))
os.system('soxi -D "{0}" >> {1}soxiout'.format(x,tmp))
f = open('{0}soxiout'.format(tmp),'r')
g = f.readline()
while g != '':
dura = g[:-2]
h = f.readline()
if h == '':
break
else:
g = h
return int(float(g))
os.system('rm -f {0}soxiout'.format(tmp))
#ask for the output file:
print ''
print ''
out = raw_input('output file (it *WILL* overwrite existing files) - default is collage.mp3: ')
if out == '':
out = 'collage.mp3'
#first thing get the directories in which to search mp3s
#print sys.argv
#print ''
#print len(sys.argv)
directories = []
for i in range(1,len(sys.argv)):
directories.append(sys.argv[i])
#then put all the files in these directories in a list
files = []
for i in directories:
tmplist = os.listdir('{0}'.format(i))
for h in tmplist:
files.append(i + '/' + h)
#next make a new list with only mp3 files
mp3 = []
for i in files:
if i[-3:] == 'mp3':
mp3.append(i)
#on to the fun stuff: one by one, trim the audio files and save them to audiocollagetemporaryfolder/[number].wav
i = 0
while mp3 != []:
a = random.choice(mp3) #randomly select an mp3, then take away that item from the mp3 list
c = mp3[0:mp3.index(a)]
c.extend(mp3[mp3.index(a) + 1:])
mp3 = c
dura = duration(a);
td = [dura, random.randint(0,dura - max), random.randint(7,max)] #td stands for trim data - storing in it info needed for sox
#resampling is needed because the splice effect (used afterwards) wants files with same sample rate
cmd = 'sox "{0}" {1}{2}.wav rate 44.1k trim {3} {4}'.format(a,tmp,i,td[1],td[2])
print 'trimming ', a
print ' '
os.system(cmd)
i = i + 1
#now using sox's splice effect we'll concatenate with crossfading first 0.wav and 1.wav, writing the result
#on 1.wav, then 1.wav and 2.wav writing on 2.wav... and so on
print '-'*20
print 'attaching all the chunks together'
j = 0
while j < i - 1:
arg = '{0}{1}.wav'.format(tmp,j)
dur = duration(arg)
cmd = 'sox {0}{1}.wav {0}{2}.wav {0}a.wav splice -q {3},{4}'.format(tmp,j,j+1,dur,random.randint(1,2))
print cmd
os.system(cmd)
os.system('rm -f {0}{1}.wav'.format(tmp,j+1))
os.system('mv {0}a.wav {0}{1}.wav'.format(tmp, j+1))
j = j + 1
#final conversion to output file, adding fade in, out and removing working directory
print '-'*20
print 'exporting to the selected output file/type'
cmd = 'sox {0}{1}.wav {2} fade t 2 0'.format(tmp,j - 1,out)
print cmd
os.system(cmd)
print 'removing temporary files'
os.system('rm -rf {0}'.format(tmp))
print 'Done'
_______________________________________________
Linux-audio-dev mailing list
[email protected]
http://lists.linuxaudio.org/listinfo/linux-audio-dev