MCPcopy Create free account
hub / github.com/Signalsmith-Audio/reverb-example-code / multiProcessor

Method multiProcessor

main.cpp:36–80  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

34
35 template<int channels, bool averageOutputs=true, class Processor>
36 void multiProcessor(std::string name, Processor &&processor) {
37 static_assert(channels%2 == 0, "there must be an even number of channels");
38
39 Wav outputWav;
40 outputWav.sampleRate = inputWav.sampleRate;
41 outputWav.channels = 2;
42
43 srand(1);
44 processor.configure(outputWav.sampleRate);
45
46 int durationSamples = inputWav.samples.size()/inputWav.channels;
47 outputWav.samples.resize(durationSamples*2);
48 for (int i = 0; i < durationSamples; ++i) {
49
50 // Duplicate input channels as many times as needed
51 std::array<double, channels> array;
52 for (int c = 0; c < channels; ++c) {
53 int inputChannel = c%inputWav.channels;
54 array[c] = inputWav.samples[i*inputWav.channels + inputChannel];
55 }
56
57 array = processor.process(array);
58
59 if (averageOutputs) {
60 // Mix down into stereo for example output
61 double left = 0, right = 0;
62 for (int c = 0; c < channels; c += 2) {
63 left += array[c];
64 right += array[c + 1];
65 }
66
67 constexpr double scaling = 2.0/channels;
68 outputWav.samples[2*i] = left*scaling;
69 outputWav.samples[2*i + 1] = right*scaling;
70 } else {
71 outputWav.samples[2*i] = array[0];
72 outputWav.samples[2*i + 1] = array[1];
73 }
74 }
75 outputWav.write(outputPrefix + name + ".wav");
76 if (!outputWav.result) {
77 std::cerr << outputWav.result.reason << "\n";
78 std::exit(1);
79 }
80 }
81
82 void extendDuration(double seconds) {
83 int extraSamples = seconds*inputWav.sampleRate;

Callers

nothing calls this directly

Calls 3

writeMethod · 0.80
configureMethod · 0.45
processMethod · 0.45

Tested by

no test coverage detected