diff --git a/plugins/community/repos/AS/AS.JPG b/plugins/community/repos/AS/AS.JPG
index a298f7c7..722d607d 100644
Binary files a/plugins/community/repos/AS/AS.JPG and b/plugins/community/repos/AS/AS.JPG differ
diff --git a/plugins/community/repos/AS/Makefile b/plugins/community/repos/AS/Makefile
index 4a0d6fec..2c320e1f 100644
--- a/plugins/community/repos/AS/Makefile
+++ b/plugins/community/repos/AS/Makefile
@@ -1,6 +1,6 @@
RACK_DIR ?= ../..
SLUG = AS
-VERSION = 0.6.8
+VERSION = 0.6.9
FLAGS +=
SOURCES += $(wildcard src/*.cpp freeverb/*.cpp)
diff --git a/plugins/community/repos/AS/README.md b/plugins/community/repos/AS/README.md
index 6b17386c..b69c547b 100644
--- a/plugins/community/repos/AS/README.md
+++ b/plugins/community/repos/AS/README.md
@@ -132,6 +132,21 @@ V 0.5.7: First relase of this module.
V 0.6.5: Added "RUN" label at the end of the list.
+### Triggers MKIII
+A manual CV signal temporary trigger module with labeling integrated, now you can type directly the labels you want to use. Also added a handy second EXT input.
+
+V 0.6.9: First relase of this module.
+
+### ReScale
+Utility module to convert from one voltage range to another, available inputs are:
+ -5v/5v, 0v/5v, 0v/10v, 1V/OCT*.
+ Available output signal options are:
+ -5v/5v, 0v/5v, -10v/10v, 0v/10v*
+ *1V/OCT option is to convert any voltage source to 1 octave 1V/OCT range.
+
+
+V 0.6.9: First relase of this module.
+
### Steps
Strum's Mental VCV Counters module. Mods: graphics, 3 counters, up to 64 steps each, added reset lights to the buttons.
@@ -160,11 +175,15 @@ V 0.6.0: First relase of this module.
V 0.6.5: Now it features soft mute, so you can use it both for audio and cv signals without any switching noise.
+V 0.6.9: Switch selector added to reverse the default ON/OFF swtiches light behavior(by usrer request).
+
### Signal Delay
Delay the incomming CV signal by set milliseconds, with signal thru and delayed output. You can chain several Signal Delay modules together for unlimited length of delays. (TAOS request).
V 0.5.5: First relase of this module.
+V 0.6,9: Small fix on the ms CV input to take the proper values fron BPM calc module.
+
### CV 2 T
CV to Trigger module. Feed a midi signal to the CV inputs and it will output one trigger signal when the incoming signal rises above 0v, and another trigger signal when the incoming signal returns to 0v. Useful to use your external hardware controller/keyboard as a trigger.
diff --git a/plugins/community/repos/AS/make.objects b/plugins/community/repos/AS/make.objects
index 29822631..59da9f43 100644
--- a/plugins/community/repos/AS/make.objects
+++ b/plugins/community/repos/AS/make.objects
@@ -20,6 +20,7 @@ ALL_OBJ= \
src/Multiple2_5.o \
src/Phaser.o \
src/QuadVCA.o \
+ src/ReScale.o \
src/Reverb.o \
src/ReverbStereo.o \
src/SEQ16.o \
@@ -33,6 +34,7 @@ ALL_OBJ= \
src/TriLFO.o \
src/TriggersMKI.o \
src/TriggersMKII.o \
+ src/TriggersMKIII.o \
src/VCA.o \
src/WaveShaper.o \
src/stereoVUmeter.o \
diff --git a/plugins/community/repos/AS/res/Flow.svg b/plugins/community/repos/AS/res/Flow.svg
index 9649656e..c0d817be 100644
--- a/plugins/community/repos/AS/res/Flow.svg
+++ b/plugins/community/repos/AS/res/Flow.svg
@@ -37,11 +37,11 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="1.7258659"
- inkscape:cx="-41.48078"
- inkscape:cy="234.09555"
+ inkscape:zoom="6.2307619"
+ inkscape:cx="59.390478"
+ inkscape:cy="341.3318"
inkscape:document-units="mm"
- inkscape:current-layer="layer3"
+ inkscape:current-layer="g961"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
@@ -49,8 +49,8 @@
fit-margin-bottom="0"
inkscape:window-width="1678"
inkscape:window-height="1334"
- inkscape:window-x="124"
- inkscape:window-y="13"
+ inkscape:window-x="268"
+ inkscape:window-y="0"
inkscape:window-maximized="0"
units="px" />
+ transform="matrix(0.26458333,0,0,0.26458333,-293.56898,-296.47329)">
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/community/repos/AS/res/TriggersMKIII.svg b/plugins/community/repos/AS/res/TriggersMKIII.svg
new file mode 100644
index 00000000..e40d6537
--- /dev/null
+++ b/plugins/community/repos/AS/res/TriggersMKIII.svg
@@ -0,0 +1,368 @@
+
+
+
+
diff --git a/plugins/community/repos/AS/src/ADSR.cpp b/plugins/community/repos/AS/src/ADSR.cpp
index ff502d31..746c0491 100644
--- a/plugins/community/repos/AS/src/ADSR.cpp
+++ b/plugins/community/repos/AS/src/ADSR.cpp
@@ -77,7 +77,7 @@ void ADSR::step() {
env = 1.0f;
}
else {
- env += powf(base, 1 - attack) / maxTime * (1.01 - env) / engineGetSampleRate();
+ env += powf(base, 1 - attack) / maxTime * (1.01f - env) / engineGetSampleRate();
}
if (env >= 1.0f) {
env = 1.0f;
@@ -91,7 +91,7 @@ void ADSR::step() {
env = 0.0f;
}
else {
- env += powf(base, 1 - release) / maxTime * (0.0 - env) / engineGetSampleRate();
+ env += powf(base, 1 - release) / maxTime * (0.0f - env) / engineGetSampleRate();
}
decaying = false;
}
diff --git a/plugins/community/repos/AS/src/AS.cpp b/plugins/community/repos/AS/src/AS.cpp
index bea63148..a8f91b0a 100644
--- a/plugins/community/repos/AS/src/AS.cpp
+++ b/plugins/community/repos/AS/src/AS.cpp
@@ -11,6 +11,7 @@ RACK_PLUGIN_MODEL_DECLARE(AS, BlankPanel6);
RACK_PLUGIN_MODEL_DECLARE(AS, BlankPanel8);
RACK_PLUGIN_MODEL_DECLARE(AS, BlankPanelSpecial);
RACK_PLUGIN_MODEL_DECLARE(AS, Cv2T);
+RACK_PLUGIN_MODEL_DECLARE(AS, ReScale);
RACK_PLUGIN_MODEL_DECLARE(AS, DelayPlusFx);
RACK_PLUGIN_MODEL_DECLARE(AS, DelayPlusStereoFx);
RACK_PLUGIN_MODEL_DECLARE(AS, Flow);
@@ -35,6 +36,7 @@ RACK_PLUGIN_MODEL_DECLARE(AS, TremoloStereoFx);
RACK_PLUGIN_MODEL_DECLARE(AS, TriLFO);
RACK_PLUGIN_MODEL_DECLARE(AS, TriggersMKI);
RACK_PLUGIN_MODEL_DECLARE(AS, TriggersMKII);
+RACK_PLUGIN_MODEL_DECLARE(AS, TriggersMKIII);
RACK_PLUGIN_MODEL_DECLARE(AS, VCA);
RACK_PLUGIN_MODEL_DECLARE(AS, WaveShaper);
RACK_PLUGIN_MODEL_DECLARE(AS, StereoVUmeter);
@@ -42,6 +44,9 @@ RACK_PLUGIN_MODEL_DECLARE(AS, StereoVUmeter);
RACK_PLUGIN_INIT(AS) {
RACK_PLUGIN_INIT_ID();
+ RACK_PLUGIN_INIT_WEBSITE("https://github.com/AScustomWorks/AS");
+ RACK_PLUGIN_INIT_VERSION("0.6.9");
+
//OSCILLATORS
RACK_PLUGIN_MODEL_ADD(AS, SineOsc);
RACK_PLUGIN_MODEL_ADD(AS, SawOsc);
@@ -67,8 +72,10 @@ RACK_PLUGIN_INIT(AS) {
RACK_PLUGIN_MODEL_ADD(AS, Merge2_5);
RACK_PLUGIN_MODEL_ADD(AS, TriggersMKI);
RACK_PLUGIN_MODEL_ADD(AS, TriggersMKII);
+ RACK_PLUGIN_MODEL_ADD(AS, TriggersMKIII);
RACK_PLUGIN_MODEL_ADD(AS, BPMCalc);
RACK_PLUGIN_MODEL_ADD(AS, Cv2T);
+ RACK_PLUGIN_MODEL_ADD(AS, ReScale);
//EFFECTS
RACK_PLUGIN_MODEL_ADD(AS, DelayPlusFx);
diff --git a/plugins/community/repos/AS/src/AS.hpp b/plugins/community/repos/AS/src/AS.hpp
index ccd1b2df..e033d537 100644
--- a/plugins/community/repos/AS/src/AS.hpp
+++ b/plugins/community/repos/AS/src/AS.hpp
@@ -27,30 +27,48 @@ struct as_HexScrew : SVGScrew {
struct as_Knob : SVGKnob {
as_Knob() {
- minAngle = -0.83 * M_PI;
- maxAngle = 0.83 * M_PI;
+ minAngle = float(-0.83 * M_PI);
+ maxAngle = float(0.83 * M_PI);
setSVG( SVG::load(assetPlugin(plugin, "res/as-knob.svg")) );
}
};
struct as_KnobBlack : SVGKnob {
as_KnobBlack() {
- minAngle = -0.83 * M_PI;
- maxAngle = 0.83 * M_PI;
+ minAngle = float(-0.83 * M_PI);
+ maxAngle = float(0.83 * M_PI);
setSVG( SVG::load(assetPlugin(plugin, "res/as-knobBlack.svg")) );
}
};
+struct as_KnobBlackSnap : as_KnobBlack {
+ as_KnobBlackSnap() {
+ snap = true;
+ }
+};
+
+struct as_KnobBlackSnap4 : as_KnobBlack {
+ as_KnobBlackSnap4() {
+ minAngle = float(-0.30 * M_PI);
+ maxAngle = float(0.30 * M_PI);
+ snap = true;
+ }
+};
+
+
+
+
+
struct as_FxKnobWhite : SVGKnob {
as_FxKnobWhite() {
- minAngle = -0.83 * M_PI;
- maxAngle = 0.83 * M_PI;
+ minAngle = float(-0.83 * M_PI);
+ maxAngle = float(0.83 * M_PI);
setSVG( SVG::load(assetPlugin(plugin, "res/as-FxKnobWhite.svg")) );
}
};
struct as_FxKnobBlack : SVGKnob {
as_FxKnobBlack() {
- minAngle = -0.83 * M_PI;
- maxAngle = 0.83 * M_PI;
+ minAngle = float(-0.83 * M_PI);
+ maxAngle = float(0.83 * M_PI);
setSVG( SVG::load(assetPlugin(plugin, "res/as-FxKnobBlack.svg")) );
}
};
diff --git a/plugins/community/repos/AS/src/BPMCalc.cpp b/plugins/community/repos/AS/src/BPMCalc.cpp
index 954088a7..5a23f858 100644
--- a/plugins/community/repos/AS/src/BPMCalc.cpp
+++ b/plugins/community/repos/AS/src/BPMCalc.cpp
@@ -102,10 +102,10 @@ struct BPMCalc : Module {
void calculateValues(float bpm){
millisecondsPerBeat = millisecs/bpm;
- millisecondsPerMeasure = millisecondsPerBeat * 4;
+ millisecondsPerMeasure = millisecondsPerBeat * 4.f;
- secondsPerBeat = 60 / bpm;
- secondsPerMeasure = secondsPerBeat * 4;
+ secondsPerBeat = 60.f / bpm;
+ secondsPerMeasure = secondsPerBeat * 4.f;
bar = (millisecondsPerMeasure);
@@ -121,11 +121,11 @@ struct BPMCalc : Module {
eight_note = millisecondsPerBeat / 2;
eight_note_t = millisecondsPerBeat / 3;
- sixth_note_d = ( millisecondsPerBeat / 4 ) * 1.5;
+ sixth_note_d = ( millisecondsPerBeat / 4.f ) * 1.5f;
sixth_note = millisecondsPerBeat / 4;
sixth_note_t = millisecondsPerBeat / 6;
- trth_note_d = ( millisecondsPerBeat / 8 ) * 1.5;
+ trth_note_d = ( millisecondsPerBeat / 8 ) * 1.5f;
trth_note = millisecondsPerBeat / 8;
trth_note_t = millisecondsPerBeat / 8 * 2 / 3;
//hz measures
@@ -237,7 +237,7 @@ void BPMCalc::step() {
}
//When BPM is locked
if ( beatLock ) {
- bpm = (int)round( 60 / beatOld );
+ bpm = float((int)round( 60 / beatOld ));
tempo = std::to_string( (int)round(bpm) );
if(bpm!=last_bpm){
if(bpm<999){
@@ -270,7 +270,7 @@ void BPMCalc::step() {
if (bpm<30){
bpm = 30;
}
- bpm = (int)round(bpm);
+ bpm = float((int)round(bpm));
tempo = std::to_string( (int)round(bpm) );
if(bpm!=last_bpm){
calculateValues(bpm);
diff --git a/plugins/community/repos/AS/src/BPMClock.cpp b/plugins/community/repos/AS/src/BPMClock.cpp
index 3e6b67c2..2311118c 100644
--- a/plugins/community/repos/AS/src/BPMClock.cpp
+++ b/plugins/community/repos/AS/src/BPMClock.cpp
@@ -107,6 +107,7 @@ struct BPMClock : Module {
float tempo =120.0f;
int time_sig_top, time_sig_bottom = 0;
+ int time_sig_bottom_old = 0;
float frequency = 2.0f;
int quarters_count_limit = 4;
int eighths_count_limit = 2;
@@ -192,10 +193,10 @@ void BPMClock::step() {
}else{
if (time_sig_top == time_sig_bottom){
- clock.setFreq(frequency*4);
quarters_count_limit = 4;
eighths_count_limit = 2;
bars_count_limit = 16;
+ clock.setFreq(frequency*4);
}else{
if(time_sig_bottom == 4){
quarters_count_limit = 4;
diff --git a/plugins/community/repos/AS/src/DelayPlus.cpp b/plugins/community/repos/AS/src/DelayPlus.cpp
index 566fcad9..5b223009 100644
--- a/plugins/community/repos/AS/src/DelayPlus.cpp
+++ b/plugins/community/repos/AS/src/DelayPlus.cpp
@@ -13,6 +13,8 @@
#include
#include
+namespace rack_plugin_AS {
+
#define HISTORY_SIZE (1<<21)
struct DelayPlusFx : Module {
@@ -296,6 +298,10 @@ DelayPlusFxWidget::DelayPlusFxWidget(DelayPlusFx *module) : ModuleWidget(module)
}
+} // namespace rack_plugin_AS
+
+using namespace rack_plugin_AS;
+
RACK_PLUGIN_MODEL_INIT(AS, DelayPlusFx) {
Model *modelDelayPlusFx = Model::create("AS", "DelayPlusFx", "DelayPlus Fx", DELAY_TAG, EFFECT_TAG);
return modelDelayPlusFx;
diff --git a/plugins/community/repos/AS/src/DelayPlusStereo.cpp b/plugins/community/repos/AS/src/DelayPlusStereo.cpp
index 38936e43..562954e9 100644
--- a/plugins/community/repos/AS/src/DelayPlusStereo.cpp
+++ b/plugins/community/repos/AS/src/DelayPlusStereo.cpp
@@ -13,6 +13,8 @@
#include
#include
+namespace rack_plugin_AS {
+
#define HISTORY_SIZE (1<<21)
struct DelayPlusStereoFx : Module {
@@ -443,6 +445,10 @@ DelayPlusStereoFxWidget::DelayPlusStereoFxWidget(DelayPlusStereoFx *module) : Mo
}
+} // namespace rack_plugin_AS
+
+using namespace rack_plugin_AS;
+
RACK_PLUGIN_MODEL_INIT(AS, DelayPlusStereoFx) {
Model *modelDelayPlusStereoFx = Model::create("AS", "DelayPlusStereoFx", "DelayPlus Stereo Fx", DUAL_TAG, DELAY_TAG, EFFECT_TAG);
return modelDelayPlusStereoFx;
diff --git a/plugins/community/repos/AS/src/Flow.cpp b/plugins/community/repos/AS/src/Flow.cpp
index b37fedea..ed9085f3 100644
--- a/plugins/community/repos/AS/src/Flow.cpp
+++ b/plugins/community/repos/AS/src/Flow.cpp
@@ -9,6 +9,7 @@ struct Flow: Module {
enum ParamIds {
SWITCH_1,
SWITCH_2,
+ MODE_PARAM,
NUM_PARAMS
};
enum InputIds {
@@ -40,6 +41,7 @@ struct Flow: Module {
bool on_1 = false;
bool on_2 = false;
+ bool light_inverted = false;
float mute_fade1 =0.0f;
float mute_fade2 =0.0f;
@@ -79,6 +81,13 @@ struct Flow: Module {
void Flow::step() {
+ if (params[MODE_PARAM].value){
+ light_inverted = false;
+ }else{
+ //switch lights turn off when the switch is enabled
+ light_inverted = true;
+ }
+
//TRIGGER 1
if (btnTrigger1.process(params[SWITCH_1].value)||extTrigger1.process(inputs[CV_TRIG_INPUT_1].value)) {
on_1 = !on_1;
@@ -94,7 +103,12 @@ void Flow::step() {
mute_fade1 = 1.0f;
}
outputs[OUTPUT_1].value = inputs[INPUT_1].value * mute_fade1;
- lights[TRIGGER_LED_1].value = on_1 ? 1.0f : 0.0f;
+ if(light_inverted){
+ lights[TRIGGER_LED_1].value = on_1 ? 0.0f : 1.0f;
+ }else{
+ lights[TRIGGER_LED_1].value = on_1 ? 1.0f : 0.0f;
+ }
+
//TRIGGER 2
if (btnTrigger2.process(params[SWITCH_2].value)||extTrigger2.process(inputs[CV_TRIG_INPUT_2].value)) {
on_2 = !on_2;
@@ -110,7 +124,12 @@ void Flow::step() {
mute_fade2 = 1.0f;
}
outputs[OUTPUT_2].value = inputs[INPUT_2].value * mute_fade2;
- lights[TRIGGER_LED_2].value = on_2 ? 1.0f : 0.0f;
+ if(light_inverted){
+ lights[TRIGGER_LED_2].value = on_2 ? 0.0f : 1.0f;
+ }else{
+ lights[TRIGGER_LED_2].value = on_2 ? 1.0f : 0.0f;
+ }
+
}
////////////////////////////////////
@@ -129,6 +148,9 @@ FlowWidget::FlowWidget(Flow *module) : ModuleWidget(module) {
addChild(Widget::create(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
+ //OLD/NEW SWITCH FROM 40-250 TO 30-300
+ addParam(ParamWidget::create(Vec(67, 23), module, Flow::MODE_PARAM, 0.0f, 1.0f, 1.0f));
+
static const float led_offset = 3.3;
static const float led_center = 15;
static const float y_offset = 150;
diff --git a/plugins/community/repos/AS/src/Phaser.cpp b/plugins/community/repos/AS/src/Phaser.cpp
index 1d2aa228..2e565cd7 100644
--- a/plugins/community/repos/AS/src/Phaser.cpp
+++ b/plugins/community/repos/AS/src/Phaser.cpp
@@ -120,8 +120,7 @@ public:
float Update( float inSamp ){
//calculate and update phaser sweep lfo...
- float d = _dmin + (_dmax-_dmin) * ((sin( _lfoPhase ) +
-1.f)/2.f);
+ float d = _dmin + (_dmax-_dmin) * ((sin( _lfoPhase ) + 1.f)/2.f);
_lfoPhase += _lfoInc;
if( _lfoPhase >= F_PI * 2.0f )
_lfoPhase -= F_PI * 2.0f;
diff --git a/plugins/community/repos/AS/src/ReScale.cpp b/plugins/community/repos/AS/src/ReScale.cpp
new file mode 100644
index 00000000..6d40d1dc
--- /dev/null
+++ b/plugins/community/repos/AS/src/ReScale.cpp
@@ -0,0 +1,136 @@
+//**************************************************************************************
+//Volt rescale module module for VCV Rack by Alfredo Santamaria - AS - https://github.com/AScustomWorks/AS
+//
+//**************************************************************************************
+#include "AS.hpp"
+
+struct ReScale: Module {
+ enum ParamIds {
+ CONVERT_PARAM,
+ NUM_PARAMS
+ };
+ enum InputIds {
+ INPUT_0,
+ INPUT_1,
+ INPUT_2,
+ INPUT_3,
+ NUM_INPUTS
+ };
+ enum OutputIds {
+ OUTPUT,
+ NUM_OUTPUTS
+ };
+ enum LightIds {
+ NUM_LIGHTS
+ };
+
+ int selection = 0;
+ float rescaled_value = 0.0f;
+ float input_value = 0.0f;
+
+ float getNoteInVolts(float noteValue) {
+ int octaveInVolts = int(floorf(noteValue));
+ float voltMinusOct = noteValue - octaveInVolts;
+ return voltMinusOct;
+ }
+
+ ReScale() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
+
+ }
+ void step() override;
+
+};
+
+void ReScale::step() {
+
+ selection = params[CONVERT_PARAM].value;
+
+ if(inputs[INPUT_0].active){
+
+ input_value = clamp(inputs[INPUT_0].value, -5.0f,5.0f);
+ if(selection==0){
+ rescaled_value = input_value;
+ }else if(selection==1){
+ rescaled_value = rescale(input_value, -5.0f, 5.0f, 0.0f, 5.0f);
+ }else if(selection==2){
+ rescaled_value = rescale(input_value, -5.0f, 5.0f, -10.0f, 10.0f);
+ }else if(selection==3){
+ rescaled_value = rescale(input_value, -5.0f, 5.0f, 0.0f, 10.0f);
+ }
+
+ }else if(inputs[INPUT_1].active){
+
+ input_value = clamp(inputs[INPUT_1].value, 0.0f, 5.0f);
+ if(selection==0){
+ rescaled_value = rescale(input_value, 0.0f, 5.0f, -5.0f, 5.0f);
+ }else if(selection==1){
+ rescaled_value = input_value;
+ }else if(selection==2){
+ rescaled_value = rescale(input_value, 0.0f, 5.0f, -10.0f, 10.0f);
+ }else if(selection==3){
+ rescaled_value = rescale(input_value, -5.0f, 5.0f, 0.0f, 10.0f);
+ }
+
+ }else if(inputs[INPUT_2].active){
+
+ input_value = clamp(inputs[INPUT_2].value, 0.0f, 10.0f);
+ if(selection==0){
+ rescaled_value = rescale(input_value, 0.0f, 10.0f, -5.0f, 5.0f);
+ }else if(selection==1){
+ rescaled_value = rescale(input_value, 0.0f, 10.0f, 0.0f, 5.0f);
+ }else if(selection==2){
+ rescaled_value = rescale(input_value, 0.0f, 10.0f, -10.0f, 10.0f);
+ }else if(selection==3){
+ rescaled_value = input_value;
+ }
+
+ }else if(inputs[INPUT_3].active){
+
+ input_value = inputs[INPUT_3].value;
+ if(selection==0){
+ rescaled_value = input_value;
+ }else if(selection==1){
+ rescaled_value = input_value;
+ }else if(selection==2){
+ rescaled_value = input_value;
+ }else if(selection==3){
+ //take the input of a midi KB, get the voltage minus octave, convert it to 1V/KEY
+ float ext_key = getNoteInVolts(input_value);
+ rescaled_value = clamp( rescale( ext_key, 0.0f, 1.0f, 0.0f, 11.0f ), 0.0f, 10.0f );
+ }
+
+ }
+ outputs[OUTPUT].value = rescaled_value;
+
+}
+
+////////////////////////////////////
+struct ReScaleWidget : ModuleWidget
+{
+ ReScaleWidget(ReScale *module);
+};
+
+ReScaleWidget::ReScaleWidget(ReScale *module) : ModuleWidget(module) {
+
+ setPanel(SVG::load(assetPlugin(plugin, "res/ReScale.svg")));
+
+ //SCREWS - SPECIAL SPACING FOR RACK WIDTH*4
+ addChild(Widget::create(Vec(0, 0)));
+ addChild(Widget::create(Vec(box.size.x - RACK_GRID_WIDTH, 0)));
+ addChild(Widget::create(Vec(0, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
+ addChild(Widget::create(Vec(box.size.x - RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
+ //PORTS
+ addInput(Port::create(Vec(18, 65), Port::INPUT, module, ReScale::INPUT_0));
+ addInput(Port::create(Vec(18, 105), Port::INPUT, module, ReScale::INPUT_1));
+ addInput(Port::create(Vec(18, 145), Port::INPUT, module, ReScale::INPUT_2));
+ addInput(Port::create(Vec(18, 185), Port::INPUT, module, ReScale::INPUT_3));
+
+ addParam(ParamWidget::create(Vec(12, 230), module, ReScale::CONVERT_PARAM, 0.0f, 3.0f, 0.0f));
+
+ addOutput(Port::create(Vec(18, 280), Port::OUTPUT, module, ReScale::OUTPUT));
+}
+
+RACK_PLUGIN_MODEL_INIT(AS, ReScale) {
+ Model *modelReScale = Model::create("AS", "ReScale", "Voltage Converter", UTILITY_TAG);
+ return modelReScale;
+}
diff --git a/plugins/community/repos/AS/src/SignalDelay.cpp b/plugins/community/repos/AS/src/SignalDelay.cpp
index d86d9688..ff85de1e 100644
--- a/plugins/community/repos/AS/src/SignalDelay.cpp
+++ b/plugins/community/repos/AS/src/SignalDelay.cpp
@@ -12,6 +12,8 @@
#define HISTORY_SIZE (1<<21)
+namespace rack_plugin_AS {
+
struct SignalDelay : Module {
enum ParamIds {
TIME_1_PARAM,
@@ -220,7 +222,7 @@ SignalDelayWidget::SignalDelayWidget(SignalDelay *module) : ModuleWidget(module)
addChild(Widget::create(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
//KNOBS
- addParam(ParamWidget::create(Vec(47, 80), module, SignalDelay::TIME_1_PARAM, 0.001f, 10.0f, 0.350f));
+ addParam(ParamWidget::create(Vec(47, 80), module, SignalDelay::TIME_1_PARAM, 0.0f, 10.0f, 0.350f));
//CV INPUT
addInput(Port::create(Vec(posX[0]+5, 87), Port::INPUT, module, SignalDelay::TIME_1_INPUT));
//INPUT
@@ -238,7 +240,7 @@ SignalDelayWidget::SignalDelayWidget(SignalDelay *module) : ModuleWidget(module)
display2->value = &module->lcd_tempo2;
addChild(display2);
//KNOBS
- addParam(ParamWidget::create(Vec(47, 80+mod_offset), module, SignalDelay::TIME_2_PARAM, 0.001f, 10.0f, 0.350f));
+ addParam(ParamWidget::create(Vec(47, 80+mod_offset), module, SignalDelay::TIME_2_PARAM, 0.0f, 10.0f, 0.350f));
//CV INPUT
addInput(Port::create(Vec(posX[0]+5, 87+mod_offset), Port::INPUT, module, SignalDelay::TIME_2_INPUT));
//INPUT
@@ -248,6 +250,10 @@ SignalDelayWidget::SignalDelayWidget(SignalDelay *module) : ModuleWidget(module)
addOutput(Port::create(Vec(posX[2], 160+mod_offset), Port::OUTPUT, module, SignalDelay::OUT_2_OUTPUT));
}
+} // namespace rack_plugin_AS
+
+using namespace rack_plugin_AS;
+
RACK_PLUGIN_MODEL_INIT(AS, SignalDelay) {
Model *modelSignalDelay = Model::create("AS", "SignalDelay", "Signal Delay", UTILITY_TAG, DELAY_TAG);
return modelSignalDelay;
diff --git a/plugins/community/repos/AS/src/TriggersMKIII.cpp b/plugins/community/repos/AS/src/TriggersMKIII.cpp
new file mode 100644
index 00000000..9bf9dd73
--- /dev/null
+++ b/plugins/community/repos/AS/src/TriggersMKIII.cpp
@@ -0,0 +1,212 @@
+//**************************************************************************************
+//TriggersMKIII module for VCV Rack by Alfredo Santamaria - AS - https://github.com/AScustomWorks/AS
+//
+//**************************************************************************************
+#include "AS.hpp"
+#include "window.hpp"
+#include "dsp/digital.hpp"
+
+struct TriggersMKIII: Module {
+ enum ParamIds {
+ TRIGGER_SWITCH_1,
+ TRIGGER_SWITCH_2,
+ NUM_PARAMS
+ };
+ enum InputIds {
+ CV_TRIG_INPUT_1_1,
+ CV_TRIG_INPUT_1_2,
+ CV_TRIG_INPUT_2_1,
+ CV_TRIG_INPUT_2_2,
+ NUM_INPUTS
+ };
+ enum OutputIds {
+ TRIGGER_OUT1,
+ TRIGGER_OUT2,
+ NUM_OUTPUTS
+ };
+ enum LightIds {
+ TRIGGER_LED_1,
+ TRIGGER_LED_2,
+ NUM_LIGHTS
+ };
+
+ SchmittTrigger btnTrigger1, btnTrigger2;
+ SchmittTrigger extTrigger1_1, extTrigger1_2;
+ SchmittTrigger extTrigger2_1, extTrigger2_2;
+
+ TextField* textField1;
+ TextField* textField2;
+
+ const float lightLambda = 0.075f;
+ float resetLight1 = 0.0f;
+ float resetLight2 = 0.0f;
+
+ int label_num1 = 0;
+ int label_num2 = 0;
+
+
+
+ TriggersMKIII() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
+ void step() override;
+
+
+ json_t *toJson()override {
+ json_t *rootJ = json_object();
+ // text
+ json_object_set_new(rootJ, "label1", json_string(textField1->text.c_str()));
+ json_object_set_new(rootJ, "label2", json_string(textField2->text.c_str()));
+ return rootJ;
+ }
+
+ void fromJson(json_t *rootJ)override {
+ json_t *text1J = json_object_get(rootJ, "label1");
+ if (text1J){
+ textField1->text = json_string_value(text1J);
+ }
+ json_t *text2J = json_object_get(rootJ, "label2");
+ if (text2J){
+ textField2->text = json_string_value(text2J);
+ }
+ }
+
+};
+
+void TriggersMKIII::step() {
+
+ outputs[TRIGGER_OUT1].value = 0.0f;
+ outputs[TRIGGER_OUT2].value = 0.0f;
+
+ //TRIGGER 1
+ if (btnTrigger1.process(params[TRIGGER_SWITCH_1].value) || extTrigger1_1.process(inputs[CV_TRIG_INPUT_1_1].value) || extTrigger1_2.process(inputs[CV_TRIG_INPUT_1_2].value)) {
+ resetLight1 = 1.0;
+ outputs[TRIGGER_OUT1].value = 10.0f;
+ }else{
+ outputs[TRIGGER_OUT1].value = 0.0f;
+ }
+ resetLight1 -= resetLight1 / lightLambda / engineGetSampleRate();
+ lights[TRIGGER_LED_1].value = resetLight1;
+
+ //TRIGGER 2
+ //EXTERNAL TRIGGER
+ if (btnTrigger2.process(params[TRIGGER_SWITCH_2].value) || extTrigger2_1.process(inputs[CV_TRIG_INPUT_2_1].value) || extTrigger2_2.process(inputs[CV_TRIG_INPUT_2_2].value)) {
+ resetLight2 = 1.0;
+ outputs[TRIGGER_OUT2].value = 10.0f;
+ //INTERNAL TRIGGER
+ }else{
+ outputs[TRIGGER_OUT2].value = 0.0f;
+ }
+ resetLight2 -= resetLight2 / lightLambda / engineGetSampleRate();
+ lights[TRIGGER_LED_2].value = resetLight2;
+
+}
+////////////////////////////////////
+struct CustomLedDisplayTextField : TextField {
+ std::shared_ptr font;
+ Vec textOffset;
+ NVGcolor color;
+ CustomLedDisplayTextField(){
+ font = Font::load(assetPlugin(plugin, "res/saxmono.ttf"));
+ color = nvgRGB(0xf0, 0x00, 0x00);
+ textOffset = Vec(5, 0);
+ };
+
+ void draw(NVGcontext *vg) override{
+ nvgScissor(vg, 0, 0, box.size.x, box.size.y);
+ // Background
+ NVGcolor backgroundColor = nvgRGB(0x20, 0x10, 0x10);
+ NVGcolor borderColor = nvgRGB(0x10, 0x10, 0x10);
+ nvgBeginPath(vg);
+ nvgRoundedRect(vg, 0.0, 0.0, box.size.x, box.size.y, 4.0);
+
+ nvgFillColor(vg, backgroundColor);
+ nvgFill(vg);
+ nvgStrokeWidth(vg, 1.5);
+ nvgStrokeColor(vg, borderColor);
+ nvgStroke(vg);
+ nvgFontSize(vg, 20);
+
+ // Text
+ if (font->handle >= 0) {
+ bndSetFont(font->handle);
+
+ NVGcolor highlightColor = nvgRGB(0xf0, 0x00, 0x00);//color;
+ highlightColor.a = 0.5;
+ int begin = min(cursor, selection);
+ int end = (this == RACK_PLUGIN_UI_FOCUSED_WIDGET) ? max(cursor, selection) : -1;
+ bndIconLabelCaret(vg, textOffset.x, textOffset.y,
+ box.size.x - 2*textOffset.x, box.size.y - 2*textOffset.y,
+ -1, color, 12, text.c_str(), highlightColor, begin, end);
+ }
+ nvgResetScissor(vg);
+ bndSetFont(rack::global_ui->window.gGuiFont->handle);
+ }
+
+ int getTextPosition(Vec mousePos)override {
+ bndSetFont(font->handle);
+ int textPos = bndIconLabelTextPosition(rack::global_ui->window.gVg, textOffset.x, textOffset.y,
+ box.size.x - 2*textOffset.x, box.size.y - 2*textOffset.y,
+ -1, 12, text.c_str(), mousePos.x, mousePos.y);
+ bndSetFont(font->handle);
+ return textPos;
+ }
+};
+
+////////////////////////////////////
+
+struct TriggersMKIIIWidget : ModuleWidget {
+
+ TextField* textField1;
+ TextField* textField2;
+ TriggersMKIIIWidget(TriggersMKIII *module);
+};
+
+TriggersMKIIIWidget::TriggersMKIIIWidget(TriggersMKIII *module) : ModuleWidget(module) {
+
+
+ setPanel(SVG::load(assetPlugin(plugin, "res/TriggersMKIII.svg")));
+
+ //SCREWS
+ addChild(Widget::create(Vec(RACK_GRID_WIDTH, 0)));
+ addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
+ addChild(Widget::create(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
+ addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
+
+ static const float led_offset = 3.3;
+ static const float led_center = 15;
+ static const float y_offset = 150;
+ //TRIGGER 1
+
+ textField1 = Widget::create(Vec(6, 46));
+ textField1->box.size = Vec(78, 30);
+ textField1->multiline = false;
+ addChild(textField1);
+ module->textField1 = this->textField1;
+ //SWITCH
+ addParam(ParamWidget::create(Vec(led_center, 122), module, TriggersMKIII::TRIGGER_SWITCH_1, 0.0, 1.0, 0.0));
+ addChild(ModuleLightWidget::create>(Vec(led_center+led_offset, 122+led_offset), module, TriggersMKIII::TRIGGER_LED_1));
+ //PORTS
+ addInput(Port::create(Vec(8, 90), Port::INPUT, module, TriggersMKIII::CV_TRIG_INPUT_1_1));
+ addInput(Port::create(Vec(33, 90), Port::INPUT, module, TriggersMKIII::CV_TRIG_INPUT_1_2));
+ addOutput(Port::create(Vec(58, 90), Port::OUTPUT, module, TriggersMKIII::TRIGGER_OUT1));
+
+ //TRIGGER 2
+ textField2 = Widget::create(Vec(6, 46+y_offset));
+ textField2->box.size = Vec(78, 30);
+ textField2->multiline = false;
+ addChild(textField2);
+ module->textField2 = this->textField2;
+ //SWITCH
+ addParam(ParamWidget::create(Vec(led_center, 122+y_offset), module, TriggersMKIII::TRIGGER_SWITCH_2, 0.0, 1.0, 0.0));
+ addChild(ModuleLightWidget::create>(Vec(led_center+led_offset, 122+led_offset+y_offset), module, TriggersMKIII::TRIGGER_LED_2));
+ //PORTS
+ addInput(Port::create(Vec(8, 90+y_offset), Port::INPUT, module, TriggersMKIII::CV_TRIG_INPUT_2_1));
+ addInput(Port::create(Vec(33, 90+y_offset), Port::INPUT, module, TriggersMKIII::CV_TRIG_INPUT_2_2));
+ addOutput(Port::create(Vec(58, 90+y_offset), Port::OUTPUT, module, TriggersMKIII::TRIGGER_OUT2));
+
+
+}
+
+RACK_PLUGIN_MODEL_INIT(AS, TriggersMKIII) {
+ Model *modelTriggersMKIII = Model::create("AS", "TriggersMKIII", "Triggers MKIII", SWITCH_TAG, UTILITY_TAG);
+ return modelTriggersMKIII;
+}
diff --git a/vst2_bin/plugins/AS/AS.JPG b/vst2_bin/plugins/AS/AS.JPG
new file mode 100644
index 00000000..722d607d
Binary files /dev/null and b/vst2_bin/plugins/AS/AS.JPG differ
diff --git a/vst2_bin/plugins/AS/LICENSE_freeverb.txt b/vst2_bin/plugins/AS/LICENSE_freeverb.txt
new file mode 100644
index 00000000..36361f4b
--- /dev/null
+++ b/vst2_bin/plugins/AS/LICENSE_freeverb.txt
@@ -0,0 +1,67 @@
+Freeverb - Free, studio-quality reverb SOURCE CODE in the public domain
+-----------------------------------------------------------------------
+
+Written by Jezar at Dreampoint - http://www.dreampoint.co.uk
+
+
+Introduction
+------------
+
+Hello.
+
+I'll try to keep this "readme" reasonably small. There are few things in the world that I hate more than long "readme" files. Except "coding conventions" - but more on that later...
+
+In this zip file you will find two folders of C++ source code:
+
+"Components" - Contains files that should clean-compile ON ANY TYPE OF COMPUTER OR SYSTEM WHATSOEVER. It should not be necessary to make ANY changes to these files to get them to compile, except to make up for inadequacies of certain compilers. These files create three classes - a comb filter, an allpass filter, and a reverb model made up of a number of instances of the filters, with some features to control the filters at a macro level. You will need to link these classes into another program that interfaces with them. The files in the components drawer are completely independant, and can be built without dependancies on anything else. Because of the simple interface, it should be possible to interface these files to any system - VST, DirectX, anything - without changing them AT ALL.
+
+"FreeverbVST" - Contains a Steinberg VST implementation of this version of Freeverb, using the components in (surprise) the components folder. It was built on a PC but may compile properly for the Macintosh with no problems. I don't know - I don't have a Macintosh. If you've figured out how to compile the examples in the Steinberg VST Development Kit, then you should easilly figure out how to bring the files into a project and get it working in a few minutes. It should be very simple.
+
+Note that this version of Freeverb doesn't contain predelay, or any EQ. I thought that might make it difficult to understand the "reverb" part of the code. Once you figure out how Freeverb works, you should find it trivial to add such features with little CPU overhead.
+
+Also, the code in this version of Freeverb has been optimised. This has changed the sound *slightly*, but not significantly compared to how much processing power it saves.
+
+Finally, note that there is also a built copy of this version of Freeverb called "Freeverb3.dll" - this is a VST plugin for the PC. If you want a version for the Mac or anything else, then you'll need to build it yourself from the code.
+
+
+Technical Explanation
+---------------------
+
+Freeverb is a simple implementation of the standard Schroeder/Moorer reverb model. I guess the only reason why it sounds better than other reverbs, is simply because I spent a long while doing listening tests in order to create the values found in "tuning.h". It uses 8 comb filters on both the left and right channels), and you might possibly be able to get away with less if CPU power is a serious constraint for you. It then feeds the result of the reverb through 4 allpass filters on both the left and right channels. These "smooth" the sound. Adding more than four allpasses doesn't seem to add anything significant to the sound, and if you use less, the sound gets a bit "grainy". The filters on the right channel are slightly detuned compared to the left channel in order to create a stereo effect.
+
+Hopefully, you should find the code in the components drawer a model of brevity and clarity. Notice that I don't use any "coding conventions". Personally, I think that coding conventions suck. They are meant to make the code "clearer", but they inevitably do the complete opposite, making the code completely unfathomable. Anyone whose done Windows programming with its - frankly stupid - "Hungarian notation" will know exactly what I mean. Coding conventions typically promote issues that are irrelevant up to the status of appearing supremely important. It may have helped back people in the days when compilers where somewhat feeble in their type-safety, but not in the new millenium with advanced C++ compilers.
+
+Imagine if we rewrote the English language to conform to coding conventions. After all, The arguments should be just as valid for the English language as they are for a computer language. For example, we could put a lower-case "n" in front of every noun, a lower-case "p" in front of a persons name, a lower-case "v" in front of every verb, and a lower-case "a" in front of every adjective. Can you imagine what the English language would look like? All in the name of "clarity". It's just as stupid to do this for computer code as it would be to do it for the English language. I hope that the code for Freeverb in the components drawer demonstrates this, and helps start a movement back towards sanity in coding practices.
+
+
+Background
+----------
+
+Why is the Freeverb code now public domain? Simple. I only intended to create Freeverb to provide me and my friends with studio-quality reverb for free. I never intended to make any money out of it. However, I simply do not have the time to develop it any further. I'm working on a "concept album" at the moment, and I'll never finish it if I spend any more time programming.
+
+In any case, I make more far money as a contract programmer - making Mobile Internet products - than I ever could writing plugins, so it simply doesn't make financial sense for me to spend any more time on it.
+
+Rather than give Freeverb to any particular individual or organisation to profit from it, I've decided to give it away to the internet community at large, so that quality, FREE (or at the very least, low-cost) reverbs can be developed for all platforms.
+
+Feel free to use the source code for Freeverb in any of your own products, whether they are also available for free, or even if they are commercial - I really don't mind. You may do with the code whatever you wish. If you use it in a product (whether commercial or not), it would be very nice of you, if you were to send me a copy of your product - although I appreciate that this isn't always possible in all circumstances.
+
+HOWEVER, please don't bug me with questions about how to use this code. I gave away Freeverb because I don't have time to maintain it. That means I *certainly* don't have time to answer questions about the source code, so please don't email questions to me. I *will* ignore them. If you can't figure the code for Freeverb out - then find somebody who can. I hope that either way, you enjoy experimenting with it.
+
+
+Disclaimer
+----------
+
+This software and source code is given away for free, without any warranties of any kind. It has been given away to the internet community as a free gift, so please treat it in the same spirit.
+
+
+I hope this code is useful and interesting to you all!
+I hope you have lots of fun experimenting with it and make good products!
+
+Very best regards,
+Jezar.
+Technology Consultant
+Dreampoint Design and Engineering
+http://www.dreampoint.co.uk
+
+
+//ends
diff --git a/vst2_bin/plugins/AS/README.md b/vst2_bin/plugins/AS/README.md
index 6b17386c..b69c547b 100644
--- a/vst2_bin/plugins/AS/README.md
+++ b/vst2_bin/plugins/AS/README.md
@@ -132,6 +132,21 @@ V 0.5.7: First relase of this module.
V 0.6.5: Added "RUN" label at the end of the list.
+### Triggers MKIII
+A manual CV signal temporary trigger module with labeling integrated, now you can type directly the labels you want to use. Also added a handy second EXT input.
+
+V 0.6.9: First relase of this module.
+
+### ReScale
+Utility module to convert from one voltage range to another, available inputs are:
+ -5v/5v, 0v/5v, 0v/10v, 1V/OCT*.
+ Available output signal options are:
+ -5v/5v, 0v/5v, -10v/10v, 0v/10v*
+ *1V/OCT option is to convert any voltage source to 1 octave 1V/OCT range.
+
+
+V 0.6.9: First relase of this module.
+
### Steps
Strum's Mental VCV Counters module. Mods: graphics, 3 counters, up to 64 steps each, added reset lights to the buttons.
@@ -160,11 +175,15 @@ V 0.6.0: First relase of this module.
V 0.6.5: Now it features soft mute, so you can use it both for audio and cv signals without any switching noise.
+V 0.6.9: Switch selector added to reverse the default ON/OFF swtiches light behavior(by usrer request).
+
### Signal Delay
Delay the incomming CV signal by set milliseconds, with signal thru and delayed output. You can chain several Signal Delay modules together for unlimited length of delays. (TAOS request).
V 0.5.5: First relase of this module.
+V 0.6,9: Small fix on the ms CV input to take the proper values fron BPM calc module.
+
### CV 2 T
CV to Trigger module. Feed a midi signal to the CV inputs and it will output one trigger signal when the incoming signal rises above 0v, and another trigger signal when the incoming signal returns to 0v. Useful to use your external hardware controller/keyboard as a trigger.
diff --git a/vst2_bin/plugins/AS/res/Flow.svg b/vst2_bin/plugins/AS/res/Flow.svg
index 9649656e..c0d817be 100644
--- a/vst2_bin/plugins/AS/res/Flow.svg
+++ b/vst2_bin/plugins/AS/res/Flow.svg
@@ -37,11 +37,11 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="1.7258659"
- inkscape:cx="-41.48078"
- inkscape:cy="234.09555"
+ inkscape:zoom="6.2307619"
+ inkscape:cx="59.390478"
+ inkscape:cy="341.3318"
inkscape:document-units="mm"
- inkscape:current-layer="layer3"
+ inkscape:current-layer="g961"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
@@ -49,8 +49,8 @@
fit-margin-bottom="0"
inkscape:window-width="1678"
inkscape:window-height="1334"
- inkscape:window-x="124"
- inkscape:window-y="13"
+ inkscape:window-x="268"
+ inkscape:window-y="0"
inkscape:window-maximized="0"
units="px" />
+ transform="matrix(0.26458333,0,0,0.26458333,-293.56898,-296.47329)">
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vst2_bin/plugins/AS/res/TriggersMKIII.svg b/vst2_bin/plugins/AS/res/TriggersMKIII.svg
new file mode 100644
index 00000000..e40d6537
--- /dev/null
+++ b/vst2_bin/plugins/AS/res/TriggersMKIII.svg
@@ -0,0 +1,368 @@
+
+
+
+