Giter VIP home page Giter VIP logo

rpj's Introduction

RPJ VCV plugins

rpj's People

Contributors

kockie69 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

rpj's Issues

Panel fails to load on Linux

[1.099 warn src/window/Svg.cpp:112 load] Failed to load SVG /Rack-2.0-Home/plugins/RPJ/res/TuxOn.svg

The file in the repository is called Tuxon.svg, which causes problems on platforms with case-sensitive file systems.

v2: Buttons fail to load

Buttons fail to load on Linux platform:

[5.141 warn src/window/Svg.cpp:112 load] Failed to load SVG /home/cschol/src/Rack-2.0-Home/plugins/RPJ/res/buttons/ButtonMin_0.svg           
  1 [5.141 warn src/window/Svg.cpp:112 load] Failed to load SVG /home/cschol/src/Rack-2.0-Home/plugins/RPJ/res/buttons/ButtonMin_1.svg     
  2 [5.141 warn src/window/Svg.cpp:112 load] Failed to load SVG /home/cschol/src/Rack-2.0-Home/plugins/RPJ/res/buttons/ButtonPlus_0.svg            
  3 [5.142 warn src/window/Svg.cpp:112 load] Failed to load SVG /home/cschol/src/Rack-2.0-Home/plugins/RPJ/res/buttons/ButtonPlus_1.svg

The issue is that the directory in the repository is called Buttons and the source code references buttons.

Compilation for arm platform fails when cross-compiling

Compilation with the Rack Plugin Toolchain fails for arm64 platform:

rm64-apple-darwin20.2-clang++-libc++  -std=c++11 -stdlib=libc++  -I./dsp/generators -I./dsp/utils -I./dsp/filters -I./dsp/third-party/src -I./dsp/third-party/falco -I./dsp -fPIC -I/home/build/rack-plugin-toolchain/Rack-SDK-mac-arm64/include -I/home/build/rack-plugin-toolchain/Rack-SDK-mac-arm64/dep/include -
MMD -MP -g -O3 -funsafe-math-optimizations -fno-omit-frame-pointer -Wall -Wextra -Wno-unused-parameter -DARCH_ARM64 -march=armv8-a+fp+simd -DARCH_MAC -mmacosx-version-min=10.9  -c -o build/dsp/third-party/falco/DspFilter.cpp.o dsp/third-party/falco/DspFilter.cpp                                                
In file included from src/PigeonPlink.cpp:8:                                                                                                                                                                                                                                                                          
In file included from src/PigeonPlink.hpp:83:                                                                                                                                                                                                                                                                         
In file included from src/../dsp/utils/LookupTable.h:10:                                                                                                                                                                                                                                                              
In file included from /home/build/rack-plugin-toolchain/local/bin/../lib/clang/12.0.1/include/emmintrin.h:13:                                                                                                                                                                                                         
In file included from /home/build/rack-plugin-toolchain/local/bin/../lib/clang/12.0.1/include/xmmintrin.h:13:                                                                                                                                                                                                         
/home/build/rack-plugin-toolchain/local/bin/../lib/clang/12.0.1/include/mmintrin.h:13:19: error: typedef redefinition with different types ('__attribute__((__vector_size__(1 * sizeof(long long)))) long long' (vector of 1 'long long' value) vs 'simde__m64' (aka 'int32x2_t'))                                    
typedef long long __m64 __attribute__((__vector_size__(8), __aligned__(8)));                                                                                                                                                                                                                                          
                  ^                                                                                                                                                                                                                                                                                                   
/home/build/rack-plugin-toolchain/Rack-SDK-mac-arm64/dep/include/simde/x86/mmx.h:121:22: note: previous definition is here                                                                                                                                                                                            
  typedef simde__m64 __m64;                                                                                                                                                                                                                                                                                           
                     ^                                                                                                                                                                                                                                                                                                
In file included from src/PigeonPlink.cpp:8:                                                                                                                                                                                                                                                                          
In file included from src/PigeonPlink.hpp:83:                                                                                                                                                                                                                                                                         
In file included from src/../dsp/utils/LookupTable.h:10:                                                                                                                                                                                                                                                              
In file included from /home/build/rack-plugin-toolchain/local/bin/../lib/clang/12.0.1/include/emmintrin.h:13:                                                                                                                                                                                                         
In file included from /home/build/rack-plugin-toolchain/local/bin/../lib/clang/12.0.1/include/xmmintrin.h:13:                                                                                                                                                                                                         
/home/build/rack-plugin-toolchain/local/bin/../lib/clang/12.0.1/include/mmintrin.h:31:11: error: too many arguments provided to function-like macro invocation                                                                                                                                                        
_mm_empty(void)                                                                                                                                                                                                                                                                                                       
          ^                                                                                                                                                                                                                                                                                                           
/home/build/rack-plugin-toolchain/Rack-SDK-mac-arm64/dep/include/simde/x86/mmx.h:768:11: note: macro '_mm_empty' defined here                                                                                                                                                                                         
#  define _mm_empty() simde_mm_empty()                                                                                                                                                                                                                                                                                
          ^                                                                                                                                                                                                                                                                                                           
In file included from src/PigeonPlink.cpp:8:                                                                                                                                                                                                                                                                          
In file included from src/PigeonPlink.hpp:83:                                                                                                                                                                                                                                                                         
In file included from src/../dsp/utils/LookupTable.h:10:                                                                                                                                                                                                                                                              
In file included from /home/build/rack-plugin-toolchain/local/bin/../lib/clang/12.0.1/include/emmintrin.h:13:                                                                                                                                                                                                         
In file included from /home/build/rack-plugin-toolchain/local/bin/../lib/clang/12.0.1/include/xmmintrin.h:13:                                                                                                                                                                                                         
/home/build/rack-plugin-toolchain/local/bin/../lib/clang/12.0.1/include/mmintrin.h:30:72: error: '__target__' attribute only applies to functions                                                                                                                                                                     
static __inline__ void  __attribute__((__always_inline__, __nodebug__, __target__("mmx")))                                                                                                                                                                                                                            
                                                                       ^                                                                                                                                                                                                                                              
