Browse Source

Fix Delay, add libsamplerate to Fundamental build system

tags/v0.6.0
Andrew Belt 7 years ago
parent
commit
88d5cc09a4
5 changed files with 36 additions and 16 deletions
  1. +3
    -0
      .gitmodules
  2. +11
    -0
      Makefile
  3. +1
    -0
      dep/libsamplerate
  4. +20
    -15
      src/Delay.cpp
  5. +1
    -1
      src/VCMixer.cpp

+ 3
- 0
.gitmodules View File

@@ -0,0 +1,3 @@
[submodule "dep/libsamplerate"]
path = dep/libsamplerate
url = https://github.com/erikd/libsamplerate.git

+ 11
- 0
Makefile View File

@@ -5,5 +5,16 @@ SOURCES += $(wildcard src/*.cpp)


DISTRIBUTABLES += $(wildcard LICENSE*) res DISTRIBUTABLES += $(wildcard LICENSE*) res


FLAGS += -Idep/libsamplerate/src
LDFLAGS += -Ldep/libsamplerate/src/.libs -l:libsamplerate.a

libsamplerate = dep/libsamplerate/src/.libs/libsamplerate.a
$(libsamplerate):
cd dep/libsamplerate && ./autogen.sh
cd dep/libsamplerate && CFLAGS=-fPIC ./configure
cd dep/libsamplerate && $(MAKE)

RESOURCES += $(libsamplerate)

RACK_DIR ?= ../.. RACK_DIR ?= ../..
include $(RACK_DIR)/plugin.mk include $(RACK_DIR)/plugin.mk

+ 1
- 0
dep/libsamplerate

@@ -0,0 +1 @@
Subproject commit 56c3897f605dbfbd3db55f46866275823c9ba4bd

+ 20
- 15
src/Delay.cpp View File

@@ -2,6 +2,7 @@
#include "dsp/samplerate.hpp" #include "dsp/samplerate.hpp"
#include "dsp/ringbuffer.hpp" #include "dsp/ringbuffer.hpp"
#include "dsp/filter.hpp" #include "dsp/filter.hpp"
#include "samplerate.h"




#define HISTORY_SIZE (1<<21) #define HISTORY_SIZE (1<<21)
@@ -29,12 +30,19 @@ struct Delay : Module {


DoubleRingBuffer<float, HISTORY_SIZE> historyBuffer; DoubleRingBuffer<float, HISTORY_SIZE> historyBuffer;
DoubleRingBuffer<float, 16> outBuffer; DoubleRingBuffer<float, 16> outBuffer;
SampleRateConverter<1> src;
SRC_STATE *src;
float lastWet = 0.0f; float lastWet = 0.0f;
RCFilter lowpassFilter; RCFilter lowpassFilter;
RCFilter highpassFilter; RCFilter highpassFilter;


Delay() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {}
Delay() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {
src = src_new(SRC_SINC_FASTEST, 1, NULL);
assert(src);
}

~Delay() {
src_delete(src);
}


void step() override; void step() override;
}; };
@@ -60,9 +68,6 @@ void Delay::step() {


// How many samples do we need consume to catch up? // How many samples do we need consume to catch up?
float consume = index - historyBuffer.size(); float consume = index - historyBuffer.size();
// printf("%f\t%d\t%f\n", index, historyBuffer.size(), consume);

// printf("wanted: %f\tactual: %d\tdiff: %d\tratio: %f\n", index, historyBuffer.size(), consume, index / historyBuffer.size());
if (outBuffer.empty()) { if (outBuffer.empty()) {
double ratio = 1.0f; double ratio = 1.0f;
if (consume <= -16) if (consume <= -16)
@@ -70,16 +75,16 @@ void Delay::step() {
else if (consume >= 16) else if (consume >= 16)
ratio = 2.0f; ratio = 2.0f;


// printf("%f\t%lf\n", consume, ratio);
int inFrames = min(historyBuffer.size(), 16);
int outFrames = outBuffer.capacity();
// printf(">\t%d\t%d\n", inFrames, outFrames);
src.setRates(ratio * engineGetSampleRate(), engineGetSampleRate());
src.process((const Frame<1>*)historyBuffer.startData(), &inFrames, (Frame<1>*)outBuffer.endData(), &outFrames);
historyBuffer.startIncr(inFrames);
outBuffer.endIncr(outFrames);
// printf("<\t%d\t%d\n", inFrames, outFrames);
// printf("====================================\n");
SRC_DATA srcData;
srcData.data_in = (const float*) historyBuffer.startData();
srcData.data_out = (float*) outBuffer.endData();
srcData.input_frames = min(historyBuffer.size(), 16);
srcData.output_frames = outBuffer.capacity();
srcData.end_of_input = false;
srcData.src_ratio = ratio;
src_process(src, &srcData);
historyBuffer.startIncr(srcData.input_frames_used);
outBuffer.endIncr(srcData.output_frames_gen);
} }


float wet = 0.0f; float wet = 0.0f;


+ 1
- 1
src/VCMixer.cpp View File

@@ -25,7 +25,7 @@ struct VCMixer : Module {
float mix = 0.f; float mix = 0.f;
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
float ch = inputs[CH_INPUT + i].value; float ch = inputs[CH_INPUT + i].value;
ch *= powf(params[LVL_PARAM + i].value, 3.f);
ch *= powf(params[LVL_PARAM + i].value, 2.f);
ch *= clamp(inputs[CV_INPUT + i].normalize(10.f) / 10.f, 0.f, 1.f); ch *= clamp(inputs[CV_INPUT + i].normalize(10.f) / 10.f, 0.f, 1.f);
outputs[CH_OUTPUT + i].value = ch; outputs[CH_OUTPUT + i].value = ch;
mix += ch; mix += ch;


Loading…
Cancel
Save