@@ -1,8 +1,7 @@ | |||||
ARCH ?= lin | |||||
FLAGS = -fPIC -g -Wall -O3 -msse -mfpmath=sse -ffast-math \ | |||||
FLAGS += \ | |||||
-fshort-enums -DTEST \ | -fshort-enums -DTEST \ | ||||
-I./src -I../../include -I./eurorack \ | |||||
-I./eurorack \ | |||||
-Wno-unused-local-typedefs | -Wno-unused-local-typedefs | ||||
@@ -45,33 +44,4 @@ SOURCES = $(wildcard src/*.cpp) \ | |||||
eurorack/warps/dsp/filter_bank.cc \ | eurorack/warps/dsp/filter_bank.cc \ | ||||
eurorack/warps/resources.cc | eurorack/warps/resources.cc | ||||
ifeq ($(ARCH), lin) | |||||
LDFLAGS += -shared | |||||
TARGET = plugin.so | |||||
endif | |||||
ifeq ($(ARCH), mac) | |||||
LDFLAGS += -shared -undefined dynamic_lookup | |||||
TARGET = plugin.dylib | |||||
endif | |||||
ifeq ($(ARCH), win) | |||||
LDFLAGS += -shared -L../../ -lRack | |||||
TARGET = plugin.dll | |||||
endif | |||||
all: $(TARGET) | |||||
dist: $(TARGET) | |||||
mkdir -p dist/AudibleInstruments | |||||
cp LICENSE* dist/AudibleInstruments/ | |||||
cp plugin.* dist/AudibleInstruments/ | |||||
cp -R res dist/AudibleInstruments/ | |||||
clean: | |||||
rm -rfv build $(TARGET) dist | |||||
include ../../Makefile.inc | |||||
include ../../plugin.mk |
@@ -71,8 +71,8 @@ void Braids::step() { | |||||
// Set timbre/modulation | // Set timbre/modulation | ||||
float timbre = params[TIMBRE_PARAM] + params[MODULATION_PARAM] * getf(inputs[TIMBRE_INPUT]) / 5.0; | float timbre = params[TIMBRE_PARAM] + params[MODULATION_PARAM] * getf(inputs[TIMBRE_INPUT]) / 5.0; | ||||
float modulation = params[COLOR_PARAM] + getf(inputs[COLOR_INPUT]) / 5.0; | float modulation = params[COLOR_PARAM] + getf(inputs[COLOR_INPUT]) / 5.0; | ||||
int16_t param1 = mapf(clampf(timbre, 0.0, 1.0), 0.0, 1.0, 0, INT16_MAX); | |||||
int16_t param2 = mapf(clampf(modulation, 0.0, 1.0), 0.0, 1.0, 0, INT16_MAX); | |||||
int16_t param1 = rescalef(clampf(timbre, 0.0, 1.0), 0.0, 1.0, 0, INT16_MAX); | |||||
int16_t param2 = rescalef(clampf(modulation, 0.0, 1.0), 0.0, 1.0, 0, INT16_MAX); | |||||
osc->set_parameters(param1, param2); | osc->set_parameters(param1, param2); | ||||
// Set pitch | // Set pitch | ||||
@@ -54,33 +54,44 @@ struct Rings : Module { | |||||
bool strum = false; | bool strum = false; | ||||
bool lastStrum = false; | bool lastStrum = false; | ||||
float lights[2] = {}; | float lights[2] = {}; | ||||
Trigger polyphonyTrigger; | |||||
Trigger modelTrigger; | |||||
SchmittTrigger polyphonyTrigger; | |||||
SchmittTrigger modelTrigger; | |||||
int polyphonyMode = 0; | int polyphonyMode = 0; | ||||
int model = 0; | int model = 0; | ||||
Rings(); | Rings(); | ||||
void step(); | void step(); | ||||
json_t *toJsonData() { | |||||
json_t *root = json_object(); | |||||
json_t *toJson() { | |||||
json_t *rootJ = json_object(); | |||||
json_object_set_new(root, "polyphony", json_integer(polyphonyMode)); | |||||
json_object_set_new(root, "model", json_integer(model)); | |||||
json_object_set_new(rootJ, "polyphony", json_integer(polyphonyMode)); | |||||
json_object_set_new(rootJ, "model", json_integer(model)); | |||||
return root; | |||||
return rootJ; | |||||
} | } | ||||
void fromJsonData(json_t *root) { | |||||
json_t *polyphonyJ = json_object_get(root, "polyphony"); | |||||
void fromJson(json_t *rootJ) { | |||||
json_t *polyphonyJ = json_object_get(rootJ, "polyphony"); | |||||
if (polyphonyJ) { | if (polyphonyJ) { | ||||
polyphonyMode = json_integer_value(polyphonyJ); | polyphonyMode = json_integer_value(polyphonyJ); | ||||
} | } | ||||
json_t *modelJ = json_object_get(root, "model"); | |||||
json_t *modelJ = json_object_get(rootJ, "model"); | |||||
if (modelJ) { | if (modelJ) { | ||||
model = json_integer_value(modelJ); | model = json_integer_value(modelJ); | ||||
} | } | ||||
} | } | ||||
void initialize() { | |||||
polyphonyMode = 0; | |||||
model = 0; | |||||
} | |||||
void randomize() { | |||||
polyphonyMode = randomu32() % 3; | |||||
model = randomu32() % 3; | |||||
} | |||||
}; | }; | ||||
@@ -96,6 +107,9 @@ Rings::Rings() { | |||||
strummer.Init(0.01, 44100.0 / 24); | strummer.Init(0.01, 44100.0 / 24); | ||||
part.Init(reverb_buffer); | part.Init(reverb_buffer); | ||||
string_synth.Init(reverb_buffer); | string_synth.Init(reverb_buffer); | ||||
polyphonyTrigger.setThresholds(0.0, 1.0); | |||||
modelTrigger.setThresholds(0.0, 1.0); | |||||
} | } | ||||
void Rings::step() { | void Rings::step() { | ||||
@@ -42,31 +42,42 @@ struct Tides : Module { | |||||
float lights[3] = {}; | float lights[3] = {}; | ||||
int frame = 0; | int frame = 0; | ||||
uint8_t lastGate; | uint8_t lastGate; | ||||
Trigger modeTrigger; | |||||
Trigger rangeTrigger; | |||||
SchmittTrigger modeTrigger; | |||||
SchmittTrigger rangeTrigger; | |||||
Tides(); | Tides(); | ||||
void step(); | void step(); | ||||
json_t *toJsonData() { | |||||
json_t *root = json_object(); | |||||
json_t *toJson() { | |||||
json_t *rootJ = json_object(); | |||||
json_object_set_new(root, "mode", json_integer((int)generator.mode())); | |||||
json_object_set_new(root, "range", json_integer((int)generator.range())); | |||||
json_object_set_new(rootJ, "mode", json_integer((int) generator.mode())); | |||||
json_object_set_new(rootJ, "range", json_integer((int) generator.range())); | |||||
return root; | |||||
return rootJ; | |||||
} | } | ||||
void fromJsonData(json_t *root) { | |||||
json_t *modeJ = json_object_get(root, "mode"); | |||||
void fromJson(json_t *rootJ) { | |||||
json_t *modeJ = json_object_get(rootJ, "mode"); | |||||
if (modeJ) { | if (modeJ) { | ||||
generator.set_mode((tides::GeneratorMode)json_integer_value(modeJ)); | |||||
generator.set_mode((tides::GeneratorMode) json_integer_value(modeJ)); | |||||
} | } | ||||
json_t *rangeJ = json_object_get(root, "range"); | |||||
json_t *rangeJ = json_object_get(rootJ, "range"); | |||||
if (rangeJ) { | if (rangeJ) { | ||||
generator.set_range((tides::GeneratorRange)json_integer_value(rangeJ)); | |||||
generator.set_range((tides::GeneratorRange) json_integer_value(rangeJ)); | |||||
} | } | ||||
} | } | ||||
void initialize() { | |||||
generator.set_range(tides::GENERATOR_RANGE_MEDIUM); | |||||
generator.set_mode(tides::GENERATOR_MODE_LOOPING); | |||||
} | |||||
void randomize() { | |||||
generator.set_range((tides::GeneratorRange) (randomu32() % 3)); | |||||
generator.set_mode((tides::GeneratorMode) (randomu32() % 3)); | |||||
} | |||||
}; | }; | ||||
@@ -77,23 +88,22 @@ Tides::Tides() { | |||||
memset(&generator, 0, sizeof(generator)); | memset(&generator, 0, sizeof(generator)); | ||||
generator.Init(); | generator.Init(); | ||||
generator.set_range(tides::GENERATOR_RANGE_MEDIUM); | |||||
generator.set_mode(tides::GENERATOR_MODE_LOOPING); | |||||
generator.set_sync(false); | generator.set_sync(false); | ||||
initialize(); | |||||
} | } | ||||
void Tides::step() { | void Tides::step() { | ||||
// TODO Save / load the state of MODE and RANGE to JSON | // TODO Save / load the state of MODE and RANGE to JSON | ||||
tides::GeneratorMode mode = generator.mode(); | tides::GeneratorMode mode = generator.mode(); | ||||
if (modeTrigger.process(params[MODE_PARAM])) { | if (modeTrigger.process(params[MODE_PARAM])) { | ||||
mode = (tides::GeneratorMode) (((int)mode + 2) % 3); | |||||
mode = (tides::GeneratorMode) (((int)mode - 1 + 3) % 3); | |||||
generator.set_mode(mode); | generator.set_mode(mode); | ||||
} | } | ||||
lights[0] = (float)mode; | lights[0] = (float)mode; | ||||
tides::GeneratorRange range = generator.range(); | tides::GeneratorRange range = generator.range(); | ||||
if (rangeTrigger.process(params[RANGE_PARAM])) { | if (rangeTrigger.process(params[RANGE_PARAM])) { | ||||
range = (tides::GeneratorRange) (((int)range + 2) % 3); | |||||
range = (tides::GeneratorRange) (((int)range - 1 + 3) % 3); | |||||
generator.set_range(range); | generator.set_range(range); | ||||
} | } | ||||
lights[2] = (float)range; | lights[2] = (float)range; | ||||
@@ -104,12 +114,12 @@ void Tides::step() { | |||||
// Pitch | // Pitch | ||||
float pitch = params[FREQUENCY_PARAM]; | float pitch = params[FREQUENCY_PARAM]; | ||||
pitch += 12.0*getf(inputs[PITCH_INPUT]); | |||||
pitch += 12.0 * getf(inputs[PITCH_INPUT]); | |||||
pitch += params[FM_PARAM] * getf(inputs[FM_INPUT], 0.1) / 5.0; | pitch += params[FM_PARAM] * getf(inputs[FM_INPUT], 0.1) / 5.0; | ||||
pitch += 60.0; | pitch += 60.0; | ||||
// Scale to the global sample rate | // Scale to the global sample rate | ||||
pitch += log2f(48000.0 / gSampleRate) * 12.0; | pitch += log2f(48000.0 / gSampleRate) * 12.0; | ||||
generator.set_pitch(clampf(pitch*0x80, -0x8000, 0x7fff)); | |||||
generator.set_pitch(clampf(pitch * 0x80, -0x8000, 0x7fff)); | |||||
// Slope, smoothness, pitch | // Slope, smoothness, pitch | ||||
int16_t shape = clampf(params[SHAPE_PARAM] + getf(inputs[SHAPE_INPUT]) / 5.0, -1.0, 1.0) * 0x7fff; | int16_t shape = clampf(params[SHAPE_PARAM] + getf(inputs[SHAPE_INPUT]) / 5.0, -1.0, 1.0) * 0x7fff; | ||||
@@ -154,8 +164,8 @@ void Tides::step() { | |||||
uni = uni * level >> 16; | uni = uni * level >> 16; | ||||
bi = -bi * level >> 16; | bi = -bi * level >> 16; | ||||
float unif = mapf(uni, 0, 0xffff, 0.0, 8.0); | |||||
float bif = mapf(bi, -0x8000, 0x7fff, -5.0, 5.0); | |||||
float unif = rescalef(uni, 0, 0xffff, 0.0, 8.0); | |||||
float bif = rescalef(bi, -0x8000, 0x7fff, -5.0, 5.0); | |||||
setf(outputs[HIGH_OUTPUT], sample.flags & tides::FLAG_END_OF_ATTACK ? 0.0 : 5.0); | setf(outputs[HIGH_OUTPUT], sample.flags & tides::FLAG_END_OF_ATTACK ? 0.0 : 5.0); | ||||
setf(outputs[LOW_OUTPUT], sample.flags & tides::FLAG_END_OF_RELEASE ? 0.0 : 5.0); | setf(outputs[LOW_OUTPUT], sample.flags & tides::FLAG_END_OF_RELEASE ? 0.0 : 5.0); | ||||
@@ -178,7 +188,7 @@ struct TidesModeLight : ModeValueLight { | |||||
TidesWidget::TidesWidget() { | TidesWidget::TidesWidget() { | ||||
Tides *module = new Tides(); | Tides *module = new Tides(); | ||||
setModule(module); | setModule(module); | ||||
box.size = Vec(15*14, 380); | |||||
box.size = Vec(15 * 14, 380); | |||||
{ | { | ||||
Panel *panel = new LightPanel(); | Panel *panel = new LightPanel(); | ||||
@@ -32,24 +32,35 @@ struct Warps : Module { | |||||
warps::ShortFrame inputFrames[60] = {}; | warps::ShortFrame inputFrames[60] = {}; | ||||
warps::ShortFrame outputFrames[60] = {}; | warps::ShortFrame outputFrames[60] = {}; | ||||
float lights[1] = {}; | float lights[1] = {}; | ||||
Trigger stateTrigger; | |||||
SchmittTrigger stateTrigger; | |||||
Warps(); | Warps(); | ||||
void step(); | void step(); | ||||
json_t *toJsonData() { | |||||
json_t *root = json_object(); | |||||
json_t *toJson() { | |||||
json_t *rootJ = json_object(); | |||||
warps::Parameters *p = modulator.mutable_parameters(); | warps::Parameters *p = modulator.mutable_parameters(); | ||||
json_object_set_new(root, "shape", json_integer(p->carrier_shape)); | |||||
return root; | |||||
json_object_set_new(rootJ, "shape", json_integer(p->carrier_shape)); | |||||
return rootJ; | |||||
} | } | ||||
void fromJsonData(json_t *root) { | |||||
json_t *shapeJ = json_object_get(root, "shape"); | |||||
void fromJson(json_t *rootJ) { | |||||
json_t *shapeJ = json_object_get(rootJ, "shape"); | |||||
warps::Parameters *p = modulator.mutable_parameters(); | warps::Parameters *p = modulator.mutable_parameters(); | ||||
if (shapeJ) { | if (shapeJ) { | ||||
p->carrier_shape = json_integer_value(shapeJ); | p->carrier_shape = json_integer_value(shapeJ); | ||||
} | } | ||||
} | } | ||||
void initialize() { | |||||
warps::Parameters *p = modulator.mutable_parameters(); | |||||
p->carrier_shape = 0; | |||||
} | |||||
void randomize() { | |||||
warps::Parameters *p = modulator.mutable_parameters(); | |||||
p->carrier_shape = randomu32() % 4; | |||||
} | |||||
}; | }; | ||||
@@ -60,6 +71,8 @@ Warps::Warps() { | |||||
memset(&modulator, 0, sizeof(modulator)); | memset(&modulator, 0, sizeof(modulator)); | ||||
modulator.Init(96000.0f); | modulator.Init(96000.0f); | ||||
stateTrigger.setThresholds(0.0, 1.0); | |||||
} | } | ||||
void Warps::step() { | void Warps::step() { | ||||