diff --git a/plugins/community/repos/cf/Makefile b/plugins/community/repos/cf/Makefile
index 80c55336..7f5e9fea 100644
--- a/plugins/community/repos/cf/Makefile
+++ b/plugins/community/repos/cf/Makefile
@@ -1,9 +1,11 @@
SLUG = cf
-VERSION = 0.6.0
+VERSION = 0.6.7
SOURCES += $(wildcard src/*.cpp)
DISTRIBUTABLES += $(wildcard LICENSE*) res
+DISTRIBUTABLES += $(wildcard LICENSE*) res_b
+DISTRIBUTABLES += $(wildcard LICENSE*) playeroscs
RACK_DIR ?= ../..
include $(RACK_DIR)/plugin.mk
diff --git a/plugins/community/repos/cf/README.md b/plugins/community/repos/cf/README.md
index 80845481..5bdf15cc 100644
--- a/plugins/community/repos/cf/README.md
+++ b/plugins/community/repos/cf/README.md
@@ -1,7 +1,7 @@
-
-
+
+
**trSEQ : tr style 16 steps SEQ with trig input per step**
diff --git a/plugins/community/repos/cf/cf060.png b/plugins/community/repos/cf/cf060.png
deleted file mode 100644
index 33684990..00000000
Binary files a/plugins/community/repos/cf/cf060.png and /dev/null differ
diff --git a/plugins/community/repos/cf/make.objects b/plugins/community/repos/cf/make.objects
index 37a3d015..55c6d2bc 100644
--- a/plugins/community/repos/cf/make.objects
+++ b/plugins/community/repos/cf/make.objects
@@ -1,7 +1,10 @@
COMMON_OBJ= \
- src/AudioFile.o \
+ src/ALGEBRA.o \
+ src/BUFFER.o \
+ src/CHOKE.o \
src/CUBE.o \
src/DAVE.o \
+ src/DISTO.o \
src/EACH.o \
src/FOUR.o \
src/L3DS3Q.o \
@@ -12,11 +15,13 @@ COMMON_OBJ= \
src/MONO.o \
src/PATCH.o \
src/PEAK.o \
+ src/PLAY.o \
src/PLAYER.o \
src/SLIDERSEQ.o \
src/STEPS.o \
src/STEREO.o \
src/SUB.o \
+ src/VARIABLE.o \
src/cf.o \
src/trSEQ.o
diff --git a/plugins/community/repos/cf/playeroscs/noisepink.wav b/plugins/community/repos/cf/playeroscs/noisepink.wav
new file mode 100644
index 00000000..84c43374
Binary files /dev/null and b/plugins/community/repos/cf/playeroscs/noisepink.wav differ
diff --git a/plugins/community/repos/cf/playeroscs/noisewhite.wav b/plugins/community/repos/cf/playeroscs/noisewhite.wav
new file mode 100644
index 00000000..1096433c
Binary files /dev/null and b/plugins/community/repos/cf/playeroscs/noisewhite.wav differ
diff --git a/plugins/community/repos/cf/playeroscs/osc1.wav b/plugins/community/repos/cf/playeroscs/osc1.wav
new file mode 100644
index 00000000..9fdd80bd
Binary files /dev/null and b/plugins/community/repos/cf/playeroscs/osc1.wav differ
diff --git a/plugins/community/repos/cf/playeroscs/osc2.wav b/plugins/community/repos/cf/playeroscs/osc2.wav
new file mode 100644
index 00000000..52c16ebc
Binary files /dev/null and b/plugins/community/repos/cf/playeroscs/osc2.wav differ
diff --git a/plugins/community/repos/cf/playeroscs/osc3.wav b/plugins/community/repos/cf/playeroscs/osc3.wav
new file mode 100644
index 00000000..835f3fc1
Binary files /dev/null and b/plugins/community/repos/cf/playeroscs/osc3.wav differ
diff --git a/plugins/community/repos/cf/playeroscs/osc4.wav b/plugins/community/repos/cf/playeroscs/osc4.wav
new file mode 100644
index 00000000..94eea669
Binary files /dev/null and b/plugins/community/repos/cf/playeroscs/osc4.wav differ
diff --git a/plugins/community/repos/cf/playeroscs/osc5.wav b/plugins/community/repos/cf/playeroscs/osc5.wav
new file mode 100644
index 00000000..43a42efe
Binary files /dev/null and b/plugins/community/repos/cf/playeroscs/osc5.wav differ
diff --git a/plugins/community/repos/cf/playeroscs/osc6.wav b/plugins/community/repos/cf/playeroscs/osc6.wav
new file mode 100644
index 00000000..0f21b898
Binary files /dev/null and b/plugins/community/repos/cf/playeroscs/osc6.wav differ
diff --git a/plugins/community/repos/cf/playeroscs/osc7.wav b/plugins/community/repos/cf/playeroscs/osc7.wav
new file mode 100644
index 00000000..822bbb49
Binary files /dev/null and b/plugins/community/repos/cf/playeroscs/osc7.wav differ
diff --git a/plugins/community/repos/cf/playeroscs/osc8.wav b/plugins/community/repos/cf/playeroscs/osc8.wav
new file mode 100644
index 00000000..3ff4f0ed
Binary files /dev/null and b/plugins/community/repos/cf/playeroscs/osc8.wav differ
diff --git a/plugins/community/repos/cf/playeroscs/saw.wav b/plugins/community/repos/cf/playeroscs/saw.wav
new file mode 100644
index 00000000..0a2fcd88
Binary files /dev/null and b/plugins/community/repos/cf/playeroscs/saw.wav differ
diff --git a/plugins/community/repos/cf/res/ALGEBRA.svg b/plugins/community/repos/cf/res/ALGEBRA.svg
new file mode 100644
index 00000000..3d61f812
--- /dev/null
+++ b/plugins/community/repos/cf/res/ALGEBRA.svg
@@ -0,0 +1,55 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res/BUFFER.svg b/plugins/community/repos/cf/res/BUFFER.svg
new file mode 100644
index 00000000..bb0f2aa8
--- /dev/null
+++ b/plugins/community/repos/cf/res/BUFFER.svg
@@ -0,0 +1,153 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res/CHOKE.svg b/plugins/community/repos/cf/res/CHOKE.svg
new file mode 100644
index 00000000..03fb4aab
--- /dev/null
+++ b/plugins/community/repos/cf/res/CHOKE.svg
@@ -0,0 +1,79 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res/DAVE.svg b/plugins/community/repos/cf/res/DAVE.svg
index 243d1d07..d80046d5 100644
--- a/plugins/community/repos/cf/res/DAVE.svg
+++ b/plugins/community/repos/cf/res/DAVE.svg
@@ -1,29893 +1,1073 @@
-
+
-
-
+
+
\ No newline at end of file
diff --git a/plugins/community/repos/cf/res/DISTO.svg b/plugins/community/repos/cf/res/DISTO.svg
new file mode 100644
index 00000000..ced7101e
--- /dev/null
+++ b/plugins/community/repos/cf/res/DISTO.svg
@@ -0,0 +1,131 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res/L3DS3Q.svg b/plugins/community/repos/cf/res/L3DS3Q.svg
index b37bef67..f089fd95 100644
--- a/plugins/community/repos/cf/res/L3DS3Q.svg
+++ b/plugins/community/repos/cf/res/L3DS3Q.svg
@@ -2,11 +2,11 @@
diff --git a/plugins/community/repos/cf/res/LEDCalculator.ttf b/plugins/community/repos/cf/res/LEDCalculator.ttf
new file mode 100644
index 00000000..f5929994
Binary files /dev/null and b/plugins/community/repos/cf/res/LEDCalculator.ttf differ
diff --git a/plugins/community/repos/cf/res/LEDSEQ.svg b/plugins/community/repos/cf/res/LEDSEQ.svg
index 101795cb..c2d76410 100644
--- a/plugins/community/repos/cf/res/LEDSEQ.svg
+++ b/plugins/community/repos/cf/res/LEDSEQ.svg
@@ -2,11 +2,11 @@
diff --git a/plugins/community/repos/cf/res/PEAK.svg b/plugins/community/repos/cf/res/PEAK.svg
index 249ca57d..e69d4de4 100644
--- a/plugins/community/repos/cf/res/PEAK.svg
+++ b/plugins/community/repos/cf/res/PEAK.svg
@@ -2,41 +2,13 @@
diff --git a/plugins/community/repos/cf/res/PLAY.svg b/plugins/community/repos/cf/res/PLAY.svg
new file mode 100644
index 00000000..c11d1e51
--- /dev/null
+++ b/plugins/community/repos/cf/res/PLAY.svg
@@ -0,0 +1,52 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res/PLAYER.svg b/plugins/community/repos/cf/res/PLAYER.svg
index c38e185e..8bbc3734 100644
--- a/plugins/community/repos/cf/res/PLAYER.svg
+++ b/plugins/community/repos/cf/res/PLAYER.svg
@@ -85,10 +85,10 @@
c-1.801,0-2.854-1.358-2.854-3.088c0-1.818,1.162-3.188,2.953-3.188C108.337,387.3,109.354,388.695,109.354,390.37z
M104.971,390.451c0,1.188,0.559,2.025,1.479,2.025c0.927,0,1.458-0.896,1.458-2.062c0-1.09-0.521-2.025-1.471-2.025
C105.512,388.391,104.971,389.271,104.971,390.451z"/>
-
-
@@ -120,7 +120,7 @@
c0.369,0.188,0.938,0.379,1.521,0.379c0.631,0,0.963-0.262,0.963-0.646c0-0.378-0.287-0.604-1.021-0.854
c-1.008-0.354-1.666-0.899-1.666-1.789c0-1.029,0.864-1.82,2.301-1.82c0.688,0,1.188,0.146,1.547,0.312l-0.31,1.104
c-0.239-0.107-0.675-0.285-1.271-0.285c-0.594,0-0.881,0.271-0.881,0.588c0,0.396,0.342,0.562,1.125,0.854
- c1.062,0.396,1.562,0.952,1.562,1.812c0,1.021-0.771,1.887-2.438,1.887c-0.688,0-1.377-0.188-1.729-0.363L69.666,392.15z"/>
+ c1.062,0.396,1.562,0.952,1.562,1.812c0,1.021-0.771,1.887-2.438,1.887c-0.688,0-1.377-0.188-1.729-0.362L69.666,392.15z"/>
@@ -141,12 +141,12 @@
c0.369,0.188,0.937,0.379,1.521,0.379c0.63,0,0.963-0.262,0.963-0.646c0-0.378-0.288-0.604-1.018-0.854
c-1.008-0.354-1.666-0.899-1.666-1.789c0-1.029,0.864-1.82,2.296-1.82c0.684,0,1.188,0.146,1.548,0.312l-0.306,1.104
c-0.243-0.107-0.675-0.285-1.269-0.285c-0.594,0-0.882,0.271-0.882,0.588c0,0.396,0.342,0.562,1.125,0.854
- c1.071,0.396,1.575,0.952,1.575,1.812c0,1.021-0.783,1.887-2.449,1.887c-0.693,0-1.377-0.188-1.719-0.363L39.647,392.15z"/>
+ c1.071,0.396,1.575,0.952,1.575,1.812c0,1.021-0.783,1.887-2.449,1.887c-0.693,0-1.377-0.188-1.719-0.362L39.647,392.15z"/>
+ c-0.09,0.355-0.18,0.814-0.279,1.17l-0.36,1.287H51.7z"/>
+ l2.071,6.066h-0.837l-0.648-1.907H19.221z M21.211,391.053l-0.594-1.746c-0.135-0.396-0.225-0.757-0.315-1.104h-0.018
+ c-0.09,0.356-0.189,0.729-0.306,1.104l-0.594,1.758L21.211,391.053L21.211,391.053z"/>
-
+ c-1.107,0-1.909-0.277-2.467-0.817c-0.558-0.521-0.864-1.312-0.855-2.206c0.009-2.02,1.477-3.169,3.466-3.169
+ c0.783,0,1.386,0.151,1.684,0.297l-0.288,1.101c-0.333-0.146-0.748-0.262-1.414-0.262c-1.144,0-2.008,0.646-2.008,1.963
+ c0,1.252,0.783,1.988,1.909,1.988c0.315,0,0.567-0.035,0.675-0.091v-1.271h-0.937v-1.07h2.26V312.477z"/>
+ c-1.107,0-1.909-0.277-2.467-0.817c-0.558-0.521-0.864-1.312-0.855-2.206c0.009-2.02,1.477-3.169,3.466-3.169
+ c0.783,0,1.386,0.151,1.684,0.297l-0.288,1.101c-0.333-0.146-0.748-0.263-1.414-0.263c-1.144,0-2.008,0.646-2.008,1.962
+ c0,1.254,0.783,1.99,1.909,1.99c0.315,0,0.567-0.036,0.675-0.091v-1.271h-0.937v-1.072h2.26V356.387z"/>
@@ -212,15 +212,15 @@
+ c-0.594,0-0.882,0.271-0.882,0.586c0,0.387,0.342,0.558,1.125,0.854c1.072,0.396,1.576,0.955,1.576,1.812
+ c0,1.019-0.783,1.881-2.449,1.881c-0.693,0-1.377-0.181-1.72-0.369L40.972,311.346z"/>
@@ -231,76 +231,77 @@
-
-
+
+
-
-
-
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/community/repos/cf/res/SLIDERSEQ.svg b/plugins/community/repos/cf/res/SLIDERSEQ.svg
index 9e06408f..3b50f3ba 100644
--- a/plugins/community/repos/cf/res/SLIDERSEQ.svg
+++ b/plugins/community/repos/cf/res/SLIDERSEQ.svg
@@ -7,367 +7,121 @@
viewBox="0 0 135.566 380" enable-background="new 0 0 135.566 380" xml:space="preserve">
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+ c0.479,0,0.963-0.104,1.278-0.252L111.69,315.384z"/>
+
-
+ v1.499H65.09v1.679h2.979L68.068,20.944L68.068,20.944z"/>
-
+ c0-1.379,1.152-2.435,3.062-2.435c0.906,0,1.584,0.192,2.062,0.408l-0.408,1.475c-0.317-0.156-0.896-0.384-1.688-0.384
+ c-0.793,0-1.182,0.36-1.182,0.78c0,0.516,0.455,0.743,1.498,1.139c1.434,0.528,2.104,1.271,2.104,2.411
+ c0,1.355-1.043,2.507-3.262,2.507c-0.93,0-1.842-0.24-2.291-0.492L76.842,22.479z"/>
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/community/repos/cf/res/VARIABLE.svg b/plugins/community/repos/cf/res/VARIABLE.svg
new file mode 100644
index 00000000..f5d96b1e
--- /dev/null
+++ b/plugins/community/repos/cf/res/VARIABLE.svg
@@ -0,0 +1,82 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res/cach.svg b/plugins/community/repos/cf/res/cach.svg
new file mode 100644
index 00000000..9eb36a63
--- /dev/null
+++ b/plugins/community/repos/cf/res/cach.svg
@@ -0,0 +1,19 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res/distocach.svg b/plugins/community/repos/cf/res/distocach.svg
new file mode 100644
index 00000000..d308662e
--- /dev/null
+++ b/plugins/community/repos/cf/res/distocach.svg
@@ -0,0 +1,22 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res/divButton.svg b/plugins/community/repos/cf/res/divButton.svg
new file mode 100644
index 00000000..4254c13c
--- /dev/null
+++ b/plugins/community/repos/cf/res/divButton.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res/maxButton.svg b/plugins/community/repos/cf/res/maxButton.svg
new file mode 100644
index 00000000..72338b27
--- /dev/null
+++ b/plugins/community/repos/cf/res/maxButton.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res/minButton.svg b/plugins/community/repos/cf/res/minButton.svg
new file mode 100644
index 00000000..ef9dbd74
--- /dev/null
+++ b/plugins/community/repos/cf/res/minButton.svg
@@ -0,0 +1,23 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res/minusButton.svg b/plugins/community/repos/cf/res/minusButton.svg
new file mode 100644
index 00000000..cdc69ff8
--- /dev/null
+++ b/plugins/community/repos/cf/res/minusButton.svg
@@ -0,0 +1,19 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res/multButton.svg b/plugins/community/repos/cf/res/multButton.svg
new file mode 100644
index 00000000..696072a3
--- /dev/null
+++ b/plugins/community/repos/cf/res/multButton.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res/plusButton.svg b/plugins/community/repos/cf/res/plusButton.svg
new file mode 100644
index 00000000..b6ac6e54
--- /dev/null
+++ b/plugins/community/repos/cf/res/plusButton.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/ALGEBRA.svg b/plugins/community/repos/cf/res_b/ALGEBRA.svg
new file mode 100644
index 00000000..1b1a483f
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/ALGEBRA.svg
@@ -0,0 +1,57 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/BUFFER.svg b/plugins/community/repos/cf/res_b/BUFFER.svg
new file mode 100644
index 00000000..920171cb
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/BUFFER.svg
@@ -0,0 +1,157 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/CHOKE.svg b/plugins/community/repos/cf/res_b/CHOKE.svg
new file mode 100644
index 00000000..bb484d1a
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/CHOKE.svg
@@ -0,0 +1,88 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/CUBE.svg b/plugins/community/repos/cf/res_b/CUBE.svg
new file mode 100644
index 00000000..fe55d03b
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/CUBE.svg
@@ -0,0 +1,115 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/DAVE.svg b/plugins/community/repos/cf/res_b/DAVE.svg
new file mode 100644
index 00000000..243d1d07
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/DAVE.svg
@@ -0,0 +1,29893 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/DISTO.svg b/plugins/community/repos/cf/res_b/DISTO.svg
new file mode 100644
index 00000000..8c60cf28
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/DISTO.svg
@@ -0,0 +1,135 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/DejaVu-LICENSE.txt b/plugins/community/repos/cf/res_b/DejaVu-LICENSE.txt
new file mode 100644
index 00000000..254e2cc4
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/DejaVu-LICENSE.txt
@@ -0,0 +1,99 @@
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
+
+Bitstream Vera Fonts Copyright
+------------------------------
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
+a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated
+documentation files (the "Font Software"), to reproduce and distribute the
+Font Software, including without limitation the rights to use, copy, merge,
+publish, distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright and trademark notices and this permission notice shall
+be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the fonts
+are renamed to names not containing either the words "Bitstream" or the word
+"Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font
+Software that has been modified and is distributed under the "Bitstream
+Vera" names.
+
+The Font Software may be sold as part of a larger software package but no
+copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
+FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the Gnome Foundation or Bitstream
+Inc., respectively. For further information, contact: fonts at gnome dot
+org.
+
+Arev Fonts Copyright
+------------------------------
+
+Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the fonts accompanying this license ("Fonts") and
+associated documentation files (the "Font Software"), to reproduce
+and distribute the modifications to the Bitstream Vera Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software
+typefaces.
+
+The Font Software may be modified, altered, or added to, and in
+particular the designs of glyphs or characters in the Fonts may be
+modified and additional glyphs or characters may be added to the
+Fonts, only if the fonts are renamed to names not containing either
+the words "Tavmjong Bah" or the word "Arev".
+
+This License becomes null and void to the extent applicable to Fonts
+or Font Software that has been modified and is distributed under the
+"Tavmjong Bah Arev" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by
+itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
+TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the name of Tavmjong Bah shall not
+be used in advertising or otherwise to promote the sale, use or other
+dealings in this Font Software without prior written authorization
+from Tavmjong Bah. For further information, contact: tavmjong @ free
+. fr.
+
+$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $
diff --git a/plugins/community/repos/cf/res_b/DejaVuSansMono.ttf b/plugins/community/repos/cf/res_b/DejaVuSansMono.ttf
new file mode 100644
index 00000000..f5786022
Binary files /dev/null and b/plugins/community/repos/cf/res_b/DejaVuSansMono.ttf differ
diff --git a/plugins/community/repos/cf/res_b/EACH.svg b/plugins/community/repos/cf/res_b/EACH.svg
new file mode 100644
index 00000000..82d7a6dd
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/EACH.svg
@@ -0,0 +1,106 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/FOUR.svg b/plugins/community/repos/cf/res_b/FOUR.svg
new file mode 100644
index 00000000..cc85d741
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/FOUR.svg
@@ -0,0 +1,308 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/L.svg b/plugins/community/repos/cf/res_b/L.svg
new file mode 100644
index 00000000..bcffcd3b
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/L.svg
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/L3DS3Q.svg b/plugins/community/repos/cf/res_b/L3DS3Q.svg
new file mode 100644
index 00000000..6e1bbea8
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/L3DS3Q.svg
@@ -0,0 +1,107 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/LEDCalculator.ttf b/plugins/community/repos/cf/res_b/LEDCalculator.ttf
new file mode 100644
index 00000000..f5929994
Binary files /dev/null and b/plugins/community/repos/cf/res_b/LEDCalculator.ttf differ
diff --git a/plugins/community/repos/cf/res_b/LEDS.svg b/plugins/community/repos/cf/res_b/LEDS.svg
new file mode 100644
index 00000000..8391a0d9
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/LEDS.svg
@@ -0,0 +1,61 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/LEDSEQ.svg b/plugins/community/repos/cf/res_b/LEDSEQ.svg
new file mode 100644
index 00000000..ef063e9d
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/LEDSEQ.svg
@@ -0,0 +1,101 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/Ldown.svg b/plugins/community/repos/cf/res_b/Ldown.svg
new file mode 100644
index 00000000..ab0e0b4d
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/Ldown.svg
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/MASTER.svg b/plugins/community/repos/cf/res_b/MASTER.svg
new file mode 100644
index 00000000..94b2f39b
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/MASTER.svg
@@ -0,0 +1,139 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/METRO.svg b/plugins/community/repos/cf/res_b/METRO.svg
new file mode 100644
index 00000000..6fc0e06d
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/METRO.svg
@@ -0,0 +1,153 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/MONO.svg b/plugins/community/repos/cf/res_b/MONO.svg
new file mode 100644
index 00000000..07a02c9e
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/MONO.svg
@@ -0,0 +1,265 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/PATCH.svg b/plugins/community/repos/cf/res_b/PATCH.svg
new file mode 100644
index 00000000..38ac556d
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/PATCH.svg
@@ -0,0 +1,72 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/PEAK.svg b/plugins/community/repos/cf/res_b/PEAK.svg
new file mode 100644
index 00000000..7496bf82
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/PEAK.svg
@@ -0,0 +1,122 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/PLAY.svg b/plugins/community/repos/cf/res_b/PLAY.svg
new file mode 100644
index 00000000..36d61148
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/PLAY.svg
@@ -0,0 +1,48 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/PLAYER.svg b/plugins/community/repos/cf/res_b/PLAYER.svg
new file mode 100644
index 00000000..beab44f2
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/PLAYER.svg
@@ -0,0 +1,258 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/PadButton.svg b/plugins/community/repos/cf/res_b/PadButton.svg
new file mode 100644
index 00000000..d24d968d
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/PadButton.svg
@@ -0,0 +1,13 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/PadButtonDown.svg b/plugins/community/repos/cf/res_b/PadButtonDown.svg
new file mode 100644
index 00000000..c3605756
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/PadButtonDown.svg
@@ -0,0 +1,13 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/SLIDERSEQ.svg b/plugins/community/repos/cf/res_b/SLIDERSEQ.svg
new file mode 100644
index 00000000..7e3d342c
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/SLIDERSEQ.svg
@@ -0,0 +1,135 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/STEPS.svg b/plugins/community/repos/cf/res_b/STEPS.svg
new file mode 100644
index 00000000..e6b8d775
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/STEPS.svg
@@ -0,0 +1,112 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/STEREO.svg b/plugins/community/repos/cf/res_b/STEREO.svg
new file mode 100644
index 00000000..659eaeb5
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/STEREO.svg
@@ -0,0 +1,273 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/SUB.svg b/plugins/community/repos/cf/res_b/SUB.svg
new file mode 100644
index 00000000..2f5042d1
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/SUB.svg
@@ -0,0 +1,145 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/Segment7Standard.ttf b/plugins/community/repos/cf/res_b/Segment7Standard.ttf
new file mode 100644
index 00000000..bdd6e2af
Binary files /dev/null and b/plugins/community/repos/cf/res_b/Segment7Standard.ttf differ
diff --git a/plugins/community/repos/cf/res_b/VARIABLE.svg b/plugins/community/repos/cf/res_b/VARIABLE.svg
new file mode 100644
index 00000000..53ece729
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/VARIABLE.svg
@@ -0,0 +1,86 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/cach.svg b/plugins/community/repos/cf/res_b/cach.svg
new file mode 100644
index 00000000..e236d95c
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/cach.svg
@@ -0,0 +1,19 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/distocach.svg b/plugins/community/repos/cf/res_b/distocach.svg
new file mode 100644
index 00000000..a14c5797
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/distocach.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/divButton.svg b/plugins/community/repos/cf/res_b/divButton.svg
new file mode 100644
index 00000000..4254c13c
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/divButton.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/downButton.svg b/plugins/community/repos/cf/res_b/downButton.svg
new file mode 100644
index 00000000..640280a6
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/downButton.svg
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/downButtonDown.svg b/plugins/community/repos/cf/res_b/downButtonDown.svg
new file mode 100644
index 00000000..f28d358d
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/downButtonDown.svg
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/maxButton.svg b/plugins/community/repos/cf/res_b/maxButton.svg
new file mode 100644
index 00000000..72338b27
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/maxButton.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/minButton.svg b/plugins/community/repos/cf/res_b/minButton.svg
new file mode 100644
index 00000000..ef9dbd74
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/minButton.svg
@@ -0,0 +1,23 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/minusButton.svg b/plugins/community/repos/cf/res_b/minusButton.svg
new file mode 100644
index 00000000..cdc69ff8
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/minusButton.svg
@@ -0,0 +1,19 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/multButton.svg b/plugins/community/repos/cf/res_b/multButton.svg
new file mode 100644
index 00000000..696072a3
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/multButton.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/plusButton.svg b/plugins/community/repos/cf/res_b/plusButton.svg
new file mode 100644
index 00000000..b6ac6e54
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/plusButton.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/tagada b/plugins/community/repos/cf/res_b/tagada
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/tagada
@@ -0,0 +1 @@
+
diff --git a/plugins/community/repos/cf/res_b/trSEQ.svg b/plugins/community/repos/cf/res_b/trSEQ.svg
new file mode 100644
index 00000000..3b61c801
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/trSEQ.svg
@@ -0,0 +1,294 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/upButton.svg b/plugins/community/repos/cf/res_b/upButton.svg
new file mode 100644
index 00000000..808ea944
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/upButton.svg
@@ -0,0 +1,15 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/res_b/upButtonDown.svg b/plugins/community/repos/cf/res_b/upButtonDown.svg
new file mode 100644
index 00000000..f01d39d5
--- /dev/null
+++ b/plugins/community/repos/cf/res_b/upButtonDown.svg
@@ -0,0 +1,15 @@
+
+
+
+
diff --git a/plugins/community/repos/cf/screens/cf064.png b/plugins/community/repos/cf/screens/cf064.png
new file mode 100644
index 00000000..1572a9ba
Binary files /dev/null and b/plugins/community/repos/cf/screens/cf064.png differ
diff --git a/plugins/community/repos/cf/screens/cf064b.png b/plugins/community/repos/cf/screens/cf064b.png
new file mode 100644
index 00000000..1473606c
Binary files /dev/null and b/plugins/community/repos/cf/screens/cf064b.png differ
diff --git a/plugins/community/repos/cf/src/ALGEBRA.cpp b/plugins/community/repos/cf/src/ALGEBRA.cpp
new file mode 100644
index 00000000..54892a06
--- /dev/null
+++ b/plugins/community/repos/cf/src/ALGEBRA.cpp
@@ -0,0 +1,170 @@
+#include "cf.hpp"
+#include "dsp/digital.hpp"
+
+
+using namespace std;
+
+namespace rack_plugin_cf {
+
+struct ALGEBRA : Module {
+ enum ParamIds {
+ OP_PARAM,
+ NUM_PARAMS = OP_PARAM+6
+ };
+ enum InputIds {
+ IN1_INPUT,
+ IN2_INPUT,
+ NUM_INPUTS
+ };
+ enum OutputIds {
+ OUT_OUTPUT,
+ NUM_OUTPUTS
+ };
+ enum LightIds {
+ LED_LIGHT,
+ NUM_LIGHTS = LED_LIGHT+6
+ };
+
+ int OP_STATE = 0 ;
+ SchmittTrigger trTrigger[6];
+
+ALGEBRA() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { }
+
+ void step() override;
+
+json_t *toJson() override {
+ json_t *rootJ = json_object();
+
+
+ json_object_set_new(rootJ, "opstate", json_integer(OP_STATE));
+ return rootJ;
+ }
+
+void fromJson(json_t *rootJ) override {
+
+
+ json_t *opstateJ = json_object_get(rootJ, "opstate");
+ if (opstateJ)
+ OP_STATE = json_integer_value(opstateJ);
+
+ }
+};
+
+
+
+
+void ALGEBRA::step() {
+ for (int i=0; i<6; i++) {
+ if (trTrigger[i].process(params[OP_PARAM+i].value)) OP_STATE= i;
+ if (OP_STATE == i) lights[LED_LIGHT+i].value=1; else lights[LED_LIGHT+i].value=0;
+ }
+ if (OP_STATE==0) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value + inputs[IN2_INPUT].value;
+ if (OP_STATE==1) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value - inputs[IN2_INPUT].value;
+ if (OP_STATE==2) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value * inputs[IN2_INPUT].value;
+ if ((OP_STATE==3) & (inputs[IN2_INPUT].value!=0)) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value / inputs[IN2_INPUT].value;
+ if (OP_STATE==4) {
+ if (inputs[IN1_INPUT].value>=inputs[IN2_INPUT].value) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value;
+ else outputs[OUT_OUTPUT].value = inputs[IN2_INPUT].value;
+ }
+ if (OP_STATE==5) {
+ if (inputs[IN1_INPUT].value<=inputs[IN2_INPUT].value) outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value;
+ else outputs[OUT_OUTPUT].value = inputs[IN2_INPUT].value;
+ }
+
+}
+
+struct plusButton : SVGSwitch, MomentarySwitch {
+ plusButton() {
+ addFrame(SVG::load(assetPlugin(plugin, "res/plusButton.svg")));
+ addFrame(SVG::load(assetPlugin(plugin, "res/plusButton.svg")));
+ sw->wrap();
+ box.size = sw->box.size;
+ }
+};
+struct minusButton : SVGSwitch, MomentarySwitch {
+ minusButton() {
+ addFrame(SVG::load(assetPlugin(plugin, "res/minusButton.svg")));
+ addFrame(SVG::load(assetPlugin(plugin, "res/minusButton.svg")));
+ sw->wrap();
+ box.size = sw->box.size;
+ }
+};
+struct multButton : SVGSwitch, MomentarySwitch {
+ multButton() {
+ addFrame(SVG::load(assetPlugin(plugin, "res/multButton.svg")));
+ addFrame(SVG::load(assetPlugin(plugin, "res/multButton.svg")));
+ sw->wrap();
+ box.size = sw->box.size;
+ }
+};
+struct divButton : SVGSwitch, MomentarySwitch {
+ divButton() {
+ addFrame(SVG::load(assetPlugin(plugin, "res/divButton.svg")));
+ addFrame(SVG::load(assetPlugin(plugin, "res/divButton.svg")));
+ sw->wrap();
+ box.size = sw->box.size;
+ }
+};
+struct maxButton : SVGSwitch, MomentarySwitch {
+ maxButton() {
+ addFrame(SVG::load(assetPlugin(plugin, "res/maxButton.svg")));
+ addFrame(SVG::load(assetPlugin(plugin, "res/maxButton.svg")));
+ sw->wrap();
+ box.size = sw->box.size;
+ }
+};
+struct minButton : SVGSwitch, MomentarySwitch {
+ minButton() {
+ addFrame(SVG::load(assetPlugin(plugin, "res/minButton.svg")));
+ addFrame(SVG::load(assetPlugin(plugin, "res/minButton.svg")));
+ sw->wrap();
+ box.size = sw->box.size;
+ }
+};
+
+struct ALGEBRAWidget : ModuleWidget {
+ ALGEBRAWidget(ALGEBRA *module);
+ //void step() override;
+
+};
+
+ALGEBRAWidget::ALGEBRAWidget(ALGEBRA *module) : ModuleWidget(module) {
+ setPanel(SVG::load(assetPlugin(plugin, "res/ALGEBRA.svg")));
+
+
+ addChild(Widget::create(Vec(15, 0)));
+ addChild(Widget::create(Vec(box.size.x-30, 365)));
+
+
+ addInput(Port::create(Vec(3, 31), Port::INPUT, module, ALGEBRA::IN1_INPUT));
+ addInput(Port::create(Vec(3, 95), Port::INPUT, module, ALGEBRA::IN2_INPUT));
+
+ int i = 0;
+ addChild(ModuleLightWidget::create>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i));
+ addParam(ParamWidget::create(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1;
+ addChild(ModuleLightWidget::create>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i));
+ addParam(ParamWidget::create(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1;
+ addChild(ModuleLightWidget::create>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i));
+ addParam(ParamWidget::create(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1;
+ addChild(ModuleLightWidget::create>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i));
+ addParam(ParamWidget::create(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1;
+ addChild(ModuleLightWidget::create>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i));
+ addParam(ParamWidget::create(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0)); i=i+1;
+ addChild(ModuleLightWidget::create>(Vec(3+4.4, i*24+133+4.4), module, ALGEBRA::LED_LIGHT + i));
+ addParam(ParamWidget::create(Vec(6, i*24+136), module, ALGEBRA::OP_PARAM + i, 0.0, 1.0, 0.0));
+
+
+
+
+ addOutput(Port::create(Vec(3, 321), Port::OUTPUT, module, ALGEBRA::OUT_OUTPUT));
+
+}
+
+} // namespace rack_plugin_cf
+
+using namespace rack_plugin_cf;
+
+RACK_PLUGIN_MODEL_INIT(cf, ALGEBRA) {
+ Model *modelALGEBRA = Model::create("cf", "ALGEBRA", "Algebra", UTILITY_TAG);
+ return modelALGEBRA;
+}
diff --git a/plugins/community/repos/cf/src/AudioFile.cpp b/plugins/community/repos/cf/src/AudioFile.cpp
deleted file mode 100644
index cc2db1a5..00000000
--- a/plugins/community/repos/cf/src/AudioFile.cpp
+++ /dev/null
@@ -1,873 +0,0 @@
-//=======================================================================
-/** @file AudioFile.cpp
- * @author Adam Stark
- * @copyright Copyright (C) 2017 Adam Stark
- *
- * This file is part of the 'AudioFile' library
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-//=======================================================================
-
-#include "AudioFile.h"
-#include
-#include
-#include
-
-//=============================================================
-// Pre-defined 10-byte representations of common sample rates
-std::unordered_map > aiffSampleRateTable = {
- {8000, {64, 11, 250, 0, 0, 0, 0, 0, 0, 0}},
- {11025, {64, 12, 172, 68, 0, 0, 0, 0, 0, 0}},
- {16000, {64, 12, 250, 0, 0, 0, 0, 0, 0, 0}},
- {22050, {64, 13, 172, 68, 0, 0, 0, 0, 0, 0}},
- {32000, {64, 13, 250, 0, 0, 0, 0, 0, 0, 0}},
- {37800, {64, 14, 147, 168, 0, 0, 0, 0, 0, 0}},
- {44056, {64, 14, 172, 24, 0, 0, 0, 0, 0, 0}},
- {44100, {64, 14, 172, 68, 0, 0, 0, 0, 0, 0}},
- {47250, {64, 14, 184, 146, 0, 0, 0, 0, 0, 0}},
- {48000, {64, 14, 187, 128, 0, 0, 0, 0, 0, 0}},
- {50000, {64, 14, 195, 80, 0, 0, 0, 0, 0, 0}},
- {50400, {64, 14, 196, 224, 0, 0, 0, 0, 0, 0}},
- {88200, {64, 15, 172, 68, 0, 0, 0, 0, 0, 0}},
- {96000, {64, 15, 187, 128, 0, 0, 0, 0, 0, 0}},
- {176400, {64, 16, 172, 68, 0, 0, 0, 0, 0, 0}},
- {192000, {64, 16, 187, 128, 0, 0, 0, 0, 0, 0}},
- {352800, {64, 17, 172, 68, 0, 0, 0, 0, 0, 0}},
- {2822400, {64, 20, 172, 68, 0, 0, 0, 0, 0, 0}},
- {5644800, {64, 21, 172, 68, 0, 0, 0, 0, 0, 0}}
-};
-
-//=============================================================
-template
-AudioFile::AudioFile()
-{
- bitDepth = 16;
- sampleRate = 44100;
- samples.resize (1);
- samples[0].resize (0);
- audioFileFormat = AudioFileFormat::NotLoaded;
-}
-
-//=============================================================
-template
-uint32_t AudioFile::getSampleRate() const
-{
- return sampleRate;
-}
-
-//=============================================================
-template
-int AudioFile::getNumChannels() const
-{
- return (int)samples.size();
-}
-
-//=============================================================
-template
-bool AudioFile::isMono() const
-{
- return getNumChannels() == 1;
-}
-
-//=============================================================
-template
-bool AudioFile::isStereo() const
-{
- return getNumChannels() == 2;
-}
-
-//=============================================================
-template
-int AudioFile::getBitDepth() const
-{
- return bitDepth;
-}
-
-//=============================================================
-template
-int AudioFile::getNumSamplesPerChannel() const
-{
- if (samples.size() > 0)
- return (int) samples[0].size();
- else
- return 0;
-}
-
-//=============================================================
-template
-double AudioFile::getLengthInSeconds() const
-{
- return (double)getNumSamplesPerChannel() / (double)sampleRate;
-}
-
-//=============================================================
-template
-void AudioFile::printSummary() const
-{
- std::cout << "|======================================|" << std::endl;
- std::cout << "Num Channels: " << getNumChannels() << std::endl;
- std::cout << "Num Samples Per Channel: " << getNumSamplesPerChannel() << std::endl;
- std::cout << "Sample Rate: " << sampleRate << std::endl;
- std::cout << "Bit Depth: " << bitDepth << std::endl;
- std::cout << "Length in Seconds: " << getLengthInSeconds() << std::endl;
- std::cout << "|======================================|" << std::endl;
-}
-
-//=============================================================
-template
-bool AudioFile::setAudioBuffer (AudioBuffer& newBuffer)
-{
- int numChannels = (int)newBuffer.size();
-
- if (numChannels <= 0)
- {
- assert (false && "The buffer your are trying to use has no channels");
- return false;
- }
-
- int numSamples = (int)newBuffer[0].size();
-
- // set the number of channels
- samples.resize (newBuffer.size());
-
- for (int k = 0; k < getNumChannels(); k++)
- {
- assert (newBuffer[k].size() == numSamples);
-
- samples[k].resize (numSamples);
-
- for (int i = 0; i < numSamples; i++)
- {
- samples[k][i] = newBuffer[k][i];
- }
- }
-
- return true;
-}
-
-//=============================================================
-template
-void AudioFile::setAudioBufferSize (int numChannels, int numSamples)
-{
- samples.resize (numChannels);
- setNumSamplesPerChannel (numSamples);
-}
-
-//=============================================================
-template
-void AudioFile::setNumSamplesPerChannel (int numSamples)
-{
- int originalSize = getNumSamplesPerChannel();
-
- for (int i = 0; i < getNumChannels();i++)
- {
- samples[i].resize (numSamples);
-
- // set any new samples to zero
- if (numSamples > originalSize)
- std::fill (samples[i].begin() + originalSize, samples[i].end(), (T)0.);
- }
-}
-
-//=============================================================
-template
-void AudioFile::setNumChannels (int numChannels)
-{
- int originalNumChannels = getNumChannels();
- int originalNumSamplesPerChannel = getNumSamplesPerChannel();
-
- samples.resize (numChannels);
-
- // make sure any new channels are set to the right size
- // and filled with zeros
- if (numChannels > originalNumChannels)
- {
- for (int i = originalNumChannels; i < numChannels; i++)
- {
- samples[i].resize (originalNumSamplesPerChannel);
- std::fill (samples[i].begin(), samples[i].end(), (T)0.);
- }
- }
-}
-
-//=============================================================
-template
-void AudioFile::setBitDepth (int numBitsPerSample)
-{
- bitDepth = numBitsPerSample;
-}
-
-//=============================================================
-template
-void AudioFile::setSampleRate (uint32_t newSampleRate)
-{
- sampleRate = newSampleRate;
-}
-
-//=============================================================
-template
-bool AudioFile::load (std::string filePath)
-{
- std::ifstream file (filePath, std::ios::binary);
-
- // check the file exists
- if (! file.good())
- {
- std::cout << "ERROR: File doesn't exist or otherwise can't load file" << std::endl;
- std::cout << filePath << std::endl;
- return false;
- }
-
- file.unsetf (std::ios::skipws);
- std::istream_iterator begin (file), end;
- std::vector fileData (begin, end);
-
- // get audio file format
- audioFileFormat = determineAudioFileFormat (fileData);
-
- if (audioFileFormat == AudioFileFormat::Wave)
- {
- return decodeWaveFile (fileData);
- }
- else if (audioFileFormat == AudioFileFormat::Aiff)
- {
- return decodeAiffFile (fileData);
- }
- else
- {
- std::cout << "Audio File Type: " << "Error" << std::endl;
- return false;
- }
-}
-
-//=============================================================
-template
-bool AudioFile::decodeWaveFile (std::vector& fileData)
-{
- // -----------------------------------------------------------
- // HEADER CHUNK
- std::string headerChunkID (fileData.begin(), fileData.begin() + 4);
- //int32_t fileSizeInBytes = fourBytesToInt (fileData, 4) + 8;
- std::string format (fileData.begin() + 8, fileData.begin() + 12);
-
- // -----------------------------------------------------------
- // try and find the start points of key chunks
- int indexOfDataChunk = getIndexOfString (fileData, "data");
- int indexOfFormatChunk = getIndexOfString (fileData, "fmt");
-
- // if we can't find the data or format chunks, or the IDs/formats don't seem to be as expected
- // then it is unlikely we'll able to read this file, so abort
- if (indexOfDataChunk == -1 || indexOfFormatChunk == -1 || headerChunkID != "RIFF" || format != "WAVE")
- {
- std::cout << "ERROR: this doesn't seem to be a valid .WAV file" << std::endl;
- return false;
- }
-
- // -----------------------------------------------------------
- // FORMAT CHUNK
- int f = indexOfFormatChunk;
- std::string formatChunkID (fileData.begin() + f, fileData.begin() + f + 4);
- //int32_t formatChunkSize = fourBytesToInt (fileData, f + 4);
- int16_t audioFormat = twoBytesToInt (fileData, f + 8);
- int16_t numChannels = twoBytesToInt (fileData, f + 10);
- sampleRate = (uint32_t) fourBytesToInt (fileData, f + 12);
- int32_t numBytesPerSecond = fourBytesToInt (fileData, f + 16);
- int16_t numBytesPerBlock = twoBytesToInt (fileData, f + 20);
- bitDepth = (int) twoBytesToInt (fileData, f + 22);
-
- int numBytesPerSample = bitDepth / 8;
-
- // check that the audio format is PCM
- if (audioFormat != 1)
- {
- std::cout << "ERROR: this is a compressed .WAV file and this library does not support decoding them at present" << std::endl;
- return false;
- }
-
- // check the number of channels is mono or stereo
- if (numChannels < 1 ||numChannels > 2)
- {
- std::cout << "ERROR: this WAV file seems to be neither mono nor stereo (perhaps multi-track, or corrupted?)" << std::endl;
- return false;
- }
-
- // check header data is consistent
- if ((numBytesPerSecond != (numChannels * sampleRate * bitDepth) / 8) || (numBytesPerBlock != (numChannels * numBytesPerSample)))
- {
- std::cout << "ERROR: the header data in this WAV file seems to be inconsistent" << std::endl;
- return false;
- }
-
- // check bit depth is either 8, 16 or 24 bit
- if (bitDepth != 8 && bitDepth != 16 && bitDepth != 24)
- {
- std::cout << "ERROR: this file has a bit depth that is not 8, 16 or 24 bits" << std::endl;
- return false;
- }
-
- // -----------------------------------------------------------
- // DATA CHUNK
- int d = indexOfDataChunk;
- std::string dataChunkID (fileData.begin() + d, fileData.begin() + d + 4);
- int32_t dataChunkSize = fourBytesToInt (fileData, d + 4);
-
- int numSamples = dataChunkSize / (numChannels * bitDepth / 8);
- int samplesStartIndex = indexOfDataChunk + 8;
-
- clearAudioBuffer();
- samples.resize (numChannels);
-
- for (int i = 0; i < numSamples; i++)
- {
- for (int channel = 0; channel < numChannels; channel++)
- {
- int sampleIndex = samplesStartIndex + (numBytesPerBlock * i) + channel * numBytesPerSample;
-
- if (bitDepth == 8)
- {
- int32_t sampleAsInt = (int32_t) fileData[sampleIndex];
- T sample = (T)(sampleAsInt - 128) / (T)128.;
-
- samples[channel].push_back (sample);
- }
- else if (bitDepth == 16)
- {
- int16_t sampleAsInt = twoBytesToInt (fileData, sampleIndex);
- T sample = sixteenBitIntToSample (sampleAsInt);
- samples[channel].push_back (sample);
- }
- else if (bitDepth == 24)
- {
- int32_t sampleAsInt = 0;
- sampleAsInt = (fileData[sampleIndex + 2] << 16) | (fileData[sampleIndex + 1] << 8) | fileData[sampleIndex];
-
- if (sampleAsInt & 0x800000) // if the 24th bit is set, this is a negative number in 24-bit world
- sampleAsInt = sampleAsInt | ~0xFFFFFF; // so make sure sign is extended to the 32 bit float
-
- T sample = (T)sampleAsInt / (T)8388608.;
- samples[channel].push_back (sample);
- }
- else
- {
- assert (false);
- }
- }
- }
-
- return true;
-}
-
-//=============================================================
-template
-bool AudioFile::decodeAiffFile (std::vector& fileData)
-{
- // -----------------------------------------------------------
- // HEADER CHUNK
- std::string headerChunkID (fileData.begin(), fileData.begin() + 4);
- //int32_t fileSizeInBytes = fourBytesToInt (fileData, 4, Endianness::BigEndian) + 8;
- std::string format (fileData.begin() + 8, fileData.begin() + 12);
-
- // -----------------------------------------------------------
- // try and find the start points of key chunks
- int indexOfCommChunk = getIndexOfString (fileData, "COMM");
- int indexOfSoundDataChunk = getIndexOfString (fileData, "SSND");
-
- // if we can't find the data or format chunks, or the IDs/formats don't seem to be as expected
- // then it is unlikely we'll able to read this file, so abort
- if (indexOfSoundDataChunk == -1 || indexOfCommChunk == -1 || headerChunkID != "FORM" || format != "AIFF")
- {
- std::cout << "ERROR: this doesn't seem to be a valid AIFF file" << std::endl;
- return false;
- }
-
- // -----------------------------------------------------------
- // COMM CHUNK
- int p = indexOfCommChunk;
- std::string commChunkID (fileData.begin() + p, fileData.begin() + p + 4);
- //int32_t commChunkSize = fourBytesToInt (fileData, p + 4, Endianness::BigEndian);
- int16_t numChannels = twoBytesToInt (fileData, p + 8, Endianness::BigEndian);
- int32_t numSamplesPerChannel = fourBytesToInt (fileData, p + 10, Endianness::BigEndian);
- bitDepth = (int) twoBytesToInt (fileData, p + 14, Endianness::BigEndian);
- sampleRate = getAiffSampleRate (fileData, p + 16);
-
- // check the sample rate was properly decoded
- if (sampleRate == -1)
- {
- std::cout << "ERROR: this AIFF file has an unsupported sample rate" << std::endl;
- return false;
- }
-
- // check the number of channels is mono or stereo
- if (numChannels < 1 ||numChannels > 2)
- {
- std::cout << "ERROR: this AIFF file seems to be neither mono nor stereo (perhaps multi-track, or corrupted?)" << std::endl;
- return false;
- }
-
- // check bit depth is either 8, 16 or 24 bit
- if (bitDepth != 8 && bitDepth != 16 && bitDepth != 24)
- {
- std::cout << "ERROR: this file has a bit depth that is not 8, 16 or 24 bits" << std::endl;
- return false;
- }
-
- // -----------------------------------------------------------
- // SSND CHUNK
- int s = indexOfSoundDataChunk;
- std::string soundDataChunkID (fileData.begin() + s, fileData.begin() + s + 4);
- int32_t soundDataChunkSize = fourBytesToInt (fileData, s + 4, Endianness::BigEndian);
- int32_t offset = fourBytesToInt (fileData, s + 8, Endianness::BigEndian);
- //int32_t blockSize = fourBytesToInt (fileData, s + 12, Endianness::BigEndian);
-
- int numBytesPerSample = bitDepth / 8;
- int numBytesPerFrame = numBytesPerSample * numChannels;
- int totalNumAudioSampleBytes = numSamplesPerChannel * numBytesPerFrame;
- int samplesStartIndex = s + 16 + (int)offset;
-
- // sanity check the data
- if ((soundDataChunkSize - 8) != totalNumAudioSampleBytes || totalNumAudioSampleBytes > (fileData.size() - samplesStartIndex))
- {
- std::cout << "ERROR: the metadatafor this file doesn't seem right" << std::endl;
- return false;
- }
-
- clearAudioBuffer();
- samples.resize (numChannels);
-
- for (int i = 0; i < numSamplesPerChannel; i++)
- {
- for (int channel = 0; channel < numChannels; channel++)
- {
- int sampleIndex = samplesStartIndex + (numBytesPerFrame * i) + channel * numBytesPerSample;
-
- if (bitDepth == 8)
- {
- int8_t sampleAsSigned8Bit = (int8_t)fileData[sampleIndex];
- T sample = (T)sampleAsSigned8Bit / (T)128.;
- samples[channel].push_back (sample);
- }
- else if (bitDepth == 16)
- {
- int16_t sampleAsInt = twoBytesToInt (fileData, sampleIndex, Endianness::BigEndian);
- T sample = sixteenBitIntToSample (sampleAsInt);
- samples[channel].push_back (sample);
- }
- else if (bitDepth == 24)
- {
- int32_t sampleAsInt = 0;
- sampleAsInt = (fileData[sampleIndex] << 16) | (fileData[sampleIndex + 1] << 8) | fileData[sampleIndex + 2];
-
- if (sampleAsInt & 0x800000) // if the 24th bit is set, this is a negative number in 24-bit world
- sampleAsInt = sampleAsInt | ~0xFFFFFF; // so make sure sign is extended to the 32 bit float
-
- T sample = (T)sampleAsInt / (T)8388608.;
- samples[channel].push_back (sample);
- }
- else
- {
- assert (false);
- }
- }
- }
-
- return true;
-}
-
-//=============================================================
-template
-uint32_t AudioFile::getAiffSampleRate (std::vector& fileData, int sampleRateStartIndex)
-{
- for (auto it : aiffSampleRateTable)
- {
- if (tenByteMatch (fileData, sampleRateStartIndex, it.second, 0))
- return it.first;
- }
-
- return -1;
-}
-
-//=============================================================
-template
-bool AudioFile::tenByteMatch (std::vector& v1, int startIndex1, std::vector& v2, int startIndex2)
-{
- for (int i = 0; i < 10; i++)
- {
- if (v1[startIndex1 + i] != v2[startIndex2 + i])
- return false;
- }
-
- return true;
-}
-
-//=============================================================
-template
-void AudioFile::addSampleRateToAiffData (std::vector& fileData, uint32_t sampleRate)
-{
- if (aiffSampleRateTable.count (sampleRate) > 0)
- {
- for (int i = 0; i < 10; i++)
- fileData.push_back (aiffSampleRateTable[sampleRate][i]);
- }
-}
-
-//=============================================================
-template
-bool AudioFile::save (std::string filePath, AudioFileFormat format)
-{
- if (format == AudioFileFormat::Wave)
- {
- return saveToWaveFile (filePath);
- }
- else if (format == AudioFileFormat::Aiff)
- {
- return saveToAiffFile (filePath);
- }
-
- return false;
-}
-
-//=============================================================
-template
-bool AudioFile::saveToWaveFile (std::string filePath)
-{
- std::vector fileData;
-
- int32_t dataChunkSize = getNumSamplesPerChannel() * (getNumChannels() * bitDepth / 8);
-
- // -----------------------------------------------------------
- // HEADER CHUNK
- addStringToFileData (fileData, "RIFF");
-
- // The file size in bytes is the header chunk size (4, not counting RIFF and WAVE) + the format
- // chunk size (24) + the metadata part of the data chunk plus the actual data chunk size
- int32_t fileSizeInBytes = 4 + 24 + 8 + dataChunkSize;
- addInt32ToFileData (fileData, fileSizeInBytes);
-
- addStringToFileData (fileData, "WAVE");
-
- // -----------------------------------------------------------
- // FORMAT CHUNK
- addStringToFileData (fileData, "fmt ");
- addInt32ToFileData (fileData, 16); // format chunk size (16 for PCM)
- addInt16ToFileData (fileData, 1); // audio format = 1
- addInt16ToFileData (fileData, (int16_t)getNumChannels()); // num channels
- addInt32ToFileData (fileData, (int32_t)sampleRate); // sample rate
-
- int32_t numBytesPerSecond = (int32_t) ((getNumChannels() * sampleRate * bitDepth) / 8);
- addInt32ToFileData (fileData, numBytesPerSecond);
-
- int16_t numBytesPerBlock = getNumChannels() * (bitDepth / 8);
- addInt16ToFileData (fileData, numBytesPerBlock);
-
- addInt16ToFileData (fileData, (int16_t)bitDepth);
-
- // -----------------------------------------------------------
- // DATA CHUNK
- addStringToFileData (fileData, "data");
- addInt32ToFileData (fileData, dataChunkSize);
-
- for (int i = 0; i < getNumSamplesPerChannel(); i++)
- {
- for (int channel = 0; channel < getNumChannels(); channel++)
- {
- if (bitDepth == 8)
- {
- int32_t sampleAsInt = ((samples[channel][i] * (T)128.) + 128.);
- uint8_t byte = (uint8_t)sampleAsInt;
- fileData.push_back (byte);
- }
- else if (bitDepth == 16)
- {
- int16_t sampleAsInt = (int16_t) (samples[channel][i] * (T)32768.);
- addInt16ToFileData (fileData, sampleAsInt);
- }
- else if (bitDepth == 24)
- {
- int32_t sampleAsIntAgain = (int32_t) (samples[channel][i] * (T)8388608.);
-
- uint8_t bytes[3];
- bytes[2] = (uint8_t) (sampleAsIntAgain >> 16) & 0xFF;
- bytes[1] = (uint8_t) (sampleAsIntAgain >> 8) & 0xFF;
- bytes[0] = (uint8_t) sampleAsIntAgain & 0xFF;
-
- fileData.push_back (bytes[0]);
- fileData.push_back (bytes[1]);
- fileData.push_back (bytes[2]);
- }
- else
- {
- assert (false && "Trying to write a file with unsupported bit depth");
- return false;
- }
- }
- }
-
- // check that the various sizes we put in the metadata are correct
- if (fileSizeInBytes != (fileData.size() - 8) || dataChunkSize != (getNumSamplesPerChannel() * getNumChannels() * (bitDepth / 8)))
- {
- std::cout << "ERROR: couldn't save file to " << filePath << std::endl;
- return false;
- }
-
- // try to write the file
- return writeDataToFile (fileData, filePath);
-}
-
-//=============================================================
-template
-bool AudioFile::saveToAiffFile (std::string filePath)
-{
- std::vector fileData;
-
- int32_t numBytesPerSample = bitDepth / 8;
- int32_t numBytesPerFrame = numBytesPerSample * getNumChannels();
- int32_t totalNumAudioSampleBytes = getNumSamplesPerChannel() * numBytesPerFrame;
- int32_t soundDataChunkSize = totalNumAudioSampleBytes + 8;
-
- // -----------------------------------------------------------
- // HEADER CHUNK
- addStringToFileData (fileData, "FORM");
-
- // The file size in bytes is the header chunk size (4, not counting FORM and AIFF) + the COMM
- // chunk size (26) + the metadata part of the SSND chunk plus the actual data chunk size
- int32_t fileSizeInBytes = 4 + 26 + 16 + totalNumAudioSampleBytes;
- addInt32ToFileData (fileData, fileSizeInBytes, Endianness::BigEndian);
-
- addStringToFileData (fileData, "AIFF");
-
- // -----------------------------------------------------------
- // COMM CHUNK
- addStringToFileData (fileData, "COMM");
- addInt32ToFileData (fileData, 18, Endianness::BigEndian); // commChunkSize
- addInt16ToFileData (fileData, getNumChannels(), Endianness::BigEndian); // num channels
- addInt32ToFileData (fileData, getNumSamplesPerChannel(), Endianness::BigEndian); // num samples per channel
- addInt16ToFileData (fileData, bitDepth, Endianness::BigEndian); // bit depth
- addSampleRateToAiffData (fileData, sampleRate);
-
- // -----------------------------------------------------------
- // SSND CHUNK
- addStringToFileData (fileData, "SSND");
- addInt32ToFileData (fileData, soundDataChunkSize, Endianness::BigEndian);
- addInt32ToFileData (fileData, 0, Endianness::BigEndian); // offset
- addInt32ToFileData (fileData, 0, Endianness::BigEndian); // block size
-
- for (int i = 0; i < getNumSamplesPerChannel(); i++)
- {
- for (int channel = 0; channel < getNumChannels(); channel++)
- {
- if (bitDepth == 8)
- {
- int32_t sampleAsInt = (int32_t)(samples[channel][i] * (T)128.);
- uint8_t byte = (uint8_t)sampleAsInt;
- fileData.push_back (byte);
- }
- else if (bitDepth == 16)
- {
- int16_t sampleAsInt = (int16_t) (samples[channel][i] * (T)32768.);
- addInt16ToFileData (fileData, sampleAsInt, Endianness::BigEndian);
- }
- else if (bitDepth == 24)
- {
- int32_t sampleAsIntAgain = (int32_t) (samples[channel][i] * (T)8388608.);
-
- uint8_t bytes[3];
- bytes[0] = (uint8_t) (sampleAsIntAgain >> 16) & 0xFF;
- bytes[1] = (uint8_t) (sampleAsIntAgain >> 8) & 0xFF;
- bytes[2] = (uint8_t) sampleAsIntAgain & 0xFF;
-
- fileData.push_back (bytes[0]);
- fileData.push_back (bytes[1]);
- fileData.push_back (bytes[2]);
- }
- else
- {
- assert (false && "Trying to write a file with unsupported bit depth");
- return false;
- }
- }
- }
-
- // check that the various sizes we put in the metadata are correct
- if (fileSizeInBytes != (fileData.size() - 8) || soundDataChunkSize != getNumSamplesPerChannel() * numBytesPerFrame + 8)
- {
- std::cout << "ERROR: couldn't save file to " << filePath << std::endl;
- return false;
- }
-
- // try to write the file
- return writeDataToFile (fileData, filePath);
-}
-
-//=============================================================
-template
-bool AudioFile::writeDataToFile (std::vector& fileData, std::string filePath)
-{
- std::ofstream outputFile (filePath, std::ios::binary);
-
- if (outputFile.is_open())
- {
- for (int i = 0; i < fileData.size(); i++)
- {
- char value = (char) fileData[i];
- outputFile.write (&value, sizeof (char));
- }
-
- outputFile.close();
-
- return true;
- }
-
- return false;
-}
-
-//=============================================================
-template
-void AudioFile::addStringToFileData (std::vector& fileData, std::string s)
-{
- for (int i = 0; i < s.length();i++)
- fileData.push_back ((uint8_t) s[i]);
-}
-
-//=============================================================
-template
-void AudioFile::addInt32ToFileData (std::vector& fileData, int32_t i, Endianness endianness)
-{
- uint8_t bytes[4];
-
- if (endianness == Endianness::LittleEndian)
- {
- bytes[3] = (i >> 24) & 0xFF;
- bytes[2] = (i >> 16) & 0xFF;
- bytes[1] = (i >> 8) & 0xFF;
- bytes[0] = i & 0xFF;
- }
- else
- {
- bytes[0] = (i >> 24) & 0xFF;
- bytes[1] = (i >> 16) & 0xFF;
- bytes[2] = (i >> 8) & 0xFF;
- bytes[3] = i & 0xFF;
- }
-
- for (int i = 0; i < 4; i++)
- fileData.push_back (bytes[i]);
-}
-
-//=============================================================
-template
-void AudioFile::addInt16ToFileData (std::vector& fileData, int16_t i, Endianness endianness)
-{
- uint8_t bytes[2];
-
- if (endianness == Endianness::LittleEndian)
- {
- bytes[1] = (i >> 8) & 0xFF;
- bytes[0] = i & 0xFF;
- }
- else
- {
- bytes[0] = (i >> 8) & 0xFF;
- bytes[1] = i & 0xFF;
- }
-
- fileData.push_back (bytes[0]);
- fileData.push_back (bytes[1]);
-}
-
-//=============================================================
-template
-void AudioFile::clearAudioBuffer()
-{
- for (int i = 0; i < samples.size();i++)
- {
- samples[i].clear();
- }
-
- samples.clear();
-}
-
-//=============================================================
-template
-AudioFileFormat AudioFile::determineAudioFileFormat (std::vector& fileData)
-{
- std::string header (fileData.begin(), fileData.begin() + 4);
-
- if (header == "RIFF")
- return AudioFileFormat::Wave;
- else if (header == "FORM")
- return AudioFileFormat::Aiff;
- else
- return AudioFileFormat::Error;
-}
-
-//=============================================================
-template
-int32_t AudioFile::fourBytesToInt (std::vector& source, int startIndex, Endianness endianness)
-{
- int32_t result;
-
- if (endianness == Endianness::LittleEndian)
- result = (source[startIndex + 3] << 24) | (source[startIndex + 2] << 16) | (source[startIndex + 1] << 8) | source[startIndex];
- else
- result = (source[startIndex] << 24) | (source[startIndex + 1] << 16) | (source[startIndex + 2] << 8) | source[startIndex + 3];
-
- return result;
-}
-
-//=============================================================
-template
-int16_t AudioFile::twoBytesToInt (std::vector& source, int startIndex, Endianness endianness)
-{
- int16_t result;
-
- if (endianness == Endianness::LittleEndian)
- result = (source[startIndex + 1] << 8) | source[startIndex];
- else
- result = (source[startIndex] << 8) | source[startIndex + 1];
-
- return result;
-}
-
-//=============================================================
-template
-int AudioFile::getIndexOfString (std::vector& source, std::string stringToSearchFor)
-{
- int index = -1;
- int stringLength = (int)stringToSearchFor.length();
-
- for (int i = 0; i < source.size() - stringLength;i++)
- {
- std::string section (source.begin() + i, source.begin() + i + stringLength);
-
- if (section == stringToSearchFor)
- {
- index = i;
- break;
- }
- }
-
- return index;
-}
-
-//=============================================================
-template
-T AudioFile::sixteenBitIntToSample (int16_t sample)
-{
- return (T)sample / (T)32768.;
-}
-
-//===========================================================
-template class AudioFile;
-template class AudioFile;
diff --git a/plugins/community/repos/cf/src/AudioFile.h b/plugins/community/repos/cf/src/AudioFile.h
deleted file mode 100644
index 9f7508b1..00000000
--- a/plugins/community/repos/cf/src/AudioFile.h
+++ /dev/null
@@ -1,172 +0,0 @@
-//=======================================================================
-/** @file AudioFile.h
- * @author Adam Stark
- * @copyright Copyright (C) 2017 Adam Stark
- *
- * This file is part of the 'AudioFile' library
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-//=======================================================================
-
-#ifndef _AS_AudioFile_h
-#define _AS_AudioFile_h
-
-#include
-#include
-#include
-#include
-
-
-//=============================================================
-/** The different types of audio file, plus some other types to
- * indicate a failure to load a file, or that one hasn't been
- * loaded yet
- */
-enum class AudioFileFormat
-{
- Error,
- NotLoaded,
- Wave,
- Aiff
-};
-
-//=============================================================
-template
-class AudioFile
-{
-public:
-
- //=============================================================
- typedef std::vector > AudioBuffer;
-
- //=============================================================
- /** Constructor */
- AudioFile();
-
- //=============================================================
- /** Loads an audio file from a given file path.
- * @Returns true if the file was successfully loaded
- */
- bool load (std::string filePath);
-
- /** Saves an audio file to a given file path.
- * @Returns true if the file was successfully saved
- */
- bool save (std::string filePath, AudioFileFormat format = AudioFileFormat::Wave);
-
- //=============================================================
- /** @Returns the sample rate */
- uint32_t getSampleRate() const;
-
- /** @Returns the number of audio channels in the buffer */
- int getNumChannels() const;
-
- /** @Returns true if the audio file is mono */
- bool isMono() const;
-
- /** @Returns true if the audio file is stereo */
- bool isStereo() const;
-
- /** @Returns the bit depth of each sample */
- int getBitDepth() const;
-
- /** @Returns the number of samples per channel */
- int getNumSamplesPerChannel() const;
-
- /** @Returns the length in seconds of the audio file based on the number of samples and sample rate */
- double getLengthInSeconds() const;
-
- /** Prints a summary of the audio file to the console */
- void printSummary() const;
-
- //=============================================================
-
- /** Set the audio buffer for this AudioFile by copying samples from another buffer.
- * @Returns true if the buffer was copied successfully.
- */
- bool setAudioBuffer (AudioBuffer& newBuffer);
-
- /** Sets the audio buffer to a given number of channels and number of samples per channel. This will try to preserve
- * the existing audio, adding zeros to any new channels or new samples in a given channel.
- */
- void setAudioBufferSize (int numChannels, int numSamples);
-
- /** Sets the number of samples per channel in the audio buffer. This will try to preserve
- * the existing audio, adding zeros to new samples in a given channel if the number of samples is increased.
- */
- void setNumSamplesPerChannel (int numSamples);
-
- /** Sets the number of channels. New channels will have the correct number of samples and be initialised to zero */
- void setNumChannels (int numChannels);
-
- /** Sets the bit depth for the audio file. If you use the save() function, this bit depth rate will be used */
- void setBitDepth (int numBitsPerSample);
-
- /** Sets the sample rate for the audio file. If you use the save() function, this sample rate will be used */
- void setSampleRate (uint32_t newSampleRate);
-
- //=============================================================
- /** A vector of vectors holding the audio samples for the AudioFile. You can
- * access the samples by channel and then by sample index, i.e:
- *
- * samples[channel][sampleIndex]
- */
- AudioBuffer samples;
-
-private:
-
- //=============================================================
- enum class Endianness
- {
- LittleEndian,
- BigEndian
- };
-
- //=============================================================
- AudioFileFormat determineAudioFileFormat (std::vector& fileData);
- bool decodeWaveFile (std::vector& fileData);
- bool decodeAiffFile (std::vector& fileData);
-
- //=============================================================
- bool saveToWaveFile (std::string filePath);
- bool saveToAiffFile (std::string filePath);
-
- //=============================================================
- void clearAudioBuffer();
-
- //=============================================================
- int32_t fourBytesToInt (std::vector& source, int startIndex, Endianness endianness = Endianness::LittleEndian);
- int16_t twoBytesToInt (std::vector& source, int startIndex, Endianness endianness = Endianness::LittleEndian);
- int getIndexOfString (std::vector& source, std::string s);
- T sixteenBitIntToSample (int16_t sample);
- uint32_t getAiffSampleRate (std::vector& fileData, int sampleRateStartIndex);
- bool tenByteMatch (std::vector& v1, int startIndex1, std::vector& v2, int startIndex2);
- void addSampleRateToAiffData (std::vector& fileData, uint32_t sampleRate);
-
- //=============================================================
- void addStringToFileData (std::vector& fileData, std::string s);
- void addInt32ToFileData (std::vector& fileData, int32_t i, Endianness endianness = Endianness::LittleEndian);
- void addInt16ToFileData (std::vector& fileData, int16_t i, Endianness endianness = Endianness::LittleEndian);
-
- //=============================================================
- bool writeDataToFile (std::vector& fileData, std::string filePath);
-
- //=============================================================
- AudioFileFormat audioFileFormat;
- uint32_t sampleRate;
- int bitDepth;
-};
-
-#endif /* AudioFile_h */
diff --git a/plugins/community/repos/cf/src/BUFFER.cpp b/plugins/community/repos/cf/src/BUFFER.cpp
new file mode 100644
index 00000000..8191205c
--- /dev/null
+++ b/plugins/community/repos/cf/src/BUFFER.cpp
@@ -0,0 +1,230 @@
+
+#include "cf.hpp"
+#include "dsp/digital.hpp"
+
+namespace rack_plugin_cf {
+
+struct BUFFER : Module {
+ enum ParamIds {
+ MODE_PARAM,
+ LENGTH_PARAM,
+ FB_PARAM,
+ NUM_PARAMS
+ };
+ enum InputIds {
+ IN_INPUT,
+ FB_INPUT,
+ LENGTH_INPUT,
+ NUM_INPUTS
+
+ };
+ enum OutputIds {
+ X_OUTPUT,
+ NUM_OUTPUTS
+ };
+ enum LightIds {
+ MODE_LIGHT,
+ NUM_LIGHTS
+ };
+
+
+ float buf[10000] ={};
+ float x = 0;
+ int pos = 0;
+ int length = 0;
+ float l_gain ;
+ int l_affi ;
+
+ bool MODE_STATE = false ;
+ SchmittTrigger modeTrigger;
+
+
+BUFFER() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
+ void step() override;
+
+json_t *toJson() override {
+ json_t *rootJ = json_object();
+
+
+ json_object_set_new(rootJ, "modestate", json_integer(MODE_STATE));
+ return rootJ;
+ }
+
+void fromJson(json_t *rootJ) override {
+
+
+ json_t *modestateJ = json_object_get(rootJ, "modestate");
+ if (modestateJ)
+ MODE_STATE = json_integer_value(modestateJ);
+
+ }
+
+};
+
+
+
+void BUFFER::step() {
+
+ if (modeTrigger.process(params[MODE_PARAM].value))
+ {if (MODE_STATE == 0) MODE_STATE = 1; else MODE_STATE = 0;}
+
+ lights[MODE_LIGHT].value=MODE_STATE;
+
+ if (!inputs[LENGTH_INPUT].active) {
+ length = int(params[LENGTH_PARAM].value*9998.0f)+1;
+ l_affi =0;
+ }
+ else {
+ length = clamp(int(inputs[LENGTH_INPUT].value*999.8f),0,9998)+1;
+ l_gain = clamp(inputs[LENGTH_INPUT].value,0.0f,10.0f);
+ l_affi = 1;
+ }
+
+if (MODE_STATE) length = (int(length/10))+2;
+
+ buf[pos]=(inputs[IN_INPUT].value+inputs[FB_INPUT].value*params[FB_PARAM].value) ; // /(1.0+params[FB_PARAM].value);
+
+ x = float(pos) ;
+ if (pos<9999) pos=pos+1; else pos=0;
+
+if (!MODE_STATE) {
+ if ((pos-length)>0)
+ outputs[X_OUTPUT].value=clamp(buf[pos-length],-10.0f,10.0f);
+ else
+ outputs[X_OUTPUT].value=clamp(buf[9999+pos-length],-10.0f,10.0f);
+ } else {
+ float som = 0.0;
+ for (int i = 1 ; i < length ; i++) {
+ if ((pos-i)>0)
+ som=som+buf[pos-i];
+ else
+ som=som+buf[9999+pos-i];
+ }
+
+ outputs[X_OUTPUT].value = clamp((inputs[FB_INPUT].value*params[FB_PARAM].value - (som / float(length-1))),-10.0f,10.0f);
+ }
+
+
+}
+
+
+
+struct BUFFERDisplay : TransparentWidget {
+
+ float *xxxx;
+ int *llll;
+ float *dbuf[10000] = {};
+
+ BUFFERDisplay() {
+
+
+ }
+
+ void draw(NVGcontext *vg) {
+ nvgStrokeWidth(vg,1.2);
+ nvgStrokeColor(vg, nvgRGBA(0x28, 0xb0, 0xf3, 0xff ));
+ {
+ nvgBeginPath(vg);
+ nvgMoveTo(vg, clamp(*dbuf[int(*xxxx)]*4.0f,-45.0f,45.0f),0.0f);
+ for (int i=1;i<*llll; i++) {if ((*xxxx-i)>0) nvgLineTo(vg, clamp(*dbuf[int(*xxxx)-i]*4.0f,-45.0f,45.0f), -200.0*(i+1)/(*llll));
+ else nvgLineTo(vg, clamp(*dbuf[9999+int(*xxxx)-i]*4.0f,-45.0f,45.0f), -200.0*(i+1)/(*llll));
+ }
+ //nvgClosePath(vg);
+ }
+ nvgLineCap(vg, NVG_ROUND);
+ nvgMiterLimit(vg, 20.0f);
+ nvgGlobalCompositeOperation(vg, NVG_LIGHTER);
+ nvgStroke(vg);
+
+ }
+};
+
+struct MOTORPOTDisplay : TransparentWidget {
+
+ float d;
+ float *gainX ;
+ int *affich;
+
+ MOTORPOTDisplay() {
+
+ }
+
+ void draw(NVGcontext *vg) {
+ if (*affich==1) {
+ float xx = d*sin(-(*gainX*0.17+0.15)*M_PI) ;
+ float yy = d*cos((*gainX*0.17+0.15)*M_PI) ;
+
+
+ nvgBeginPath(vg);
+ nvgCircle(vg, 0,0, d);
+ nvgFillColor(vg, nvgRGBA(0x00, 0x00, 0x00, 0xff));
+ nvgFill(vg);
+
+ nvgStrokeWidth(vg,1.2);
+ nvgStrokeColor(vg, nvgRGBA(0xff, 0xff, 0xff, 0xff));
+ {
+ nvgBeginPath(vg);
+ nvgMoveTo(vg, 0,0);
+ nvgLineTo(vg, xx,yy);
+ nvgClosePath(vg);
+ }
+ nvgStroke(vg);
+ }
+
+ }
+};
+
+struct BUFFERWidget : ModuleWidget {
+ BUFFERWidget(BUFFER *module);
+};
+
+BUFFERWidget::BUFFERWidget(BUFFER *module) : ModuleWidget(module) {
+ setPanel(SVG::load(assetPlugin(plugin, "res/BUFFER.svg")));
+
+ addChild(Widget::create(Vec(15, 0)));
+ addChild(Widget::create(Vec(box.size.x-30, 0)));
+ addChild(Widget::create(Vec(15, 365)));
+ addChild(Widget::create(Vec(box.size.x-30, 365)));
+
+ {
+ BUFFERDisplay *bdisplay = new BUFFERDisplay();
+ bdisplay->box.pos = Vec(60, 270);
+ bdisplay->xxxx = &module->x ;
+ bdisplay->llll = &module->length ;
+ for (int i=0;i<10000;i++) {
+ bdisplay->dbuf[i] = &module->buf[i] ;
+ }
+ addChild(bdisplay);
+ }
+
+
+ addParam(ParamWidget::create(Vec(19, 35), module, BUFFER::MODE_PARAM, 0.0, 1.0, 0.0));
+ addChild(ModuleLightWidget::create>(Vec(23.4, 39.4), module, BUFFER::MODE_LIGHT));
+
+ addInput(Port::create(Vec(15, 321), Port::INPUT, module, BUFFER::IN_INPUT));
+
+ addInput(Port::create(Vec(47, 321), Port::INPUT, module, BUFFER::FB_INPUT));
+ addParam(ParamWidget::create(Vec(50.4, 284), module, BUFFER::FB_PARAM, 0.0f, 1.0f, 0.5f));
+
+ addInput(Port::create(Vec(80, 321), Port::INPUT, module, BUFFER::LENGTH_INPUT));
+ addParam(ParamWidget::create(Vec(83.4, 284), module, BUFFER::LENGTH_PARAM, 0.0f, 1.0f, 0.5f));
+ {
+ MOTORPOTDisplay *pdisplay = new MOTORPOTDisplay();
+ pdisplay->box.pos = Vec(92.8, 293.2);
+ pdisplay->d = 9.3;
+ pdisplay->gainX = &module->l_gain;
+ pdisplay->affich = &module->l_affi;
+ addChild(pdisplay);
+ }
+ addOutput(Port::create(Vec(80, 31), Port::OUTPUT, module, BUFFER::X_OUTPUT));
+
+}
+
+} // namespace rack_plugin_cf
+
+using namespace rack_plugin_cf;
+
+RACK_PLUGIN_MODEL_INIT(cf, BUFFER) {
+ Model *modelBUFFER = Model::create("cf", "BUFFER", "Buffer", DELAY_TAG);
+ return modelBUFFER;
+}
diff --git a/plugins/community/repos/cf/src/CHOKE.cpp b/plugins/community/repos/cf/src/CHOKE.cpp
new file mode 100644
index 00000000..ca3a183e
--- /dev/null
+++ b/plugins/community/repos/cf/src/CHOKE.cpp
@@ -0,0 +1,104 @@
+#include "cf.hpp"
+#include "dsp/digital.hpp"
+
+
+using namespace std;
+
+namespace rack_plugin_cf {
+
+struct CHOKE : Module {
+ enum ParamIds {
+ TR1_PARAM,
+ TR2_PARAM,
+ PAN_PARAM,
+ NUM_PARAMS
+ };
+ enum InputIds {
+ TRIG1_INPUT,
+ TRIG2_INPUT,
+ IN1_INPUT,
+ IN2_INPUT,
+ NUM_INPUTS
+ };
+ enum OutputIds {
+ OUT_OUTPUT,
+ NUM_OUTPUTS
+ };
+ enum LightIds {
+ L2_LIGHT,
+ NUM_LIGHTS
+ };
+
+ bool play = false;
+ SchmittTrigger tr1Trigger;
+ SchmittTrigger tr2Trigger;
+
+CHOKE() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { }
+
+ void step() override;
+
+
+};
+
+
+
+
+void CHOKE::step() {
+
+ if (tr1Trigger.process(inputs[TRIG1_INPUT].value))
+ {
+ play = false ;
+
+ };
+ if (tr2Trigger.process(inputs[TRIG2_INPUT].value))
+ {
+ play = true ;
+
+ };
+ if (play)
+ outputs[OUT_OUTPUT].value = inputs[IN2_INPUT].value*(1-clamp(-params[PAN_PARAM].value,0.0f,1.0f));
+ else outputs[OUT_OUTPUT].value = inputs[IN1_INPUT].value*(1-clamp(params[PAN_PARAM].value,0.0f,1.0f));
+
+
+lights[L2_LIGHT].value=play;
+}
+
+
+
+
+struct CHOKEWidget : ModuleWidget {
+ CHOKEWidget(CHOKE *module);
+ //void step() override;
+
+};
+
+CHOKEWidget::CHOKEWidget(CHOKE *module) : ModuleWidget(module) {
+ setPanel(SVG::load(assetPlugin(plugin, "res/CHOKE.svg")));
+
+
+ addChild(Widget::create(Vec(15, 0)));
+ addChild(Widget::create(Vec(box.size.x-30, 365)));
+
+ addParam(ParamWidget::create(Vec(6, 298), module, CHOKE::PAN_PARAM, -1.0f, 1.0f, 0.0f));
+
+ addInput(Port::create(Vec(3, 61), Port::INPUT, module, CHOKE::IN1_INPUT));
+ addInput(Port::create(Vec(3, 91), Port::INPUT, module, CHOKE::TRIG1_INPUT));
+
+ addInput(Port::create(Vec(3, 181), Port::INPUT, module, CHOKE::IN2_INPUT));
+ addInput(Port::create(Vec(3, 211), Port::INPUT, module, CHOKE::TRIG2_INPUT));
+
+ addChild(ModuleLightWidget::create>(Vec(8, 276), module, CHOKE::L2_LIGHT));
+
+ addOutput(Port::create(Vec(3, 321), Port::OUTPUT, module, CHOKE::OUT_OUTPUT));
+
+}
+
+} // namespace rack_plugin_cf
+
+using namespace rack_plugin_cf;
+
+
+RACK_PLUGIN_MODEL_INIT(cf, CHOKE) {
+ Model *modelCHOKE = Model::create("cf", "CHOKE", "Choke", UTILITY_TAG);
+ return modelCHOKE;
+}
diff --git a/plugins/community/repos/cf/src/CUBE.cpp b/plugins/community/repos/cf/src/CUBE.cpp
index 08cc3d3f..48583d05 100644
--- a/plugins/community/repos/cf/src/CUBE.cpp
+++ b/plugins/community/repos/cf/src/CUBE.cpp
@@ -27,9 +27,9 @@ struct CUBE : Module {
float yy[12] = {-1.0,-1.0, 1.0, 1.0,-1.0,-1.0, 1.0, 1.0};
float zz[12] = {-1.0,-1.0,-1.0,-1.0, 1.0, 1.0, 1.0, 1.0};
- float x[12] = {};
- float y[12] = {};
- float z[12] = {};
+ float x[8] = {};
+ float y[8] = {};
+ float z[8] = {};
float d = 0.0;
float theta= 0.0 ;
@@ -49,7 +49,7 @@ void CUBE::step() {
if (inputs[X_INPUT].active) gainX=inputs[X_INPUT].value;
if (inputs[Y_INPUT].active) gainY=inputs[Y_INPUT].value;
- for(int i=0; i<12; i++)
+ for(int i=0; i<8; i++)
{
d = sqrt(yy[i]*yy[i] + zz[i]*zz[i]);
theta = atan2(yy[i],zz[i])+frameX;
@@ -73,8 +73,8 @@ void CUBE::step() {
struct CUBEDisplay : TransparentWidget {
- float *xxxx[12] = {};
- float *yyyy[12] = {};
+ float *xxxx[8] = {};
+ float *yyyy[8] = {};
CUBEDisplay() {
@@ -155,7 +155,7 @@ CUBEWidget::CUBEWidget(CUBE *module) : ModuleWidget(module) {
{
CUBEDisplay *display = new CUBEDisplay();
display->box.pos = Vec(60, 120);
- for (int i=0;i<12;i++) {
+ for (int i=0;i<8;i++) {
display->xxxx[i] = &module->x[i] ;
display->yyyy[i] = &module->y[i] ;
}
diff --git a/plugins/community/repos/cf/src/DISTO.cpp b/plugins/community/repos/cf/src/DISTO.cpp
new file mode 100644
index 00000000..17e85ff0
--- /dev/null
+++ b/plugins/community/repos/cf/src/DISTO.cpp
@@ -0,0 +1,191 @@
+
+#include "cf.hpp"
+#include "dsp/digital.hpp"
+
+namespace rack_plugin_cf {
+
+struct DISTO : Module {
+ enum ParamIds {
+ FOLD_PARAM,
+ GAIN_PARAM,
+ NUM_PARAMS
+ };
+ enum InputIds {
+ IN_INPUT,
+ GAIN_INPUT,
+ FOLD_INPUT,
+ NUM_INPUTS
+
+ };
+ enum OutputIds {
+ X_OUTPUT,
+ NUM_OUTPUTS
+ };
+
+
+ float x = 0;
+ float y = 0;
+ int length = 0;
+ float fold_gain ;
+ int fold_affi ;
+ float gain_gain ;
+ int gain_affi ;
+
+ DISTO() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {}
+ void step() override;
+
+};
+
+
+
+void DISTO::step() {
+
+ if (inputs[FOLD_INPUT].active) {
+ fold_affi =true; fold_gain = clamp(inputs[FOLD_INPUT].value,-0.001,10.001) ;}
+ else {fold_affi =false; fold_gain = params[FOLD_PARAM].value ;}
+
+ if (inputs[GAIN_INPUT].active) {
+ gain_affi =true; gain_gain = clamp(inputs[GAIN_INPUT].value,-0.001,10.001) ;}
+ else {gain_affi =false; gain_gain = params[GAIN_PARAM].value ;}
+
+//////////DISTO
+ x=inputs[IN_INPUT].value*5.0f*gain_gain;
+
+ if (abs(x)>5) y = clamp((abs(x)-5)/2.2f,0.0f,58.0f); else y=0;
+
+ for (int i =0; i<100; i++) {
+ if (x<-5.0f) x=-5.0f+(-x-5.0f)*fold_gain/5.0;
+ if (x>5.0f) x=5.0f-(x-5.0f)*fold_gain/5.0;
+ if ((x>=-5.0) & (x<=5.0)) i=1000;
+ if (i==99) x=0;
+ }
+
+ outputs[X_OUTPUT].value=clamp(x,-5.0f,5.0f);
+
+}
+
+struct cachecl : SVGScrew {
+ cachecl() {
+ sw->setSVG(SVG::load(assetPlugin(plugin, "res/distocach.svg")));
+ box.size = sw->box.size;
+ }
+};
+
+struct DISTODisplay : TransparentWidget {
+
+ float *xxxx;
+ int *llll;
+ float bu[5] = {};
+ int ind = 0;
+
+ DISTODisplay() {
+
+
+ }
+
+ void draw(NVGcontext *vg) {
+ bu[ind] = *xxxx ;
+ for (int i = 0 ; i<5 ; i++){
+ {//nvgStrokeColor(vg, nvgRGBA(0x28, 0xb0, 0xf3, 0xff));
+ nvgBeginPath(vg);
+ nvgCircle(vg, 0,0, bu[i]);
+ nvgFillColor(vg, nvgRGBA(0x28, 0xb0, 0xf3, 0xff));
+ nvgGlobalCompositeOperation(vg, NVG_LIGHTER);
+ nvgFill(vg);
+ nvgClosePath(vg);
+ }
+ }
+ //nvgStroke(vg);
+ if (ind<4) ind = ind +1; else ind = 0;
+ }
+};
+
+struct MOTORPOTDisplay : TransparentWidget {
+
+ float d;
+ float *gainX ;
+ int *affich;
+
+ MOTORPOTDisplay() {
+
+ }
+
+ void draw(NVGcontext *vg) {
+ if (*affich==1) {
+ float xx = d*sin(-(*gainX*0.17+0.15)*M_PI) ;
+ float yy = d*cos((*gainX*0.17+0.15)*M_PI) ;
+
+
+ nvgBeginPath(vg);
+ nvgCircle(vg, 0,0, d);
+ nvgFillColor(vg, nvgRGBA(0x00, 0x00, 0x00, 0xff));
+ nvgFill(vg);
+
+ nvgStrokeWidth(vg,1.2);
+ nvgStrokeColor(vg, nvgRGBA(0xff, 0xff, 0xff, 0xff));
+ {
+ nvgBeginPath(vg);
+ nvgMoveTo(vg, 0,0);
+ nvgLineTo(vg, xx,yy);
+ nvgClosePath(vg);
+ }
+ nvgStroke(vg);
+ }
+
+ }
+};
+
+struct DISTOWidget : ModuleWidget {
+ DISTOWidget(DISTO *module);
+};
+
+DISTOWidget::DISTOWidget(DISTO *module) : ModuleWidget(module) {
+ setPanel(SVG::load(assetPlugin(plugin, "res/DISTO.svg")));
+
+ addChild(Widget::create(Vec(15, 0)));
+ addChild(Widget::create(Vec(box.size.x-30, 0)));
+ addChild(Widget::create(Vec(15, 365)));
+ addChild(Widget::create(Vec(box.size.x-30, 365)));
+
+ {
+ DISTODisplay *distdisplay = new DISTODisplay();
+ distdisplay->box.pos = Vec(60, 170);
+ distdisplay->xxxx = &module->y ;
+ distdisplay->llll = &module->length ;
+ addChild(distdisplay);
+ }
+
+ addInput(Port::create(Vec(15, 321), Port::INPUT, module, DISTO::IN_INPUT));
+
+ addInput(Port::create(Vec(47, 321), Port::INPUT, module, DISTO::GAIN_INPUT));
+ addParam(ParamWidget::create(Vec(50.4, 284), module, DISTO::GAIN_PARAM, 0.0f, 10.0f, 0.2f));
+ {
+ MOTORPOTDisplay *gaindisplay = new MOTORPOTDisplay();
+ gaindisplay->box.pos = Vec(59.8, 293.2);
+ gaindisplay->d = 9.3;
+ gaindisplay->gainX = &module->gain_gain;
+ gaindisplay->affich = &module->gain_affi;
+ addChild(gaindisplay);
+ }
+ addInput(Port::create(Vec(80, 321), Port::INPUT, module, DISTO::FOLD_INPUT));
+ addParam(ParamWidget::create(Vec(83.4, 284), module, DISTO::FOLD_PARAM, 0.0f, 10.0f, 0.0f));
+ {
+ MOTORPOTDisplay *folddisplay = new MOTORPOTDisplay();
+ folddisplay->box.pos = Vec(92.8, 293.2);
+ folddisplay->d = 9.3;
+ folddisplay->gainX = &module->fold_gain;
+ folddisplay->affich = &module->fold_affi;
+ addChild(folddisplay);
+ }
+ addOutput(Port::create(Vec(80, 31), Port::OUTPUT, module, DISTO::X_OUTPUT));
+ addChild(Widget::create(Vec(0, 0)));
+}
+
+} // namespace rack_plugin_cf
+
+using namespace rack_plugin_cf;
+
+RACK_PLUGIN_MODEL_INIT(cf, DISTO) {
+ Model *modelDISTO = Model::create("cf", "DISTO", "Disto", DISTORTION_TAG);
+ return modelDISTO;
+}
diff --git a/plugins/community/repos/cf/src/EACH.cpp b/plugins/community/repos/cf/src/EACH.cpp
index 2f0d40c7..e9b5b91b 100644
--- a/plugins/community/repos/cf/src/EACH.cpp
+++ b/plugins/community/repos/cf/src/EACH.cpp
@@ -50,8 +50,8 @@ void EACH::step() {
max_EACH = floor(params[DIV_PARAM].value);
or_affi=0;
} else {
- max_EACH = round(clamp((inputs[DIV_INPUT].value * 1.2)+1,1.0f,12.0f));
- or_gain = round(clamp(inputs[DIV_INPUT].value,0.0f,10.0f));
+ max_EACH = round(clamp((inputs[DIV_INPUT].value * 4.8)+1,1.0f,48.0f));
+ or_gain = (clamp(inputs[DIV_INPUT].value,0.0f,10.0f));
or_affi=1;
}
@@ -66,7 +66,7 @@ void EACH::step() {
if (inputs[DOUZE_INPUT].active) {
if (stepa == max_EACH) {
- note = 5;
+ note = 50;
stepa = 0;
lum = 2000;
}
@@ -180,7 +180,7 @@ EACHWidget::EACHWidget(EACH *module) : ModuleWidget(module) {
addOutput(Port::create(Vec(54, 321), Port::OUTPUT, module, EACH::DOUZE_OUTPUT));
addOutput(Port::create(Vec(35, 235), Port::OUTPUT, module, EACH::BEAT_OUTPUT));
- addParam(ParamWidget::create(Vec(27, 107), module, EACH::DIV_PARAM, 1.0f, 12.1f, 3.1f));
+ addParam(ParamWidget::create(Vec(27, 107), module, EACH::DIV_PARAM, 1.0f, 48.1f, 3.1f));
addInput(Port::create(Vec(11, 141), Port::INPUT, module, EACH::DIV_INPUT));
{
MOTORPOTDisplay *display = new MOTORPOTDisplay();
diff --git a/plugins/community/repos/cf/src/L3DS3Q.cpp b/plugins/community/repos/cf/src/L3DS3Q.cpp
index f2120e90..a8b85322 100644
--- a/plugins/community/repos/cf/src/L3DS3Q.cpp
+++ b/plugins/community/repos/cf/src/L3DS3Q.cpp
@@ -25,7 +25,6 @@ struct L3DS3Q : Module {
};
-int wait = 0;
int pas = 0;
bool ledState[80] = {};
int tempState[5] = {};
@@ -33,7 +32,7 @@ bool editState = false ;
SchmittTrigger rstTrigger;
SchmittTrigger upTrigger;
SchmittTrigger editTrigger;
-
+SchmittTrigger ledTrigger[80] ={};
L3DS3Q() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
void step() override;
@@ -91,7 +90,7 @@ void L3DS3Q::step() {
if (upTrigger.process(inputs[UP_INPUT].value))
{
for (int i = 0; i < 5; i++) {
- if (ledState[(i+pas*5)%80]) tempState [i] = 20;
+ if (ledState[(i+pas*5)%80]) tempState [i] = 50;
}
if (pas <15) pas = pas+1; else pas =0;
}
@@ -105,30 +104,22 @@ void L3DS3Q::step() {
{
for (int i = 0; i < 80; i++) {lights[LED_LIGHT +i].value=ledState[(i+pas*5)%80];}
- if (wait == 0) {
for (int i = 0; i < 80; i++) {
- if (params[ON_PARAM +i].value) {ledState[(i+pas*5)%80]=!ledState[(i+pas*5)%80]; wait = 20000;}
- }} else wait = wait-1;
+ if (ledTrigger[i].process(params[ON_PARAM +i].value)) {ledState[(i+pas*5)%80]=!ledState[(i+pas*5)%80];}
+ };
} else {
for (int i = 0; i < 80; i++) {lights[LED_LIGHT +i].value=ledState[i];}
- if (wait == 0) {
+
for (int i = 0; i < 80; i++) {
- if (params[ON_PARAM +i].value) {ledState[i]=!ledState[i]; wait = 20000;}
- }} else wait = wait-1;
+ if (ledTrigger[i].process(params[ON_PARAM +i].value)) {ledState[i]=!ledState[i];}
+ };
}
for (int i = 0; i < 5; i++) {
if (tempState [i]>0) {tempState [i] = tempState [i]-1;outputs[TR_OUTPUT+i].value=10.0f;} else outputs[TR_OUTPUT+i].value=0.0f;
}
- //if (wait == 0) {
- // for (int i = 0; i < 80; i++) {
-
- // if (params[ON_PARAM +i].value) {ledState[i]=!ledState[i]; wait = 20000;}
- // lights[LED_LIGHT +i].value=ledState[i];
- //}} else wait = wait-1;
-
}
diff --git a/plugins/community/repos/cf/src/LEDS.cpp b/plugins/community/repos/cf/src/LEDS.cpp
index 82caf5cf..3fa4835a 100644
--- a/plugins/community/repos/cf/src/LEDS.cpp
+++ b/plugins/community/repos/cf/src/LEDS.cpp
@@ -27,6 +27,7 @@ bool ledState[100] = {};
bool tempState[5] = {};
SchmittTrigger rndTrigger;
SchmittTrigger upTrigger;
+SchmittTrigger ledTrigger[100];
LEDS() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
@@ -94,12 +95,12 @@ void LEDS::step() {
{ledState[i+95] = tempState[i];}
}
- if (wait == 0) {
+
for (int i = 0; i < 100; i++) {
- if (params[ON_PARAM +i].value) {ledState[i]=!ledState[i]; wait = 20000;}
+ if (ledTrigger[i].process(params[ON_PARAM +i].value)) {ledState[i]=!ledState[i];}
lights[LED_LIGHT +i].value=ledState[i];
- }} else wait = wait-1;
+ }
}
diff --git a/plugins/community/repos/cf/src/LEDSEQ.cpp b/plugins/community/repos/cf/src/LEDSEQ.cpp
index 01d3a54f..8887f449 100644
--- a/plugins/community/repos/cf/src/LEDSEQ.cpp
+++ b/plugins/community/repos/cf/src/LEDSEQ.cpp
@@ -25,7 +25,7 @@ struct LEDSEQ : Module {
};
-int wait = 0;
+
int pas = 0;
bool ledState[80] = {};
int tempState[5] = {};
@@ -33,6 +33,7 @@ bool editState = false ;
SchmittTrigger rstTrigger;
SchmittTrigger upTrigger;
SchmittTrigger editTrigger;
+SchmittTrigger ledTrigger[80] ={};
LEDSEQ() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
@@ -91,7 +92,7 @@ void LEDSEQ::step() {
if (upTrigger.process(inputs[UP_INPUT].value))
{
for (int i = 0; i < 5; i++) {
- if (ledState[(i+pas*5)%80]) tempState [i] = 20;
+ if (ledState[(i+pas*5)%80]) tempState [i] = 50;
}
if (pas <15) pas = pas+1; else pas =0;
}
@@ -105,17 +106,17 @@ void LEDSEQ::step() {
{
for (int i = 0; i < 80; i++) {lights[LED_LIGHT +i].value=ledState[(i+pas*5)%80];}
- if (wait == 0) {
+
for (int i = 0; i < 80; i++) {
- if (params[ON_PARAM +i].value) {ledState[(i+pas*5)%80]=!ledState[(i+pas*5)%80]; wait = 20000;}
- }} else wait = wait-1;
+ if (ledTrigger[i].process(params[ON_PARAM +i].value)) {ledState[(i+pas*5)%80]=!ledState[(i+pas*5)%80];}
+ };
} else {
for (int i = 0; i < 80; i++) {lights[LED_LIGHT +i].value=ledState[i];}
- if (wait == 0) {
+
for (int i = 0; i < 80; i++) {
- if (params[ON_PARAM +i].value) {ledState[i]=!ledState[i]; wait = 20000;}
- }} else wait = wait-1;
+ if (ledTrigger[i].process(params[ON_PARAM +i].value)) {ledState[i]=!ledState[i];}
+ };
}
for (int i = 0; i < 5; i++) {
diff --git a/plugins/community/repos/cf/src/MASTER.cpp b/plugins/community/repos/cf/src/MASTER.cpp
index ac0e02ec..cc6e4c8f 100644
--- a/plugins/community/repos/cf/src/MASTER.cpp
+++ b/plugins/community/repos/cf/src/MASTER.cpp
@@ -131,8 +131,8 @@ MASTERWidget::MASTERWidget(MASTER *module) : ModuleWidget(module) {
addOutput(Port::create(Vec(54, 61), Port::OUTPUT, module, MASTER::LEFT_OUTPUT));
addOutput(Port::create(Vec(54, 91), Port::OUTPUT, module, MASTER::RIGHT_OUTPUT));
- addOutput(Port::create(Vec(11, 321), Port::OUTPUT, module, MASTER::LEFT_MAIN_OUTPUT));
- addOutput(Port::create(Vec(54, 321), Port::OUTPUT, module, MASTER::RIGHT_MAIN_OUTPUT));
+ addOutput(Port::create(Vec(54, 308), Port::OUTPUT, module, MASTER::LEFT_MAIN_OUTPUT));
+ addOutput(Port::create(Vec(54, 334), Port::OUTPUT, module, MASTER::RIGHT_MAIN_OUTPUT));
addInput(Port::create(Vec(11, 61), Port::INPUT, module, MASTER::LEFT_INPUT));
addInput(Port::create(Vec(11, 91), Port::INPUT, module, MASTER::RIGHT_INPUT));
diff --git a/plugins/community/repos/cf/src/MONO.cpp b/plugins/community/repos/cf/src/MONO.cpp
index 6e70d609..62047ae4 100644
--- a/plugins/community/repos/cf/src/MONO.cpp
+++ b/plugins/community/repos/cf/src/MONO.cpp
@@ -6,8 +6,8 @@ namespace rack_plugin_cf {
struct MONO : Module {
enum ParamIds {
PAN_PARAM,
- GAIN_PARAM,
- SOLO_PARAM,
+ GAIN_PARAM,
+ SOLO_PARAM,
ON_PARAM,
NUM_PARAMS
};
@@ -30,7 +30,7 @@ struct MONO : Module {
OUT1_OUTPUT,
NUM_OUTPUTS
};
- enum LightIds {
+ enum LightIds {
SOLO_LIGHT,
ON_LIGHT,
LEVEL_LIGHTS,
@@ -180,6 +180,7 @@ struct MOTORPOTDisplay : TransparentWidget {
}
};
+
struct MONOWidget : ModuleWidget {
MONOWidget(MONO *module);
};
diff --git a/plugins/community/repos/cf/src/PEAK.cpp b/plugins/community/repos/cf/src/PEAK.cpp
index e6750883..90cdcf64 100644
--- a/plugins/community/repos/cf/src/PEAK.cpp
+++ b/plugins/community/repos/cf/src/PEAK.cpp
@@ -15,10 +15,12 @@ struct PEAK : Module {
enum InputIds {
LIN1_INPUT,
IN1_INPUT,
+ IN2_INPUT,
NUM_INPUTS
};
enum OutputIds {
OUT1_OUTPUT,
+ OUT2_OUTPUT,
NUM_OUTPUTS
};
enum LightIds {
@@ -72,6 +74,37 @@ void PEAK::step() {
lights[OVER_LIGHT].value = 0.0;
}
+
+
+ if (inputs[IN2_INPUT].active)
+ {
+
+ if (inputs[IN2_INPUT].value > params[TRESHOLD_PARAM].value)
+ {
+ outputs[OUT2_OUTPUT].value = (max_GAIN/10.0*(params[TRESHOLD_PARAM].value + ((inputs[IN2_INPUT].value-params[TRESHOLD_PARAM].value)/(1+(inputs[IN2_INPUT].value-params[TRESHOLD_PARAM].value)))));
+ reman_t = sensiv;
+ }
+ else if (inputs[IN2_INPUT].value < 0-params[TRESHOLD_PARAM].value)
+ {
+ outputs[OUT2_OUTPUT].value = (max_GAIN/10.0*(0-(params[TRESHOLD_PARAM].value - ((inputs[IN2_INPUT].value+params[TRESHOLD_PARAM].value)/(1+(-inputs[IN2_INPUT].value-params[TRESHOLD_PARAM].value))))));
+ reman_t = sensiv;
+ }
+ else
+ {
+ outputs[OUT2_OUTPUT].value =(max_GAIN*inputs[IN2_INPUT].value)/10.0;
+ }
+
+ if (outputs[OUT2_OUTPUT].value >10) reman_o=sensiv;
+
+ }
+ else
+ {
+ outputs[OUT2_OUTPUT].value = max_GAIN/10;
+ lights[TRESHOLD_LIGHT].value = 0.0;
+ lights[OVER_LIGHT].value = 0.0;
+ }
+
+
if (reman_t >0)
{
reman_t--;
@@ -158,9 +191,13 @@ PEAKWidget::PEAKWidget(PEAK *module) : ModuleWidget(module) {
addParam(ParamWidget::create(Vec(27, 227), module, PEAK::TRESHOLD_PARAM, 0.0f, 10.0f, 10.0f));
addChild(ModuleLightWidget::create>(Vec(42.4, 211.4), module, PEAK::TRESHOLD_LIGHT));
- addInput(Port::create(Vec(11, 321), Port::INPUT, module, PEAK::IN1_INPUT));
+ addInput(Port::create(Vec(11, 308), Port::INPUT, module, PEAK::IN1_INPUT));
+
+ addOutput(Port::create(Vec(54, 308), Port::OUTPUT, module, PEAK::OUT1_OUTPUT));
+
+ addInput(Port::create(Vec(11, 334), Port::INPUT, module, PEAK::IN2_INPUT));
- addOutput(Port::create(Vec(54, 321), Port::OUTPUT, module, PEAK::OUT1_OUTPUT));
+ addOutput(Port::create(Vec(54, 334), Port::OUTPUT, module, PEAK::OUT2_OUTPUT));
NumbDisplayWidget *display = new NumbDisplayWidget();
display->box.pos = Vec(20,56);
diff --git a/plugins/community/repos/cf/src/PLAY.cpp b/plugins/community/repos/cf/src/PLAY.cpp
new file mode 100644
index 00000000..63f536bf
--- /dev/null
+++ b/plugins/community/repos/cf/src/PLAY.cpp
@@ -0,0 +1,321 @@
+#include "cf.hpp"
+#include "dsp/digital.hpp"
+#include "osdialog.h"
+namespace rack_plugin_cf {
+// (note) also used in Bidoo module(s)
+#include "dr_wav.h"
+}
+#include
+#include "cmath"
+#ifdef _MSC_VER
+#include "dirent_win32/dirent.h"
+#else
+#include
+#endif
+#include //----added by Joakim Lindbom
+
+
+using namespace std;
+
+namespace rack_plugin_cf {
+
+struct PLAY : Module {
+ enum ParamIds {
+ PREV_PARAM,
+ NEXT_PARAM,
+ LSPEED_PARAM,
+ LOAD_PARAM,
+ PLAY_PARAM,
+ NUM_PARAMS
+ };
+ enum InputIds {
+ TRIG_INPUT,
+ NUM_INPUTS
+ };
+ enum OutputIds {
+ OUT_OUTPUT,
+ NUM_OUTPUTS
+ };
+ enum LightIds {
+ NUM_LIGHTS
+ };
+
+
+ unsigned int channels;
+ unsigned int sampleRate;
+ drwav_uint64 totalSampleCount;
+
+ vector> playBuffer;
+ bool loading = false;
+
+ bool run = false;
+
+ string lastPath = "";
+ float samplePos = 0;
+ string fileDesc;
+ bool fileLoaded = false;
+ bool reload = false ;
+ int sampnumber = 0;
+ vector fichier;
+ SchmittTrigger loadsampleTrigger;
+ SchmittTrigger playTrigger;
+ SchmittTrigger nextTrigger;
+ SchmittTrigger prevTrigger;
+
+PLAY() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
+ playBuffer.resize(1);
+ playBuffer[0].resize(0); }
+
+ void step() override;
+
+ void loadSample(std::string path);
+
+ // persistence
+
+ json_t *toJson() override {
+ json_t *rootJ = json_object();
+ // lastPath
+ json_object_set_new(rootJ, "lastPath", json_string(lastPath.c_str()));
+ return rootJ;
+ }
+
+ void fromJson(json_t *rootJ) override {
+ // lastPath
+ json_t *lastPathJ = json_object_get(rootJ, "lastPath");
+ if (lastPathJ) {
+ lastPath = json_string_value(lastPathJ);
+ reload = true ;
+ loadSample(lastPath);
+
+ }}
+
+};
+
+void PLAY::loadSample(std::string path) {
+
+ loading = true;
+ unsigned int c;
+ unsigned int sr;
+ drwav_uint64 sc;
+ float* pSampleData;
+ pSampleData = drwav_open_and_read_file_f32(path.c_str(), &c, &sr, &sc);
+
+ if (pSampleData != NULL) {
+ channels = c;
+ sampleRate = sr;
+ playBuffer[0].clear();
+ for (unsigned int i=0; i < sc; i = i + c) {
+ playBuffer[0].push_back(pSampleData[i]);
+
+ }
+ totalSampleCount = playBuffer[0].size();
+ drwav_free(pSampleData);
+loading = false;
+
+ fileLoaded = true;
+
+ fileDesc = stringFilename(path);
+
+ if (reload) {
+ DIR* rep = NULL;
+ struct dirent* dirp = NULL;
+ std::string dir = path.empty() ? assetLocal("") : stringDirectory(path);
+
+ rep = opendir(dir.c_str());
+ int i = 0;
+ fichier.clear();
+ while ((dirp = readdir(rep)) != NULL) {
+ std::string name = dirp->d_name;
+
+ std::size_t found = name.find(".wav",name.length()-5);
+ if (found==std::string::npos) found = name.find(".WAV",name.length()-5);
+
+ if (found!=std::string::npos) {
+ fichier.push_back(name);
+ if ((dir + "/" + name)==path) {sampnumber = i;}
+ i=i+1;
+ }
+
+ }
+
+//----added by Joakim Lindbom
+ sort(fichier.begin(), fichier.end()); // Linux needs this to get files in right order
+ for (int o=0;o 0) sampnumber=sampnumber-1; else sampnumber =int(fichier.size()-1);
+ loadSample(dir + "/" + fichier[sampnumber]);
+ }
+ } else fileDesc = "R.Click to load";
+
+
+
+////////////////////////////////////////////////////////////////// Play
+ if (inputs[TRIG_INPUT].active) {
+ if (playTrigger.process(inputs[TRIG_INPUT].value))
+ {
+ run = true;
+ samplePos = 0;
+ }
+ }
+
+ if ((!loading) && (run) && ((abs(floor(samplePos)) < totalSampleCount)))
+ { if (samplePos>=0)
+ outputs[OUT_OUTPUT].value = 5 * playBuffer[0][floor(samplePos)];
+ else outputs[OUT_OUTPUT].value = 5 * playBuffer[0][floor(totalSampleCount-1+samplePos)];
+ samplePos = samplePos+1+(params[LSPEED_PARAM].value) /3;
+ }
+ else
+ {
+ run = false;
+ outputs[OUT_OUTPUT].value = 0;
+ }
+
+}
+
+struct upButton : SVGSwitch, MomentarySwitch {
+ upButton() {
+ addFrame(SVG::load(assetPlugin(plugin, "res/upButton.svg")));
+ addFrame(SVG::load(assetPlugin(plugin, "res/upButtonDown.svg")));
+ sw->wrap();
+ box.size = sw->box.size;
+ }
+};
+struct downButton : SVGSwitch, MomentarySwitch {
+ downButton() {
+ addFrame(SVG::load(assetPlugin(plugin, "res/downButton.svg")));
+ addFrame(SVG::load(assetPlugin(plugin, "res/downButtonDown.svg")));
+ sw->wrap();
+ box.size = sw->box.size;
+ }
+};
+
+struct PLAYDisplay : TransparentWidget {
+ PLAY *module;
+
+ int frame = 0;
+ shared_ptr font;
+
+ PLAYDisplay() {
+ font = Font::load(assetPlugin(plugin, "res/LEDCalculator.ttf"));
+ }
+
+ void draw(NVGcontext *vg) override {
+ std::string to_display = "";
+ for (int i=0; i<14; i++) to_display = to_display + module->fileDesc[i];
+ nvgFontSize(vg, 24);
+ nvgFontFaceId(vg, font->handle);
+ nvgTextLetterSpacing(vg, 0);
+ nvgFillColor(vg, nvgRGBA(0x4c, 0xc7, 0xf3, 0xff));
+ nvgRotate(vg, -M_PI / 2.0f);
+ nvgTextBox(vg, 5, 5,350, to_display.c_str(), NULL);
+ }
+};
+
+
+struct PLAYWidget : ModuleWidget {
+ PLAYWidget(PLAY *module);
+//void step() override;
+Menu *createContextMenu() override;
+};
+
+PLAYWidget::PLAYWidget(PLAY *module) : ModuleWidget(module) {
+ setPanel(SVG::load(assetPlugin(plugin, "res/PLAY.svg")));
+
+
+ {
+ PLAYDisplay *gdisplay = new PLAYDisplay();
+ gdisplay->module = module;
+ gdisplay->box.pos = Vec(18, 253);
+ gdisplay->box.size = Vec(130, 250);
+ addChild(gdisplay);
+ }
+
+ addChild(Widget::create(Vec(15, 0)));
+ addChild(Widget::create(Vec(box.size.x-30, 365)));
+
+ addParam(ParamWidget::create(Vec(6, 298), module, PLAY::LSPEED_PARAM, -5.0f, 5.0f, 0.0f));
+ addInput(Port::create(Vec(3, 31), Port::INPUT, module, PLAY::TRIG_INPUT));
+ addOutput(Port::create(Vec(3, 321), Port::OUTPUT, module, PLAY::OUT_OUTPUT));
+
+ addParam(ParamWidget::create(Vec(6, 276), module, PLAY::PREV_PARAM, 0.0f, 1.0f, 0.0f));
+ addParam(ParamWidget::create(Vec(6, 256), module, PLAY::NEXT_PARAM, 0.0f, 1.0f, 0.0f));
+}
+
+struct PLAYItem : MenuItem {
+ PLAY *play;
+ void onAction(EventAction &e) override {
+
+ std::string dir = play->lastPath.empty() ? assetLocal("") : stringDirectory(play->lastPath);
+ char *path = osdialog_file(OSDIALOG_OPEN, dir.c_str(), NULL, NULL);
+ if (path) {
+ play->run = false;
+ play->reload = true;
+ play->loadSample(path);
+
+ play->samplePos = 0;
+ play->lastPath = path;
+ free(path);
+ }
+
+ }
+
+};
+
+Menu *PLAYWidget::createContextMenu() {
+ Menu *menu = ModuleWidget::createContextMenu();
+
+ MenuLabel *spacerLabel = new MenuLabel();
+ menu->addChild(spacerLabel);
+
+ PLAY *play = dynamic_cast(module);
+ assert(play);
+
+ PLAYItem *sampleItem = new PLAYItem();
+ sampleItem->text = "Load sample";
+ sampleItem->play = play ;
+ menu->addChild(sampleItem);
+
+ return menu;
+}
+
+} // namespace rack_plugin_cf
+
+using namespace rack_plugin_cf;
+
+RACK_PLUGIN_MODEL_INIT(cf, PLAY) {
+ Model *modelPLAY = Model::create("cf", "PLAY", "Play", SAMPLER_TAG);
+ return modelPLAY;
+}
+
diff --git a/plugins/community/repos/cf/src/PLAYER.cpp b/plugins/community/repos/cf/src/PLAYER.cpp
index 10b8ef40..db0152c9 100644
--- a/plugins/community/repos/cf/src/PLAYER.cpp
+++ b/plugins/community/repos/cf/src/PLAYER.cpp
@@ -1,7 +1,11 @@
#include "cf.hpp"
#include "dsp/digital.hpp"
#include "osdialog.h"
-#include "AudioFile.h"
+namespace rack_plugin_cf {
+// (note) also used in Bidoo module(s)
+#define DR_WAV_IMPLEMENTATION
+#include "dr_wav.h"
+}
#include
#include "cmath"
#ifdef _MSC_VER
@@ -37,6 +41,7 @@ struct PLAYER : Module {
PREV_INPUT,
NEXT_INPUT,
TRIG_INPUT,
+ VO_INPUT,
NUM_INPUTS
};
enum OutputIds {
@@ -49,12 +54,22 @@ struct PLAYER : Module {
NUM_LIGHTS
};
+ unsigned int channels;
+ unsigned int sampleRate;
+ drwav_uint64 totalSampleCount;
+
+ vector> playBuffer;
+ bool loading = false;
+
bool play = false;
+
string lastPath = "";
- AudioFile audioFile;
+
+
float samplePos = 0;
float startPos = 0;
vector displayBuff;
+
string fileDesc;
bool fileLoaded = false;
@@ -65,6 +80,7 @@ struct PLAYER : Module {
SchmittTrigger nextinTrigger;
SchmittTrigger previnTrigger;
SchmittTrigger oscTrigger;
+
vector fichier;
int sampnumber = 0;
@@ -73,7 +89,10 @@ struct PLAYER : Module {
bool oscState = false ;
- PLAYER() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { }
+ PLAYER() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
+ playBuffer.resize(2);
+ playBuffer[0].resize(0);
+ playBuffer[1].resize(0); }
void step() override;
@@ -98,29 +117,47 @@ json_object_set_new(rootJ, "oscstate", json_integer(oscState));
loadSample(lastPath);
}
- json_t *oscstateJ = json_object_get(rootJ, "oscstate");
- if (oscstateJ) {
+ json_t *oscstateJ = json_object_get(rootJ, "oscstate");
+ if (oscstateJ)
oscState = json_integer_value(oscstateJ);
- }
lights[OSC_LIGHT].value=oscState;
+
}
};
void PLAYER::loadSample(std::string path) {
- if (audioFile.load (path.c_str())) {
+
+ loading = true;
+ unsigned int c;
+ unsigned int sr;
+ drwav_uint64 sc;
+ float* pSampleData;
+ pSampleData = drwav_open_and_read_file_f32(path.c_str(), &c, &sr, &sc);
+
+ if (pSampleData != NULL) {
+ channels = c;
+ sampleRate = sr;
+ playBuffer[0].clear();
+ playBuffer[1].clear();
+ for (unsigned int i=0; i < sc; i = i + c) {
+ playBuffer[0].push_back(pSampleData[i]);
+ if (channels == 2)
+ playBuffer[1].push_back((float)pSampleData[i+1]);
+
+ }
+ totalSampleCount = playBuffer[0].size();
+ drwav_free(pSampleData);
+loading = false;
+
+
fileLoaded = true;
vector().swap(displayBuff);
- for (int i=0; i < audioFile.getNumSamplesPerChannel(); i = i + floor(audioFile.getNumSamplesPerChannel()/130)) {
- displayBuff.push_back(audioFile.samples[0][i]);
+ for (int i=0; i < floor(totalSampleCount); i = i + floor(totalSampleCount/130)) {
+ displayBuff.push_back(playBuffer[0][i]);
}
fileDesc = stringFilename(path)+ "\n";
- fileDesc += std::to_string(audioFile.getSampleRate())+ " Hz" + " - "; //"\n";
- fileDesc += std::to_string(audioFile.getBitDepth())+ " bits" + " \n";
- // fileDesc += std::to_string(audioFile.getNumSamplesPerChannel())+ " smp" +"\n";
- // fileDesc += std::to_string(audioFile.getLengthInSeconds())+ " s." + "\n";
- fileDesc += std::to_string(audioFile.getNumChannels())+ " channel(s)" + "\n";
- // fileDesc += std::to_string(audioFile.isMono())+ "\n";
- // fileDesc += std::to_string(audioFile.isStereo())+ "\n";
+ fileDesc += std::to_string(sampleRate)+ " Hz" + "\n";
+ fileDesc += std::to_string(channels)+ " channel(s)" + "\n";
if (reload) {
DIR* rep = NULL;
@@ -135,26 +172,22 @@ void PLAYER::loadSample(std::string path) {
std::size_t found = name.find(".wav",name.length()-5);
if (found==std::string::npos) found = name.find(".WAV",name.length()-5);
- if (found==std::string::npos) found = name.find(".aif",name.length()-5);
- if (found==std::string::npos) found = name.find(".AIF",name.length()-5);
- if (found==std::string::npos) found = name.find(".aiff",name.length()-5);
- if (found==std::string::npos) found = name.find(".AIFF",name.length()-5);
if (found!=std::string::npos) {
fichier.push_back(name);
if ((dir + "/" + name)==path) {sampnumber = i;}
i=i+1;
- }
+ }
- }
+ }
//----added by Joakim Lindbom
- sort(fichier.begin(), fichier.end()); // Linux needs this to get files in right order
- for (int o=0;o 0) sampnumber=sampnumber-1; else sampnumber =int(fichier.size()-1);
loadSample(dir + "/" + fichier[sampnumber]);
}
- } else fileDesc = "right click to load \n .wav or .aif sample \n :)";
+ } else fileDesc = "right click to load \n .wav sample \n :)";
if (oscTrigger.process(params[OSC_PARAM].value))
{oscState =!oscState;lights[OSC_LIGHT].value=oscState;}
@@ -195,8 +228,8 @@ if (!oscState) {
bool gated = inputs[GATE_INPUT].value > 0;
if (inputs[POS_INPUT].active)
- startPos = clamp((params[LSTART_PARAM].value + inputs[POS_INPUT].value * params[TSTART_PARAM].value),0.0f,10.0f)*audioFile.getNumSamplesPerChannel()/10;
- else {startPos = clamp((params[LSTART_PARAM].value),0.0f,10.0f)*audioFile.getNumSamplesPerChannel()/10;
+ startPos = clamp((params[LSTART_PARAM].value + inputs[POS_INPUT].value * params[TSTART_PARAM].value),0.0f,10.0f)*totalSampleCount/10;
+ else {startPos = clamp((params[LSTART_PARAM].value),0.0f,10.0f)*totalSampleCount/10;
inputs[POS_INPUT].value = 0 ;
}
@@ -212,18 +245,18 @@ if (!oscState) {
}
}
- if ((play) && ((floor(samplePos) < audioFile.getNumSamplesPerChannel()) && (floor(samplePos) >= 0))) {
- if (audioFile.getNumChannels() == 1) {
- outputs[OUT_OUTPUT].value = 5 * audioFile.samples[0][floor(samplePos)];
- outputs[OUT2_OUTPUT].value = 5 * audioFile.samples[0][floor(samplePos)];}
- else if (audioFile.getNumChannels() ==2) {
- outputs[OUT_OUTPUT].value = 5 * audioFile.samples[0][floor(samplePos)];
- outputs[OUT2_OUTPUT].value = 5 * audioFile.samples[1][floor(samplePos)];
+ if ((!loading) && (play) && ((floor(samplePos) < totalSampleCount) && (floor(samplePos) >= 0))) {
+ if (channels == 1) {
+ outputs[OUT_OUTPUT].value = 5 * playBuffer[0][floor(samplePos)];
+ outputs[OUT2_OUTPUT].value = 5 * playBuffer[0][floor(samplePos)];}
+ else if (channels ==2) {
+ outputs[OUT_OUTPUT].value = 5 * playBuffer[0][floor(samplePos)];
+ outputs[OUT2_OUTPUT].value = 5 * playBuffer[1][floor(samplePos)];
}
if (inputs[SPD_INPUT].active)
- samplePos = samplePos+1+(params[LSPEED_PARAM].value +inputs[SPD_INPUT].value * params[TSPEED_PARAM].value) /3;
+ samplePos = samplePos+powf(2.0, inputs[VO_INPUT].value)+(params[LSPEED_PARAM].value +inputs[SPD_INPUT].value * params[TSPEED_PARAM].value) /3;
else {
- samplePos = samplePos+1+(params[LSPEED_PARAM].value) /3;
+ samplePos = samplePos+powf(2.0, inputs[VO_INPUT].value)+(params[LSPEED_PARAM].value) /3;
inputs[SPD_INPUT].value = 0 ;}
}
else
@@ -234,20 +267,20 @@ if (!oscState) {
if (!inputs[TRIG_INPUT].active) {if (gated == false) {play = false; outputs[OUT_OUTPUT].value = 0;outputs[OUT2_OUTPUT].value = 0;}}
} else {
- if (((floor(samplePos) < audioFile.getNumSamplesPerChannel()) && (floor(samplePos) >= 0))) {
+ if (((floor(samplePos) < totalSampleCount) && (floor(samplePos) >= 0))) {
if (playTrigger.process(inputs[TRIG_INPUT].value)) samplePos = 0;
- if (audioFile.getNumChannels() == 1) {
- outputs[OUT_OUTPUT].value = 5 * audioFile.samples[0][floor(samplePos)];
- outputs[OUT2_OUTPUT].value = 5 * audioFile.samples[0][floor(samplePos)];}
- else if (audioFile.getNumChannels() ==2) {
- outputs[OUT_OUTPUT].value = 5 * audioFile.samples[0][floor(samplePos)];
- outputs[OUT2_OUTPUT].value = 5 * audioFile.samples[1][floor(samplePos)];
+ if (channels == 1) {
+ outputs[OUT_OUTPUT].value = 5 * playBuffer[0][floor(samplePos)];
+ outputs[OUT2_OUTPUT].value = 5 * playBuffer[0][floor(samplePos)];}
+ else if (channels ==2) {
+ outputs[OUT_OUTPUT].value = 5 * playBuffer[0][floor(samplePos)];
+ outputs[OUT2_OUTPUT].value = 5 * playBuffer[1][floor(samplePos)];
}
if (inputs[SPD_INPUT].active)
- samplePos = samplePos+1+(params[LSPEED_PARAM].value +inputs[SPD_INPUT].value * params[TSPEED_PARAM].value) /3;
+ samplePos = samplePos+powf(2.0, inputs[VO_INPUT].value)+(params[LSPEED_PARAM].value +inputs[SPD_INPUT].value * params[TSPEED_PARAM].value) /3;
else {
- samplePos = samplePos+1+(params[LSPEED_PARAM].value) /3;
+ samplePos = samplePos+powf(2.0, inputs[VO_INPUT].value)+(params[LSPEED_PARAM].value) /3;
inputs[SPD_INPUT].value = 0 ;}
}
else
@@ -307,8 +340,8 @@ struct PLAYERDisplay : TransparentWidget {
nvgStrokeWidth(vg, 0.8);
{
nvgBeginPath(vg);
- nvgMoveTo(vg, floor(module->samplePos * 125 / module->audioFile.getNumSamplesPerChannel()) , 85);
- nvgLineTo(vg, floor(module->samplePos * 125 / module->audioFile.getNumSamplesPerChannel()) , 165);
+ nvgMoveTo(vg, floor(module->samplePos * 125 / module->totalSampleCount) , 85);
+ nvgLineTo(vg, floor(module->samplePos * 125 / module->totalSampleCount) , 165);
nvgClosePath(vg);
}
nvgStroke(vg);
@@ -318,8 +351,8 @@ struct PLAYERDisplay : TransparentWidget {
nvgStrokeWidth(vg, 1.5);
{
nvgBeginPath(vg);
- nvgMoveTo(vg, floor(module->startPos * 125 / module->audioFile.getNumSamplesPerChannel()) , 85);
- nvgLineTo(vg, floor(module->startPos * 125 / module->audioFile.getNumSamplesPerChannel()) , 165);
+ nvgMoveTo(vg, floor(module->startPos * 125 / module->totalSampleCount) , 85);
+ nvgLineTo(vg, floor(module->startPos * 125 / module->totalSampleCount) , 165);
nvgClosePath(vg);
}
nvgStroke(vg);
@@ -380,8 +413,8 @@ PLAYERWidget::PLAYERWidget(PLAYER *module) : ModuleWidget(module) {
static const float portX0[4] = {10, 40, 70, 100};
- addParam(ParamWidget::create(Vec(23, 230), module, PLAYER::LSTART_PARAM, 0.0f, 10.0f, 0.0f));
- addParam(ParamWidget::create(Vec(73, 230), module, PLAYER::LSPEED_PARAM, -5.0f, 5.0f, 0.0f));
+ addParam(ParamWidget::create(Vec(23, 235), module, PLAYER::LSTART_PARAM, 0.0f, 10.0f, 0.0f));
+ addParam(ParamWidget::create(Vec(73, 235), module, PLAYER::LSPEED_PARAM, -5.0f, 5.0f, 0.0f));
addParam(ParamWidget::create(Vec(42, 278), module, PLAYER::TSTART_PARAM, -1.0f, 1.0f, 0.0f));
addParam(ParamWidget::create(Vec(73, 278), module, PLAYER::TSPEED_PARAM, -1.0f, 1.0f, 0.0f));
@@ -397,9 +430,9 @@ PLAYERWidget::PLAYERWidget(PLAYER *module) : ModuleWidget(module) {
addParam(ParamWidget::create(Vec(43, 95), module, PLAYER::PREV_PARAM, 0.0f, 1.0f, 0.0f));
addParam(ParamWidget::create(Vec(73, 95), module, PLAYER::NEXT_PARAM, 0.0f, 1.0f, 0.0f));
- addParam(ParamWidget::create(Vec(11, 210), module, PLAYER::OSC_PARAM, 0.0, 1.0, 0.0));
- addChild(ModuleLightWidget::create>(Vec(15.4, 214.4), module, PLAYER::OSC_LIGHT));
-
+ addParam(ParamWidget::create(Vec(104, 212), module, PLAYER::OSC_PARAM, 0.0, 1.0, 0.0));
+ addChild(ModuleLightWidget::create>(Vec(108.4, 216.4), module, PLAYER::OSC_LIGHT));
+ addInput(Port::create(Vec(portX0[0], 210), Port::INPUT, module, PLAYER::VO_INPUT));
}
struct PLAYERItem : MenuItem {
diff --git a/plugins/community/repos/cf/src/SLIDERSEQ.cpp b/plugins/community/repos/cf/src/SLIDERSEQ.cpp
index 3438bbe6..c2d4d628 100644
--- a/plugins/community/repos/cf/src/SLIDERSEQ.cpp
+++ b/plugins/community/repos/cf/src/SLIDERSEQ.cpp
@@ -13,6 +13,7 @@ struct SLIDERSEQ : Module {
enum InputIds {
RST_INPUT,
UP_INPUT,
+POS_INPUT,
NUM_INPUTS
};
enum OutputIds {
@@ -21,19 +22,19 @@ struct SLIDERSEQ : Module {
};
enum LightIds {
OFFSET_LIGHT,
- LED_LIGHT,
- NUM_LIGHTS = LED_LIGHT + 16
+ NUM_LIGHTS
};
-
int pas = 0;
bool OFFSET_STATE = false ;
SchmittTrigger rstTrigger;
SchmittTrigger upTrigger;
SchmittTrigger offsetTrigger;
-
+SchmittTrigger posTrigger;
+float sl_pas ;
+float sl_value ;
SLIDERSEQ() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
void step() override;
@@ -64,31 +65,67 @@ void fromJson(json_t *rootJ) override {
void SLIDERSEQ::step() {
-
+if (!inputs[POS_INPUT].active) {
+ if (rstTrigger.process(inputs[RST_INPUT].value))
+ {
+ pas = -1;
+ }
if (upTrigger.process(inputs[UP_INPUT].value))
{
if (pas <15) pas = pas+1; else pas =0;
}
- if (rstTrigger.process(inputs[RST_INPUT].value))
- {
- pas = 0;
- }
- for (int i = 0; i < 16; i++)
- {
- if (i==pas) lights[LED_LIGHT +i].value=1; else lights[LED_LIGHT +i].value= 0;
- }
+} else { pas = int(inputs[POS_INPUT].value*1.6);
+ if (pas<0) pas =0;
+ if (pas>15) pas =15;
+};
if (offsetTrigger.process(params[OFFSET_PARAM].value))
{if (OFFSET_STATE == 0) OFFSET_STATE = 1; else OFFSET_STATE = 0;}
if (OFFSET_STATE==1) lights[OFFSET_LIGHT].value=true; else lights[OFFSET_LIGHT].value=false;
- outputs[TR_OUTPUT].value=params[LVL_PARAM +pas].value*10-OFFSET_STATE*5.0;
+
+if (pas>-1) {
+ sl_pas=pas; sl_value = params[LVL_PARAM +pas].value ;
+ outputs[TR_OUTPUT].value=params[LVL_PARAM +pas].value*10-OFFSET_STATE*5.0;}
+ else {
+ sl_pas=0; sl_value = params[LVL_PARAM +0].value ;
+ outputs[TR_OUTPUT].value=params[LVL_PARAM +0].value*10-OFFSET_STATE*5.0;}
}
+struct SLDisplay : TransparentWidget {
+
+ float *pp ;
+ float *vv;
+
+ SLDisplay() {
+
+ }
+
+ void draw(NVGcontext *vg) {
+
+ float xx = (int(*pp)%8) ;
+ float yy = int(*pp/8)-*vv/2 ;
+
+
+ nvgBeginPath(vg);
+ nvgRect(vg, xx*15,65+yy*125, 4.5,10.5);
+ nvgFillColor(vg, nvgRGBA(0x4c, 0xc7, 0xf3, 0xff));
+ nvgFill(vg);
+ nvgBeginPath(vg);
+ nvgRoundedRect(vg, xx*15-3,65+yy*125-3, 10.5,16.5,2.0);
+ nvgFillColor(vg, nvgRGBA(0x4c, 0xc7, 0xf3, 0x30));
+ nvgFill(vg);
+ nvgBeginPath(vg);
+ nvgRoundedRect(vg, xx*15-6,65+yy*125-6, 16.5,22.5,4.0);
+ nvgFillColor(vg, nvgRGBA(0x4c, 0xc7, 0xf3, 0x10));
+ nvgFill(vg);
+
+ }
+};
struct SLIDERSEQWidget : ModuleWidget {
SLIDERSEQWidget(SLIDERSEQ *module);
@@ -102,25 +139,33 @@ SLIDERSEQWidget::SLIDERSEQWidget(SLIDERSEQ *module) : ModuleWidget(module) {
addChild(Widget::create(Vec(15, 365)));
addChild(Widget::create(Vec(box.size.x-30, 365)));
- addInput(Port::create(Vec(14, 320), Port::INPUT, module, SLIDERSEQ::RST_INPUT));
- addInput(Port::create(Vec(43, 320), Port::INPUT, module, SLIDERSEQ::UP_INPUT));
- addOutput(Port::create(Vec(96, 320), Port::OUTPUT, module, SLIDERSEQ::TR_OUTPUT));
-
+ addInput(Port::create(Vec(10, 320), Port::INPUT, module, SLIDERSEQ::RST_INPUT));
+ addInput(Port::create(Vec(39, 320), Port::INPUT, module, SLIDERSEQ::UP_INPUT));
+ addOutput(Port::create(Vec(100, 320), Port::OUTPUT, module, SLIDERSEQ::TR_OUTPUT));
+
//addParam(ParamWidget::create(Vec(74, 322), module, SLIDERSEQ::OFFSET_PARAM, 0.0f, 1.0f, 0.0f));
- addParam(ParamWidget::create(Vec(72, 323), module, SLIDERSEQ::OFFSET_PARAM, 0.0, 1.0, 0.0));
- addChild(ModuleLightWidget::create>(Vec(76.4, 327.4), module, SLIDERSEQ::OFFSET_LIGHT));
+ addParam(ParamWidget::create(Vec(84, 288), module, SLIDERSEQ::OFFSET_PARAM, 0.0, 1.0, 0.0));
+ addChild(ModuleLightWidget::create>(Vec(88.4, 292.4), module, SLIDERSEQ::OFFSET_LIGHT));
for (int i = 0; i < 8; i++) {
- addParam(ParamWidget::create(Vec(4+i*15, 30+ 30), module, SLIDERSEQ::LVL_PARAM+i, 0.0, 1.0, 0.0));
- addChild(ModuleLightWidget::create>(Vec(10+i*15, 30+ 115), module, SLIDERSEQ::LED_LIGHT + i));
+ addParam(ParamWidget::create(Vec(4+i*15, 30+ 30), module, SLIDERSEQ::LVL_PARAM+i, 0.0, 1.0, 0.0));
+ //addChild(ModuleLightWidget::create>(Vec(10+i*15, 30+ 115), module, SLIDERSEQ::LED_LIGHT + i));
}
for (int i = 8; i < 16; i++) {
- addParam(ParamWidget::create(Vec(4+(i-8)*15, 30+ 155), module, SLIDERSEQ::LVL_PARAM+i, 0.0, 1.0, 0.0));
- addChild(ModuleLightWidget::create>(Vec(10+(i-8)*15, 30+ 240), module, SLIDERSEQ::LED_LIGHT + i));
+ addParam(ParamWidget::create(Vec(4+(i-8)*15, 30+ 155), module, SLIDERSEQ::LVL_PARAM+i, 0.0, 1.0, 0.0));
+ //addChild(ModuleLightWidget::create>(Vec(10+(i-8)*15, 30+ 240), module, SLIDERSEQ::LED_LIGHT + i));
}
-
+
+ {
+ SLDisplay *pdisplay = new SLDisplay();
+ pdisplay->box.pos = Vec(12, 61);
+ pdisplay->pp = &module->sl_pas;
+ pdisplay->vv = &module->sl_value;
+ addChild(pdisplay);
+ }
+ addInput(Port::create(Vec(68, 320), Port::INPUT, module, SLIDERSEQ::POS_INPUT));
}
} // namespace rack_plugin_cf
diff --git a/plugins/community/repos/cf/src/STEREO.cpp b/plugins/community/repos/cf/src/STEREO.cpp
index d6a951fa..813dc2d6 100644
--- a/plugins/community/repos/cf/src/STEREO.cpp
+++ b/plugins/community/repos/cf/src/STEREO.cpp
@@ -6,8 +6,8 @@ namespace rack_plugin_cf {
struct STEREO : Module {
enum ParamIds {
PAN_PARAM,
- GAIN_PARAM,
- SOLO_PARAM,
+ GAIN_PARAM,
+ SOLO_PARAM,
ON_PARAM,
NUM_PARAMS
};
@@ -40,23 +40,23 @@ struct STEREO : Module {
};
- float SIGNAL1 = 0.0 ;
- float SIGNAL2 = 0.0 ;
- bool ON_STATE = false ;
- bool SOLO_STATE = false ;
- bool soloed = false;
- int lightState[11] = {};
- int cligno =0;
- int retard =0;
- int retard2 =0;
- SchmittTrigger onTrigger;
- SchmittTrigger oninTrigger;
- SchmittTrigger soloTrigger;
- SchmittTrigger soloinTrigger;
- float or_gain ;
- int or_affi ;
- float orp_gain ;
- int orp_affi ;
+float SIGNAL1 = 0.0 ;
+float SIGNAL2 = 0.0 ;
+bool ON_STATE = false ;
+bool SOLO_STATE = false ;
+bool soloed = false;
+int lightState[11] = {};
+int cligno =0;
+int retard =0;
+int retard2 =0;
+SchmittTrigger onTrigger;
+SchmittTrigger oninTrigger;
+SchmittTrigger soloTrigger;
+SchmittTrigger soloinTrigger;
+float or_gain ;
+int or_affi ;
+float orp_gain ;
+int orp_affi ;
STEREO() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {onReset();}
void step() override;
diff --git a/plugins/community/repos/cf/src/SUB.cpp b/plugins/community/repos/cf/src/SUB.cpp
index 0979b41b..10aa1ea0 100644
--- a/plugins/community/repos/cf/src/SUB.cpp
+++ b/plugins/community/repos/cf/src/SUB.cpp
@@ -6,9 +6,9 @@ namespace rack_plugin_cf {
struct SUB : Module {
enum ParamIds {
- GAIN_PARAM,
+ GAIN_PARAM,
GAIN2_PARAM,
- LINK_PARAM,
+ LINK_PARAM,
NUM_PARAMS
};
enum InputIds {
@@ -33,24 +33,24 @@ struct SUB : Module {
};
- float SIGNAL = 0.0 ;
- float SIGNAL2 = 0.0 ;
- float or_gain ;
- float or2_gain ;
- int or_affi ;
- int or2_affi ;
- bool LINK_STATE = false ;
- SchmittTrigger linkTrigger;
+float SIGNAL = 0.0 ;
+float SIGNAL2 = 0.0 ;
+float or_gain ;
+float or2_gain ;
+int or_affi ;
+int or2_affi ;
+bool LINK_STATE = false ;
+SchmittTrigger linkTrigger;
SUB() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {reset();}
void step() override;
- void reset() override {
- LINK_STATE = false;
- }
-
- json_t *toJson() override {
+void reset() override {
+ LINK_STATE = false;
+ }
+
+json_t *toJson() override {
json_t *rootJ = json_object();
// solo
json_object_set_new(rootJ, "linkstate", json_integer(LINK_STATE));
@@ -76,26 +76,26 @@ void SUB::step() {
{LINK_STATE=!LINK_STATE;}
lights[LINK_LIGHT].value=LINK_STATE;
-
- SIGNAL = inputs[IN1_INPUT].value ;
+
+ SIGNAL = inputs[IN1_INPUT].value ;
outputs[OUT1_OUTPUT].value = SIGNAL;
-
+
if (!inputs[GAIN_INPUT].active)
- {SIGNAL = SIGNAL * params[GAIN_PARAM].value/10.0 ;or_affi=0;}
- else {SIGNAL = SIGNAL * clamp(inputs[GAIN_INPUT].value/10.0f,0.0f,1.0f) ; or_affi=1;or_gain=clamp(inputs[GAIN_INPUT].value,0.0f,10.0f);}
+ {SIGNAL = SIGNAL * params[GAIN_PARAM].value/10.0 ;or_affi=0;}
+ else {SIGNAL = SIGNAL * clamp(inputs[GAIN_INPUT].value/10.0f,0.0f,1.0f) ; or_affi=1;or_gain=clamp(inputs[GAIN_INPUT].value,0.0f,10.0f);}
outputs[M1_OUTPUT].value = inputs[M1_INPUT].value + SIGNAL;
- SIGNAL2 = inputs[IN2_INPUT].value ;
-
+ SIGNAL2 = inputs[IN2_INPUT].value ;
+
outputs[OUT2_OUTPUT].value = SIGNAL2;
-
+
if (!LINK_STATE) {
if (!inputs[GAIN2_INPUT].active)
{SIGNAL2 = SIGNAL2 * params[GAIN2_PARAM].value/10.0 ;or2_affi=0;}
- else {SIGNAL2 = SIGNAL2 * clamp(inputs[GAIN2_INPUT].value/10.0f,0.0f,1.0f) ; or2_affi=1;or2_gain=clamp(inputs[GAIN2_INPUT].value,0.0f,10.0f);}
+ else {SIGNAL2 = SIGNAL2 * clamp(inputs[GAIN2_INPUT].value/10.0f,0.0f,1.0f) ; or2_affi=1;or2_gain=clamp(inputs[GAIN2_INPUT].value,0.0f,10.0f);}
} else {
if (!inputs[GAIN_INPUT].active)
{SIGNAL2 = SIGNAL2 * params[GAIN_PARAM].value/10.0 ;or2_affi=1;or2_gain=clamp(params[GAIN_PARAM].value,0.0f,10.0f);}
@@ -155,11 +155,11 @@ SUBWidget::SUBWidget(SUB *module) : ModuleWidget(module) {
addChild(Widget::create(Vec(15, 365)));
addChild(Widget::create(Vec(box.size.x-30, 365)));
- addParam(ParamWidget::create(Vec(22, 179), module, SUB::LINK_PARAM, 0.0, 1.0, 0.0));
+ addParam(ParamWidget::create(Vec(22, 179), module, SUB::LINK_PARAM, 0.0, 1.0, 0.0));
addChild(ModuleLightWidget::create>(Vec(26.5, 182.5), module, SUB::LINK_LIGHT));
- addParam(ParamWidget::create(Vec(27, 247), module, SUB::GAIN2_PARAM, 0.0, 10.0, 0.0));
+ addParam(ParamWidget::create(Vec(27, 247), module, SUB::GAIN2_PARAM, 0.0, 10.0, 0.0));
addInput(Port::create(Vec(11, 281), Port::INPUT, module, SUB::GAIN2_INPUT));
{
MOTORPOTDisplay *display2 = new MOTORPOTDisplay();
@@ -183,7 +183,8 @@ SUBWidget::SUBWidget(SUB *module) : ModuleWidget(module) {
addInput(Port::create(Vec(11, 61+152), Port::INPUT, module, SUB::M2_INPUT));
- addParam(ParamWidget::create