Final C++ project: a CLI WAV sound processor with a filter pipeline.
The project intentionally supports the assignment format only:
- PCM
- mono
- 44100 Hz
- signed 16-bit samples
cmake -S . -B build
cmake --build build./build/sound_processor/sound_processor [-i input.wav] [-o output.wav] [-f filter [params...]]...Examples:
./build/sound_processor/sound_processor -i input_example.wav -f lowpass 101 -f ampl 10 -o output_example.wav
./build/sound_processor/sound_processor -o sine.wav -f generator sin 440 2000 -f fade in 250
./build/sound_processor/sound_processor -i input_example.wav -o output_example.wav -f lowpass 5 -f normalize 0.9./build/sound_processor/sound_processor -c pipeline.jsonExample JSON:
{
"output": "sine.wav",
"filters": [
{ "name": "generator", "params": ["sin", 440, 2000] },
{ "name": "fade", "params": ["in", 250] },
{ "name": "ampl", "params": [0.8] }
]
}Required transform filters:
ampl factornormalize [peak]silence unit start end, whereunitissecormstimestretch factorlowpass window_size
Required generators:
generator sin frequency_hz duration_msgenerator am amplitude carrier_hz modulation_hz depth duration_msgenerator fm amplitude carrier_hz modulation_hz deviation_hz duration_ms
Extra custom filters:
fade in duration_msfade out duration_msreverse
The code is split by responsibility:
app: application orchestration, result codes and loggingcli: command-line parsing and filter descriptorswav: WAV reader/writer and waveform modelfiltering:IFilter,Pipeline, registry and factoryfilters: concrete filters and generatorsjson: JSON pipeline loadertests: unit-style tests for core components
Filters are created through FilterRegistry, so adding a new filter does not require changing parser or pipeline logic.
cmake --build build
./build/sound_processor/sound_processor_tests
cd build && ctest --output-on-failure