Voxglitch Community Feedback

Wow, this is such a treat to see the evolution of a module. It’s really looking good, and the interaction has been wonderful to witness. Thank you Bret!

@b0d0 My pleasure! It should eventually look amazing! I’ll probably be working on it this weekend. I’m hoping to get the track lengths implemented!

2 Likes

Hi everyone! Quick update: I’ve added support for variable track lengths. At the moment, I’ve created separate led buttons for selecting the track length.

The front panel is becoming a super-mess!! It doesn’t seem efficient to spent a lot of time making it pretty until the dust has settled. :see_no_evil:

Here are the track length buttons. In this example, the track length is set to 11:



Eventually you’ll be able to click on the smaller LEDs to set the playback length. They’ll have a dual purpose of displaying the playback position and allowing you to click on them to set the track playback length. We’ll get there!


Next up, I intend to:

  1. Add the ability to reset playback
  2. Fix the bug where the very first step is skipped when the module is first clocked
4 Likes

So hyped!

Me too! It’s going to take a while, so please be patient!

Update: Reset implemented. Also fixed the first-step issue. Next up: Implementation of the CV controls for global memory.

2 Likes

Take all the time you need mate. “If ya rush a miracle maker, ya get rotten miracles”

(I hope somebody got that reference)

1 Like

“Buh-bye boys! Have fun storming the castle!” “Think they’ll make it?” “It would take a miracle.”

Here’s a quick update for you! The panel is stil messy, but the funcationality is coming along. Here’s what’s new:

  • I’ve added a reset button.
  • I’ve added 4 more memory slots
  • I renamed the variables in the code from “pattern” to “memory”.
  • I changed how pattern lengths are selected and displayed. Holding the shift key while pressing a sample trigger button will set the pattern length. The pattern length is displayed with a grey background behind the step position indicators (red lights).
  • Added CV (0-10v) control over memory selection.

Here’s how it’s shaping up:

Cool beans!

:warning: If you’re playing around with this module from the source code, there are changes to the save/load code which will break your patches. “Inconceivable!”

1 Like

Yes! Someone got it!

Wow. I’m pretty excited. Although I do want to give it a new front panel eventually, I’m hoping to get this into the library sooner than expected. The only must-have feature that I want to add first is the ability to copy and paste memory slots, and that shouldn’t take more than about an hour.

Launch to-do list:

  1. Add feature for Copy/paste memory slots
  2. Add proper tooltips
  3. Add visual dashes between stereo output pairs
  4. Documentation
  5. Figure out a cool name for it
  6. Move down reset input. Add “x32” indicator under clock input so people know to clock it quickly.

Follow up tasks:

  1. Attack/decay controls
  2. Better front panel
  3. Improved sample playback quality (some type of interpolation)

It’s a lot of fun so far!

14 Likes

Oh man it looks awesome. Just a heads up, it’s not building on mac as of git commit 2be4979. :slightly_frowning_face: Something about floats and doubles

c++  -std=c++11 -stdlib=libc++   -fPIC -I../../include -I../../dep/include -MMD -MP -g -O3 -march=nehalem -funsafe-math-optimizations -fno-omit-frame-pointer -Wall -Wextra -Wno-unused-parameter -DARCH_MAC -mmacosx-version-min=10.9  -c -o build/src/Scalar110.cpp.o src/Scalar110.cpp
In file included from src/Scalar110.cpp:16:
src/Common/common.hpp:25:13: warning: format string is not a string literal (potentially insecure) [-Wformat-security]
      DEBUG(std::to_string(value).c_str());
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../../include/logger.hpp:13:107: note: expanded from macro 'DEBUG'
#define DEBUG(format, ...) rack::logger::log(rack::logger::DEBUG_LEVEL, __FILE__, __LINE__, __FUNCTION__, format, ##__VA_ARGS__)
                                                                                                          ^~~~~~
src/Common/common.hpp:25:13: note: treat the string as an argument to avoid this
      DEBUG(std::to_string(value).c_str());
            ^
            "%s",
