Compare commits
1 Commits
main
...
feature/as
| Author | SHA1 | Date | |
|---|---|---|---|
| 103513b186 |
@ -7,7 +7,7 @@ include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
signalsmith-linear
|
||||
GIT_REPOSITORY https://github.com/Signalsmith-Audio/linear.git
|
||||
GIT_TAG 0.2.3
|
||||
GIT_TAG 0.2.4
|
||||
GIT_SHALLOW ON
|
||||
)
|
||||
FetchContent_MakeAvailable(signalsmith-linear)
|
||||
|
||||
26
cmd/Makefile
26
cmd/Makefile
@ -11,19 +11,19 @@ out/stretch: main.cpp ../signalsmith-stretch.h util/*.h util/*.hxx
|
||||
# Uses input files from: https://signalsmith-audio.co.uk/code/stretch/inputs.zip
|
||||
examples: out/stretch
|
||||
mkdir -p out/examples
|
||||
inputs/run-all.sh out/examples/u2- out/stretch --semitones=2
|
||||
inputs/run-all.sh out/examples/d2- out/stretch --semitones=-2
|
||||
inputs/run-all.sh out/examples/u4- out/stretch --semitones=4
|
||||
inputs/run-all.sh out/examples/d4- out/stretch --semitones=-4
|
||||
inputs/run-all.sh out/examples/u8- out/stretch --semitones=8
|
||||
inputs/run-all.sh out/examples/d8- out/stretch --semitones=-8
|
||||
inputs/run-all.sh out/examples/u16- out/stretch --semitones=16
|
||||
inputs/run-all.sh out/examples/d16- out/stretch --semitones=-16
|
||||
inputs/run-all.sh out/examples/t_8- out/stretch --time=0.8
|
||||
inputs/run-all.sh out/examples/t1_2- out/stretch --time=1.2
|
||||
inputs/run-all.sh out/examples/t1_5- out/stretch --time=1.5
|
||||
inputs/run-all.sh out/examples/t2- out/stretch --time=2
|
||||
inputs/run-all.sh out/examples/t4- out/stretch --time=4
|
||||
inputs/run-all.sh out/examples/u2- out/stretch --semitones=2 --asymmetry=0.5
|
||||
inputs/run-all.sh out/examples/d2- out/stretch --semitones=-2 --asymmetry=0.5
|
||||
inputs/run-all.sh out/examples/u4- out/stretch --semitones=4 --asymmetry=0.5
|
||||
inputs/run-all.sh out/examples/d4- out/stretch --semitones=-4 --asymmetry=0.5
|
||||
inputs/run-all.sh out/examples/u8- out/stretch --semitones=8 --asymmetry=0.5
|
||||
inputs/run-all.sh out/examples/d8- out/stretch --semitones=-8 --asymmetry=0.5
|
||||
inputs/run-all.sh out/examples/u16- out/stretch --semitones=16 --asymmetry=0.5
|
||||
inputs/run-all.sh out/examples/d16- out/stretch --semitones=-16 --asymmetry=0.5
|
||||
inputs/run-all.sh out/examples/t_8- out/stretch --time=0.8 --asymmetry=0.5
|
||||
inputs/run-all.sh out/examples/t1_2- out/stretch --time=1.2 --asymmetry=0.5
|
||||
inputs/run-all.sh out/examples/t1_5- out/stretch --time=1.5 --asymmetry=0.5
|
||||
inputs/run-all.sh out/examples/t2- out/stretch --time=2 --asymmetry=0.5
|
||||
inputs/run-all.sh out/examples/t4- out/stretch --time=4 --asymmetry=0.5
|
||||
|
||||
TEST_WAV ?= "inputs/voice.wav"
|
||||
|
||||
|
||||
@ -19,12 +19,13 @@ int main(int argc, char* argv[]) {
|
||||
|
||||
std::string inputWav = args.arg<std::string>("input.wav", "16-bit WAV file");
|
||||
std::string outputWav = args.arg<std::string>("output.wav", "output WAV file");
|
||||
double time = args.flag<double>("time", "time-stretch factor", 1);
|
||||
double semitones = args.flag<double>("semitones", "pitch-shift amount", 0);
|
||||
double formants = args.flag<double>("formant", "formant-shift amount (semitones)", 0);
|
||||
bool formantComp = args.hasFlag("formant-comp", "formant compensation");
|
||||
double formantBase = args.flag<double>("formant-base", "formant base frequency (Hz, 0=auto)", 100);
|
||||
double tonality = args.flag<double>("tonality", "tonality limit (Hz)", 8000);
|
||||
double time = args.flag<double>("time", "time-stretch factor", 1);
|
||||
double asymmetry = args.flag<double>("asymmetry", "asymmetrical STFT analysis (0-1)", 0);
|
||||
bool splitComputation = args.hasFlag("split-computation", "distributes the computation more evenly (but higher latency)");
|
||||
args.errorExit(); // exits on error, or with `--help`
|
||||
|
||||
@ -42,7 +43,7 @@ int main(int argc, char* argv[]) {
|
||||
outWav.resize(outputLength);
|
||||
|
||||
SignalsmithStretch stretch;
|
||||
stretch.presetDefault(int(inWav.channels), inWav.sampleRate, splitComputation);
|
||||
stretch.configure(int(inWav.channels), inWav.sampleRate*0.12, inWav.sampleRate*0.03, splitComputation, asymmetry);
|
||||
stretch.setTransposeSemitones(semitones, tonality/inWav.sampleRate);
|
||||
stretch.setFormantSemitones(formants, formantComp);
|
||||
stretch.setFormantBase(formantBase/inWav.sampleRate);
|
||||
|
||||
@ -68,11 +68,12 @@ struct SignalsmithStretch {
|
||||
}
|
||||
|
||||
// Manual setup
|
||||
void configure(int nChannels, int blockSamples, int intervalSamples, bool splitComputation=false) {
|
||||
void configure(int nChannels, int blockSamples, int intervalSamples, bool splitComputation=false, Sample asymmetry=0) {
|
||||
_splitComputation = splitComputation;
|
||||
channels = nChannels;
|
||||
asymmetry *= 1 - 2.0*intervalSamples/blockSamples; // maximum asymmetry gives latency of two intervals
|
||||
stft.configure(channels, channels, blockSamples, intervalSamples + 1);
|
||||
stft.setInterval(intervalSamples, stft.kaiser);
|
||||
stft.setInterval(intervalSamples, stft.kaiser, asymmetry);
|
||||
stft.reset(0.1);
|
||||
stashedInput = stft.input;
|
||||
stashedOutput = stft.output;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user