so I have this piece of code which I understood fairly well from a tutorial:
( // run once to convert and resample wavetable files
var paths, file, data, n, newData, outFile;
paths = "/mnt/4/sound/wtables/AKWF/AKWF_0002/*.wav".pathMatch;
Routine({
paths.do { |it i|
// 'protect' guarantees the file objects will be closed in case of error
protect {
// Read original size of data
file = SoundFile.openRead(paths[i]);
data = Signal.newClear(file.numFrames);
file.readData(data);
0.1.wait;
// Convert to n = some power of 2 samples.
// n = data.size.nextPowerOfTwo;
n = 4096;
newData = data.resamp1(n);
0.1.wait;
// Convert the resampled signal into a Wavetable.
// resamp1 outputs an Array, so we have to reconvert to Signal
newData = newData.as(Signal).asWavetable;
0.1.wait;
// save to disk.
outFile = SoundFile(paths[i] ++ "_4096.wtable")
.headerFormat_("WAV")
.sampleFormat_("float")
.numChannels_(1)
.sampleRate_(44100);
if(outFile.openWrite.notNil) {
outFile.writeData(newData);
0.1.wait;
} {
"Couldn't write output file".warn;
};
} {
file.close;
if(outFile.notNil) { outFile.close };
};
}
}).play
)
it basically converts a bank of wavetables (stored in AKWF_0002) which are 600 samples long to proper 4096 samps wavetables (double that cause of how wavetables work in SC) and saves them. The problem is something doesn’t work in the saving process, in the final piece of code (outFile variable), it adds the string after the header, so I get lots of “.wav_4096.wavetable” files. Is there any way to solve this? I can’t seem to find a solution. Thanks!
Doesn’t work. If I apply splitext to paths[i] only, I get .wtable files, if I apply it to both paths[i] and the string, I get files with no extension. I need .wav files.
Here is the information (or format of information) that I want.
Anything less than this is guesswork and will waste time with vague or incorrect responses.
It’s not clear to me how the original filename looks – the whole filename, with extension – and also not clear to me what you would like to convert it to. So I don’t feel able to give more specific advice, based on the available information.
I explained it in the first post, maybe I wasn’t clear enough. The code converts 600 samples long .wav files (wavetables) to 4096 samples long .wav files. I just need to save them to .wav again with a different name, and that’s where the problem is (last piece of code, explained by comments). Basically when saving, SoundFile first adds the .wav extension, then appends the string, and I need the other way around.
Without testing I would suspect that keeping two dots in the filename could cause problems. It looks like you a going for something like: somename_4096.wtable.wav, what about if you try somename_4096wtable.wav (without the dot between 4096 and wtable)?
At least for me it wasn’t clear. It’s really helpful to be specific, like “I have a 600-sample wavetable file called xyz.wav, and I want my new file to be called xyz-4096.wav.”
So it sounds like what you need to do is 1/ strip off the extension, 2/ add something to the base name, 3/ add “.wav” again.
.splitext[0] takes care of #1. The others, I guess you can do on your own with some ++ operations.
I tested your original code a bit. The problem is that paths[i] points to the filename including .wav so anything after that is appended after .wav (as you experienced). The splitext gets rid of the extension. The other problems is that AFAIK there is no way of making .openWrite implicitly add the extension (on Mac OS at least) so .wav has to be explicitly added to the file name.