../../include/logger.hpp:13:107: note: expanded from macro 'DEBUG'
#define DEBUG(format, ...) rack::logger::log(rack::logger::DEBUG_LEVEL, __FILE__, __LINE__, __FUNCTION__, format, ##__VA_ARGS__)
                                                                                                          ^
In file included from src/Scalar110.cpp:16:
src/Common/common.hpp:35:13: warning: format string is not a string literal (potentially insecure) [-Wformat-security]
      DEBUG(std::to_string(value).c_str());
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../../include/logger.hpp:13:107: note: expanded from macro 'DEBUG'
#define DEBUG(format, ...) rack::logger::log(rack::logger::DEBUG_LEVEL, __FILE__, __LINE__, __FUNCTION__, format, ##__VA_ARGS__)
                                                                                                          ^~~~~~
src/Common/common.hpp:35:13: note: treat the string as an argument to avoid this
      DEBUG(std::to_string(value).c_str());
            ^
            "%s",
../../include/logger.hpp:13:107: note: expanded from macro 'DEBUG'
#define DEBUG(format, ...) rack::logger::log(rack::logger::DEBUG_LEVEL, __FILE__, __LINE__, __FUNCTION__, format, ##__VA_ARGS__)
                                                                                                          ^
In file included from src/Scalar110.cpp:29:
src/Scalar110/Scalar110Widget.hpp:121:15: warning: unused variable 'textX' [-Wunused-variable]
        float textX = bounds[0];
              ^
src/Scalar110/Scalar110Widget.hpp:122:15: warning: unused variable 'textY' [-Wunused-variable]
        float textY = bounds[1];
              ^
src/Scalar110/Scalar110Widget.hpp:123:15: warning: unused variable 'textWidth' [-Wunused-variable]
        float textWidth = bounds[2];
              ^
src/Scalar110/Scalar110Widget.hpp:316:28: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list
      [-Wc++11-narrowing]
      {180 + mem_x_offset, 114.5 + mem_y_offset},
                           ^~~~~~~~~~~~~~~~~~~~
src/Scalar110/Scalar110Widget.hpp:316:28: note: insert an explicit cast to silence this issue
      {180 + mem_x_offset, 114.5 + mem_y_offset},
                           ^~~~~~~~~~~~~~~~~~~~
                           static_cast<float>( )
src/Scalar110/Scalar110Widget.hpp:317:28: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list
      [-Wc++11-narrowing]
      {210 + mem_x_offset, 114.5 + mem_y_offset},
                           ^~~~~~~~~~~~~~~~~~~~
src/Scalar110/Scalar110Widget.hpp:317:28: note: insert an explicit cast to silence this issue
      {210 + mem_x_offset, 114.5 + mem_y_offset},
                           ^~~~~~~~~~~~~~~~~~~~
                           static_cast<float>( )
src/Scalar110/Scalar110Widget.hpp:318:28: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list
      [-Wc++11-narrowing]
      {240 + mem_x_offset, 114.5 + mem_y_offset},
                           ^~~~~~~~~~~~~~~~~~~~
src/Scalar110/Scalar110Widget.hpp:318:28: note: insert an explicit cast to silence this issue
      {240 + mem_x_offset, 114.5 + mem_y_offset},
                           ^~~~~~~~~~~~~~~~~~~~
                           static_cast<float>( )
src/Scalar110/Scalar110Widget.hpp:319:28: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list
      [-Wc++11-narrowing]
      {270 + mem_x_offset, 114.5 + mem_y_offset},
                           ^~~~~~~~~~~~~~~~~~~~
src/Scalar110/Scalar110Widget.hpp:319:28: note: insert an explicit cast to silence this issue
      {270 + mem_x_offset, 114.5 + mem_y_offset},
                           ^~~~~~~~~~~~~~~~~~~~
                           static_cast<float>( )
src/Scalar110/Scalar110Widget.hpp:326:28: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list
      [-Wc++11-narrowing]
      {180 + mem_x_offset, 177.011719 + mem_y_offset},
                           ^~~~~~~~~~~~~~~~~~~~~~~~~