/home/build/rack-plugin-toolchain/local/bin/../lib/clang/12.0.1/include/mmintrin.h:31:1: error: variable has incomplete type 'void'                                                                                                                                                                                   
_mm_empty(void)                                                                                                                                                                                                                                                                                                       
^                                                                                                                                                                                                                                                                                                                     
/home/build/rack-plugin-toolchain/local/bin/../lib/clang/12.0.1/include/mmintrin.h:33:5: error: use of undeclared identifier '__builtin_ia32_emms'; did you mean '__builtin_isless'?                                                                                                                                  
    __builtin_ia32_emms();                                                                                                                                                                                                                                                                                            
    ^                                                                                                                                                                                                                                                                                                                 
/home/build/rack-plugin-toolchain/local/osxcross/bin/../SDK/MacOSX11.1.sdk/usr/include/c++/v1/math.h:647:12: note: '__builtin_isless' declared here                                                                                                                                                                   
    return isless(__lcpp_x, __lcpp_y);                                                                                                                                                                                                                                                                                
           ^                                                                                                                                                                                                                                                                                                          
/home/build/rack-plugin-toolchain/local/osxcross/bin/../SDK/MacOSX11.1.sdk/usr/include/math.h:545:22: note: expanded from macro 'isless'                                                                                                                                                                              
#define isless(x, y) __builtin_isless((x),(y))                                                                                                                                                                                                                                                                        
                     ^                                                                                                                                             
[...]

aesthetic issues in the panels?

There are clearly numerous things about the layout of these panels that look unintentional. I assume if you wanted to spend the time to make everything "neat and tidy" you could perfectly well do it, so I won't log a bunch of specific issues about it. But if you would ever like to to do so, or test some future plugin, I would be happy to.

Out of bounds array access

I started running static analysis with cppcheck as part of the integration process and it found this potential out of bounds array access.

I am not holding integration, but please check it out for the next release. Thanks!

Checking Grendel.cpp ...             
32/60 files checked 34% done
GenieExpander.cpp:31:10: error: Array 'colors[4][3]' accessed at index colors[4][*], which is out of bounds. [arrayIndexOutOfBounds]
   colors[i][j]=rnd(generator);
         ^                  
GenieExpander.cpp:29:16: note: Assuming that condition 'i<=4' is not redundant
 for (int i=0;i<=4;i++)                                                                                                                                    
               ^            
GenieExpander.cpp:31:10: note: Array index out of bounds
   colors[i][j]=rnd(generator);  
         ^          
GenieExpander.cpp:343:10: error: Array 'edges[4][2]' accessed at index edges[*][3], which is out of bounds. [arrayIndexOutOfBounds]
    edges[i][n]=rdMsg->edges[i][n];                                                                                                                        
         ^                                                                                                                                                 
GenieExpander.cpp:342:18: note: Assuming that condition 'n<4' is not redundant                                                                             
   for (int n=0;n<4;n++)         
                 ^                                                                                                                                         
GenieExpander.cpp:343:10: note: Array index out of bounds
    edges[i][n]=rdMsg->edges[i][n];
         ^                                                                                                                                                 
GenieExpander.cpp:343:29: error: Array 'rdMsg->edges[4][2]' accessed at index rdMsg->edges[*][3], which is out of bounds. [arrayIndexOutOfBounds]          
    edges[i][n]=rdMsg->edges[i][n];  
                            ^
GenieExpander.cpp:342:18: note: Assuming that condition 'n<4' is not redundant                                                                             
   for (int n=0;n<4;n++)                                                                                                                                   
                 ^                                                                                                                                         
GenieExpander.cpp:343:29: note: Array index out of bounds                                                                                                  
    edges[i][n]=rdMsg->edges[i][n];                                                                                                                        
                            ^      

Add a config file to Pigeon Plink with steppings

Add a config file that will be read during startup or when a PP module is added. If no config file is available, the default settings will be used, otherwise the config will be read as configured.
The configuration will be in json format, and for the default settings it would look like:

{
"steppings": [
{
"name": "None",
"values": [
]
},
{
"name": "legacy",
"values": [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
]
},
{
"name": "Legacy+Sub",
"values": [0.125,0.25, 0.5, 1.00,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
]
},
{
"name": "Octaves",
"values": [0.125, 0.25, 0.5, 1.00, 2.00, 4.00, 8.00, 16.00, 32.00
]
},
{
"name": "Digitone",
"values": [0.25, 0.50, 0.75, 1.00, 1.25, 1.50, 1.75, 2.00, 2.25, 2.50, 2.75, 3.00, 3.25, 3.50, 3.75, 4.00, 4.25, 4.50, 4.75, 5.00, 5.50, 6.00, 6.50, 7.00, 7.50, 8.00, 8.50, 9.00, 9.50, 10.00, 11.00, 12.00, 13.00, 14.00, 15.00, 16.00
]
},
{
"name": "DX11",
"values": [0.50, 0.71, 0.78, 0.87, 1.00, 1.41, 1.57, 1.73, 2.00, 2.82, 3.00, 3.14, 3.46, 4.00, 4.24, 4.71, 5.00, 5.19, 5.65, 6.00, 6.28, 6.92, 7.00, 7.07, 7.85, 8.00, 8.48, 8.65, 9.00, 9.42, 9.89, 10.00, 10.38, 10.99, 11.00, 11.30, 12.00, 12.11, 12.56, 12.72, 13.00, 13.84, 14.00, 14.10, 14.13, 15.00, 15.55, 15.57, 15.70, 16.96, 17.27, 17.30, 18.37, 18.84, 19.03, 19.78, 20.41, 20.76, 21.20, 21.98, 22.49, 23.55, 24.22, 25.95
]
},
{
"name": "DX7",
"values": [0.50,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
]
}
]
}

