Search code examples
rfor-loopwav

for.loop with WAV files


I'm trying to create a loop for reading in stereo wave files in R, but I'm unsure if I should use for.loop or while.loop. I'm calculating the RMS for both channels.

Here's the action for one sound file:

foo=readWave("mysound.wav")
L=foo@left
R=foo@right
rms(L)
rms(R)

Now, I have directories full of 2 minute sound files. I want to take each of those files, isolate the channels, and calculate the RMS. I THINK this is how it's done:

mydir=list.files("directory", recursive=TRUE) 
for (i in 1:length(mydir)) {
    foo=readWave(mydir[i])
    L=foo@left
    R=foo@right
    rms(L)
    rms(R)
    write(combine, file="test.txt", append=true, sep="\t")  
}

This loop returns the error message that my first sound files doesn't exist. As per the suggestion below, I've also tried to read in the files by:

wav_files <- lapply(mydir, readWave)
Error in FUN(c("DASBR2_20131112$224708.wav", "DASBR2_20131112$224910.wav",  : 
   File 'DASBR2_20131112$224708.wav' does not exist.

This also returns that my file does not exist. Perhaps there is a better way to read in the wave files? Can lapply or for.loop handle waves?

When I type mydir into the console, R produces the following output:

> mydir
   [1] "DASBR2_20131112$224708.wav" "DASBR2_20131112$224910.wav"
   [3] "DASBR2_20131112$225110.wav" "DASBR2_20131112$225310.wav"
   [5] "DASBR2_20131112$225446.wav" "DASBR2_20131112$225648.wav"
   ...

This is what I expect, as these are the names of my sound files. Thoughts?


Solution

  • Here is how I did this:

    fnam=file.path("directory path")
    filist=list.files(fnam, recursive=TRUE, pattern="wav")
    filist1=paste(fnam, "/", filist, sep="")
    nfiles=length(filist1)
    test_rms=c("Full File Path", "RMS-L","RMS-R")
    for (i in 1:nfiles){
         inname=filist1[i]
         ywave=readWave(inname)
         L=ywave@left
         R=ywave@right
         test_rms = rbind(test_rms, c(inname, rms(L), rms(R)))
     }
    

    The code for RMS can be replaced with whatever process you need to preform. I will say that the code failed to run through my entire directory, as I had may sub-directories. At least two deep from the path I specified. This code went one level in, and read everything in that directory, even wav files in further sub-directories. I think this script just can handle two directories out.