src/Scalar110/Scalar110Widget.hpp:326:28: note: insert an explicit cast to silence this issue
      {180 + mem_x_offset, 177.011719 + mem_y_offset},
                           ^~~~~~~~~~~~~~~~~~~~~~~~~
                           static_cast<float>(      )
src/Scalar110/Scalar110Widget.hpp:327:28: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list
      [-Wc++11-narrowing]
      {210 + mem_x_offset, 177.011719 + mem_y_offset},
                           ^~~~~~~~~~~~~~~~~~~~~~~~~
src/Scalar110/Scalar110Widget.hpp:327:28: note: insert an explicit cast to silence this issue
      {210 + mem_x_offset, 177.011719 + mem_y_offset},
                           ^~~~~~~~~~~~~~~~~~~~~~~~~
                           static_cast<float>(      )
src/Scalar110/Scalar110Widget.hpp:328:28: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list
      [-Wc++11-narrowing]
      {240 + mem_x_offset, 177.011719 + mem_y_offset},
                           ^~~~~~~~~~~~~~~~~~~~~~~~~
src/Scalar110/Scalar110Widget.hpp:328:28: note: insert an explicit cast to silence this issue
      {240 + mem_x_offset, 177.011719 + mem_y_offset},
                           ^~~~~~~~~~~~~~~~~~~~~~~~~
                           static_cast<float>(      )
src/Scalar110/Scalar110Widget.hpp:329:28: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list
      [-Wc++11-narrowing]
      {270 + mem_x_offset, 177.011719 + mem_y_offset}
                           ^~~~~~~~~~~~~~~~~~~~~~~~~
src/Scalar110/Scalar110Widget.hpp:329:28: note: insert an explicit cast to silence this issue
      {270 + mem_x_offset, 177.011719 + mem_y_offset}
                           ^~~~~~~~~~~~~~~~~~~~~~~~~
                           static_cast<float>(      )
src/Scalar110/Scalar110Widget.hpp:349:13: warning: format string is not a string literal (potentially insecure) [-Wformat-security]
      DEBUG(debug_string.c_str());
            ^~~~~~~~~~~~~~~~~~~~
../../include/logger.hpp:13:107: note: expanded from macro 'DEBUG'
#define DEBUG(format, ...) rack::logger::log(rack::logger::DEBUG_LEVEL, __FILE__, __LINE__, __FUNCTION__, format, ##__VA_ARGS__)
                                                                                                          ^~~~~~
src/Scalar110/Scalar110Widget.hpp:349:13: note: treat the string as an argument to avoid this
      DEBUG(debug_string.c_str());
            ^
            "%s",
../../include/logger.hpp:13:107: note: expanded from macro 'DEBUG'
#define DEBUG(format, ...) rack::logger::log(rack::logger::DEBUG_LEVEL, __FILE__, __LINE__, __FUNCTION__, format, ##__VA_ARGS__)
                                                                                                          ^
6 warnings and 8 errors generated.
make: *** [build/src/Scalar110.cpp.o] Error 1
[11:30 AM][~/Projects/VCVRack-v2/plugins/voxglitch][samplebox]

Ah, yes! I’ll fix that tonight. It warned me on Windows but still built, and that code is meant to be simplified anyhow. I was using some variables to help me shift around front panel elements easily. Now that they’re in place, I can remove the math. Thanks!!

Shaping up nicely man. Fantastic!

I just pushed up changes that should fix this. I’ll probably be pushing one or two more cosmetic and superfluous updates tonight

2 Likes

It works! :slight_smile:

This thing is so much fun!

1 Like

My update for the day:

Mostly front panel updates, but memory copy/paste is implemented now!

Launch to-do list:

  • Documentation
  • Video tutorial
  • Figure out a cool name for it. Update all of the code with the new name. (This will break all patches.)
  • Clean up widget code a little bit.

Woo hoo! Everything is checked in to the samplebox branch.

4 Likes

had fun making some glitchy sounds :slight_smile:

1 Like

That’s awesome! I’m so glad that you’re enjoying it!

How about naming it Salmon of Doubt because of all the parameter lox?

That sounds like something my cleric would discover in a D&D campaign! :smile: :fishing_pole_and_fish: :sushi:

2 Likes