Build error on macOS platform

Build error during integration on macOS platform:

x86_64-apple-darwin17-clang++-libc++  -std=c++11 -stdlib=libc++   -fPIC -I/home/build/rack-plugin-toolchain/Rack-SDK/include -I/home/build/rack-plugin-toolchain/Rack-SDK/dep/include -MMD -MP -g -O3 -march=nocona -funsafe-math-optimizations -Wall -Wextra -Wno-unused-parameter -DARCH_MAC -mmacosx-version-min=10.7  -c -o build/src/Grendel.cpp.o src/Grendel.cpp
src/Grendel.cpp:6:12: error: invalid suffix 'd' on floating constant
        phase = 0.d;
                  ^
src/Grendel.cpp:7:16: error: invalid suffix 'd' on floating constant
        frequency = 1.d;
                      ^

v2: References to custom fonst stored across frames

Your plugin stores references to custom fonts across frames. This leads to crashes in the VST when reloading a project.

For example (but there might be others):

AlgorithmDisplay::AlgorithmDisplay(Vec pos) {
    box.pos = pos;
    box.size.y = fh;                      
    box.size.x = fh;       
    setColor(0xff, 0xff, 0xff, 0xff);                     
    font = APP->window->loadFont(asset::plugin(pluginInstance, "res/DejaVuSansMono.ttf"));
}

Please see the following link on how to resolve this issue and re-submit to the Library:
https://vcvrack.com/manual/Migrate2#2-1-Don-t-store-Font-and-Image-references-across-multiple-frames

RPJ Visualizer 2.1.0 has an update loop and doesn't load

Hi Robert

The RPJ Visualizer 2.1.0 released in the library 6 hours ago has an update loop. In other words: Rack keeps wanting to update it.

It also doesn't load. From the log:

[0.353 info src/plugin.cpp:162 loadPlugin] Loading plugin from /Users/lab/Documents/Rack2/plugins/RPJVisualizer
[0.354 warn src/plugin.cpp:228 loadPlugin] Could not load plugin /Users/lab/Documents/Rack2/plugins/RPJVisualizer: Failed to load library /Users/lab/Documents/Rack2/plugins/RPJVisualizer/plugin.dylib: dlopen(/Users/lab/Documents/Rack2/plugins/RPJVisualizer/plugin.dylib, 6): Symbol not found: ____chkstk_darwin
Referenced from: /Users/lab/Documents/Rack2/plugins/RPJVisualizer/plugin.dylib
Expected in: /usr/lib/libSystem.B.dylib
in /Users/lab/Documents/Rack2/plugins/RPJVisualizer/plugin.dylib

OS: macOS 10.12.6

Thanks.

PP: Min frequency down to Zero Hz (and control over Phase)

This is a feature request for Pigeon Plink (PP)
(actually 2 closely related feature requests)

0 Hz
If PP is using Phase Modulation (PM), instead of Frequency Modulation (FM), then it would be nice to have the minimum frequency starting from 0 (zero) Hz. With the carrier at 0 Hz (and V/Oct for "notes" on the Modulator) this would enable static Wave Shaping.

The Yamaha DX7 only goes down to 1 Herz (minus some detune). This low frequency will produce spectral modulation at that rate (so, no static spectrum). The Yamaha SY77/99 oscillators do go down to 0 Hz, and are able to produce static wave shaping at 0 Hz. This 0 Hz carrier thing offering a different spectral effect then when Carrier and Modulator are running at audiorates. True FM cannot go down to 0 Hz. In that case: as low as possible (will leave some of the beforementioned "LFO" timbral modulation).

Control over Phase (manual/static initial phase angle, but preferable also with modulation).
The "Wave shaping" by the 0 Hz "Carrier" depends on the Phase angle of the Carrier. Shifting the phase will change the symmetry of modulation. And will thus change the waveshape and thus the spectral content. So, shifting the angle could be static (setting the initial phase angle to any degree (SY77/99 only had a few angles on offer). But it would preferably also offer phase angle modulation. For the 0 Hz "trick", the shift could be controlled by some control source (like an ADSR). At audiorates it would simply be Yamaha style Phase Modulation. As said, with the added option to set the initial phase angle.

I guess at this point in time only NYSTHI TZOP offers all this (down to 0 Hz). It has Linear FM and Phase Angle with Modulation (and Exponential FM). Though it only offers SINE as carrier oscillator shape. The modulator can off course be any oscillator at the input.

just a thank you for VCA-bias

Pigeon Plink manual: "The VCA-Knob acts like a Bias, which opens the VCA from zero to full. The incoming modulation will add to that bias."
Thank you for this!!!! With FM, you don't always want the baseline to be zero. It's annoying to have to add offsets to envelopes. Excellent design feature, thank you!

RPJ Lavender and other Filter - Polyphonic Bug

Hi Robert,

I just came across a strange bug in your filters.

image

When using a polyphonic envelope for cutoff, the wrong channels are triggered. After a while it stops to open the filter at all and outputs fast rising or falling voltages, even when disconnect the polyphonyc envelope and just use a trigger to open the filter.

TuxOn - Use after free when deleting TuxOn from a patch [intermittent]

Address sanitizer detects a use after free when deleting TuxOn from a patch.

To reproduce:

  • Build with address sanitizer enabled
  • Add TuxOn to a patch
  • Hover over the module and hit backspace / delete to remove it
  • Address sanitizer should trigger a crash
  • If it doesn't crash repeat the add and remove a few times, often it happens on the first or second try, once it took up to 10 tries

Rack: 5551617afff182925940908eaf73a7d7361303cc
RPJ: 5b4b7d0
Build Command: make -j10 EXTRA_FLAGS=-fsanitize=address EXTRA_LDFLAGS=-fsanitize=address
OS: macOS Monterey
Device: M1 MacBook Pro - have reproduced with native apple silicon and x86 builds

=================================================================
==82179==ERROR: AddressSanitizer: heap-use-after-free on address 0x611000496a90 at pc 0x00000f68b1fe bp 0x00020cf16950 sp 0x00020cf16948
WRITE of size 4 at 0x611000496a90 thread T13
    #0 0xf68b1fd in TuxOn::process(rack::engine::Module::ProcessArgs const&) TuxOn.cpp:301
    #1 0x5702868 in rack::engine::Module::doProcess(rack::engine::Module::ProcessArgs const&) Module.cpp
    #2 0x56ec4b7 in rack::engine::Engine::stepBlock(int) Engine.cpp:551
    #3 0x56f96da in rack::engine::Engine_fallbackRun(rack::engine::Engine*) Engine.cpp:1324
    #4 0x56fc81a in void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (*)(rack::engine::Engine*), rack::engine::Engine*> >(void*) thread:298
    #5 0x7ff80354d4e0 in _pthread_start+0x7c (libsystem_pthread.dylib:x86_64+0x64e0)
    #6 0x7ff803548f6a in thread_start+0xe (libsystem_pthread.dylib:x86_64+0x1f6a)

0x611000496a90 is located 144 bytes inside of 200-byte region [0x611000496a00,0x611000496ac8)
freed by thread T0 here:
    #0 0x45b268d in wrap__ZdlPv+0x7d (libclang_rt.asan_osx_dynamic.dylib:x86_64+0x5468d)
    #1 0x574158d in rack::widget::Widget::clearChildren() Widget.cpp:243
    #2 0x55d43cd in rack::app::ModuleWidget::~ModuleWidget() ModuleWidget.cpp:49
    #3 0xf50cf3d in BraveModuleWidget::~BraveModuleWidget() BlindCurve.cpp:52
    #4 0x55dcd73 in rack::app::ModuleWidget::removeAction() ModuleWidget.cpp:928
    #5 0x55d943e in rack::app::ModuleWidget::onHoverKey(rack::widget::Widget::HoverKeyEvent const&) ModuleWidget.cpp:353
    #6 0x55568a7 in void rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::widget::Widget::HoverKeyEvent const&), rack::widget::Widget::HoverKeyEvent>(void (rack::widget::Widget::*)(rack::widget::Widget::HoverKeyEvent const&), rack::widget::Widget::HoverKeyEvent const&) Widget.hpp:197
    #7 0x55568a7 in void rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::widget::Widget::HoverKeyEvent const&), rack::widget::Widget::HoverKeyEvent>(void (rack::widget::Widget::*)(rack::widget::Widget::HoverKeyEvent const&), rack::widget::Widget::HoverKeyEvent const&) Widget.hpp:197
    #8 0x561ec42 in rack::app::RackWidget::onHoverKey(rack::widget::Widget::HoverKeyEvent const&) RackWidget.cpp:176
    #9 0x55568a7 in void rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::widget::Widget::HoverKeyEvent const&), rack::widget::Widget::HoverKeyEvent>(void (rack::widget::Widget::*)(rack::widget::Widget::HoverKeyEvent const&), rack::widget::Widget::HoverKeyEvent const&) Widget.hpp:197
    #10 0x57477c2 in rack::widget::ZoomWidget::onHoverKey(rack::widget::Widget::HoverKeyEvent const&) ZoomWidget.hpp:35
    #11 0x55568a7 in void rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::widget::Widget::HoverKeyEvent const&), rack::widget::Widget::HoverKeyEvent>(void (rack::widget::Widget::*)(rack::widget::Widget::HoverKeyEvent const&), rack::widget::Widget::HoverKeyEvent const&) Widget.hpp:197
    #12 0x55568a7 in void rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::widget::Widget::HoverKeyEvent const&), rack::widget::Widget::HoverKeyEvent>(void (rack::widget::Widget::*)(rack::widget::Widget::HoverKeyEvent const&), rack::widget::Widget::HoverKeyEvent const&) Widget.hpp:197
    #13 0x572736c in rack::ui::ScrollWidget::onHoverKey(rack::widget::Widget::HoverKeyEvent const&) ScrollWidget.cpp:175
    #14 0x55568a7 in void rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::widget::Widget::HoverKeyEvent const&), rack::widget::Widget::HoverKeyEvent>(void (rack::widget::Widget::*)(rack::widget::Widget::HoverKeyEvent const&), rack::widget::Widget::HoverKeyEvent const&) Widget.hpp:197
    #15 0x5648522 in rack::app::Scene::onHoverKey(rack::widget::Widget::HoverKeyEvent const&) Scene.cpp:323
    #16 0x574e49c in rack::widget::EventState::handleKey(rack::math::Vec, int, int, int, int) event.cpp:334
    #17 0x575645f in rack::window::keyCallback(GLFWwindow*, int, int, int, int) Window.cpp:225
    #18 0x582c82d in -[GLFWContentView keyDown:] cocoa_window.m:580
    #19 0x7ff8060f4065 in -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:]+0x1bed (AppKit:x86_64+0x1b2065)
    #20 0x7ff8060f225d in -[NSWindow(NSEventRouting) sendEvent:]+0x15f (AppKit:x86_64+0x1b025d)
    #21 0x7ff8060f1087 in -[NSApplication(NSEvent) sendEvent:]+0xbb3 (AppKit:x86_64+0x1af087)
    #22 0x582dc30 in _glfwPollEventsCocoa cocoa_window.m:1419
    #23 0x5758024 in rack::window::Window::step() Window.cpp:431
    #24 0x5757dc3 in rack::window::Window::run() Window.cpp:409
    #25 0x41219e1 in main standalone.cpp:240
    #26 0x1043e152d in start+0x1cd (dyld:x86_64+0x552d)
    #27 0x1043dbfff  (<unknown module>)

previously allocated by thread T0 here:
    #0 0x45b226d in wrap__Znwm+0x7d (libclang_rt.asan_osx_dynamic.dylib:x86_64+0x5426d)
    #1 0xf681ebe in TuxOn::TuxOn() TuxOn.hpp:115
    #2 0xf6ed424 in rack::plugin::Model* rack::createModel<TuxOn, TuxOnModuleWidget>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)::TModel::createModule() helpers.hpp:27
    #3 0x558b8ed in rack::app::browser::chooseModel(rack::plugin::Model*) Browser.cpp:90
    #4 0x558785b in rack::app::browser::ModelBox::onButton(rack::widget::Widget::ButtonEvent const&) Browser.cpp:259
    #5 0x5589d10 in rack::widget::Widget::onButton(rack::widget::Widget::ButtonEvent const&) Widget.hpp:234
    #6 0x5589d10 in rack::widget::Widget::onButton(rack::widget::Widget::ButtonEvent const&) Widget.hpp:234
    #7 0x5589d10 in rack::widget::Widget::onButton(rack::widget::Widget::ButtonEvent const&) Widget.hpp:234
    #8 0x57265b8 in rack::ui::ScrollWidget::onButton(rack::widget::Widget::ButtonEvent const&) ScrollWidget.cpp:130
    #9 0x5586668 in rack::app::browser::Browser::onButton(rack::widget::Widget::ButtonEvent const&) Browser.cpp:781
    #10 0x5720e94 in rack::ui::MenuOverlay::onButton(rack::widget::Widget::ButtonEvent const&) MenuOverlay.cpp:34
    #11 0x5555a48 in rack::widget::OpaqueWidget::onButton(rack::widget::Widget::ButtonEvent const&) OpaqueWidget.hpp:21
    #12 0x574bc9a in rack::widget::EventState::handleButton(rack::math::Vec, int, int, int) event.cpp:134
    #13 0x7ff80617ecd0 in -[NSWindow(NSEventRouting) _handleMouseDownEvent:isDelayedEvent:]+0x12fa (AppKit:x86_64+0x23ccd0)
    #14 0x7ff8060f2e8d in -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:]+0xa15 (AppKit:x86_64+0x1b0e8d)
    #15 0x7ff8060f225d in -[NSWindow(NSEventRouting) sendEvent:]+0x15f (AppKit:x86_64+0x1b025d)
    #16 0x7ff8060f0633 in -[NSApplication(NSEvent) sendEvent:]+0x15f (AppKit:x86_64+0x1ae633)
    #17 0x582dc30 in _glfwPollEventsCocoa cocoa_window.m:1419
    #18 0x5758024 in rack::window::Window::step() Window.cpp:431
    #19 0x5757dc3 in rack::window::Window::run() Window.cpp:409
    #20 0x41219e1 in main standalone.cpp:240
    #21 0x1043e152d in start+0x1cd (dyld:x86_64+0x552d)
    #22 0x1043dbfff  (<unknown module>)

Thread T13 created by T0 here:
    #0 0x459f8cc in wrap_pthread_create+0x5c (libclang_rt.asan_osx_dynamic.dylib:x86_64+0x418cc)
    #1 0x56fc6d7 in std::__1::thread::thread<void (&)(rack::engine::Engine*), rack::engine::Engine*, void>(void (&)(rack::engine::Engine*), rack::engine::Engine*&&) thread:314
    #2 0x56f91ea in rack::engine::Engine::startFallbackThread() Engine.cpp:1348
    #3 0x4121930 in main standalone.cpp:227
    #4 0x1043e152d in start+0x1cd (dyld:x86_64+0x552d)
    #5 0x1043dbfff  (<unknown module>)

SUMMARY: AddressSanitizer: heap-use-after-free TuxOn.cpp:301 in TuxOn::process(rack::engine::Module::ProcessArgs const&)
Shadow bytes around the buggy address:
  0x1c2200092d00: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x1c2200092d10: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd
  0x1c2200092d20: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x1c2200092d30: fd fd fd fd fd fd fd fd fa fa fa fa fa fa fa fa
  0x1c2200092d40: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
=>0x1c2200092d50: fd fd[fd]fd fd fd fd fd fd fa fa fa fa fa fa fa
  0x1c2200092d60: fa fa fa fa fa fa fa fa 00 00 00 00 00 00 00 00
  0x1c2200092d70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x1c2200092d80: 00 00 00 00 00 00 00 00 fa fa fa fa fa fa fa fa
  0x1c2200092d90: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x1c2200092da0: fd fd fd fd fd fd fd fd fd fd fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==82179==ABORTING
zsh: abort      ./Rack -d

Bypass for Pigeon Plink

It would be nice to add the new bypass-feature to pass through the Input present at LFM to the audio output without any alteration.
That way it would be much easier to check the output of a modulator in a FM-Chain.

Adding Genie 2.2.1 to patch crashes Rack 2.1.2

Adding Genie 2.2.1 to patch crashes Rack 2.1.2 on M1 Mini (16GB)

Thread 0 Crashed::  Dispatch queue: com.apple.main-thread
0   <translation info unavailable>	       0x102355a00 ???
1   AppleMetalOpenGLRenderer      	        0x1f335da7 GLRFrambufferAttachment::setResource(AttachmentType, GLDTextureRec*, unsigned int) + 101
2   libsystem_platform.dylib      	    0x7ff817042e13 _sigtramp + 51
3   GLEngine                      	    0x7ffa30141c18 gleUpdateDrawFramebufferState + 515
4   GLEngine                      	    0x7ffa300702ba glClear_Exec + 203
5   libRack.dylib                 	         0x2d79973 rack::widget::FramebufferWidget::drawFramebuffer() + 259
6   libRack.dylib                 	         0x2d79639 rack::widget::FramebufferWidget::render(rack::math::Vec, rack::math::Vec, rack::math::Rect) + 1001
7   libRack.dylib                 	         0x2d790e1 rack::widget::FramebufferWidget::draw(rack::widget::Widget::DrawArgs const&) + 545
8   libRack.dylib                 	         0x2d7b06d rack::widget::Widget::draw(rack::widget::Widget::DrawArgs const&) + 461
9   libRack.dylib                 	         0x2d7b06d rack::widget::Widget::draw(rack::widget::Widget::DrawArgs const&) + 461
10  libRack.dylib                 	         0x2d19061 rack::app::ModuleWidget::draw(rack::widget::Widget::DrawArgs const&) + 97
11  libRack.dylib                 	         0x2d7b06d rack::widget::Widget::draw(rack::widget::Widget::DrawArgs const&) + 461
12  libRack.dylib                 	         0x2d7b06d rack::widget::Widget::draw(rack::widget::Widget::DrawArgs const&) + 461
13  libRack.dylib                 	         0x2d2c09b rack::app::RackWidget::draw(rack::widget::Widget::DrawArgs const&) + 59
14  libRack.dylib                 	         0x2d7b06d rack::widget::Widget::draw(rack::widget::Widget::DrawArgs const&) + 461
15  libRack.dylib                 	         0x2d7b6d9 rack::widget::ZoomWidget::draw(rack::widget::Widget::DrawArgs const&) + 105
16  libRack.dylib                 	         0x2d7b06d rack::widget::Widget::draw(rack::widget::Widget::DrawArgs const&) + 461
17  libRack.dylib                 	         0x2d7b06d rack::widget::Widget::draw(rack::widget::Widget::DrawArgs const&) + 461
18  libRack.dylib                 	         0x2d74224 rack::ui::ScrollWidget::draw(rack::widget::Widget::DrawArgs const&) + 52
19  libRack.dylib                 	         0x2d7b06d rack::widget::Widget::draw(rack::widget::Widget::DrawArgs const&) + 461
20  libRack.dylib                 	         0x2d8020d rack::window::Window::step() + 1997
21  libRack.dylib                 	         0x2d7fa28 rack::window::Window::run() + 40
22  Rack                          	       0x102242fbe main + 3454
23  dyld                          	       0x2023d852e start + 462

This is a segfault so likely issue due to bug @RareBreeds filed above

request: chebyshev filter

Thanks for your lovely filters.

Once upon a time I used Adobe Audition, and it had these amazing Chebyshev filters where you could set them to a ridiculously high order with extreme passband ripple. The result was a metallic resonator akin to to a 4ms SMR. From what limited reading I've done, the DSP allowing this must be pretty fancy since because of floating point overflow. Maybe it was only possible because it was not a realtime plugin.

Anyway, if you wanted to take a look I'd be much obliged.

Thanks,
George

LFM crashes Rack - macos

Intel macos (Monterey)

This happens when I try to add the visualizer (external window variant) to my patch. I tried the embedded variant too and it crashes with an identical stack trace.

Date/Time:             2022-10-05 09:35:34.3548 -0400
OS Version:            macOS 12.6 (21G115)
Report Version:        12
Anonymous UUID:        CC7D0BD0-06B8-0EA0-383E-F09402C7BAF0

Sleep/Wake UUID:       BBC123E7-527C-45E5-9F79-EDC7160F622A

Time Awake Since Boot: 580000 seconds
Time Since Wake:       267539 seconds

System Integrity Protection: enabled

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_CRASH (SIGSEGV)
Exception Codes:       0x0000000000000000, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Termination Reason:    Namespace SIGNAL, Code 11 Segmentation fault: 11
Terminating Process:   Rack [68398]

Thread 0 Crashed::  Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib        	    0x7ff81e250bd2 __psynch_mutexwait + 10
1   libsystem_pthread.dylib       	    0x7ff81e288e7e _pthread_mutex_firstfit_lock_wait + 76
2   libsystem_pthread.dylib       	    0x7ff81e286cbb _pthread_mutex_firstfit_lock_slow + 205
3   libc++.1.dylib                	    0x7ff81e1eb719 std::__1::mutex::lock() + 9
4   plugin.dylib                  	        0x12f82bca ProjectMRenderer::activePreset() const + 26
5   plugin.dylib                  	        0x12f7f372 BaseProjectMWidget::step() + 210
6   libRack.dylib                 	         0xa805369 rack::widget::Widget::step() + 185
7   libRack.dylib                 	         0xa805369 rack::widget::Widget::step() + 185
8   libRack.dylib                 	         0xa805369 rack::widget::Widget::step() + 185
9   libRack.dylib                 	         0xa805369 rack::widget::Widget::step() + 185
10  libRack.dylib                 	         0xa805369 rack::widget::Widget::step() + 185
11  libRack.dylib                 	         0xa805369 rack::widget::Widget::step() + 185
12  libRack.dylib                 	         0xa7fe733 rack::ui::ScrollWidget::step() + 19
13  libRack.dylib                 	         0xa7b7bfb rack::app::RackScrollWidget::step() + 843
14  libRack.dylib                 	         0xa805369 rack::widget::Widget::step() + 185
15  libRack.dylib                 	         0xa7c38de rack::app::Scene::step() + 494
16  libRack.dylib                 	         0xa80a295 rack::window::Window::step() + 1573
17  libRack.dylib                 	         0xa809c58 rack::window::Window::run() + 40
18  Rack                          	       0x109ce5fd6 main + 3382
19  dyld                          	       0x11033852e start + 462
....

Compiling with Rack 2.2.0 using gcc 11.3 fails on simde instructions

Rack 2.2.0 apparently changed something in the simde instructions resulting in the errors below when compiling with gcc 11.3 on Ubuntu 22.04 and having -march=nehalem in Rack/compile.mk

A workaround is to replaced nehalem with -march=broadwell or skylake or compile it using an older version of gcc, like 7.5 in Ubuntu 18.04

build/src/SugarMice.cpp.o src/SugarMice.cpp
In file included from ../Rack/dep/include/simde/x86/sse3.h:30,
                 from ../Rack/dep/include/simde/x86/ssse3.h:30,
                 from ../Rack/dep/include/simde/x86/sse4.1.h:31,
                 from ../Rack/dep/include/simde/x86/sse4.2.h:31,
                 from ../Rack/include/simd/common.hpp:4,
                 from ../Rack/include/simd/Vector.hpp:3,
                 from ../Rack/include/simd/functions.hpp:2,
                 from ../Rack/include/dsp/common.hpp:4,
                 from ../Rack/include/rack.hpp:110,
                 from src/RPJ.hpp:1,
                 from src/PigeonPlink.cpp:5:
../Rack/dep/include/simde/x86/sse2.h:3653:30: error: redefinition of ‘__m128i simde_mm_loadu_epi64(const void*)’
 3653 |   #define _mm_loadu_epi64(a) simde_mm_loadu_epi64(a)
      |                              ^~~~~~~~~~~~~~~~~~~~
../Rack/dep/include/simde/x86/sse2.h:3633:1: note: ‘simde__m128i simde_mm_loadu_epi64(const void*)’ previously defined here
 3633 | simde_mm_loadu_epi64(void const * mem_addr) {
      | ^~~~~~~~~~~~~~~~~~~~
../Rack/dep/include/simde/x86/sse2.h:3628:30: error: redefinition of ‘__m128i simde_mm_loadu_epi32(const void*)’
 3628 |   #define _mm_loadu_epi32(a) simde_mm_loadu_epi32(a)
      |                              ^~~~~~~~~~~~~~~~~~~~
../Rack/dep/include/simde/x86/sse2.h:3608:1: note: ‘simde__m128i simde_mm_loadu_epi32(const void*)’ previously defined here
 3608 | simde_mm_loadu_epi32(void const * mem_addr) {
      | ^~~~~~~~~~~~~~~~~~~~
../Rack/dep/include/simde/x86/sse2.h:3603:30: error: redefinition of ‘__m128i simde_mm_loadu_epi16(const void*)’
 3603 |   #define _mm_loadu_epi16(a) simde_mm_loadu_epi16(a)
      |                              ^~~~~~~~~~~~~~~~~~~~

Adding Pigeon Plink to patch crashes Rack.

Every time I attempt to add Pigeon Plink, Rack closes itself. These seem to be the pertinent lines in log.txt:

[182.703 info src/app/Browser.cpp:86 chooseModel] Creating module RPJ FM Pigeon Plink
[182.703 info src/PigeonPlink.cpp:373 onAdd] Loading config file /catacombs/Existentia/Rack/RPJ.json
[182.709 fatal adapters/standalone.cpp:49 fatalSignalHandler] Fatal signal 11. Stack trace:
20: /catacombs/Existentia/Rack2Free/Rack() [0x403c8d]

There is no RPJ.json file. I suspect that may be the root cause of the problem.

This was on Kubuntu 20.04 and VCV Rack Free v2.0.6

Remove dist directory from repository

One more issue I noticed is that the dist directory is committed to the repository.

To support an efficient build process on the Rack build system, which clones the repository on build, please remove the dist directory from the repository and its history.

See BFG Repo Cleaner for a way to remove the dist directory from the repo history.

Just removing the dist directory with a commit is NOT ENOUGH.

Genie - Use after free when adding plugin to patch

Address sanitizer detects a use after free when adding Genie to a patch.

Rack: 5551617afff182925940908eaf73a7d7361303cc
RPJ: 5b4b7d0
Build Command: make -j10 EXTRA_FLAGS=-fsanitize=address EXTRA_LDFLAGS=-fsanitize=address

[9.254 info src/app/Browser.cpp:89 chooseModel] Creating module RPJ Genie
[9.254 info src/app/Browser.cpp:93 chooseModel] Creating module widget RPJ Genie
=================================================================
==82150==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x619000037940 at pc 0x00000c13e851 bp 0x00020636e990 sp 0x00020636e988
WRITE of size 4 at 0x619000037940 thread T15
    #0 0xc13e850 in Genie::doPendulum(rack::engine::Module::ProcessArgs const&) Genie.cpp:97
    #1 0x2113868 in rack::engine::Module::doProcess(rack::engine::Module::ProcessArgs const&) Module.cpp
    #2 0x20fd4b7 in rack::engine::Engine::stepBlock(int) Engine.cpp:551
    #3 0x210a6da in rack::engine::Engine_fallbackRun(rack::engine::Engine*) Engine.cpp:1324
    #4 0x210d81a in void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (*)(rack::engine::Engine*), rack::engine::Engine*> >(void*) thread:298
    #5 0x7ff80354d4e0 in _pthread_start+0x7c (libsystem_pthread.dylib:x86_64+0x64e0)
    #6 0x7ff803548f6a in thread_start+0xe (libsystem_pthread.dylib:x86_64+0x1f6a)

0x619000037940 is located 0 bytes to the right of 960-byte region [0x619000037580,0x619000037940)
allocated by thread T0 here:
    #0 0xfc326d in wrap__Znwm+0x7d (libclang_rt.asan_osx_dynamic.dylib:x86_64+0x5426d)
    #1 0x2115b1e in std::__1::vector<rack::engine::Output, std::__1::allocator<rack::engine::Output> >::__append(unsigned long) vector:1115
    #2 0x210f7f9 in rack::engine::Module::config(int, int, int, int) Module.cpp:64
    #3 0xc13ac9d in Genie::Genie() Genie.cpp:29
    #4 0xc146ae4 in rack::plugin::Model* rack::createModel<Genie, GenieModuleWidget>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)::TModel::createModule() helpers.hpp:27
    #5 0x1f9c8ed in rack::app::browser::chooseModel(rack::plugin::Model*) Browser.cpp:90
    #6 0x1f9885b in rack::app::browser::ModelBox::onButton(rack::widget::Widget::ButtonEvent const&) Browser.cpp:259
    #7 0x1f9ad10 in rack::widget::Widget::onButton(rack::widget::Widget::ButtonEvent const&) Widget.hpp:234
    #8 0x1f9ad10 in rack::widget::Widget::onButton(rack::widget::Widget::ButtonEvent const&) Widget.hpp:234
    #9 0x1f9ad10 in rack::widget::Widget::onButton(rack::widget::Widget::ButtonEvent const&) Widget.hpp:234
    #10 0x21375b8 in rack::ui::ScrollWidget::onButton(rack::widget::Widget::ButtonEvent const&) ScrollWidget.cpp:130
    #11 0x1f97668 in rack::app::browser::Browser::onButton(rack::widget::Widget::ButtonEvent const&) Browser.cpp:781
    #12 0x2131e94 in rack::ui::MenuOverlay::onButton(rack::widget::Widget::ButtonEvent const&) MenuOverlay.cpp:34
    #13 0x1f66a48 in rack::widget::OpaqueWidget::onButton(rack::widget::Widget::ButtonEvent const&) OpaqueWidget.hpp:21
    #14 0x215cc9a in rack::widget::EventState::handleButton(rack::math::Vec, int, int, int) event.cpp:134
    #15 0x7ff80617ecd0 in -[NSWindow(NSEventRouting) _handleMouseDownEvent:isDelayedEvent:]+0x12fa (AppKit:x86_64+0x23ccd0)
    #16 0x7ff8060f2e8d in -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:]+0xa15 (AppKit:x86_64+0x1b0e8d)
    #17 0x7ff8060f225d in -[NSWindow(NSEventRouting) sendEvent:]+0x15f (AppKit:x86_64+0x1b025d)
    #18 0x7ff8060f0633 in -[NSApplication(NSEvent) sendEvent:]+0x15f (AppKit:x86_64+0x1ae633)
    #19 0x223ec30 in _glfwPollEventsCocoa cocoa_window.m:1419
    #20 0x2169024 in rack::window::Window::step() Window.cpp:431
    #21 0x2168dc3 in rack::window::Window::run() Window.cpp:409
    #22 0xb329e1 in main standalone.cpp:240
    #23 0x100f3652d in start+0x1cd (dyld:x86_64+0x552d)
    #24 0x100f30fff  (<unknown module>)

Thread T15 created by T0 here:
    #0 0xfb08cc in wrap_pthread_create+0x5c (libclang_rt.asan_osx_dynamic.dylib:x86_64+0x418cc)
    #1 0x210d6d7 in std::__1::thread::thread<void (&)(rack::engine::Engine*), rack::engine::Engine*, void>(void (&)(rack::engine::Engine*), rack::engine::Engine*&&) thread:314
    #2 0x210a1ea in rack::engine::Engine::startFallbackThread() Engine.cpp:1348
    #3 0xb32930 in main standalone.cpp:227
    #4 0x100f3652d in start+0x1cd (dyld:x86_64+0x552d)
    #5 0x100f30fff  (<unknown module>)

SUMMARY: AddressSanitizer: heap-buffer-overflow Genie.cpp:97 in Genie::doPendulum(rack::engine::Module::ProcessArgs const&)
Shadow bytes around the buggy address:
  0x1c3200006ed0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x1c3200006ee0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x1c3200006ef0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x1c3200006f00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x1c3200006f10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x1c3200006f20: 00 00 00 00 00 00 00 00[fa]fa fa fa fa fa fa fa
  0x1c3200006f30: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x1c3200006f40: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x1c3200006f50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x1c3200006f60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x1c3200006f70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==82150==ABORTING
zsh: abort      ./Rack -d

the changelog stops at 1.x, never gets to 2

I don't remember what the "current" branch is here, so I may be wrong. The default branch is main, but I also looked on v2. It doesn't seem like either have been updated in a really long time. The one linked from the library version stops at 1.x also. Maybe you should remove the link from the plugin.json if you don't intend on updating it?

PP Manual Formatting

Just a quick note: Under Controls, Ratio Knob and VCA Knob are not formatted as Headlines.

TuxOn problems

Windows and Macintosh:

  • Zoom In and Zoom Out not doing anything
  • Limited song length
    • If song long enough, then impossible to play entire song
    • VCV sample rate affects how much can be played, but sound quality remains same. For example, I have a ~3:50 mp3 recorded at 48k that can be played in its entirety if VCV sample rate is at 48k. If at 96k then only ~2:50 plays, though entire songs is graphically displayed - it just simply stops playing before reaching end. VCV at 192k only plays ~1:25.

Macintosh only

  • VCV Rack crashes after playing a song when I try to load a new patch. Also, VCV does not shut down properly if I try to close after playing a song
  • Eject does not work, neither does selecting a new song via the context menu

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.