On Sun, 25 Jan 2009, Kjetil S. Matheussen wrote:
Erik Nomitch:
Hi,
I'm making a random "beat" generator based on a directory tree of
samples and a map file. Currently, it shuffles sample order and
creates a list of samples and their corresponding start time (example
list below).
I need a good way to mix all of these seperate samples into one single
audio file based on the time at which each starts at. Any
recommendations or thoughts would be appreciated. File format doesn't
matter, I'll use whatever is easiest.
Thanks,
Erik Nomitch
ex:
at: 0.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_C2A.wav
at: 2.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_C2S.wav
at: 4.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_T1A.wav
at: 6.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_T1S.wav
at: 8.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_aOrig.wav
at: 10.0 play /home/tux/.projects/elign/808/clap/808Clap-R8_01.wav
at: 12.0 play /home/tux/.projects/elign/808/clap/808Clap-R8_01_ST.wav
at: 14.0 play /home/tux/.projects/elign/808/clap/808Clap-R8_01_VT1.wav
at: 4.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_C2A.wav
at: 6.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_C2S.wav
at: 8.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_T1A.wav
at: 10.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_T1S.wav
at: 12.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_aOrig.wav
at: 14.0 play /home/tux/.projects/elign/808/clap/808Clap-R8_01.wav
at: 16.0 play /home/tux/.projects/elign/808/clap/808Clap-R8_01_ST.wav
at: 18.0 play /home/tux/.projects/elign/808/clap/808Clap-R8_01_VT1.wav
at: 4.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_C2A.wav
at: 8.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_C2S.wav
at: 12.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_T1A.wav
at: 16.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_T1S.wav
at: 20.0 play /home/tux/.projects/elign/808/clap/808Clap-Kult_aOrig.wav
at: 24.0 play /home/tux/.projects/elign/808/clap/808Clap-R8_01.wav
at: 28.0 play /home/tux/.projects/elign/808/clap/808Clap-R8_01_ST.wav
at: 32.0 play /home/tux/.projects/elign/808/clap/808Clap-R8_01_VT1.wav
etc...
Below is some code I have hacked together for Snd to do this.
Compile snd with the "--with-guile" option, save your txt
above ("at: etc.") into a file called "score.txt", start Snd, and
paste the
code below into the terminal you started
snd in.
Alternatively, you can save the code below into a
file, and use the "-b" option to start a gui-less
Snd which load and runs a specified script file.
Oops, I didn't test this on a clean Snd, and there seems
to be a lot of dependencies. Instead, use
snd-ls,
http://heim.ifi.uio.no/~ksvalast/arkiv/src/snd/,
and the code below instead:
(define (map-file filename func)
(let* ((fd (open-file filename "r"))
(line (read-line fd))
(ret '()))
(while (not (eof-object? line))
(set! ret (cons (func line) ret))
(set! line (read-line fd)))
(reverse ret)))
(define* (fileplay seconds filename)
(let* ((samples (seconds->samples seconds))
(end (+ (mus-sound-frames filename) samples)))
(for-each (lambda (ch)
(define fd (make-readin filename :channel ch))
(run
(lambda ()
(do ((i samples (1+ i))) ((= i end))
(out-any i (readin fd) ch *output*)))))
(iota (mus-sound-chans filename)))))
(define (create score samplerate channels outfile)
(set! (optimization) 6)
(primitive-eval `(with-sound (:srate ,samplerate :channels ,channels :output ,outfile)
,@(map (lambda (start filename)
`(fileplay ,start ,filename))
(map string->number (map cadr (map-file score
(lambda (l) (string-split l #\space)))))
(map cadddr (map-file score (lambda (l)
(string-split l #\space))))))))
(create "score.txt" 44100 2 "/tmp/test.wav")