diff --git a/plugins/community/repos/Bogaudio/Makefile b/plugins/community/repos/Bogaudio/Makefile index 7ccf50c5..a32bbb24 100644 --- a/plugins/community/repos/Bogaudio/Makefile +++ b/plugins/community/repos/Bogaudio/Makefile @@ -1,6 +1,6 @@ SLUG=Bogaudio -VERSION=0.6.14 +VERSION=0.6.16 FLAGS += -DSLUG=$(SLUG) -DVERSION=$(VERSION) ifdef REQUIRE_VERSION diff --git a/plugins/community/repos/Bogaudio/README.md b/plugins/community/repos/Bogaudio/README.md index 5b62714a..c8c81ce4 100644 --- a/plugins/community/repos/Bogaudio/README.md +++ b/plugins/community/repos/Bogaudio/README.md @@ -5,6 +5,7 @@ Modules for [VCV Rack](https://github.com/VCVRack/Rack), an open-source Eurorack - [Oscillators](#oscillators) - [LFOs](#lfos) - [Envelopes and Envelope Utilities](#envelopes) + - [Noise/Random, Sample and Hold](#random) - [Mixers, Panners and VCAs](#mixers) - [Effects and Dynamics](#effects) - [Sequential Switches and Sequencers](#sequencers) @@ -17,6 +18,8 @@ Modules for [VCV Rack](https://github.com/VCVRack/Rack), an open-source Eurorack ![modules screenshot](./doc/www/modules2.png) +![modules screenshot](./doc/www/modules6.png) + ![modules screenshot](./doc/www/modules5.png) ![modules screenshot](./doc/www/modules3.png) @@ -180,17 +183,53 @@ An envelope follower, a utility that converts its input to a CV proportional to With DAMP at the minimum setting and SCALE at half, the module is an effective wave rectifier (that is, it outputs the absolute value of the input). +### Noise/Random, Sample and Hold + +![Noise/random screenshot](doc/www/noise.png) + +#### NOISE + +A noise source, in types blue (f), white, pink (1/f), red (aka rown, 1/f^2) and Gauss (normal with mean 0 and variance 1). + +Additionally, NOISE has an absolute value circuit. Patch audio into ABS to get positive CV. For example, patch white noise into ABS to get uniform values in the range 0 to 10. + +#### S&H + +A dual sample-and-hold and trigger-and-hold. Sampling may be triggered by CV (on the rising edge of a trigger or gate) or button press. If nothing is connected to an IN port, sampling for that channel is from an internal white noise source (range 0-10V). + +Each channel can be toggled into track-and-hold mode. In this mode, when the input at GATE is high, or the button is held, the input is copied to the output. When the gate goes low, the input is sampled and held until the next gate. + +#### WALK2 + +WALK2 provides two channels of chaotic CV, where the CV moves as a "random walk". The two outputs are drawn as a trace, in X and Y, on the display. + +For each channel: + - RATE controls how sedately, or wildly, the CV moves around. If CV is in use, it is attenuated by the knob. + - OFFSET adds or subtracts up to 5V from the base +/-5V output. If the offset CV is in use, it is attenuverted by the knob. + - SCALE scales the output; if CV is in use, it is attenuated by the knob. + +Additionally: + - A trigger on the JUMP input will cause both channels to jump to a random value. A bit of slew limitation applies to the jump to minimize popping. + - DIST outputs a third CV, ranging over 0-10V, related the X and Y channel outputs. + +Clicking on the display will jump the outputs, X and Y, to that point (again with a bit of slew limitation). + +Various options on the context (right-click) menu allow customization of the display (set the range of the display to +/-10V instead of the default +/-5V; hide the grid dots; set the color of the trace). + +#### WALK + +WALK is a single-channel random walk, identical to one channel of WALK2, in 3HP. ### Mixers, Panners and VCAs -#### MIX4 +#### MIX8 -A four-channel mixer/panner with performance mutes. +An eight-channel mixer/panner with performance mutes. ![Mixers screenshot](doc/www/mixers1.png) Features: - - Four input channels with decibel-calibrated level faders. + - Eight input channels with decibel-calibrated level faders. - Level fader for the output mix. - CV control over channel and output levels; expects +10 volt CV; CV is attenuated by the corresponding slider when in use. - CV-controlled stereo panners; expects +/-5 volt CV; CV is attenuverted by the corresponding knob when in use. @@ -200,9 +239,13 @@ Features: - Fader handles contain lights indicating the signal level out of that channel or the entire mix. - Output saturates (soft clips) to +/-12 volts, where the clipping effect becomes noticeable above +/-10 volts. -#### MIX8 +#### MIX4 + +A four-channel version of MIX8 with the same features. -An eight-channel version of MIX4 with the same features. +### MIX1 + +A 3HP fader/VCA, with mute. #### VCM @@ -218,10 +261,12 @@ By default, the output is hard clipped at +/-12 volts (this is a standard in Rac #### UMIX -A 3HP unity mixer, usable with CV (e.g. combining triggers) or audio. Up to 8 inputs are summed to the output. Saturation (soft clipping) is applied to the output at +/-12 volts; the LEVEL knob allows attenuation of the mix before the saturation is applied. +A 3HP unity mixer, usable with CV (e.g. combining triggers) or audio. Up to 8 inputs are summed to the output. Saturation (soft clipping) is applied to the output, which limits it to around +/-11V; the LEVEL knob allows attenuation of the mix before the saturation is applied. The context (right-click) menu has an option to average, rather than sum, the inputs. +A second context menu option, "CV mode", disables the saturation, which allows for precise summing (or averaging) of CVs. In this case the output is hard-clipped at +/-12V. + #### MATRIX88 An 8x8 channel matrix mixer. Each input can be sent with an independent level to each of the eight output mixes. @@ -331,6 +376,8 @@ As a multiplexer, it routes an input to the output under control of the SELECT k Both functions may be used simultaneously: the SELECT+CV value is added to the sequential/clocked value, wrapping around. Note that the STEPS value only affects the sequential value; for example, using a clock input and setting STEPS to 2 will yield an alternation between two adjacent inputs, but this pair can be selected with the SELECT knob or CV. +On the context (right-click) menu, if option "Select on clock" is selected, then the select value (knob and CV) is checked and used to modify the active step only when a clock is received, rather than continuously. + #### 1:8 1:8 is the opposite of 8:1 -- it routes a single input to 1 of 8 outputs. The control circuit behavior (CLOCK, SELECT, etc) is the same. @@ -427,24 +474,12 @@ Manual may be set to output a trigger pulse on patch load (akin to a Max/Msp or A 3 HP multiple (signal duplicator). There are two 1-to-3 channels. There is also a 1-to-6 mode: if nothing is patched to the second channel's input, the input to the first channel is copied to all six outputs. -#### NOISE - -A noise source, in types blue (f), white, pink (1/f), red (aka rown, 1/f^2) and Gauss (normal with mean 0 and variance 1). - -Additionally, NOISE has an absolute value circuit. Patch audio into ABS to get positive CV. For example, patch white noise into ABS to get uniform values in the range 0 to 10. - #### OFFSET An offset and scaler. The OFFSET and SCALE knobs have CV inputs. With an input signal, output is `(input + offset) * scale`. With no input connected, the output is constant in the value of `offset * scale`. By default, the output is capped at +/-12 volts (this is a standard in Rack). A context menu option allows this limit to be disabled. -#### S&H - -A dual sample-and-hold and trigger-and-hold. Sampling may be triggered by CV (on the rising edge of a trigger or gate) or button press. If nothing is connected to an IN port, sampling for that channel is from an internal white noise source (range 0-10V). - -Each channel can be toggled into track-and-hold mode. In this mode, when the input at GATE is high, or the button is held, the input is copied to the output. When the gate goes low, the input is sampled and held until the next gate. - #### SLEW A slew limiter - when the input changes rapidly, the output changes less rapidly, lagging the input. diff --git a/plugins/community/repos/Bogaudio/doc/www/mixers1.png b/plugins/community/repos/Bogaudio/doc/www/mixers1.png index aed43553..9ad7971f 100644 Binary files a/plugins/community/repos/Bogaudio/doc/www/mixers1.png and b/plugins/community/repos/Bogaudio/doc/www/mixers1.png differ diff --git a/plugins/community/repos/Bogaudio/doc/www/modules2.png b/plugins/community/repos/Bogaudio/doc/www/modules2.png index 46f0804a..a5e65468 100644 Binary files a/plugins/community/repos/Bogaudio/doc/www/modules2.png and b/plugins/community/repos/Bogaudio/doc/www/modules2.png differ diff --git a/plugins/community/repos/Bogaudio/doc/www/modules4.png b/plugins/community/repos/Bogaudio/doc/www/modules4.png index b8a781f3..54eebd71 100644 Binary files a/plugins/community/repos/Bogaudio/doc/www/modules4.png and b/plugins/community/repos/Bogaudio/doc/www/modules4.png differ diff --git a/plugins/community/repos/Bogaudio/doc/www/modules5.png b/plugins/community/repos/Bogaudio/doc/www/modules5.png index ab70733b..28d2150a 100644 Binary files a/plugins/community/repos/Bogaudio/doc/www/modules5.png and b/plugins/community/repos/Bogaudio/doc/www/modules5.png differ diff --git a/plugins/community/repos/Bogaudio/doc/www/modules6.png b/plugins/community/repos/Bogaudio/doc/www/modules6.png new file mode 100644 index 00000000..dc7d2f2f Binary files /dev/null and b/plugins/community/repos/Bogaudio/doc/www/modules6.png differ diff --git a/plugins/community/repos/Bogaudio/doc/www/noise.png b/plugins/community/repos/Bogaudio/doc/www/noise.png new file mode 100644 index 00000000..3326270b Binary files /dev/null and b/plugins/community/repos/Bogaudio/doc/www/noise.png differ diff --git a/plugins/community/repos/Bogaudio/doc/www/sequencers.png b/plugins/community/repos/Bogaudio/doc/www/sequencers.png index 87b3d51b..7ef23be6 100644 Binary files a/plugins/community/repos/Bogaudio/doc/www/sequencers.png and b/plugins/community/repos/Bogaudio/doc/www/sequencers.png differ diff --git a/plugins/community/repos/Bogaudio/doc/www/utilities.png b/plugins/community/repos/Bogaudio/doc/www/utilities.png index a03508a5..d1f9e103 100644 Binary files a/plugins/community/repos/Bogaudio/doc/www/utilities.png and b/plugins/community/repos/Bogaudio/doc/www/utilities.png differ diff --git a/plugins/community/repos/Bogaudio/make.objects b/plugins/community/repos/Bogaudio/make.objects index ba862c74..8b4146a5 100644 --- a/plugins/community/repos/Bogaudio/make.objects +++ b/plugins/community/repos/Bogaudio/make.objects @@ -37,6 +37,7 @@ ALL_OBJ= \ src/Lmtr.o \ src/Manual.o \ src/Matrix88.o \ + src/Mix1.o \ src/Mix4.o \ src/Mix8.o \ src/Mult.o \ diff --git a/plugins/community/repos/Bogaudio/res-src/AddrSeq-src.svg b/plugins/community/repos/Bogaudio/res-src/AddrSeq-src.svg index 6aba794c..ccec0bbc 100644 --- a/plugins/community/repos/Bogaudio/res-src/AddrSeq-src.svg +++ b/plugins/community/repos/Bogaudio/res-src/AddrSeq-src.svg @@ -54,12 +54,13 @@ - 2 - 3 - 4 - 5 - 6 - 7 + 1 + 2 + 3 + 4 + 5 + 6 + 7 8 diff --git a/plugins/community/repos/Bogaudio/res-src/Cmp-src.svg b/plugins/community/repos/Bogaudio/res-src/Cmp-src.svg index a20da1f0..f59b4e1a 100644 --- a/plugins/community/repos/Bogaudio/res-src/Cmp-src.svg +++ b/plugins/community/repos/Bogaudio/res-src/Cmp-src.svg @@ -206,7 +206,7 @@ A - > + B diff --git a/plugins/community/repos/Bogaudio/res-src/EightOne-src.svg b/plugins/community/repos/Bogaudio/res-src/EightOne-src.svg index e041c307..f7cc0f95 100644 --- a/plugins/community/repos/Bogaudio/res-src/EightOne-src.svg +++ b/plugins/community/repos/Bogaudio/res-src/EightOne-src.svg @@ -54,12 +54,13 @@ - 2 - 3 - 4 - 5 - 6 - 7 + 1 + 2 + 3 + 4 + 5 + 6 + 7 8 diff --git a/plugins/community/repos/Bogaudio/res-src/Mix1-src.svg b/plugins/community/repos/Bogaudio/res-src/Mix1-src.svg new file mode 100644 index 00000000..eb91083c --- /dev/null +++ b/plugins/community/repos/Bogaudio/res-src/Mix1-src.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + -6 + + + + + -12 + + + + + -24 + + + + + -48 + + + + dB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MIX1 + + BGA + + + + + + + + + + + + + + + + MUTE + + LEVEL + + IN + + + + + + OUT + + + diff --git a/plugins/community/repos/Bogaudio/res-src/OneEight-src.svg b/plugins/community/repos/Bogaudio/res-src/OneEight-src.svg index cd672626..d156343f 100644 --- a/plugins/community/repos/Bogaudio/res-src/OneEight-src.svg +++ b/plugins/community/repos/Bogaudio/res-src/OneEight-src.svg @@ -54,12 +54,13 @@ - 2 - 3 - 4 - 5 - 6 - 7 + 1 + 2 + 3 + 4 + 5 + 6 + 7 8 diff --git a/plugins/community/repos/Bogaudio/res-src/Walk-src.svg b/plugins/community/repos/Bogaudio/res-src/Walk-src.svg index 757bc407..de6dc0b6 100644 --- a/plugins/community/repos/Bogaudio/res-src/Walk-src.svg +++ b/plugins/community/repos/Bogaudio/res-src/Walk-src.svg @@ -123,50 +123,38 @@ RATE - - - - CV - - + OFFSET - + SCALE - - - - - - - GATE - + + + + + + RATE + + OFFSET + + SCALE + + JUMP - - - - - - TRK - - - - - - - HOLD - - OUT - + + + + + OUT diff --git a/plugins/community/repos/Bogaudio/res-src/Walk2-src.svg b/plugins/community/repos/Bogaudio/res-src/Walk2-src.svg index 28426d5d..da768d90 100644 --- a/plugins/community/repos/Bogaudio/res-src/Walk2-src.svg +++ b/plugins/community/repos/Bogaudio/res-src/Walk2-src.svg @@ -96,16 +96,6 @@ - - - - - - - - - - @@ -186,27 +176,15 @@ - - - - - TRK - - - - - TRK - - - - - - - - - GATE - HOLD + + + + + + + OFF + SCL RATE @@ -214,20 +192,21 @@ - - - - - - GATE - HOLD + + + + + + + OFF + SCL RATE OUT - + diff --git a/plugins/community/repos/Bogaudio/res/AddrSeq.svg b/plugins/community/repos/Bogaudio/res/AddrSeq.svg index c9c3600c..38b5332c 100644 --- a/plugins/community/repos/Bogaudio/res/AddrSeq.svg +++ b/plugins/community/repos/Bogaudio/res/AddrSeq.svg @@ -11,11 +11,11 @@ width="90" height="380" viewBox="0 0 90 380" - id="svg221" + id="svg223" sodipodi:docname="svg_render_tmp.svg" inkscape:version="0.92.2 5c3e80d, 2017-08-06"> + id="metadata227"> @@ -36,7 +36,7 @@ inkscape:pageshadow="2" inkscape:window-width="468" inkscape:window-height="449" - id="namedview223" + id="namedview225" showgrid="false" inkscape:zoom="0.62105263" inkscape:cx="45" @@ -44,7 +44,7 @@ inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="0" - inkscape:current-layer="svg221" /> + inkscape:current-layer="svg223" /> + id="defs127"> @@ -158,35 +158,39 @@ viewBox="0 0 40px 40px"> + id="g57"> 2 + id="text41">1 3 + transform="rotate(-197.1) translate(13 0) rotate(197.1) translate(-2 2)" + id="text43">2 4 + transform="rotate(-154.3) translate(13 0) rotate(154.3) translate(-2 2)" + id="text45">3 5 + transform="rotate(-111.4) translate(13 0) rotate(111.4) translate(-2 2)" + id="text47">4 6 + transform="rotate(-68.6) translate(13 0) rotate(68.6) translate(-2 2)" + id="text49">5 7 + transform="rotate(-25.7) translate(13 0) rotate(25.7) translate(-2 2)" + id="text51">6 + 7 8 + id="text55">8 + id="g102"> + id="polyline60" /> + id="polyline62" /> + id="polyline64" /> + id="polyline66" /> + id="polyline68" /> + id="polyline70" /> + id="polyline72" /> + id="polyline74" /> + id="polyline76" /> + id="polyline78" /> + id="polyline80" /> + id="polyline82" /> + id="polyline84" /> + id="polyline86" /> + id="polyline88" /> + id="polyline90" /> + id="polyline92" /> + id="polyline94" /> + id="polyline96" /> + id="polyline98" /> + id="polyline100" /> + id="rect105" /> + id="rect107" /> + id="rect110" /> + id="g117"> + id="circle113" /> + id="circle115" /> + id="g124"> + id="circle120" /> + id="circle122" /> + id="rect129" /> + id="polyline131" /> + id="polyline133" /> + id="polyline135" /> + id="text137"> + id="path918" /> + id="path920" /> + id="path922" /> + id="path924" /> + id="path926" /> + id="path928" /> + id="path930" /> + id="path932" /> + id="text139"> + id="path935" /> + id="path937" /> + id="path939" /> + id="path941" /> + id="path943" /> + id="path945" /> + id="path947" /> + id="path949" /> + id="rect141" /> + id="rect145" /> + id="rect147" /> + id="text149"> + id="path955" /> + id="path957" /> + id="path959" /> + id="path961" /> + id="path963" /> + id="rect153" /> + id="text155"> + id="path967" /> + id="path969" /> + id="path971" /> + id="path973" /> + id="path975" /> + id="text159"> + id="path978" /> + id="path980" /> + id="path982" /> + id="path984" /> + id="path986" /> + id="text263"> + + + + id="path992" /> + id="text267"> + id="path995" /> + id="text269"> + id="path998" /> + id="text271"> + id="path1001" /> + id="text273"> + id="path1004" /> + id="text275"> + id="path1007" /> + id="text277"> + id="path1010" /> + id="text165"> + id="path1013" /> + id="path1015" /> + id="path1017" /> + id="text167"> + id="path1020" /> + id="path1022" /> + id="path1024" /> + id="text171"> + id="path671" /> + id="path673" /> + id="path675" /> + id="path677" /> + id="path679" /> + id="path681" /> + id="text651"> + id="path684" /> + id="text653"> + id="path687" /> + id="text655"> + id="path690" /> + id="text657"> + id="path693" /> + id="text659"> + id="path696" /> + id="text661"> + id="path699" /> + id="text663"> + id="path702" /> + id="text665"> + id="path705" /> + id="rect175" /> + id="text177"> + id="path709" /> + id="path711" /> + id="rect183" /> + id="text185"> + id="path715" /> + id="path717" /> + id="path719" /> + id="polyline605" /> + id="polyline607" /> + id="polyline609" /> + id="polyline611" /> + id="polyline613" /> + id="polyline615" /> + id="polyline617" /> + id="polyline619" /> + id="polyline621" /> + id="polyline623" /> + id="polyline625" /> + id="polyline627" /> + id="polyline629" /> + id="polyline631" /> + id="polyline633" /> + id="polyline635" /> + id="polyline637" /> + id="polyline639" /> + id="polyline641" /> + id="polyline643" /> + id="polyline645" /> + id="text191"> + id="path743" /> + id="polyline559" /> + id="polyline561" /> + id="polyline563" /> + id="polyline565" /> + id="polyline567" /> + id="polyline569" /> + id="polyline571" /> + id="polyline573" /> + id="polyline575" /> + id="polyline577" /> + id="polyline579" /> + id="polyline581" /> + id="polyline583" /> + id="polyline585" /> + id="polyline587" /> + id="polyline589" /> + id="polyline591" /> + id="polyline593" /> + id="polyline595" /> + id="polyline597" /> + id="polyline599" /> + id="text195"> + id="path767" /> + id="polyline513" /> + id="polyline515" /> + id="polyline517" /> + id="polyline519" /> + id="polyline521" /> + id="polyline523" /> + id="polyline525" /> + id="polyline527" /> + id="polyline529" /> + id="polyline531" /> + id="polyline533" /> + id="polyline535" /> + id="polyline537" /> + id="polyline539" /> + id="polyline541" /> + id="polyline543" /> + id="polyline545" /> + id="polyline547" /> + id="polyline549" /> + id="polyline551" /> + id="polyline553" /> + id="text199"> + id="path791" /> + id="polyline467" /> + id="polyline469" /> + id="polyline471" /> + id="polyline473" /> + id="polyline475" /> + id="polyline477" /> + id="polyline479" /> + id="polyline481" /> + id="polyline483" /> + id="polyline485" /> + id="polyline487" /> + id="polyline489" /> + id="polyline491" /> + id="polyline493" /> + id="polyline495" /> + id="polyline497" /> + id="polyline499" /> + id="polyline501" /> + id="polyline503" /> + id="polyline505" /> + id="polyline507" /> + id="text203"> + id="path815" /> + id="polyline421" /> + id="polyline423" /> + id="polyline425" /> + id="polyline427" /> + id="polyline429" /> + id="polyline431" /> + id="polyline433" /> + id="polyline435" /> + id="polyline437" /> + id="polyline439" /> + id="polyline441" /> + id="polyline443" /> + id="polyline445" /> + id="polyline447" /> + id="polyline449" /> + id="polyline451" /> + id="polyline453" /> + id="polyline455" /> + id="polyline457" /> + id="polyline459" /> + id="polyline461" /> + id="text207"> + id="path839" /> + id="polyline375" /> + id="polyline377" /> + id="polyline379" /> + id="polyline381" /> + id="polyline383" /> + id="polyline385" /> + id="polyline387" /> + id="polyline389" /> + id="polyline391" /> + id="polyline393" /> + id="polyline395" /> + id="polyline397" /> + id="polyline399" /> + id="polyline401" /> + id="polyline403" /> + id="polyline405" /> + id="polyline407" /> + id="polyline409" /> + id="polyline411" /> + id="polyline413" /> + id="polyline415" /> + id="text211"> + id="path863" /> + id="polyline329" /> + id="polyline331" /> + id="polyline333" /> + id="polyline335" /> + id="polyline337" /> + id="polyline339" /> + id="polyline341" /> + id="polyline343" /> + id="polyline345" /> + id="polyline347" /> + id="polyline349" /> + id="polyline351" /> + id="polyline353" /> + id="polyline355" /> + id="polyline357" /> + id="polyline359" /> + id="polyline361" /> + id="polyline363" /> + id="polyline365" /> + id="polyline367" /> + id="polyline369" /> + id="text215"> + id="path887" /> + id="polyline283" /> + id="polyline285" /> + id="polyline287" /> + id="polyline289" /> + id="polyline291" /> + id="polyline293" /> + id="polyline295" /> + id="polyline297" /> + id="polyline299" /> + id="polyline301" /> + id="polyline303" /> + id="polyline305" /> + id="polyline307" /> + id="polyline309" /> + id="polyline311" /> + id="polyline313" /> + id="polyline315" /> + id="polyline317" /> + id="polyline319" /> + id="polyline321" /> + id="polyline323" /> + id="text219"> + id="path911" /> diff --git a/plugins/community/repos/Bogaudio/res/Cmp.svg b/plugins/community/repos/Bogaudio/res/Cmp.svg index 9e4fba81..820516f5 100644 --- a/plugins/community/repos/Bogaudio/res/Cmp.svg +++ b/plugins/community/repos/Bogaudio/res/Cmp.svg @@ -1257,12 +1257,12 @@ id="path632" /> diff --git a/plugins/community/repos/Bogaudio/res/EightOne.svg b/plugins/community/repos/Bogaudio/res/EightOne.svg index 06c77dd0..ff765c0b 100644 --- a/plugins/community/repos/Bogaudio/res/EightOne.svg +++ b/plugins/community/repos/Bogaudio/res/EightOne.svg @@ -11,11 +11,11 @@ width="90" height="380" viewBox="0 0 90 380" - id="svg164" + id="svg166" sodipodi:docname="svg_render_tmp.svg" inkscape:version="0.92.2 5c3e80d, 2017-08-06"> + id="metadata170"> @@ -36,7 +36,7 @@ inkscape:pageshadow="2" inkscape:window-width="468" inkscape:window-height="449" - id="namedview166" + id="namedview168" showgrid="false" inkscape:zoom="0.62105263" inkscape:cx="45" @@ -44,7 +44,7 @@ inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="0" - inkscape:current-layer="svg164" /> + inkscape:current-layer="svg166" /> + id="defs82"> @@ -158,35 +158,39 @@ viewBox="0 0 40px 40px"> + id="g57"> 2 + id="text41">1 3 + transform="rotate(-197.1) translate(13 0) rotate(197.1) translate(-2 2)" + id="text43">2 4 + transform="rotate(-154.3) translate(13 0) rotate(154.3) translate(-2 2)" + id="text45">3 5 + transform="rotate(-111.4) translate(13 0) rotate(111.4) translate(-2 2)" + id="text47">4 6 + transform="rotate(-68.6) translate(13 0) rotate(68.6) translate(-2 2)" + id="text49">5 7 + transform="rotate(-25.7) translate(13 0) rotate(25.7) translate(-2 2)" + id="text51">6 + 7 8 + id="text55">8 + id="rect60" /> + id="rect62" /> + id="rect65" /> + id="g72"> + id="circle68" /> + id="circle70" /> + id="g79"> + id="circle75" /> + id="circle77" /> + id="rect84" /> + id="polyline86" /> + id="polyline88" /> + id="polyline90" /> + id="text92"> + id="path295" /> + id="path297" /> + id="path299" /> + id="text94"> + id="path302" /> + id="path304" /> + id="path306" /> + id="path308" /> + id="path310" /> + id="path312" /> + id="path314" /> + id="path316" /> + id="rect96" /> + id="rect100" /> + id="text102"> + id="path321" /> + id="path323" /> + id="text104"> + id="path326" /> + id="text106"> + id="path329" /> + id="text108"> + id="path332" /> + id="text110"> + id="path335" /> + id="text112"> + id="path338" /> + id="text114"> + id="path341" /> + id="text116"> + id="path344" /> + id="text118"> + id="path347" /> + id="rect122" /> + id="rect124" /> + id="text126"> + id="path352" /> + id="path354" /> + id="path356" /> + id="path358" /> + id="path360" /> + id="rect130" /> + id="text132"> + id="path364" /> + id="path366" /> + id="path368" /> + id="path370" /> + id="path372" /> + id="text136"> + id="path375" /> + id="path377" /> + id="path379" /> + id="path381" /> + id="path383" /> + id="text200"> + + + + id="path389" /> + id="text204"> + id="path392" /> + id="text206"> + id="path395" /> + id="text208"> + id="path398" /> + id="text210"> + id="path401" /> + id="text212"> + id="path404" /> + id="text214"> + id="path407" /> + id="text142"> + id="path410" /> + id="path412" /> + id="path414" /> + id="text144"> + id="path417" /> + id="path419" /> + id="path421" /> + id="text148"> + id="path240" /> + id="path242" /> + id="path244" /> + id="path246" /> + id="path248" /> + id="path250" /> + id="text220"> + id="path253" /> + id="text222"> + id="path256" /> + id="text224"> + id="path259" /> + id="text226"> + id="path262" /> + id="text228"> + id="path265" /> + id="text230"> + id="path268" /> + id="text232"> + id="path271" /> + id="text234"> + id="path274" /> + id="rect152" /> + id="text154"> + id="path278" /> + id="path280" /> + id="rect160" /> + id="text162"> + id="path284" /> + id="path286" /> + id="path288" /> diff --git a/plugins/community/repos/Bogaudio/res/Mix1.svg b/plugins/community/repos/Bogaudio/res/Mix1.svg new file mode 100644 index 00000000..986636d6 --- /dev/null +++ b/plugins/community/repos/Bogaudio/res/Mix1.svg @@ -0,0 +1,670 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + -6 + + + + + -12 + + + + + -24 + + + + + -48 + + + + dB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/community/repos/Bogaudio/res/OneEight.svg b/plugins/community/repos/Bogaudio/res/OneEight.svg index 9af005f9..0e11a0d2 100644 --- a/plugins/community/repos/Bogaudio/res/OneEight.svg +++ b/plugins/community/repos/Bogaudio/res/OneEight.svg @@ -11,11 +11,11 @@ width="90" height="380" viewBox="0 0 90 380" - id="svg164" + id="svg166" sodipodi:docname="svg_render_tmp.svg" inkscape:version="0.92.2 5c3e80d, 2017-08-06"> + id="metadata170"> @@ -36,7 +36,7 @@ inkscape:pageshadow="2" inkscape:window-width="468" inkscape:window-height="449" - id="namedview166" + id="namedview168" showgrid="false" inkscape:zoom="0.62105263" inkscape:cx="45" @@ -44,7 +44,7 @@ inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="0" - inkscape:current-layer="svg164" /> + inkscape:current-layer="svg166" /> + id="defs82"> @@ -158,35 +158,39 @@ viewBox="0 0 40px 40px"> + id="g57"> 2 + id="text41">1 3 + transform="rotate(-197.1) translate(13 0) rotate(197.1) translate(-2 2)" + id="text43">2 4 + transform="rotate(-154.3) translate(13 0) rotate(154.3) translate(-2 2)" + id="text45">3 5 + transform="rotate(-111.4) translate(13 0) rotate(111.4) translate(-2 2)" + id="text47">4 6 + transform="rotate(-68.6) translate(13 0) rotate(68.6) translate(-2 2)" + id="text49">5 7 + transform="rotate(-25.7) translate(13 0) rotate(25.7) translate(-2 2)" + id="text51">6 + 7 8 + id="text55">8 + id="rect60" /> + id="rect62" /> + id="rect65" /> + id="g72"> + id="circle68" /> + id="circle70" /> + id="g79"> + id="circle75" /> + id="circle77" /> + id="rect84" /> + id="polyline86" /> + id="polyline88" /> + id="polyline90" /> + id="text92"> + id="path325" /> + id="path327" /> + id="path329" /> + id="text94"> + id="path332" /> + id="path334" /> + id="path336" /> + id="path338" /> + id="path340" /> + id="path342" /> + id="path344" /> + id="path346" /> + id="rect96" /> + id="rect100" /> + id="rect102" /> + id="text104"> + id="path352" /> + id="path354" /> + id="path356" /> + id="path358" /> + id="path360" /> + id="rect108" /> + id="text110"> + id="path364" /> + id="path366" /> + id="path368" /> + id="path370" /> + id="path372" /> + id="text114"> + id="path375" /> + id="path377" /> + id="path379" /> + id="path381" /> + id="path383" /> + id="text200"> + + + + id="path389" /> + id="text204"> + id="path392" /> + id="text206"> + id="path395" /> + id="text208"> + id="path398" /> + id="text210"> + id="path401" /> + id="text212"> + id="path404" /> + id="text214"> + id="path407" /> + id="text120"> + id="path410" /> + id="path412" /> + id="path414" /> + id="text122"> + id="path417" /> + id="path419" /> + id="path421" /> + id="text126"> + id="path240" /> + id="path242" /> + id="path244" /> + id="path246" /> + id="path248" /> + id="path250" /> + id="text220"> + id="path253" /> + id="text222"> + id="path256" /> + id="text224"> + id="path259" /> + id="text226"> + id="path262" /> + id="text228"> + id="path265" /> + id="text230"> + id="path268" /> + id="text232"> + id="path271" /> + id="text234"> + id="path274" /> + id="rect130" /> + id="text132"> + id="path278" /> + id="path280" /> + id="rect138" /> + id="text140"> + id="path284" /> + id="path286" /> + id="rect144" /> + id="text146"> + id="path290" /> + id="path292" /> + id="path294" /> + id="text148"> + id="path297" /> + id="text150"> + id="path300" /> + id="text152"> + id="path303" /> + id="text154"> + id="path306" /> + id="text156"> + id="path309" /> + id="text158"> + id="path312" /> + id="text160"> + id="path315" /> + id="text162"> + id="path318" /> diff --git a/plugins/community/repos/Bogaudio/res/Walk.svg b/plugins/community/repos/Bogaudio/res/Walk.svg index b0c404fc..df29bb67 100644 --- a/plugins/community/repos/Bogaudio/res/Walk.svg +++ b/plugins/community/repos/Bogaudio/res/Walk.svg @@ -11,11 +11,11 @@ width="45" height="380" viewBox="0 0 45 380" - id="svg171" + id="svg161" sodipodi:docname="svg_render_tmp.svg" inkscape:version="0.92.2 5c3e80d, 2017-08-06"> + id="metadata165"> @@ -36,7 +36,7 @@ inkscape:pageshadow="2" inkscape:window-width="468" inkscape:window-height="449" - id="namedview173" + id="namedview163" showgrid="false" inkscape:zoom="0.62105263" inkscape:cx="22.5" @@ -44,7 +44,7 @@ inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="0" - inkscape:current-layer="svg171" /> + inkscape:current-layer="svg161" /> + id="defs94"> @@ -344,46 +344,23 @@ id="circle89" /> - - - - - - - - + id="rect96" /> + id="polyline98" /> + id="polyline100" /> + id="polyline102" /> @@ -391,69 +368,69 @@ + id="text104"> + id="path538" /> + id="path540" /> + id="path542" /> + id="path544" /> + id="path546" /> + id="text106"> + id="path549" /> + id="path551" /> + id="path553" /> + id="path555" /> + id="path557" /> + id="path559" /> + id="path561" /> + id="path563" /> + id="rect108" /> @@ -464,283 +441,283 @@ + id="text114"> + id="path377" /> + id="polyline116" /> + id="polyline118" /> + id="text122"> + id="path382" /> + id="polyline124" /> + id="polyline126" /> + id="text132"> + id="path387" /> + id="path389" /> + id="path391" /> + id="path393" /> + id="polyline351" /> + id="polyline353" /> + id="polyline355" /> + id="polyline357" /> + id="polyline359" /> + id="polyline361" /> + id="polyline363" /> + id="polyline365" /> + id="polyline367" /> + id="polyline369" /> + id="polyline371" /> + id="text140"> + id="path407" /> + id="path409" /> + id="path411" /> + id="path413" /> + id="polyline325" /> + id="polyline327" /> + id="polyline329" /> + id="polyline331" /> + id="polyline333" /> + id="polyline335" /> + id="polyline337" /> + id="polyline339" /> + id="polyline341" /> + id="polyline343" /> + id="polyline345" /> + id="text148"> + id="path427" /> + id="path429" /> + id="path431" /> + id="polyline309" /> + id="polyline293" /> + id="text156"> + id="path436" /> + id="path438" /> + id="path440" /> + id="polyline277" /> + id="polyline261" /> - - - - - - - - - - - - - - + d="m 12,281 h 52 c 2.77,0 5,2.23 5,5 v 69 c 0,2.77 -2.23,5 -5,5 H 12 c -2.77,0 -5,-2.23 -5,-5 v -69 c 0,-2.77 2.23,-5 5,-5 z" + id="rect164" /> + d="m 52,320 h 12 c 2.77,0 5,2.23 5,5 v 30 c 0,2.77 -2.23,5 -5,5 H 52 c -2.77,0 -5,-2.23 -5,-5 v -30 c 0,-2.77 2.23,-5 5,-5 z" + id="rect166" /> + d="m 38,320 h 20 v 40 H 38 Z" + id="rect168" /> + - + id="text172"> + id="path449" /> + id="path451" /> + id="path453" /> - + id="text174"> + id="path456" /> + id="path458" /> + id="path460" /> + id="text176"> + id="path463" /> + id="path465" /> + id="path467" /> + id="path469" /> + id="text178"> + id="path472" /> + id="path474" /> + id="path476" /> + d="m 147,281 h 52 c 2.77,0 5,2.23 5,5 v 69 c 0,2.77 -2.23,5 -5,5 h -52 c -2.77,0 -5,-2.23 -5,-5 v -69 c 0,-2.77 2.23,-5 5,-5 z" + id="rect182" /> + d="m 187,320 h 12 c 2.77,0 5,2.23 5,5 v 30 c 0,2.77 -2.23,5 -5,5 h -12 c -2.77,0 -5,-2.23 -5,-5 v -30 c 0,-2.77 2.23,-5 5,-5 z" + id="rect184" /> + d="m 173,320 h 20 v 40 h -20 z" + id="rect186" /> + - + id="text190"> + id="path483" /> + id="path485" /> + id="path487" /> - + id="text192"> + id="path490" /> + id="path492" /> + id="path494" /> + id="text194"> + id="path497" /> + id="path499" /> + id="path501" /> + id="path503" /> + id="text196"> + id="path506" /> + id="path508" /> + id="path510" /> + d="m 79.5,300 h 51 c 2.77,0 5,2.23 5,5 v 30 c 0,2.77 -2.23,5 -5,5 h -51 c -2.77,0 -5,-2.23 -5,-5 v -30 c 0,-2.77 2.23,-5 5,-5 z" + id="rect200" /> + d="m 119.5,300 h 12 c 2.77,0 5,2.23 5,5 v 30 c 0,2.77 -2.23,5 -5,5 h -12 c -2.77,0 -5,-2.23 -5,-5 v -30 c 0,-2.77 2.23,-5 5,-5 z" + id="rect202" /> + d="m 105.5,300 h 20 v 40 h -20 z" + id="rect204" /> + id="text206"> + id="path516" /> + id="path518" /> + id="path520" /> + id="path522" /> + id="text208"> + id="path525" /> + id="path527" /> + id="path529" /> + id="path531" /> diff --git a/plugins/community/repos/Bogaudio/src/AddrSeq.cpp b/plugins/community/repos/Bogaudio/src/AddrSeq.cpp index 2d7a6374..ead0ff5f 100644 --- a/plugins/community/repos/Bogaudio/src/AddrSeq.cpp +++ b/plugins/community/repos/Bogaudio/src/AddrSeq.cpp @@ -1,20 +1,50 @@ #include "AddrSeq.hpp" +#define SELECT_ON_CLOCK "select_on_clock" + void AddrSeq::onReset() { _step = 0; _clock.reset(); _reset.reset(); } +void AddrSeq::onSampleRateChange() { + _timer.setParams(engineGetSampleRate(), 0.001f); +} + +json_t* AddrSeq::toJson() { + json_t* root = json_object(); + json_object_set_new(root, SELECT_ON_CLOCK, json_boolean(_selectOnClock)); + return root; +} + +void AddrSeq::fromJson(json_t* root) { + json_t* s = json_object_get(root, SELECT_ON_CLOCK); + if (s) { + _selectOnClock = json_is_true(s); + } +} + void AddrSeq::step() { - int steps = clamp(params[STEPS_PARAM].value, 2.0f, 8.0f); + bool reset = _reset.process(inputs[RESET_INPUT].value); + if (reset) { + _timer.reset(); + } + bool timer = _timer.next(); + bool clock = _clock.process(inputs[CLOCK_INPUT].value) && !timer; + + int steps = clamp(params[STEPS_PARAM].value, 1.0f, 8.0f); int reverse = 1 - 2 * (params[DIRECTION_PARAM].value == 0.0f); - _step = (_step + reverse * _clock.process(inputs[CLOCK_INPUT].value)) % steps; + _step = (_step + reverse * clock) % steps; _step += (_step < 0) * steps; - _step -= _step * _reset.process(inputs[RESET_INPUT].value); - int step = _step + (int)params[SELECT_PARAM].value; - step += (int)(clamp(inputs[SELECT_INPUT].value, 0.0f, 10.0f) * 0.1f * 8.0f); + _step -= _step * reset; + int select = params[SELECT_PARAM].value; + select += clamp(inputs[SELECT_INPUT].value, 0.0f, 10.0f) * 0.1f * 8.0f; + if (!_selectOnClock || clock) { + _select = select; + } + int step = _step + _select; step = step % 8; float out = 0.0f; @@ -25,6 +55,24 @@ void AddrSeq::step() { outputs[OUT_OUTPUT].value = out * 10.0f; } +struct SelectOnClockMenuItem : MenuItem { + AddrSeq* _module; + + SelectOnClockMenuItem(AddrSeq* module, const char* label) + : _module(module) + { + this->text = label; + } + + void onAction(EventAction &e) override { + _module->_selectOnClock = !_module->_selectOnClock; + } + + void step() override { + rightText = _module->_selectOnClock ? "?" : ""; + } +}; + struct AddrSeqWidget : ModuleWidget { static constexpr int hp = 6; @@ -71,7 +119,7 @@ struct AddrSeqWidget : ModuleWidget { // end generated by svg_widgets.rb { - auto w = ParamWidget::create(stepsParamPosition, module, AddrSeq::STEPS_PARAM, 2.0, 8.0, 8.0); + auto w = ParamWidget::create(stepsParamPosition, module, AddrSeq::STEPS_PARAM, 1.0, 8.0, 8.0); dynamic_cast(w)->snap = true; addParam(w); } @@ -105,6 +153,13 @@ struct AddrSeqWidget : ModuleWidget { addChild(ModuleLightWidget::create>(out7LightPosition, module, AddrSeq::OUT7_LIGHT)); addChild(ModuleLightWidget::create>(out8LightPosition, module, AddrSeq::OUT8_LIGHT)); } + + void appendContextMenu(Menu* menu) override { + AddrSeq* m = dynamic_cast(module); + assert(m); + menu->addChild(new MenuLabel()); + menu->addChild(new SelectOnClockMenuItem(m, "Select on clock")); + } }; RACK_PLUGIN_MODEL_INIT(Bogaudio, AddrSeq) { diff --git a/plugins/community/repos/Bogaudio/src/AddrSeq.hpp b/plugins/community/repos/Bogaudio/src/AddrSeq.hpp index 7fb9d98e..46d50503 100644 --- a/plugins/community/repos/Bogaudio/src/AddrSeq.hpp +++ b/plugins/community/repos/Bogaudio/src/AddrSeq.hpp @@ -1,6 +1,9 @@ #pragma once #include "bogaudio.hpp" +#include "dsp/signal.hpp" + +using namespace bogaudio::dsp; extern Model* modelAddrSeq; @@ -48,13 +51,20 @@ struct AddrSeq : Module { Trigger _clock; Trigger _reset; + Timer _timer; int _step; + bool _selectOnClock = false; + int _select = 0; AddrSeq() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { onReset(); + onSampleRateChange(); } void onReset() override; + void onSampleRateChange() override; + json_t* toJson() override; + void fromJson(json_t* root) override; void step() override; }; diff --git a/plugins/community/repos/Bogaudio/src/EightOne.cpp b/plugins/community/repos/Bogaudio/src/EightOne.cpp index 7a6ce9f9..4360d3c1 100644 --- a/plugins/community/repos/Bogaudio/src/EightOne.cpp +++ b/plugins/community/repos/Bogaudio/src/EightOne.cpp @@ -1,20 +1,50 @@ #include "EightOne.hpp" +#define SELECT_ON_CLOCK "select_on_clock" + void EightOne::onReset() { _step = 0; _clock.reset(); _reset.reset(); } +void EightOne::onSampleRateChange() { + _timer.setParams(engineGetSampleRate(), 0.001f); +} + +json_t* EightOne::toJson() { + json_t* root = json_object(); + json_object_set_new(root, SELECT_ON_CLOCK, json_boolean(_selectOnClock)); + return root; +} + +void EightOne::fromJson(json_t* root) { + json_t* s = json_object_get(root, SELECT_ON_CLOCK); + if (s) { + _selectOnClock = json_is_true(s); + } +} + void EightOne::step() { - int steps = clamp(params[STEPS_PARAM].value, 2.0f, 8.0f); + bool reset = _reset.process(inputs[RESET_INPUT].value); + if (reset) { + _timer.reset(); + } + bool timer = _timer.next(); + bool clock = _clock.process(inputs[CLOCK_INPUT].value) && !timer; + + int steps = clamp(params[STEPS_PARAM].value, 1.0f, 8.0f); int reverse = 1 - 2 * (params[DIRECTION_PARAM].value == 0.0f); - _step = (_step + reverse * _clock.process(inputs[CLOCK_INPUT].value)) % steps; + _step = (_step + reverse * clock) % steps; _step += (_step < 0) * steps; - _step -= _step * _reset.process(inputs[RESET_INPUT].value); - int step = _step + (int)params[SELECT_PARAM].value; - step += (int)(clamp(inputs[SELECT_INPUT].value, 0.0f, 10.0f) * 0.1f * 8.0f); + _step -= _step * reset; + int select = params[SELECT_PARAM].value; + select += clamp(inputs[SELECT_INPUT].value, 0.0f, 10.0f) * 0.1f * 8.0f; + if (!_selectOnClock || clock) { + _select = select; + } + int step = _step + _select; step = step % 8; float out = 0.0f; @@ -25,6 +55,24 @@ void EightOne::step() { outputs[OUT_OUTPUT].value = out; } +struct SelectOnClockMenuItem : MenuItem { + EightOne* _module; + + SelectOnClockMenuItem(EightOne* module, const char* label) + : _module(module) + { + this->text = label; + } + + void onAction(EventAction &e) override { + _module->_selectOnClock = !_module->_selectOnClock; + } + + void step() override { + rightText = _module->_selectOnClock ? "?" : ""; + } +}; + struct EightOneWidget : ModuleWidget { static constexpr int hp = 6; @@ -71,7 +119,7 @@ struct EightOneWidget : ModuleWidget { // end generated by svg_widgets.rb { - auto w = ParamWidget::create(stepsParamPosition, module, EightOne::STEPS_PARAM, 2.0, 8.0, 8.0); + auto w = ParamWidget::create(stepsParamPosition, module, EightOne::STEPS_PARAM, 1.0, 8.0, 8.0); dynamic_cast(w)->snap = true; addParam(w); } @@ -105,6 +153,13 @@ struct EightOneWidget : ModuleWidget { addChild(ModuleLightWidget::create>(in7LightPosition, module, EightOne::IN7_LIGHT)); addChild(ModuleLightWidget::create>(in8LightPosition, module, EightOne::IN8_LIGHT)); } + + void appendContextMenu(Menu* menu) override { + EightOne* m = dynamic_cast(module); + assert(m); + menu->addChild(new MenuLabel()); + menu->addChild(new SelectOnClockMenuItem(m, "Select on clock")); + } }; RACK_PLUGIN_MODEL_INIT(Bogaudio, EightOne) { diff --git a/plugins/community/repos/Bogaudio/src/EightOne.hpp b/plugins/community/repos/Bogaudio/src/EightOne.hpp index e4455390..cd2746d1 100644 --- a/plugins/community/repos/Bogaudio/src/EightOne.hpp +++ b/plugins/community/repos/Bogaudio/src/EightOne.hpp @@ -1,6 +1,9 @@ #pragma once #include "bogaudio.hpp" +#include "dsp/signal.hpp" + +using namespace bogaudio::dsp; extern Model* modelEightOne; @@ -48,13 +51,20 @@ struct EightOne : Module { Trigger _clock; Trigger _reset; + Timer _timer; int _step; + bool _selectOnClock = false; + int _select = 0; EightOne() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { onReset(); + onSampleRateChange(); } void onReset() override; + void onSampleRateChange() override; + json_t* toJson() override; + void fromJson(json_t* root) override; void step() override; }; diff --git a/plugins/community/repos/Bogaudio/src/Mix1.cpp b/plugins/community/repos/Bogaudio/src/Mix1.cpp new file mode 100644 index 00000000..18629aae --- /dev/null +++ b/plugins/community/repos/Bogaudio/src/Mix1.cpp @@ -0,0 +1,65 @@ + +#include "Mix1.hpp" + +void Mix1::onSampleRateChange() { + _channel.setSampleRate(engineGetSampleRate()); +} + +void Mix1::step() { + _channel.next(false, false); + outputs[OUT_OUTPUT].value = _channel.out; +} + +struct Mix1Widget : ModuleWidget { + static constexpr int hp = 3; + + Mix1Widget(Mix1* module) : ModuleWidget(module) { + box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); + + { + SVGPanel *panel = new SVGPanel(); + panel->box.size = box.size; + panel->setBackground(SVG::load(assetPlugin(plugin, "res/Mix1.svg"))); + addChild(panel); + } + + addChild(Widget::create(Vec(0, 0))); + addChild(Widget::create(Vec(box.size.x - 15, 365))); + + // generated by svg_widgets.rb + auto levelParamPosition = Vec(13.5, 18.0); + auto muteParamPosition = Vec(13.2, 175.7); + + auto muteInputPosition = Vec(10.5, 198.0); + auto levelInputPosition = Vec(10.5, 233.0); + auto inInputPosition = Vec(10.5, 268.0); + + auto outOutputPosition = Vec(10.5, 306.0); + // end generated by svg_widgets.rb + + { + auto slider = ParamWidget::create( + levelParamPosition, + module, + Mix1::LEVEL_PARAM, + 0.0, + 1.0, + fabsf(MixerChannel::minDecibels) / (MixerChannel::maxDecibels - MixerChannel::minDecibels) + ); + dynamic_cast(slider)->setVULevel(&module->_channel.rms); + addParam(slider); + } + addParam(ParamWidget::create(muteParamPosition, module, Mix1::MUTE_PARAM, 0.0, 1.0, 0.0)); + + addInput(Port::create(muteInputPosition, Port::INPUT, module, Mix1::MUTE_INPUT)); + addInput(Port::create(levelInputPosition, Port::INPUT, module, Mix1::LEVEL_INPUT)); + addInput(Port::create(inInputPosition, Port::INPUT, module, Mix1::IN_INPUT)); + + addOutput(Port::create(outOutputPosition, Port::OUTPUT, module, Mix1::OUT_OUTPUT)); + } +}; + +RACK_PLUGIN_MODEL_INIT(Bogaudio, Mix1) { + Model* modelMix1 = createModel("Bogaudio-Mix1", "MIX1", "fader/amplifier with mute", AMPLIFIER_TAG); + return modelMix1; +} diff --git a/plugins/community/repos/Bogaudio/src/Mix1.hpp b/plugins/community/repos/Bogaudio/src/Mix1.hpp new file mode 100644 index 00000000..9c1ae089 --- /dev/null +++ b/plugins/community/repos/Bogaudio/src/Mix1.hpp @@ -0,0 +1,58 @@ +#pragma once + +#include "bogaudio.hpp" +#include "mixer.hpp" +#include "dsp/signal.hpp" + +using namespace bogaudio::dsp; + +extern Model* modelMix1; + +namespace bogaudio { + +struct Mix1 : Module { + enum ParamsIds { + LEVEL_PARAM, + MUTE_PARAM, + NUM_PARAMS + }; + + enum InputsIds { + MUTE_INPUT, + LEVEL_INPUT, + IN_INPUT, + NUM_INPUTS + }; + + enum OutputsIds { + OUT_OUTPUT, + NUM_OUTPUTS + }; + + enum LightsIds { + NUM_LIGHTS + }; + + MixerChannel _channel; + + Mix1() + : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) + , _channel( + params[LEVEL_PARAM], + params[LEVEL_PARAM], // not used + params[MUTE_PARAM], + inputs[IN_INPUT], + inputs[LEVEL_INPUT], + inputs[LEVEL_INPUT], // not used + 1000.0f, + &inputs[MUTE_INPUT] + ) + { + onSampleRateChange(); + } + + void onSampleRateChange() override; + void step() override; +}; + +} // namespace bogaudio diff --git a/plugins/community/repos/Bogaudio/src/OneEight.cpp b/plugins/community/repos/Bogaudio/src/OneEight.cpp index e63f676e..b02d9b69 100644 --- a/plugins/community/repos/Bogaudio/src/OneEight.cpp +++ b/plugins/community/repos/Bogaudio/src/OneEight.cpp @@ -1,20 +1,50 @@ #include "OneEight.hpp" +#define SELECT_ON_CLOCK "select_on_clock" + void OneEight::onReset() { _step = 0; _clock.reset(); _reset.reset(); } +void OneEight::onSampleRateChange() { + _timer.setParams(engineGetSampleRate(), 0.001f); +} + +json_t* OneEight::toJson() { + json_t* root = json_object(); + json_object_set_new(root, SELECT_ON_CLOCK, json_boolean(_selectOnClock)); + return root; +} + +void OneEight::fromJson(json_t* root) { + json_t* s = json_object_get(root, SELECT_ON_CLOCK); + if (s) { + _selectOnClock = json_is_true(s); + } +} + void OneEight::step() { - int steps = clamp(params[STEPS_PARAM].value, 2.0f, 8.0f); + bool reset = _reset.process(inputs[RESET_INPUT].value); + if (reset) { + _timer.reset(); + } + bool timer = _timer.next(); + bool clock = _clock.process(inputs[CLOCK_INPUT].value) && !timer; + + int steps = clamp(params[STEPS_PARAM].value, 1.0f, 8.0f); int reverse = 1 - 2 * (params[DIRECTION_PARAM].value == 0.0f); - _step = (_step + reverse * _clock.process(inputs[CLOCK_INPUT].value)) % steps; + _step = (_step + reverse * clock) % steps; _step += (_step < 0) * steps; - _step -= _step * _reset.process(inputs[RESET_INPUT].value); - int step = _step + (int)params[SELECT_PARAM].value; - step += (int)(clamp(inputs[SELECT_INPUT].value, 0.0f, 10.0f) * 0.1f * 8.0f); + _step -= _step * reset; + int select = params[SELECT_PARAM].value; + select += clamp(inputs[SELECT_INPUT].value, 0.0f, 10.0f) * 0.1f * 8.0f; + if (!_selectOnClock || clock) { + _select = select; + } + int step = _step + _select; step = step % 8; float in = inputs[IN_INPUT].value + !inputs[IN_INPUT].active * 10.0f; @@ -24,6 +54,24 @@ void OneEight::step() { } } +struct SelectOnClockMenuItem : MenuItem { + OneEight* _module; + + SelectOnClockMenuItem(OneEight* module, const char* label) + : _module(module) + { + this->text = label; + } + + void onAction(EventAction &e) override { + _module->_selectOnClock = !_module->_selectOnClock; + } + + void step() override { + rightText = _module->_selectOnClock ? "?" : ""; + } +}; + struct OneEightWidget : ModuleWidget { static constexpr int hp = 6; @@ -70,7 +118,7 @@ struct OneEightWidget : ModuleWidget { // end generated by svg_widgets.rb { - auto w = ParamWidget::create(stepsParamPosition, module, OneEight::STEPS_PARAM, 2.0, 8.0, 8.0); + auto w = ParamWidget::create(stepsParamPosition, module, OneEight::STEPS_PARAM, 1.0, 8.0, 8.0); dynamic_cast(w)->snap = true; addParam(w); } @@ -104,6 +152,13 @@ struct OneEightWidget : ModuleWidget { addChild(ModuleLightWidget::create>(out7LightPosition, module, OneEight::OUT7_LIGHT)); addChild(ModuleLightWidget::create>(out8LightPosition, module, OneEight::OUT8_LIGHT)); } + + void appendContextMenu(Menu* menu) override { + OneEight* m = dynamic_cast(module); + assert(m); + menu->addChild(new MenuLabel()); + menu->addChild(new SelectOnClockMenuItem(m, "Select on clock")); + } }; RACK_PLUGIN_MODEL_INIT(Bogaudio, OneEight) { diff --git a/plugins/community/repos/Bogaudio/src/OneEight.hpp b/plugins/community/repos/Bogaudio/src/OneEight.hpp index 74494fef..5b11b921 100644 --- a/plugins/community/repos/Bogaudio/src/OneEight.hpp +++ b/plugins/community/repos/Bogaudio/src/OneEight.hpp @@ -1,6 +1,9 @@ #pragma once #include "bogaudio.hpp" +#include "dsp/signal.hpp" + +using namespace bogaudio::dsp; extern Model* modelOneEight; @@ -48,13 +51,20 @@ struct OneEight : Module { Trigger _clock; Trigger _reset; + Timer _timer; int _step; + bool _selectOnClock = false; + int _select = 0; OneEight() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { onReset(); + onSampleRateChange(); } void onReset() override; + void onSampleRateChange() override; + json_t* toJson() override; + void fromJson(json_t* root) override; void step() override; }; diff --git a/plugins/community/repos/Bogaudio/src/UMix.cpp b/plugins/community/repos/Bogaudio/src/UMix.cpp index 1d881b5c..3a2b688b 100644 --- a/plugins/community/repos/Bogaudio/src/UMix.cpp +++ b/plugins/community/repos/Bogaudio/src/UMix.cpp @@ -2,17 +2,24 @@ #include "UMix.hpp" #define SUM "sum" +#define CVMODE "cv_mode" json_t* UMix::toJson() { json_t* root = json_object(); json_object_set_new(root, SUM, json_boolean(_sum)); + json_object_set_new(root, CVMODE, json_boolean(_cvMode)); return root; } void UMix::fromJson(json_t* root) { - json_t* ll = json_object_get(root, SUM); - if (ll) { - _sum = json_is_true(ll); + json_t* s = json_object_get(root, SUM); + if (s) { + _sum = json_is_true(s); + } + + json_t* c = json_object_get(root, CVMODE); + if (c) { + _cvMode = json_is_true(c); } } @@ -25,7 +32,13 @@ void UMix::step() { for (int i = 0; i < 8; ++i) { out += inputs[IN1_INPUT + i].value; } - outputs[OUT_OUTPUT].value = _saturator.next(params[LEVEL_PARAM].value * out); + out *= params[LEVEL_PARAM].value; + if (_cvMode) { + outputs[OUT_OUTPUT].value = clamp(out, -12.0f, 12.0f); + } + else { + outputs[OUT_OUTPUT].value = _saturator.next(out); + } } else { float out = 0.0f; @@ -38,7 +51,13 @@ void UMix::step() { } if (active > 0) { out /= (float)active; - outputs[OUT_OUTPUT].value = _saturator.next(params[LEVEL_PARAM].value * out); + out *= params[LEVEL_PARAM].value; + if (_cvMode) { + outputs[OUT_OUTPUT].value = clamp(out, -12.0f, 12.0f); + } + else { + outputs[OUT_OUTPUT].value = _saturator.next(out); + } } else { outputs[OUT_OUTPUT].value = 0.0f; @@ -64,6 +83,24 @@ struct AverageMenuItem : MenuItem { } }; +struct CVModeMenuItem : MenuItem { + UMix* _module; + + CVModeMenuItem(UMix* module, const char* label) + : _module(module) + { + this->text = label; + } + + void onAction(EventAction &e) override { + _module->_cvMode = !_module->_cvMode; + } + + void step() override { + rightText = _module->_cvMode ? "✔" : ""; + } +}; + struct UMixWidget : ModuleWidget { static constexpr int hp = 3; @@ -114,6 +151,7 @@ struct UMixWidget : ModuleWidget { assert(umix); menu->addChild(new MenuLabel()); menu->addChild(new AverageMenuItem(umix, "Average")); + menu->addChild(new CVModeMenuItem(umix, "CV mode")); } }; diff --git a/plugins/community/repos/Bogaudio/src/UMix.hpp b/plugins/community/repos/Bogaudio/src/UMix.hpp index b130f25e..ee5d35e9 100644 --- a/plugins/community/repos/Bogaudio/src/UMix.hpp +++ b/plugins/community/repos/Bogaudio/src/UMix.hpp @@ -37,6 +37,7 @@ struct UMix : Module { }; bool _sum = true; + bool _cvMode = false; Saturator _saturator; UMix() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { diff --git a/plugins/community/repos/Bogaudio/src/Walk.cpp b/plugins/community/repos/Bogaudio/src/Walk.cpp index 80fc36de..27c3b5d0 100644 --- a/plugins/community/repos/Bogaudio/src/Walk.cpp +++ b/plugins/community/repos/Bogaudio/src/Walk.cpp @@ -2,17 +2,16 @@ #include "Walk.hpp" void Walk::onReset() { - _trigger.reset(); + _jumpTrigger.reset(); _modulationStep = modulationSteps; } void Walk::onSampleRateChange() { _modulationStep = modulationSteps; + _slew.setParams(engineGetSampleRate(), 100.0f, 10.0f); } void Walk::step() { - lights[TRACK_LIGHT].value = params[TRACK_PARAM].value; - ++_modulationStep; if (_modulationStep >= modulationSteps) { _modulationStep = 0; @@ -21,21 +20,29 @@ void Walk::step() { if (inputs[RATE_INPUT].active) { rate *= clamp(inputs[RATE_INPUT].value / 10.0f, 0.0f, 1.0f); } - rate *= rate; - rate *= rate; + rate = 0.2f * powf(rate, 5.0f); _walk.setParams(engineGetSampleRate(), rate); - } - float out = _walk.next(); - out *= params[SCALE_PARAM].value; - out += params[OFFSET_PARAM].value * 5.0f; - outputs[OUT_OUTPUT].value = out; + _offset = params[OFFSET_PARAM].value; + if (inputs[OFFSET_INPUT].active) { + _offset *= clamp(inputs[OFFSET_INPUT].value / 5.0f, -1.0f, 1.0f); + } + _offset *= 5.0f; - bool triggered = _trigger.process(inputs[HOLD_INPUT].value); - if (params[TRACK_PARAM].value > 0.5f ? _trigger.isHigh() : triggered) { - _hold = out; + _scale = params[SCALE_PARAM].value; + if (inputs[SCALE_INPUT].active) { + _scale *= clamp(inputs[SCALE_INPUT].value / 10.0f, 0.0f, 1.0f); + } } - outputs[HOLD_OUTPUT].value = _hold; + + if (_jumpTrigger.process(inputs[JUMP_INPUT].value)) { + _walk.jump(); + } + + float out = _slew.next(_walk.next()); + out *= _scale; + out += _offset; + outputs[OUT_OUTPUT].value = out; } struct WalkWidget : ModuleWidget { @@ -56,31 +63,27 @@ struct WalkWidget : ModuleWidget { // generated by svg_widgets.rb auto rateParamPosition = Vec(8.0, 36.0); - auto offsetParamPosition = Vec(14.5, 137.0); - auto scaleParamPosition = Vec(14.5, 178.0); - auto trackParamPosition = Vec(29.0, 246.7); + auto offsetParamPosition = Vec(14.5, 91.0); + auto scaleParamPosition = Vec(14.5, 130.0); - auto rateInputPosition = Vec(10.5, 77.0); - auto holdInputPosition = Vec(10.5, 210.0); + auto rateInputPosition = Vec(10.5, 160.0); + auto offsetInputPosition = Vec(10.5, 195.0); + auto scaleInputPosition = Vec(10.5, 230.0); + auto jumpInputPosition = Vec(10.5, 265.0); - auto holdOutputPosition = Vec(10.5, 261.0); - auto outOutputPosition = Vec(10.5, 296.0); - - auto trackLightPosition = Vec(7.0, 248.0); + auto outOutputPosition = Vec(10.5, 303.0); // end generated by svg_widgets.rb addParam(ParamWidget::create(rateParamPosition, module, Walk::RATE_PARAM, 0.0, 1.0, 0.1)); addParam(ParamWidget::create(offsetParamPosition, module, Walk::OFFSET_PARAM, -1.0, 1.0, 0.0)); addParam(ParamWidget::create(scaleParamPosition, module, Walk::SCALE_PARAM, 0.0, 1.0, 1.0)); - addParam(ParamWidget::create(trackParamPosition, module, Walk::TRACK_PARAM, 0.0, 1.0, 0.0)); addInput(Port::create(rateInputPosition, Port::INPUT, module, Walk::RATE_INPUT)); - addInput(Port::create(holdInputPosition, Port::INPUT, module, Walk::HOLD_INPUT)); + addInput(Port::create(offsetInputPosition, Port::INPUT, module, Walk::OFFSET_INPUT)); + addInput(Port::create(scaleInputPosition, Port::INPUT, module, Walk::SCALE_INPUT)); + addInput(Port::create(jumpInputPosition, Port::INPUT, module, Walk::JUMP_INPUT)); - addOutput(Port::create(holdOutputPosition, Port::OUTPUT, module, Walk::HOLD_OUTPUT)); addOutput(Port::create(outOutputPosition, Port::OUTPUT, module, Walk::OUT_OUTPUT)); - - addChild(ModuleLightWidget::create>(trackLightPosition, module, Walk::TRACK_LIGHT)); } }; diff --git a/plugins/community/repos/Bogaudio/src/Walk.hpp b/plugins/community/repos/Bogaudio/src/Walk.hpp index b9cd3aa7..0cd9c229 100644 --- a/plugins/community/repos/Bogaudio/src/Walk.hpp +++ b/plugins/community/repos/Bogaudio/src/Walk.hpp @@ -2,6 +2,7 @@ #include "bogaudio.hpp" #include "dsp/noise.hpp" +#include "dsp/signal.hpp" using namespace bogaudio::dsp; @@ -14,32 +15,33 @@ struct Walk : Module { RATE_PARAM, OFFSET_PARAM, SCALE_PARAM, - TRACK_PARAM, NUM_PARAMS }; enum InputsIds { RATE_INPUT, - HOLD_INPUT, + OFFSET_INPUT, + SCALE_INPUT, + JUMP_INPUT, NUM_INPUTS }; enum OutputsIds { - HOLD_OUTPUT, OUT_OUTPUT, NUM_OUTPUTS }; enum LightsIds { - TRACK_LIGHT, NUM_LIGHTS }; const int modulationSteps = 100; int _modulationStep = 0; - Trigger _trigger; + float _offset = 0.0f; + float _scale = 0.0f; + Trigger _jumpTrigger; RandomWalk _walk; - float _hold = 0.0f; + SlewLimiter _slew; Walk() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { onReset(); diff --git a/plugins/community/repos/Bogaudio/src/Walk2.cpp b/plugins/community/repos/Bogaudio/src/Walk2.cpp index 3f203d62..85759634 100644 --- a/plugins/community/repos/Bogaudio/src/Walk2.cpp +++ b/plugins/community/repos/Bogaudio/src/Walk2.cpp @@ -1,9 +1,11 @@ #include "Walk2.hpp" +#define ZOOM_OUT_KEY "zoom_out" +#define GRID_KEY "grid" +#define COLOR_KEY "color" + void Walk2::onReset() { - _triggerX.reset(); - _triggerY.reset(); _jumpTrigger.reset(); _modulationStep = modulationSteps; } @@ -13,65 +15,105 @@ void Walk2::onSampleRateChange() { _historySteps = (historySeconds * engineGetSampleRate()) / historyPoints; } -void Walk2::step() { - lights[TRACK_X_LIGHT].value = params[TRACK_X_PARAM].value; - lights[TRACK_Y_LIGHT].value = params[TRACK_Y_PARAM].value; +json_t* Walk2::toJson() { + json_t* root = json_object(); + json_object_set_new(root, ZOOM_OUT_KEY, json_boolean(_zoomOut)); + json_object_set_new(root, GRID_KEY, json_boolean(_drawGrid)); + json_object_set_new(root, COLOR_KEY, json_integer(_traceColor)); + return root; +} +void Walk2::fromJson(json_t* root) { + json_t* zo = json_object_get(root, ZOOM_OUT_KEY); + if (zo) { + _zoomOut = json_is_true(zo); + } + json_t* g = json_object_get(root, GRID_KEY); + if (g) { + _drawGrid = json_is_true(g); + } + json_t* c = json_object_get(root, COLOR_KEY); + if (c) { + _traceColor = (TraceColor)json_integer_value(c); + } +} + +inline float scaleRate(float rate) { + return 0.2f * powf(rate, 5.0f); +} + +void Walk2::step() { ++_modulationStep; if (_modulationStep >= modulationSteps) { _modulationStep = 0; + float sampleRate = engineGetSampleRate(); float rateX = params[RATE_X_PARAM].value; if (inputs[RATE_X_INPUT].active) { rateX *= clamp(inputs[RATE_X_INPUT].value / 10.0f, 0.0f, 1.0f); } - rateX *= rateX; - rateX *= rateX; - _walkX.setParams(engineGetSampleRate(), rateX); + rateX = scaleRate(rateX); + _walkX.setParams(sampleRate, rateX); + _slewX.setParams(sampleRate, std::max((1.0f - rateX) * 100.0f, 0.0f), 10.0f); + + _offsetX = params[OFFSET_X_PARAM].value; + if (inputs[OFFSET_X_INPUT].active) { + _offsetX *= clamp(inputs[OFFSET_X_INPUT].value / 5.0f, -1.0f, 1.0f); + } + _offsetX *= 5.0f; + + _scaleX = params[SCALE_X_PARAM].value; + if (inputs[SCALE_X_INPUT].active) { + _scaleX *= clamp(inputs[SCALE_X_INPUT].value / 10.0f, 0.0f, 1.0f); + } float rateY = params[RATE_Y_PARAM].value; if (inputs[RATE_Y_INPUT].active) { rateY *= clamp(inputs[RATE_Y_INPUT].value / 10.0f, 0.0f, 1.0f); } - rateY *= rateY; - rateY *= rateY; - _walkY.setParams(engineGetSampleRate(), rateY); + rateY = scaleRate(rateY); + _walkY.setParams(sampleRate, rateY); + _slewY.setParams(sampleRate, std::max((1.0f - rateY) * 100.0f, 0.0f), 10.0f); + + _offsetY = params[OFFSET_Y_PARAM].value; + if (inputs[OFFSET_Y_INPUT].active) { + _offsetY *= clamp(inputs[OFFSET_Y_INPUT].value / 5.0f, -1.0f, 1.0f); + } + _offsetY *= 5.0f; + + _scaleY = params[SCALE_Y_PARAM].value; + if (inputs[SCALE_Y_INPUT].active) { + _scaleY *= clamp(inputs[SCALE_Y_INPUT].value / 10.0f, 0.0f, 1.0f); + } } - if (_jumpTrigger.process(inputs[JUMP_INPUT].value)) { + Vec* jumpTo = _jumpTo; + if (jumpTo != NULL) { + _jumpTo = NULL; + _walkX.tell(jumpTo->x); + _walkY.tell(jumpTo->y); + delete jumpTo; + } + else if (_jumpTrigger.process(inputs[JUMP_INPUT].value)) { _walkX.jump(); _walkY.jump(); } - float outX = _walkX.next(); - outX *= params[SCALE_X_PARAM].value; - outX += params[OFFSET_X_PARAM].value * 5.0f; + float outX = _slewX.next(_walkX.next()); + outX *= _scaleX; + outX += _offsetX; outputs[OUT_X_OUTPUT].value = outX; - bool triggeredX = _triggerX.process(inputs[HOLD_X_INPUT].value); - if (params[TRACK_X_PARAM].value > 0.5f ? _triggerX.isHigh() : triggeredX) { - _holdX = outX; - } - outputs[HOLD_X_OUTPUT].value = _holdX; - - float outY = _walkY.next(); - outY *= params[SCALE_Y_PARAM].value; - outY += params[OFFSET_Y_PARAM].value * 5.0f; + float outY = _slewY.next(_walkY.next()); + outY *= _scaleY; + outY += _offsetY; outputs[OUT_Y_OUTPUT].value = outY; - bool triggeredY = _triggerY.process(inputs[HOLD_Y_INPUT].value); - if (params[TRACK_Y_PARAM].value > 0.5f ? _triggerY.isHigh() : triggeredY) { - _holdY = outY; - } - outputs[HOLD_Y_OUTPUT].value = _holdY; - outputs[DISTANCE_OUTPUT].value = sqrtf(outX*outX + outY*outY) * 0.707107f; // scaling constant is 10 / squrt(200) if (_historyStep == 0) { _outsX.push(outX); - _holdsX.push(_holdX); _outsY.push(outY); - _holdsY.push(_holdY); } ++_historyStep; _historyStep %= _historySteps; @@ -81,15 +123,14 @@ struct Walk2Display : TransparentWidget { const int _insetAround = 4; const NVGcolor _axisColor = nvgRGBA(0xff, 0xff, 0xff, 0x70); - const NVGcolor _textColor = nvgRGBA(0xff, 0xff, 0xff, 0xc0); - const NVGcolor _traceColor = nvgRGBA(0xff, 0x00, 0x00, 0xd0); - const NVGcolor _holdColor = nvgRGBA(0x00, 0xff, 0x00, 0xd0); + const NVGcolor _defaultTraceColor = nvgRGBA(0x00, 0xff, 0x00, 0xee); Walk2* _module; const Vec _size; const Vec _drawSize; int _midX, _midY; std::shared_ptr _font; + NVGcolor _traceColor = _defaultTraceColor; Walk2Display( Walk2* module, @@ -97,22 +138,65 @@ struct Walk2Display : TransparentWidget { ) : _module(module) , _size(size) - , _drawSize(_size.x - 2*_insetAround, _size.y - 2*_insetAround) - , _midX(_size.x / 2) - , _midY(_size.y / 2) + , _drawSize(2 * (_size.x - 2 * _insetAround), 2 * (_size.y - 2 * _insetAround)) + , _midX(_insetAround + _drawSize.x/2) + , _midY(_insetAround + _drawSize.y/2) , _font(Font::load(assetPlugin(plugin, "res/fonts/inconsolata.ttf"))) { } + void onMouseDown(EventMouseDown& e) override { + if ( + e.pos.x > _insetAround && + e.pos.x < _size.x - _insetAround && + e.pos.y > _insetAround && + e.pos.y < _size.y - _insetAround + ) { + float x = 20.0f * ((e.pos.x - _insetAround) / (float)_drawSize.x); + x -= 5.0f; + float y = 20.0f * ((e.pos.y - _insetAround) / (float)_drawSize.y); + y = 5.0f - y; + _module->_jumpTo = new Vec(x, y); + } + } + void draw(NVGcontext* vg) override { + switch (_module->_traceColor) { + case Walk2::ORANGE_TRACE_COLOR: { + _traceColor = nvgRGBA(0xff, 0x80, 0x00, 0xee); + break; + } + case Walk2::RED_TRACE_COLOR: { + _traceColor = nvgRGBA(0xff, 0x00, 0x00, 0xee); + break; + } + case Walk2::BLUE_TRACE_COLOR: { + _traceColor = nvgRGBA(0x00, 0xdd, 0xff, 0xee); + break; + } + case Walk2::GREEN_TRACE_COLOR: + default: { + _traceColor = _defaultTraceColor; + } + } drawBackground(vg); float strokeWidth = std::max(1.0f, 3 - RACK_PLUGIN_UI_RACKSCENE->zoomWidget->zoom); nvgSave(vg); - nvgScissor(vg, _insetAround, _insetAround, _size.x - _insetAround, _size.y - _insetAround); + nvgScissor(vg, _insetAround, _insetAround, _drawSize.x / 2, _drawSize.y / 2); + if (_module->_zoomOut) { + nvgScale(vg, 0.5f, 0.5f); + strokeWidth *= 2.0f; + } + else { + float tx = 1.0f + (clamp(_module->_offsetX, -5.0f, 5.0f) / 5.0f); + tx *= -_drawSize.x / 4; + float ty = 1.0f - (clamp(_module->_offsetY, -5.0f, 5.0f) / 5.0f); + ty *= -_drawSize.y / 4; + nvgTranslate(vg, tx, ty); + } drawAxes(vg, strokeWidth); drawTrace(vg, _traceColor, _module->_outsX, _module->_outsY); - drawTrace(vg, _holdColor, _module->_holdsX, _module->_holdsY); nvgRestore(vg); } @@ -128,26 +212,142 @@ struct Walk2Display : TransparentWidget { } void drawAxes(NVGcontext* vg, float strokeWidth) { + const float shortTick = 4.0f; + const float longTick = 8.0f; + float dot = 0.5f * strokeWidth; + nvgSave(vg); nvgStrokeColor(vg, _axisColor); nvgStrokeWidth(vg, strokeWidth); nvgBeginPath(vg); nvgMoveTo(vg, _insetAround, _midY); - nvgLineTo(vg, _size.x - _insetAround, _midY); + nvgLineTo(vg, _insetAround + _drawSize.x, _midY); nvgStroke(vg); nvgBeginPath(vg); nvgMoveTo(vg, _midX, _insetAround); - nvgLineTo(vg, _midX, _size.y - _insetAround); + nvgLineTo(vg, _midX, _insetAround + _drawSize.y); nvgStroke(vg); + for (int i = 1; i <= 10; ++i) { + float tick = i % 5 == 0 ? longTick : shortTick; + + float x = (i * 0.1f) * 0.5f * _drawSize.x; + nvgBeginPath(vg); + nvgMoveTo(vg, _midX + x, _midY - tick); + nvgLineTo(vg, _midX + x, _midY + tick); + nvgStroke(vg); + + nvgBeginPath(vg); + nvgMoveTo(vg, _midX - x, _midY - tick); + nvgLineTo(vg, _midX - x, _midY + tick); + nvgStroke(vg); + + float y = (i * 0.1f) * 0.5f * _drawSize.y; + nvgBeginPath(vg); + nvgMoveTo(vg, _midX - tick, _midY + y); + nvgLineTo(vg, _midX + tick, _midY + y); + nvgStroke(vg); + + nvgBeginPath(vg); + nvgMoveTo(vg, _midX - tick, _midY - y); + nvgLineTo(vg, _midX + tick, _midY - y); + nvgStroke(vg); + + if (_module->_drawGrid) { + for (int j = 1; j <= 10; ++j) { + float y = (j * 0.1f) * 0.5f * _drawSize.y; + + nvgBeginPath(vg); + nvgMoveTo(vg, _midX + x - dot, _midY + y); + nvgLineTo(vg, _midX + x + dot, _midY + y); + nvgStroke(vg); + + nvgBeginPath(vg); + nvgMoveTo(vg, _midX - x - dot, _midY + y); + nvgLineTo(vg, _midX - x + dot, _midY + y); + nvgStroke(vg); + + nvgBeginPath(vg); + nvgMoveTo(vg, _midX - x - dot, _midY - y); + nvgLineTo(vg, _midX - x + dot, _midY - y); + nvgStroke(vg); + + nvgBeginPath(vg); + nvgMoveTo(vg, _midX + x - dot, _midY - y); + nvgLineTo(vg, _midX + x + dot, _midY - y); + nvgStroke(vg); + } + } + } + + if (_module->_drawGrid) { + const float tick = shortTick; + { + float x = _midX - _drawSize.x / 4; + float y = _midY - _drawSize.y / 4; + + nvgBeginPath(vg); + nvgMoveTo(vg, x - tick, y); + nvgLineTo(vg, x + tick, y); + nvgStroke(vg); + + nvgBeginPath(vg); + nvgMoveTo(vg, x, y - tick); + nvgLineTo(vg, x, y + tick); + nvgStroke(vg); + } + { + float x = _midX + _drawSize.x / 4; + float y = _midY - _drawSize.y / 4; + + nvgBeginPath(vg); + nvgMoveTo(vg, x - tick, y); + nvgLineTo(vg, x + tick, y); + nvgStroke(vg); + + nvgBeginPath(vg); + nvgMoveTo(vg, x, y - tick); + nvgLineTo(vg, x, y + tick); + nvgStroke(vg); + } + { + float x = _midX + _drawSize.x / 4; + float y = _midY + _drawSize.y / 4; + + nvgBeginPath(vg); + nvgMoveTo(vg, x - tick, y); + nvgLineTo(vg, x + tick, y); + nvgStroke(vg); + + nvgBeginPath(vg); + nvgMoveTo(vg, x, y - tick); + nvgLineTo(vg, x, y + tick); + nvgStroke(vg); + } + { + float x = _midX - _drawSize.x / 4; + float y = _midY + _drawSize.y / 4; + + nvgBeginPath(vg); + nvgMoveTo(vg, x - tick, y); + nvgLineTo(vg, x + tick, y); + nvgStroke(vg); + + nvgBeginPath(vg); + nvgMoveTo(vg, x, y - tick); + nvgLineTo(vg, x, y + tick); + nvgStroke(vg); + } + } + nvgRestore(vg); } void drawTrace(NVGcontext* vg, NVGcolor color, HistoryBuffer& x, HistoryBuffer& y) { nvgSave(vg); - nvgGlobalCompositeOperation(vg, NVG_LIGHTER); + // nvgGlobalCompositeOperation(vg, NVG_LIGHTER); // int n = _module->historyPoints; // float beginRadius = std::max(1.0f, 2.0f - gRackScene->zoomWidget->zoom); @@ -169,6 +369,10 @@ struct Walk2Display : TransparentWidget { int n = _module->historyPoints; float beginWidth = std::max(1.0f, 4.0f - RACK_PLUGIN_UI_RACKSCENE->zoomWidget->zoom); float endWidth = std::max(0.5f, 2.0f - RACK_PLUGIN_UI_RACKSCENE->zoomWidget->zoom); + if (_module->_zoomOut) { + beginWidth *= 2.0f; + endWidth *= 2.0f; + } float widthStep = (beginWidth - endWidth) / (float)n; float width = endWidth; float endAlpha = 0.1f; @@ -176,8 +380,8 @@ struct Walk2Display : TransparentWidget { color.a = endAlpha; for (int i = n - 1; i > 0; --i) { nvgBeginPath(vg); - nvgMoveTo(vg, cvToPixel(_midX, _drawSize.x, x.value(i - 1)), cvToPixel(_midY, _drawSize.y, y.value(i - 1))); - nvgLineTo(vg, cvToPixel(_midX, _drawSize.x, x.value(i)), cvToPixel(_midY, _drawSize.y, y.value(i))); + nvgMoveTo(vg, cvToPixelX(_midX, _drawSize.x, x.value(i - 1)), cvToPixelY(_midY, _drawSize.y, y.value(i - 1))); + nvgLineTo(vg, cvToPixelX(_midX, _drawSize.x, x.value(i)), cvToPixelY(_midY, _drawSize.y, y.value(i))); nvgStrokeWidth(vg, width); nvgStrokeColor(vg, color); nvgStroke(vg); @@ -185,7 +389,7 @@ struct Walk2Display : TransparentWidget { color.a += alphaStep; } nvgBeginPath(vg); - nvgCircle(vg, cvToPixel(_midX, _drawSize.x, x.value(0)), cvToPixel(_midY, _drawSize.y, y.value(0)), 0.5f * width); + nvgCircle(vg, cvToPixelX(_midX, _drawSize.x, x.value(0)), cvToPixelY(_midY, _drawSize.y, y.value(0)), 0.5f * width); nvgStrokeColor(vg, color); nvgFillColor(vg, color); nvgStroke(vg); @@ -194,8 +398,68 @@ struct Walk2Display : TransparentWidget { nvgRestore(vg); } - inline float cvToPixel(float mid, float extent, float cv) { - return mid + 0.1f * extent * cv; + inline float cvToPixelX(float mid, float extent, float cv) { + return mid + 0.05f * extent * cv; + } + + inline float cvToPixelY(float mid, float extent, float cv) { + return mid - 0.05f * extent * cv; + } +}; + +struct ZoomOutMenuItem : MenuItem { + Walk2* _module; + const bool _zoomOut; + + ZoomOutMenuItem(Walk2* module, const char* label, bool zoomOut) + : _module(module) + , _zoomOut(zoomOut) + { + this->text = label; + } + + void onAction(EventAction &e) override { + _module->_zoomOut = _zoomOut; + } + + void step() override { + rightText = _module->_zoomOut == _zoomOut ? "?" : ""; + } +}; + +struct GridMenuItem : MenuItem { + Walk2* _module; + + GridMenuItem(Walk2* module, const char* label) : _module(module) { + this->text = label; + } + + void onAction(EventAction &e) override { + _module->_drawGrid = !_module->_drawGrid; + } + + void step() override { + rightText = _module->_drawGrid ? "?" : ""; + } +}; + +struct ColorMenuItem : MenuItem { + Walk2* _module; + const Walk2::TraceColor _color; + + ColorMenuItem(Walk2* module, const char* label, Walk2::TraceColor color) + : _module(module) + , _color(color) + { + this->text = label; + } + + void onAction(EventAction &e) override { + _module->_traceColor = _color; + } + + void step() override { + rightText = _module->_traceColor == _color ? "?" : ""; } }; @@ -234,23 +498,18 @@ struct Walk2Widget : ModuleWidget { auto offsetYParamPosition = Vec(119.0, 234.0); auto scaleXParamPosition = Vec(75.0, 262.5); auto scaleYParamPosition = Vec(119.0, 262.5); - auto trackXParamPosition = Vec(94.0, 290.7); - auto trackYParamPosition = Vec(131.0, 290.7); - auto holdXInputPosition = Vec(10.5, 284.0); + auto offsetXInputPosition = Vec(10.5, 284.0); + auto scaleXInputPosition = Vec(41.5, 284.0); auto rateXInputPosition = Vec(10.5, 323.0); - auto holdYInputPosition = Vec(145.5, 284.0); + auto offsetYInputPosition = Vec(145.5, 284.0); + auto scaleYInputPosition = Vec(176.5, 284.0); auto rateYInputPosition = Vec(145.5, 323.0); - auto jumpInputPosition = Vec(78.0, 313.0); + auto jumpInputPosition = Vec(78.0, 303.0); - auto holdXOutputPosition = Vec(41.5, 284.0); auto outXOutputPosition = Vec(41.5, 323.0); - auto holdYOutputPosition = Vec(176.5, 284.0); auto outYOutputPosition = Vec(176.5, 323.0); - auto distanceOutputPosition = Vec(109.0, 313.0); - - auto trackXLightPosition = Vec(72.0, 292.0); - auto trackYLightPosition = Vec(109.0, 292.0); + auto distanceOutputPosition = Vec(109.0, 303.0); // end generated by svg_widgets.rb addParam(ParamWidget::create(rateXParamPosition, module, Walk2::RATE_X_PARAM, 0.0, 1.0, 0.1)); @@ -259,23 +518,34 @@ struct Walk2Widget : ModuleWidget { addParam(ParamWidget::create(offsetYParamPosition, module, Walk2::OFFSET_Y_PARAM, -1.0, 1.0, 0.0)); addParam(ParamWidget::create(scaleXParamPosition, module, Walk2::SCALE_X_PARAM, 0.0, 1.0, 1.0)); addParam(ParamWidget::create(scaleYParamPosition, module, Walk2::SCALE_Y_PARAM, 0.0, 1.0, 1.0)); - addParam(ParamWidget::create(trackXParamPosition, module, Walk2::TRACK_X_PARAM, 0.0, 1.0, 0.0)); - addParam(ParamWidget::create(trackYParamPosition, module, Walk2::TRACK_Y_PARAM, 0.0, 1.0, 0.0)); - addInput(Port::create(holdXInputPosition, Port::INPUT, module, Walk2::HOLD_X_INPUT)); + addInput(Port::create(offsetXInputPosition, Port::INPUT, module, Walk2::OFFSET_X_INPUT)); + addInput(Port::create(scaleXInputPosition, Port::INPUT, module, Walk2::SCALE_X_INPUT)); addInput(Port::create(rateXInputPosition, Port::INPUT, module, Walk2::RATE_X_INPUT)); - addInput(Port::create(holdYInputPosition, Port::INPUT, module, Walk2::HOLD_Y_INPUT)); + addInput(Port::create(offsetYInputPosition, Port::INPUT, module, Walk2::OFFSET_Y_INPUT)); + addInput(Port::create(scaleYInputPosition, Port::INPUT, module, Walk2::SCALE_Y_INPUT)); addInput(Port::create(rateYInputPosition, Port::INPUT, module, Walk2::RATE_Y_INPUT)); addInput(Port::create(jumpInputPosition, Port::INPUT, module, Walk2::JUMP_INPUT)); - addOutput(Port::create(holdXOutputPosition, Port::OUTPUT, module, Walk2::HOLD_X_OUTPUT)); addOutput(Port::create(outXOutputPosition, Port::OUTPUT, module, Walk2::OUT_X_OUTPUT)); - addOutput(Port::create(holdYOutputPosition, Port::OUTPUT, module, Walk2::HOLD_Y_OUTPUT)); addOutput(Port::create(outYOutputPosition, Port::OUTPUT, module, Walk2::OUT_Y_OUTPUT)); addOutput(Port::create(distanceOutputPosition, Port::OUTPUT, module, Walk2::DISTANCE_OUTPUT)); + } - addChild(ModuleLightWidget::create>(trackXLightPosition, module, Walk2::TRACK_X_LIGHT)); - addChild(ModuleLightWidget::create>(trackYLightPosition, module, Walk2::TRACK_Y_LIGHT)); + void appendContextMenu(Menu* menu) override { + Walk2* w = dynamic_cast(module); + assert(w); + + menu->addChild(new MenuLabel()); + menu->addChild(new ZoomOutMenuItem(w, "Display range: +/-5V", false)); + menu->addChild(new ZoomOutMenuItem(w, "Display range: +/-10V", true)); + menu->addChild(new MenuLabel()); + menu->addChild(new GridMenuItem(w, "Show grid")); + menu->addChild(new MenuLabel()); + menu->addChild(new ColorMenuItem(w, "Trace color: green", Walk2::GREEN_TRACE_COLOR)); + menu->addChild(new ColorMenuItem(w, "Trace color: orange", Walk2::ORANGE_TRACE_COLOR)); + menu->addChild(new ColorMenuItem(w, "Trace color: red", Walk2::RED_TRACE_COLOR)); + menu->addChild(new ColorMenuItem(w, "Trace color: blue", Walk2::BLUE_TRACE_COLOR)); } }; diff --git a/plugins/community/repos/Bogaudio/src/Walk2.hpp b/plugins/community/repos/Bogaudio/src/Walk2.hpp index ce5f40e5..a8b97fd9 100644 --- a/plugins/community/repos/Bogaudio/src/Walk2.hpp +++ b/plugins/community/repos/Bogaudio/src/Walk2.hpp @@ -1,8 +1,11 @@ #pragma once +#include + #include "bogaudio.hpp" #include "dsp/buffer.hpp" #include "dsp/noise.hpp" +#include "dsp/signal.hpp" using namespace bogaudio::dsp; @@ -18,32 +21,28 @@ struct Walk2 : Module { OFFSET_Y_PARAM, SCALE_X_PARAM, SCALE_Y_PARAM, - TRACK_X_PARAM, - TRACK_Y_PARAM, NUM_PARAMS }; enum InputsIds { - HOLD_X_INPUT, + OFFSET_X_INPUT, + SCALE_X_INPUT, RATE_X_INPUT, - HOLD_Y_INPUT, + OFFSET_Y_INPUT, + SCALE_Y_INPUT, RATE_Y_INPUT, JUMP_INPUT, NUM_INPUTS }; enum OutputsIds { - HOLD_X_OUTPUT, OUT_X_OUTPUT, - HOLD_Y_OUTPUT, OUT_Y_OUTPUT, DISTANCE_OUTPUT, NUM_OUTPUTS }; enum LightsIds { - TRACK_X_LIGHT, - TRACK_Y_LIGHT, NUM_LIGHTS }; @@ -55,18 +54,29 @@ struct Walk2 : Module { int _historySteps; int _historyStep = 0; - Trigger _triggerX, _triggerY; + float _offsetX = 0.0f, _offsetY = 0.0f; + float _scaleX = 0.0f, _scaleY = 0.0f; RandomWalk _walkX, _walkY; + SlewLimiter _slewX, _slewY; Trigger _jumpTrigger; - float _holdX = 0.0f, _holdY = 0.0f; - HistoryBuffer _outsX, _outsY, _holdsX, _holdsY; + HistoryBuffer _outsX, _outsY; + std::atomic _jumpTo; + + enum TraceColor { + GREEN_TRACE_COLOR, + ORANGE_TRACE_COLOR, + RED_TRACE_COLOR, + BLUE_TRACE_COLOR + }; + bool _zoomOut = false; + bool _drawGrid = true; + TraceColor _traceColor = GREEN_TRACE_COLOR; Walk2() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) , _outsX(historyPoints, 0.0f) , _outsY(historyPoints, 0.0f) - , _holdsX(historyPoints, 0.0f) - , _holdsY(historyPoints, 0.0f) + , _jumpTo(NULL) { onReset(); onSampleRateChange(); @@ -74,6 +84,8 @@ struct Walk2 : Module { void onReset() override; void onSampleRateChange() override; + json_t* toJson() override; + void fromJson(json_t* root) override; void step() override; }; diff --git a/plugins/community/repos/Bogaudio/src/bogaudio.cpp b/plugins/community/repos/Bogaudio/src/bogaudio.cpp index d7f983e4..fbc1cfb2 100644 --- a/plugins/community/repos/Bogaudio/src/bogaudio.cpp +++ b/plugins/community/repos/Bogaudio/src/bogaudio.cpp @@ -144,10 +144,12 @@ RACK_PLUGIN_MODEL_DECLARE(Bogaudio, OneEight); RACK_PLUGIN_MODEL_DECLARE(Bogaudio, Walk); RACK_PLUGIN_MODEL_DECLARE(Bogaudio, Walk2); +RACK_PLUGIN_MODEL_DECLARE(Bogaudio, Mix1); // 0.6.16 + RACK_PLUGIN_INIT(Bogaudio) { RACK_PLUGIN_INIT_ID(); - RACK_PLUGIN_INIT_VERSION("0.6.14"); + RACK_PLUGIN_INIT_VERSION("0.6.16"); RACK_PLUGIN_INIT_WEBSITE("https://github.com/bogaudio/BogaudioModules"); RACK_PLUGIN_INIT_MANUAL("https://github.com/bogaudio/BogaudioModules/blob/master/README.md"); @@ -238,4 +240,6 @@ RACK_PLUGIN_INIT(Bogaudio) { RACK_PLUGIN_MODEL_ADD(Bogaudio, OneEight); RACK_PLUGIN_MODEL_ADD(Bogaudio, Walk); RACK_PLUGIN_MODEL_ADD(Bogaudio, Walk2); + + RACK_PLUGIN_MODEL_ADD(Bogaudio, Mix1); // 0.6.16 } diff --git a/plugins/community/repos/Bogaudio/src/dsp/noise.cpp b/plugins/community/repos/Bogaudio/src/dsp/noise.cpp index 711f6c42..3ea2825d 100644 --- a/plugins/community/repos/Bogaudio/src/dsp/noise.cpp +++ b/plugins/community/repos/Bogaudio/src/dsp/noise.cpp @@ -34,20 +34,27 @@ void RandomWalk::setParams(float sampleRate, float change) { const float maxDamp = 0.98; const float minDamp = 0.9999; - _damp = maxDamp + (1 - change)*(minDamp - maxDamp); + _damp = maxDamp + (1.0f - change)*(minDamp - maxDamp); + + _biasDamp = 1.0f - change*(2.0f / sampleRate); } void RandomWalk::jump() { - // FIXME - _bias = _noise.next() * 5.0f; + tell(_noise.next() * 5.0f); +} + +void RandomWalk::tell(float v) { + assert(v >= -5.0f && v <= 5.0f); + _last = _bias = v; _filter.reset(); } float RandomWalk::_next() { float delta = _noise.next(); - if ((_lastOut >= _max - _bias && delta > 0.0f) || (_lastOut <= _min - _bias && delta < 0.0f)) { + if ((_lastOut >= _max && delta > 0.0f) || (_lastOut <= _min && delta < 0.0f)) { delta = -delta; } _last = _damp*_last + delta; + _bias *= _biasDamp; return _lastOut = std::min(std::max(_bias + _filter.next(_last), _min), _max); } diff --git a/plugins/community/repos/Bogaudio/src/dsp/noise.hpp b/plugins/community/repos/Bogaudio/src/dsp/noise.hpp index f5cd6c54..707c3d56 100644 --- a/plugins/community/repos/Bogaudio/src/dsp/noise.hpp +++ b/plugins/community/repos/Bogaudio/src/dsp/noise.hpp @@ -93,6 +93,7 @@ struct RandomWalk : Generator { float _lastOut = 0.0f; float _damp; float _bias = 0.0f; + float _biasDamp = 1.0f; WhiteNoiseGenerator _noise; LowPassFilter _filter; @@ -110,6 +111,7 @@ struct RandomWalk : Generator { void setParams(float sampleRate = 1000.0f, float change = 0.5f); void jump(); + void tell(float v); float _next() override; }; diff --git a/plugins/community/repos/Bogaudio/src/dsp/signal.cpp b/plugins/community/repos/Bogaudio/src/dsp/signal.cpp index 189068a4..b4706fa6 100644 --- a/plugins/community/repos/Bogaudio/src/dsp/signal.cpp +++ b/plugins/community/repos/Bogaudio/src/dsp/signal.cpp @@ -495,3 +495,22 @@ float NoiseGate::compressionDb(float detectorDb, float thresholdDb, float ratio, float compressionDb = differenceDb * ratio - differenceDb; return std::min(compressionDb, -Amplifier::minDecibels); } + + +void Timer::setParams(float sampleRate, float time) { + assert(sampleRate > 0.0f); + assert(time > 0.0f); + // FIXME: if the timer is running, should set the duration to reflect the time elapsed so far, adjusting it for the delta samplerate. + _durationSteps = time * sampleRate; +} + +void Timer::reset() { + _expired = false; + _countSteps = 0; +} + +bool Timer::next() { + ++_countSteps; + _expired = _expired || _countSteps >= _durationSteps; + return !_expired; +} diff --git a/plugins/community/repos/Bogaudio/src/dsp/signal.hpp b/plugins/community/repos/Bogaudio/src/dsp/signal.hpp index 89a46c4b..834f8032 100644 --- a/plugins/community/repos/Bogaudio/src/dsp/signal.hpp +++ b/plugins/community/repos/Bogaudio/src/dsp/signal.hpp @@ -238,5 +238,19 @@ struct NoiseGate { float compressionDb(float detectorDb, float thresholdDb, float ratio, bool softKnee); }; +struct Timer { + bool _expired; + int _countSteps; + int _durationSteps; + + Timer(float sampleRate = 1000.0f, float time = 1.0f) { + setParams(sampleRate, time); + reset(); + } + + void setParams(float sampleRate = 1000.0f, float time = 1.0f); + void reset(); + bool next(); +}; } // namespace dsp } // namespace bogaudio diff --git a/plugins/community/repos/Bogaudio/src/lfo_base.hpp b/plugins/community/repos/Bogaudio/src/lfo_base.hpp index 476f1092..ae31eba8 100644 --- a/plugins/community/repos/Bogaudio/src/lfo_base.hpp +++ b/plugins/community/repos/Bogaudio/src/lfo_base.hpp @@ -27,7 +27,7 @@ struct LFOBase : Module { json_t* toJson() override; void fromJson(json_t* root) override; - bool isCompliantPitchMode() { return _pitchMode == COMPLIANT_PITCH_MODE; } + bool isCompliantPitchMode() { return _pitchMode != CLASSIC_PITCH_MODE; } void setPitchMode(PitchMode mode); void setPitchModeListener(PitchModeListener* listener) { _pitchModeListener = listener; } void setFrequency(bool slow, Param& frequency, Input& pitch, Phasor& phasor); @@ -106,8 +106,8 @@ struct LFOBaseWidget : ModuleWidget, PitchModeListener { LFOBase* lfo = dynamic_cast(module); assert(lfo); menu->addChild(new MenuLabel()); - menu->addChild(new PitchModeMenuItem(lfo, "Classic pitch mode: 0V = C0 = 16.35HZ", false)); menu->addChild(new PitchModeMenuItem(lfo, "Standard pitch mode: 0V = C-3 = 2.04HZ", true)); + menu->addChild(new PitchModeMenuItem(lfo, "Classic pitch mode: 0V = C0 = 16.35HZ", false)); } }; diff --git a/plugins/community/repos/Bogaudio/src/mixer.cpp b/plugins/community/repos/Bogaudio/src/mixer.cpp index f465f40b..7b5366ac 100644 --- a/plugins/community/repos/Bogaudio/src/mixer.cpp +++ b/plugins/community/repos/Bogaudio/src/mixer.cpp @@ -18,7 +18,11 @@ void MixerChannel::next(bool stereo, bool solo) { return; } - bool muted = solo ? _muteParam.value < 2.0f : _muteParam.value > 0.5f; + float mute = _muteParam.value; + if (_muteInput) { + mute += clamp(_muteInput->value, 0.0f, 10.0f); + } + bool muted = solo ? mute < 2.0f : mute > 0.5f; if (muted) { _amplifier.setLevel(_levelSL.next(minDecibels)); } diff --git a/plugins/community/repos/Bogaudio/src/mixer.hpp b/plugins/community/repos/Bogaudio/src/mixer.hpp index 545a6a53..34de6413 100644 --- a/plugins/community/repos/Bogaudio/src/mixer.hpp +++ b/plugins/community/repos/Bogaudio/src/mixer.hpp @@ -25,6 +25,7 @@ struct MixerChannel { Input& _inInput; Input& _levelInput; Input& _panInput; + Input* _muteInput; float out = 0.0f; float left = 0.0f; @@ -38,7 +39,8 @@ struct MixerChannel { Input& in, Input& levelCv, Input& panCv, - float sampleRate = 1000.0f + float sampleRate = 1000.0f, + Input* muteCv = NULL ) : _levelParam(level) , _panParam(pan) @@ -46,6 +48,7 @@ struct MixerChannel { , _inInput(in) , _levelInput(levelCv) , _panInput(panCv) + , _muteInput(muteCv) { setSampleRate(sampleRate); _rms.setSensitivity(0.05f); diff --git a/vst2_bin/plugins/Bogaudio/README.md b/vst2_bin/plugins/Bogaudio/README.md index 5b62714a..c8c81ce4 100644 --- a/vst2_bin/plugins/Bogaudio/README.md +++ b/vst2_bin/plugins/Bogaudio/README.md @@ -5,6 +5,7 @@ Modules for [VCV Rack](https://github.com/VCVRack/Rack), an open-source Eurorack - [Oscillators](#oscillators) - [LFOs](#lfos) - [Envelopes and Envelope Utilities](#envelopes) + - [Noise/Random, Sample and Hold](#random) - [Mixers, Panners and VCAs](#mixers) - [Effects and Dynamics](#effects) - [Sequential Switches and Sequencers](#sequencers) @@ -17,6 +18,8 @@ Modules for [VCV Rack](https://github.com/VCVRack/Rack), an open-source Eurorack ![modules screenshot](./doc/www/modules2.png) +![modules screenshot](./doc/www/modules6.png) + ![modules screenshot](./doc/www/modules5.png) ![modules screenshot](./doc/www/modules3.png) @@ -180,17 +183,53 @@ An envelope follower, a utility that converts its input to a CV proportional to With DAMP at the minimum setting and SCALE at half, the module is an effective wave rectifier (that is, it outputs the absolute value of the input). +### Noise/Random, Sample and Hold + +![Noise/random screenshot](doc/www/noise.png) + +#### NOISE + +A noise source, in types blue (f), white, pink (1/f), red (aka rown, 1/f^2) and Gauss (normal with mean 0 and variance 1). + +Additionally, NOISE has an absolute value circuit. Patch audio into ABS to get positive CV. For example, patch white noise into ABS to get uniform values in the range 0 to 10. + +#### S&H + +A dual sample-and-hold and trigger-and-hold. Sampling may be triggered by CV (on the rising edge of a trigger or gate) or button press. If nothing is connected to an IN port, sampling for that channel is from an internal white noise source (range 0-10V). + +Each channel can be toggled into track-and-hold mode. In this mode, when the input at GATE is high, or the button is held, the input is copied to the output. When the gate goes low, the input is sampled and held until the next gate. + +#### WALK2 + +WALK2 provides two channels of chaotic CV, where the CV moves as a "random walk". The two outputs are drawn as a trace, in X and Y, on the display. + +For each channel: + - RATE controls how sedately, or wildly, the CV moves around. If CV is in use, it is attenuated by the knob. + - OFFSET adds or subtracts up to 5V from the base +/-5V output. If the offset CV is in use, it is attenuverted by the knob. + - SCALE scales the output; if CV is in use, it is attenuated by the knob. + +Additionally: + - A trigger on the JUMP input will cause both channels to jump to a random value. A bit of slew limitation applies to the jump to minimize popping. + - DIST outputs a third CV, ranging over 0-10V, related the X and Y channel outputs. + +Clicking on the display will jump the outputs, X and Y, to that point (again with a bit of slew limitation). + +Various options on the context (right-click) menu allow customization of the display (set the range of the display to +/-10V instead of the default +/-5V; hide the grid dots; set the color of the trace). + +#### WALK + +WALK is a single-channel random walk, identical to one channel of WALK2, in 3HP. ### Mixers, Panners and VCAs -#### MIX4 +#### MIX8 -A four-channel mixer/panner with performance mutes. +An eight-channel mixer/panner with performance mutes. ![Mixers screenshot](doc/www/mixers1.png) Features: - - Four input channels with decibel-calibrated level faders. + - Eight input channels with decibel-calibrated level faders. - Level fader for the output mix. - CV control over channel and output levels; expects +10 volt CV; CV is attenuated by the corresponding slider when in use. - CV-controlled stereo panners; expects +/-5 volt CV; CV is attenuverted by the corresponding knob when in use. @@ -200,9 +239,13 @@ Features: - Fader handles contain lights indicating the signal level out of that channel or the entire mix. - Output saturates (soft clips) to +/-12 volts, where the clipping effect becomes noticeable above +/-10 volts. -#### MIX8 +#### MIX4 + +A four-channel version of MIX8 with the same features. -An eight-channel version of MIX4 with the same features. +### MIX1 + +A 3HP fader/VCA, with mute. #### VCM @@ -218,10 +261,12 @@ By default, the output is hard clipped at +/-12 volts (this is a standard in Rac #### UMIX -A 3HP unity mixer, usable with CV (e.g. combining triggers) or audio. Up to 8 inputs are summed to the output. Saturation (soft clipping) is applied to the output at +/-12 volts; the LEVEL knob allows attenuation of the mix before the saturation is applied. +A 3HP unity mixer, usable with CV (e.g. combining triggers) or audio. Up to 8 inputs are summed to the output. Saturation (soft clipping) is applied to the output, which limits it to around +/-11V; the LEVEL knob allows attenuation of the mix before the saturation is applied. The context (right-click) menu has an option to average, rather than sum, the inputs. +A second context menu option, "CV mode", disables the saturation, which allows for precise summing (or averaging) of CVs. In this case the output is hard-clipped at +/-12V. + #### MATRIX88 An 8x8 channel matrix mixer. Each input can be sent with an independent level to each of the eight output mixes. @@ -331,6 +376,8 @@ As a multiplexer, it routes an input to the output under control of the SELECT k Both functions may be used simultaneously: the SELECT+CV value is added to the sequential/clocked value, wrapping around. Note that the STEPS value only affects the sequential value; for example, using a clock input and setting STEPS to 2 will yield an alternation between two adjacent inputs, but this pair can be selected with the SELECT knob or CV. +On the context (right-click) menu, if option "Select on clock" is selected, then the select value (knob and CV) is checked and used to modify the active step only when a clock is received, rather than continuously. + #### 1:8 1:8 is the opposite of 8:1 -- it routes a single input to 1 of 8 outputs. The control circuit behavior (CLOCK, SELECT, etc) is the same. @@ -427,24 +474,12 @@ Manual may be set to output a trigger pulse on patch load (akin to a Max/Msp or A 3 HP multiple (signal duplicator). There are two 1-to-3 channels. There is also a 1-to-6 mode: if nothing is patched to the second channel's input, the input to the first channel is copied to all six outputs. -#### NOISE - -A noise source, in types blue (f), white, pink (1/f), red (aka rown, 1/f^2) and Gauss (normal with mean 0 and variance 1). - -Additionally, NOISE has an absolute value circuit. Patch audio into ABS to get positive CV. For example, patch white noise into ABS to get uniform values in the range 0 to 10. - #### OFFSET An offset and scaler. The OFFSET and SCALE knobs have CV inputs. With an input signal, output is `(input + offset) * scale`. With no input connected, the output is constant in the value of `offset * scale`. By default, the output is capped at +/-12 volts (this is a standard in Rack). A context menu option allows this limit to be disabled. -#### S&H - -A dual sample-and-hold and trigger-and-hold. Sampling may be triggered by CV (on the rising edge of a trigger or gate) or button press. If nothing is connected to an IN port, sampling for that channel is from an internal white noise source (range 0-10V). - -Each channel can be toggled into track-and-hold mode. In this mode, when the input at GATE is high, or the button is held, the input is copied to the output. When the gate goes low, the input is sampled and held until the next gate. - #### SLEW A slew limiter - when the input changes rapidly, the output changes less rapidly, lagging the input. diff --git a/vst2_bin/plugins/Bogaudio/res/AddrSeq.svg b/vst2_bin/plugins/Bogaudio/res/AddrSeq.svg index c9c3600c..38b5332c 100644 --- a/vst2_bin/plugins/Bogaudio/res/AddrSeq.svg +++ b/vst2_bin/plugins/Bogaudio/res/AddrSeq.svg @@ -11,11 +11,11 @@ width="90" height="380" viewBox="0 0 90 380" - id="svg221" + id="svg223" sodipodi:docname="svg_render_tmp.svg" inkscape:version="0.92.2 5c3e80d, 2017-08-06"> + id="metadata227"> @@ -36,7 +36,7 @@ inkscape:pageshadow="2" inkscape:window-width="468" inkscape:window-height="449" - id="namedview223" + id="namedview225" showgrid="false" inkscape:zoom="0.62105263" inkscape:cx="45" @@ -44,7 +44,7 @@ inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="0" - inkscape:current-layer="svg221" /> + inkscape:current-layer="svg223" /> + id="defs127"> @@ -158,35 +158,39 @@ viewBox="0 0 40px 40px"> + id="g57"> 2 + id="text41">1 3 + transform="rotate(-197.1) translate(13 0) rotate(197.1) translate(-2 2)" + id="text43">2 4 + transform="rotate(-154.3) translate(13 0) rotate(154.3) translate(-2 2)" + id="text45">3 5 + transform="rotate(-111.4) translate(13 0) rotate(111.4) translate(-2 2)" + id="text47">4 6 + transform="rotate(-68.6) translate(13 0) rotate(68.6) translate(-2 2)" + id="text49">5 7 + transform="rotate(-25.7) translate(13 0) rotate(25.7) translate(-2 2)" + id="text51">6 + 7 8 + id="text55">8 + id="g102"> + id="polyline60" /> + id="polyline62" /> + id="polyline64" /> + id="polyline66" /> + id="polyline68" /> + id="polyline70" /> + id="polyline72" /> + id="polyline74" /> + id="polyline76" /> + id="polyline78" /> + id="polyline80" /> + id="polyline82" /> + id="polyline84" /> + id="polyline86" /> + id="polyline88" /> + id="polyline90" /> + id="polyline92" /> + id="polyline94" /> + id="polyline96" /> + id="polyline98" /> + id="polyline100" /> + id="rect105" /> + id="rect107" /> + id="rect110" /> + id="g117"> + id="circle113" /> + id="circle115" /> + id="g124"> + id="circle120" /> + id="circle122" /> + id="rect129" /> + id="polyline131" /> + id="polyline133" /> + id="polyline135" /> + id="text137"> + id="path918" /> + id="path920" /> + id="path922" /> + id="path924" /> + id="path926" /> + id="path928" /> + id="path930" /> + id="path932" /> + id="text139"> + id="path935" /> + id="path937" /> + id="path939" /> + id="path941" /> + id="path943" /> + id="path945" /> + id="path947" /> + id="path949" /> + id="rect141" /> + id="rect145" /> + id="rect147" /> + id="text149"> + id="path955" /> + id="path957" /> + id="path959" /> + id="path961" /> + id="path963" /> + id="rect153" /> + id="text155"> + id="path967" /> + id="path969" /> + id="path971" /> + id="path973" /> + id="path975" /> + id="text159"> + id="path978" /> + id="path980" /> + id="path982" /> + id="path984" /> + id="path986" /> + id="text263"> + + + + id="path992" /> + id="text267"> + id="path995" /> + id="text269"> + id="path998" /> + id="text271"> + id="path1001" /> + id="text273"> + id="path1004" /> + id="text275"> + id="path1007" /> + id="text277"> + id="path1010" /> + id="text165"> + id="path1013" /> + id="path1015" /> + id="path1017" /> + id="text167"> + id="path1020" /> + id="path1022" /> + id="path1024" /> + id="text171"> + id="path671" /> + id="path673" /> + id="path675" /> + id="path677" /> + id="path679" /> + id="path681" /> + id="text651"> + id="path684" /> + id="text653"> + id="path687" /> + id="text655"> + id="path690" /> + id="text657"> + id="path693" /> + id="text659"> + id="path696" /> + id="text661"> + id="path699" /> + id="text663"> + id="path702" /> + id="text665"> + id="path705" /> + id="rect175" /> + id="text177"> + id="path709" /> + id="path711" /> + id="rect183" /> + id="text185"> + id="path715" /> + id="path717" /> + id="path719" /> + id="polyline605" /> + id="polyline607" /> + id="polyline609" /> + id="polyline611" /> + id="polyline613" /> + id="polyline615" /> + id="polyline617" /> + id="polyline619" /> + id="polyline621" /> + id="polyline623" /> + id="polyline625" /> + id="polyline627" /> + id="polyline629" /> + id="polyline631" /> + id="polyline633" /> + id="polyline635" /> + id="polyline637" /> + id="polyline639" /> + id="polyline641" /> + id="polyline643" /> + id="polyline645" /> + id="text191"> + id="path743" /> + id="polyline559" /> + id="polyline561" /> + id="polyline563" /> + id="polyline565" /> + id="polyline567" /> + id="polyline569" /> + id="polyline571" /> + id="polyline573" /> + id="polyline575" /> + id="polyline577" /> + id="polyline579" /> + id="polyline581" /> + id="polyline583" /> + id="polyline585" /> + id="polyline587" /> + id="polyline589" /> + id="polyline591" /> + id="polyline593" /> + id="polyline595" /> + id="polyline597" /> + id="polyline599" /> + id="text195"> + id="path767" /> + id="polyline513" /> + id="polyline515" /> + id="polyline517" /> + id="polyline519" /> + id="polyline521" /> + id="polyline523" /> + id="polyline525" /> + id="polyline527" /> + id="polyline529" /> + id="polyline531" /> + id="polyline533" /> + id="polyline535" /> + id="polyline537" /> + id="polyline539" /> + id="polyline541" /> + id="polyline543" /> + id="polyline545" /> + id="polyline547" /> + id="polyline549" /> + id="polyline551" /> + id="polyline553" /> + id="text199"> + id="path791" /> + id="polyline467" /> + id="polyline469" /> + id="polyline471" /> + id="polyline473" /> + id="polyline475" /> + id="polyline477" /> + id="polyline479" /> + id="polyline481" /> + id="polyline483" /> + id="polyline485" /> + id="polyline487" /> + id="polyline489" /> + id="polyline491" /> + id="polyline493" /> + id="polyline495" /> + id="polyline497" /> + id="polyline499" /> + id="polyline501" /> + id="polyline503" /> + id="polyline505" /> + id="polyline507" /> + id="text203"> + id="path815" /> + id="polyline421" /> + id="polyline423" /> + id="polyline425" /> + id="polyline427" /> + id="polyline429" /> + id="polyline431" /> + id="polyline433" /> + id="polyline435" /> + id="polyline437" /> + id="polyline439" /> + id="polyline441" /> + id="polyline443" /> + id="polyline445" /> + id="polyline447" /> + id="polyline449" /> + id="polyline451" /> + id="polyline453" /> + id="polyline455" /> + id="polyline457" /> + id="polyline459" /> + id="polyline461" /> + id="text207"> + id="path839" /> + id="polyline375" /> + id="polyline377" /> + id="polyline379" /> + id="polyline381" /> + id="polyline383" /> + id="polyline385" /> + id="polyline387" /> + id="polyline389" /> + id="polyline391" /> + id="polyline393" /> + id="polyline395" /> + id="polyline397" /> + id="polyline399" /> + id="polyline401" /> + id="polyline403" /> + id="polyline405" /> + id="polyline407" /> + id="polyline409" /> + id="polyline411" /> + id="polyline413" /> + id="polyline415" /> + id="text211"> + id="path863" /> + id="polyline329" /> + id="polyline331" /> + id="polyline333" /> + id="polyline335" /> + id="polyline337" /> + id="polyline339" /> + id="polyline341" /> + id="polyline343" /> + id="polyline345" /> + id="polyline347" /> + id="polyline349" /> + id="polyline351" /> + id="polyline353" /> + id="polyline355" /> + id="polyline357" /> + id="polyline359" /> + id="polyline361" /> + id="polyline363" /> + id="polyline365" /> + id="polyline367" /> + id="polyline369" /> + id="text215"> + id="path887" /> + id="polyline283" /> + id="polyline285" /> + id="polyline287" /> + id="polyline289" /> + id="polyline291" /> + id="polyline293" /> + id="polyline295" /> + id="polyline297" /> + id="polyline299" /> + id="polyline301" /> + id="polyline303" /> + id="polyline305" /> + id="polyline307" /> + id="polyline309" /> + id="polyline311" /> + id="polyline313" /> + id="polyline315" /> + id="polyline317" /> + id="polyline319" /> + id="polyline321" /> + id="polyline323" /> + id="text219"> + id="path911" /> diff --git a/vst2_bin/plugins/Bogaudio/res/Cmp.svg b/vst2_bin/plugins/Bogaudio/res/Cmp.svg index 9e4fba81..820516f5 100644 --- a/vst2_bin/plugins/Bogaudio/res/Cmp.svg +++ b/vst2_bin/plugins/Bogaudio/res/Cmp.svg @@ -1257,12 +1257,12 @@ id="path632" /> diff --git a/vst2_bin/plugins/Bogaudio/res/EightOne.svg b/vst2_bin/plugins/Bogaudio/res/EightOne.svg index 06c77dd0..ff765c0b 100644 --- a/vst2_bin/plugins/Bogaudio/res/EightOne.svg +++ b/vst2_bin/plugins/Bogaudio/res/EightOne.svg @@ -11,11 +11,11 @@ width="90" height="380" viewBox="0 0 90 380" - id="svg164" + id="svg166" sodipodi:docname="svg_render_tmp.svg" inkscape:version="0.92.2 5c3e80d, 2017-08-06"> + id="metadata170"> @@ -36,7 +36,7 @@ inkscape:pageshadow="2" inkscape:window-width="468" inkscape:window-height="449" - id="namedview166" + id="namedview168" showgrid="false" inkscape:zoom="0.62105263" inkscape:cx="45" @@ -44,7 +44,7 @@ inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="0" - inkscape:current-layer="svg164" /> + inkscape:current-layer="svg166" /> + id="defs82"> @@ -158,35 +158,39 @@ viewBox="0 0 40px 40px"> + id="g57"> 2 + id="text41">1 3 + transform="rotate(-197.1) translate(13 0) rotate(197.1) translate(-2 2)" + id="text43">2 4 + transform="rotate(-154.3) translate(13 0) rotate(154.3) translate(-2 2)" + id="text45">3 5 + transform="rotate(-111.4) translate(13 0) rotate(111.4) translate(-2 2)" + id="text47">4 6 + transform="rotate(-68.6) translate(13 0) rotate(68.6) translate(-2 2)" + id="text49">5 7 + transform="rotate(-25.7) translate(13 0) rotate(25.7) translate(-2 2)" + id="text51">6 + 7 8 + id="text55">8 + id="rect60" /> + id="rect62" /> + id="rect65" /> + id="g72"> + id="circle68" /> + id="circle70" /> + id="g79"> + id="circle75" /> + id="circle77" /> + id="rect84" /> + id="polyline86" /> + id="polyline88" /> + id="polyline90" /> + id="text92"> + id="path295" /> + id="path297" /> + id="path299" /> + id="text94"> + id="path302" /> + id="path304" /> + id="path306" /> + id="path308" /> + id="path310" /> + id="path312" /> + id="path314" /> + id="path316" /> + id="rect96" /> + id="rect100" /> + id="text102"> + id="path321" /> + id="path323" /> + id="text104"> + id="path326" /> + id="text106"> + id="path329" /> + id="text108"> + id="path332" /> + id="text110"> + id="path335" /> + id="text112"> + id="path338" /> + id="text114"> + id="path341" /> + id="text116"> + id="path344" /> + id="text118"> + id="path347" /> + id="rect122" /> + id="rect124" /> + id="text126"> + id="path352" /> + id="path354" /> + id="path356" /> + id="path358" /> + id="path360" /> + id="rect130" /> + id="text132"> + id="path364" /> + id="path366" /> + id="path368" /> + id="path370" /> + id="path372" /> + id="text136"> + id="path375" /> + id="path377" /> + id="path379" /> + id="path381" /> + id="path383" /> + id="text200"> + + + + id="path389" /> + id="text204"> + id="path392" /> + id="text206"> + id="path395" /> + id="text208"> + id="path398" /> + id="text210"> + id="path401" /> + id="text212"> + id="path404" /> + id="text214"> + id="path407" /> + id="text142"> + id="path410" /> + id="path412" /> + id="path414" /> + id="text144"> + id="path417" /> + id="path419" /> + id="path421" /> + id="text148"> + id="path240" /> + id="path242" /> + id="path244" /> + id="path246" /> + id="path248" /> + id="path250" /> + id="text220"> + id="path253" /> + id="text222"> + id="path256" /> + id="text224"> + id="path259" /> + id="text226"> + id="path262" /> + id="text228"> + id="path265" /> + id="text230"> + id="path268" /> + id="text232"> + id="path271" /> + id="text234"> + id="path274" /> + id="rect152" /> + id="text154"> + id="path278" /> + id="path280" /> + id="rect160" /> + id="text162"> + id="path284" /> + id="path286" /> + id="path288" /> diff --git a/vst2_bin/plugins/Bogaudio/res/Mix1.svg b/vst2_bin/plugins/Bogaudio/res/Mix1.svg new file mode 100644 index 00000000..986636d6 --- /dev/null +++ b/vst2_bin/plugins/Bogaudio/res/Mix1.svg @@ -0,0 +1,670 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + -6 + + + + + -12 + + + + + -24 + + + + + -48 + + + + dB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vst2_bin/plugins/Bogaudio/res/OneEight.svg b/vst2_bin/plugins/Bogaudio/res/OneEight.svg index 9af005f9..0e11a0d2 100644 --- a/vst2_bin/plugins/Bogaudio/res/OneEight.svg +++ b/vst2_bin/plugins/Bogaudio/res/OneEight.svg @@ -11,11 +11,11 @@ width="90" height="380" viewBox="0 0 90 380" - id="svg164" + id="svg166" sodipodi:docname="svg_render_tmp.svg" inkscape:version="0.92.2 5c3e80d, 2017-08-06"> + id="metadata170"> @@ -36,7 +36,7 @@ inkscape:pageshadow="2" inkscape:window-width="468" inkscape:window-height="449" - id="namedview166" + id="namedview168" showgrid="false" inkscape:zoom="0.62105263" inkscape:cx="45" @@ -44,7 +44,7 @@ inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="0" - inkscape:current-layer="svg164" /> + inkscape:current-layer="svg166" /> + id="defs82"> @@ -158,35 +158,39 @@ viewBox="0 0 40px 40px"> + id="g57"> 2 + id="text41">1 3 + transform="rotate(-197.1) translate(13 0) rotate(197.1) translate(-2 2)" + id="text43">2 4 + transform="rotate(-154.3) translate(13 0) rotate(154.3) translate(-2 2)" + id="text45">3 5 + transform="rotate(-111.4) translate(13 0) rotate(111.4) translate(-2 2)" + id="text47">4 6 + transform="rotate(-68.6) translate(13 0) rotate(68.6) translate(-2 2)" + id="text49">5 7 + transform="rotate(-25.7) translate(13 0) rotate(25.7) translate(-2 2)" + id="text51">6 + 7 8 + id="text55">8 + id="rect60" /> + id="rect62" /> + id="rect65" /> + id="g72"> + id="circle68" /> + id="circle70" /> + id="g79"> + id="circle75" /> + id="circle77" /> + id="rect84" /> + id="polyline86" /> + id="polyline88" /> + id="polyline90" /> + id="text92"> + id="path325" /> + id="path327" /> + id="path329" /> + id="text94"> + id="path332" /> + id="path334" /> + id="path336" /> + id="path338" /> + id="path340" /> + id="path342" /> + id="path344" /> + id="path346" /> + id="rect96" /> + id="rect100" /> + id="rect102" /> + id="text104"> + id="path352" /> + id="path354" /> + id="path356" /> + id="path358" /> + id="path360" /> + id="rect108" /> + id="text110"> + id="path364" /> + id="path366" /> + id="path368" /> + id="path370" /> + id="path372" /> + id="text114"> + id="path375" /> + id="path377" /> + id="path379" /> + id="path381" /> + id="path383" /> + id="text200"> + + + + id="path389" /> + id="text204"> + id="path392" /> + id="text206"> + id="path395" /> + id="text208"> + id="path398" /> + id="text210"> + id="path401" /> + id="text212"> + id="path404" /> + id="text214"> + id="path407" /> + id="text120"> + id="path410" /> + id="path412" /> + id="path414" /> + id="text122"> + id="path417" /> + id="path419" /> + id="path421" /> + id="text126"> + id="path240" /> + id="path242" /> + id="path244" /> + id="path246" /> + id="path248" /> + id="path250" /> + id="text220"> + id="path253" /> + id="text222"> + id="path256" /> + id="text224"> + id="path259" /> + id="text226"> + id="path262" /> + id="text228"> + id="path265" /> + id="text230"> + id="path268" /> + id="text232"> + id="path271" /> + id="text234"> + id="path274" /> + id="rect130" /> + id="text132"> + id="path278" /> + id="path280" /> + id="rect138" /> + id="text140"> + id="path284" /> + id="path286" /> + id="rect144" /> + id="text146"> + id="path290" /> + id="path292" /> + id="path294" /> + id="text148"> + id="path297" /> + id="text150"> + id="path300" /> + id="text152"> + id="path303" /> + id="text154"> + id="path306" /> + id="text156"> + id="path309" /> + id="text158"> + id="path312" /> + id="text160"> + id="path315" /> + id="text162"> + id="path318" /> diff --git a/vst2_bin/plugins/Bogaudio/res/Walk.svg b/vst2_bin/plugins/Bogaudio/res/Walk.svg index b0c404fc..df29bb67 100644 --- a/vst2_bin/plugins/Bogaudio/res/Walk.svg +++ b/vst2_bin/plugins/Bogaudio/res/Walk.svg @@ -11,11 +11,11 @@ width="45" height="380" viewBox="0 0 45 380" - id="svg171" + id="svg161" sodipodi:docname="svg_render_tmp.svg" inkscape:version="0.92.2 5c3e80d, 2017-08-06"> + id="metadata165"> @@ -36,7 +36,7 @@ inkscape:pageshadow="2" inkscape:window-width="468" inkscape:window-height="449" - id="namedview173" + id="namedview163" showgrid="false" inkscape:zoom="0.62105263" inkscape:cx="22.5" @@ -44,7 +44,7 @@ inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="0" - inkscape:current-layer="svg171" /> + inkscape:current-layer="svg161" /> + id="defs94"> @@ -344,46 +344,23 @@ id="circle89" /> - - - - - - - - + id="rect96" /> + id="polyline98" /> + id="polyline100" /> + id="polyline102" /> @@ -391,69 +368,69 @@ + id="text104"> + id="path538" /> + id="path540" /> + id="path542" /> + id="path544" /> + id="path546" /> + id="text106"> + id="path549" /> + id="path551" /> + id="path553" /> + id="path555" /> + id="path557" /> + id="path559" /> + id="path561" /> + id="path563" /> + id="rect108" /> @@ -464,283 +441,283 @@ + id="text114"> + id="path377" /> + id="polyline116" /> + id="polyline118" /> + id="text122"> + id="path382" /> + id="polyline124" /> + id="polyline126" /> + id="text132"> + id="path387" /> + id="path389" /> + id="path391" /> + id="path393" /> + id="polyline351" /> + id="polyline353" /> + id="polyline355" /> + id="polyline357" /> + id="polyline359" /> + id="polyline361" /> + id="polyline363" /> + id="polyline365" /> + id="polyline367" /> + id="polyline369" /> + id="polyline371" /> + id="text140"> + id="path407" /> + id="path409" /> + id="path411" /> + id="path413" /> + id="polyline325" /> + id="polyline327" /> + id="polyline329" /> + id="polyline331" /> + id="polyline333" /> + id="polyline335" /> + id="polyline337" /> + id="polyline339" /> + id="polyline341" /> + id="polyline343" /> + id="polyline345" /> + id="text148"> + id="path427" /> + id="path429" /> + id="path431" /> + id="polyline309" /> + id="polyline293" /> + id="text156"> + id="path436" /> + id="path438" /> + id="path440" /> + id="polyline277" /> + id="polyline261" /> - - - - - - - - - - - - - - + d="m 12,281 h 52 c 2.77,0 5,2.23 5,5 v 69 c 0,2.77 -2.23,5 -5,5 H 12 c -2.77,0 -5,-2.23 -5,-5 v -69 c 0,-2.77 2.23,-5 5,-5 z" + id="rect164" /> + d="m 52,320 h 12 c 2.77,0 5,2.23 5,5 v 30 c 0,2.77 -2.23,5 -5,5 H 52 c -2.77,0 -5,-2.23 -5,-5 v -30 c 0,-2.77 2.23,-5 5,-5 z" + id="rect166" /> + d="m 38,320 h 20 v 40 H 38 Z" + id="rect168" /> + - + id="text172"> + id="path449" /> + id="path451" /> + id="path453" /> - + id="text174"> + id="path456" /> + id="path458" /> + id="path460" /> + id="text176"> + id="path463" /> + id="path465" /> + id="path467" /> + id="path469" /> + id="text178"> + id="path472" /> + id="path474" /> + id="path476" /> + d="m 147,281 h 52 c 2.77,0 5,2.23 5,5 v 69 c 0,2.77 -2.23,5 -5,5 h -52 c -2.77,0 -5,-2.23 -5,-5 v -69 c 0,-2.77 2.23,-5 5,-5 z" + id="rect182" /> + d="m 187,320 h 12 c 2.77,0 5,2.23 5,5 v 30 c 0,2.77 -2.23,5 -5,5 h -12 c -2.77,0 -5,-2.23 -5,-5 v -30 c 0,-2.77 2.23,-5 5,-5 z" + id="rect184" /> + d="m 173,320 h 20 v 40 h -20 z" + id="rect186" /> + - + id="text190"> + id="path483" /> + id="path485" /> + id="path487" /> - + id="text192"> + id="path490" /> + id="path492" /> + id="path494" /> + id="text194"> + id="path497" /> + id="path499" /> + id="path501" /> + id="path503" /> + id="text196"> + id="path506" /> + id="path508" /> + id="path510" /> + d="m 79.5,300 h 51 c 2.77,0 5,2.23 5,5 v 30 c 0,2.77 -2.23,5 -5,5 h -51 c -2.77,0 -5,-2.23 -5,-5 v -30 c 0,-2.77 2.23,-5 5,-5 z" + id="rect200" /> + d="m 119.5,300 h 12 c 2.77,0 5,2.23 5,5 v 30 c 0,2.77 -2.23,5 -5,5 h -12 c -2.77,0 -5,-2.23 -5,-5 v -30 c 0,-2.77 2.23,-5 5,-5 z" + id="rect202" /> + d="m 105.5,300 h 20 v 40 h -20 z" + id="rect204" /> + id="text206"> + id="path516" /> + id="path518" /> + id="path520" /> + id="path522" /> + id="text208"> + id="path525" /> + id="path527" /> + id="path529" /> + id="path531" />