Skip to content

Instantly share code, notes, and snippets.

@ffAudio
Created January 21, 2024 21:37
Show Gist options
  • Save ffAudio/94bc85213163dedb0eaff2e902a5ad88 to your computer and use it in GitHub Desktop.
Save ffAudio/94bc85213163dedb0eaff2e902a5ad88 to your computer and use it in GitHub Desktop.
Resample a folder of testsignals
/*
==============================================================================
Resample the test signals in the folder
==============================================================================
*/
#include <juce_core/juce_core.h>
#include <juce_audio_formats/juce_audio_formats.h>
#include <juce_dsp/juce_dsp.h>
int main (int, char**)
{
constexpr auto sampleRate = 44100.0;
using ResamplerType=juce::ResamplingAudioSource;
auto folder = juce::File::getSpecialLocation (juce::File::userDesktopDirectory).getChildFile("TestSignals");
auto output = folder.getChildFile("output");
output.createDirectory();
juce::WavAudioFormat format;
for (auto file : folder.findChildFiles(juce::File::findFiles, false))
{
if (!file.hasFileExtension(".wav"))
continue;
auto input = file.createInputStream();
auto reader = format.createReaderFor(input.release(), true);
if (!reader)
{
DBG ("Creating reader failed: " << file.getFullPathName());
continue;
}
const auto sourceSampleRate = reader->sampleRate;
const auto numSourceSamples = reader->lengthInSamples;
const auto numChannels = reader->numChannels;
const auto blockSize = 512;
auto source = std::make_unique<juce::AudioFormatReaderSource>(reader, true);
auto outputFile = output.getChildFile(file.getFileName());
auto outputStream = outputFile.createOutputStream();
outputStream->setPosition(0);
outputStream->truncate();
auto writer = std::unique_ptr<juce::AudioFormatWriter>(format.createWriterFor(outputStream.release(), sampleRate, reader->numChannels, reader->bitsPerSample, {}, 0));
if (!writer)
{
DBG ("Creating writer failed: " << outputFile.getFullPathName());
continue;
}
auto resampler = std::make_unique<ResamplerType>(source.release(), true, numChannels);
juce::AudioBuffer<float> buffer (numChannels, blockSize);
juce::AudioSourceChannelInfo info (buffer);
const auto ratio = sourceSampleRate / sampleRate;
const auto numTargetSamples = numSourceSamples / ratio;
resampler->setResamplingRatio(ratio);
resampler->prepareToPlay(blockSize, sampleRate);
juce::int64 pos = 0;
while (pos < numTargetSamples)
{
resampler->getNextAudioBlock(info);
writer->writeFromAudioSampleBuffer(buffer, 0, blockSize);
pos += blockSize;
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment