@@ -1,8 +1,7 @@ | |||
ARCH ?= lin | |||
FLAGS = -fPIC -g -Wall -O3 -msse -mfpmath=sse -ffast-math \ | |||
FLAGS += \ | |||
-fshort-enums -DTEST \ | |||
-I./src -I../../include -I./eurorack \ | |||
-I./eurorack \ | |||
-Wno-unused-local-typedefs | |||
@@ -45,33 +44,4 @@ SOURCES = $(wildcard src/*.cpp) \ | |||
eurorack/warps/dsp/filter_bank.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 | |||
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; | |||
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); | |||
// Set pitch | |||
@@ -54,33 +54,44 @@ struct Rings : Module { | |||
bool strum = false; | |||
bool lastStrum = false; | |||
float lights[2] = {}; | |||
Trigger polyphonyTrigger; | |||
Trigger modelTrigger; | |||
SchmittTrigger polyphonyTrigger; | |||
SchmittTrigger modelTrigger; | |||
int polyphonyMode = 0; | |||
int model = 0; | |||
Rings(); | |||
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) { | |||
polyphonyMode = json_integer_value(polyphonyJ); | |||
} | |||
json_t *modelJ = json_object_get(root, "model"); | |||
json_t *modelJ = json_object_get(rootJ, "model"); | |||
if (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); | |||
part.Init(reverb_buffer); | |||
string_synth.Init(reverb_buffer); | |||
polyphonyTrigger.setThresholds(0.0, 1.0); | |||
modelTrigger.setThresholds(0.0, 1.0); | |||
} | |||
void Rings::step() { | |||
@@ -42,31 +42,42 @@ struct Tides : Module { | |||
float lights[3] = {}; | |||
int frame = 0; | |||
uint8_t lastGate; | |||
Trigger modeTrigger; | |||
Trigger rangeTrigger; | |||
SchmittTrigger modeTrigger; | |||
SchmittTrigger rangeTrigger; | |||
Tides(); | |||
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) { | |||
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) { | |||
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)); | |||
generator.Init(); | |||
generator.set_range(tides::GENERATOR_RANGE_MEDIUM); | |||
generator.set_mode(tides::GENERATOR_MODE_LOOPING); | |||
generator.set_sync(false); | |||
initialize(); | |||
} | |||
void Tides::step() { | |||
// TODO Save / load the state of MODE and RANGE to JSON | |||
tides::GeneratorMode mode = generator.mode(); | |||
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); | |||
} | |||
lights[0] = (float)mode; | |||
tides::GeneratorRange range = generator.range(); | |||
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); | |||
} | |||
lights[2] = (float)range; | |||
@@ -104,12 +114,12 @@ void Tides::step() { | |||
// Pitch | |||
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 += 60.0; | |||
// Scale to the global sample rate | |||
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 | |||
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; | |||
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[LOW_OUTPUT], sample.flags & tides::FLAG_END_OF_RELEASE ? 0.0 : 5.0); | |||
@@ -178,7 +188,7 @@ struct TidesModeLight : ModeValueLight { | |||
TidesWidget::TidesWidget() { | |||
Tides *module = new Tides(); | |||
setModule(module); | |||
box.size = Vec(15*14, 380); | |||
box.size = Vec(15 * 14, 380); | |||
{ | |||
Panel *panel = new LightPanel(); | |||
@@ -32,24 +32,35 @@ struct Warps : Module { | |||
warps::ShortFrame inputFrames[60] = {}; | |||
warps::ShortFrame outputFrames[60] = {}; | |||
float lights[1] = {}; | |||
Trigger stateTrigger; | |||
SchmittTrigger stateTrigger; | |||
Warps(); | |||
void step(); | |||
json_t *toJsonData() { | |||
json_t *root = json_object(); | |||
json_t *toJson() { | |||
json_t *rootJ = json_object(); | |||
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(); | |||
if (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)); | |||
modulator.Init(96000.0f); | |||
stateTrigger.setThresholds(0.0, 1.0); | |||
} | |||
void Warps::step() { | |||