jeremywen / jw-modules Goto Github PK
View Code? Open in Web Editor NEWVCV Rack Modules
License: BSD 3-Clause "New" or "Revised" License
VCV Rack Modules
License: BSD 3-Clause "New" or "Revised" License
It is not necessary to include arch.mk
in Makefile
. Also, the relative include does not work since I am overriding RACK_DIR
to point to the SDK during build. I am not building out of the tree.
diff --git a/Makefile b/Makefile
index 3345dd9..99ad5b3 100644
--- a/Makefile
+++ b/Makefile
@@ -15,8 +15,6 @@ SOURCES = \
$(wildcard lib/oscpack/osc/*.cpp) \
$(wildcard src/*.cpp) \
-include ../../arch.mk
-
ifeq ($(ARCH), win)
SOURCES += $(wildcard lib/oscpack/ip/win32/*.cpp)
LDFLAGS += -lws2_32 -lwinmm
[JW-Modules] Building plugin on platform win...In file included from lib/oscpack/osc/OscOutboundPacketStream.h:43:0,
from lib/oscpack/osc/OscOutboundPacketStream.cpp:37:
lib/oscpack/osc/OscException.h:57:25: warning: ‘virtual const char* osc::Exception::what() const’ can be marked override [-Wsuggest-override]
virtual const char* what() const throw() { return what_; }
^~~~
In file included from lib/oscpack/osc/OscReceivedElements.h:45:0,
from lib/oscpack/osc/OscReceivedElements.cpp:37:
lib/oscpack/osc/OscException.h:57:25: warning: ‘virtual const char* osc::Exception::what() const’ can be marked override [-Wsuggest-override]
virtual const char* what() const throw() { return what_; }
^~~~
lib/oscpack/osc/OscReceivedElements.cpp: In function ‘const char* osc::FindStr4End(const char*, const char*)’:
lib/oscpack/osc/OscReceivedElements.cpp:67:5: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
if( p >= end )
^~
lib/oscpack/osc/OscReceivedElements.cpp:70:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’
if( p[0] == '\0' ) // special case for SuperCollider integer address pattern
^~
In file included from lib/oscpack/osc/OscReceivedElements.h:45:0,
from lib/oscpack/osc/OscPrintReceivedElements.h:42,
from lib/oscpack/osc/OscPrintReceivedElements.cpp:37:
lib/oscpack/osc/OscException.h:57:25: warning: ‘virtual const char* osc::Exception::what() const’ can be marked override [-Wsuggest-override]
virtual const char* what() const throw() { return what_; }
^~~~
lib/oscpack/ip/posix/UdpSocket.cpp:43:10: fatal error: netdb.h: No such file or directory
#include <netdb.h>
^~~~~~~~~
compilation terminated.
make: *** [build/lib/oscpack/ip/posix/UdpSocket.cpp.o] Error 1
I am have major issues with the NoteSeq module. Every time I add it to a patch, less than 3 minutes later it causes a lock up on my laptop. I then have to reboot my system every time.
Rack v0.5.1 will include a plugin manager, and plugins need to follow the versioning guidelines in order to be accepted. You can use this example plugin Makefile and Tutorial.cpp file as a reference for making sure the version is the same in the C++, Makefile, and JSON manifest.
plugin->version
using the Tutorial.cpp file as a reference.Once you've fixed this, send a PR to the Rack community repository and remove the "disabled"
property in the JSON manifest file if present.
The Makefile
should define a variable called RACK_DIR
, which can be set to the location of the Rack source code. This allows compiling the plugin outside of the Rack source tree.
See API Update Thread.
I notice that coordinates for layout out labels don't match the coordinates used for placing Knobs, Inputs, etc. I've encountered the same annoyance in my code and was wondering if there was a better way.
The definition of the Blues scale here:
http://www.grantmuller.com/MidiReference/doc/midiReference/ScaleReference.html
is wrong, should be
1, b3, 4, b5, 5, b7
(0, 3, 5, 6, 7, 10)
Hello Jeremy,
First, "bravo" and thanks for your great modules.
I am in touch with "phdsg" who asks me to think about a module based on physics.
Since I made a module ChUTE which is a trigger based on a "bouncing ball" movement he thinks, and it makes sense, that I could do something like that carambolage
I have seen in your repository that you launched BouncyBall.cpp.
Is it something that you will push in that direction ?
Best,
Thanks for the modules! I'm enjoying them.
I've noticed an issue with the gate buttons.
After I hit Rnd Gates it seems like the first click on a gate button that is off has no effect.
I'm on Rack 0.5.1 on Linux.
Lines 160 to 165 in 172f20f
struct MyBlueValueLight : ModuleLightWidget {
MyBlueValueLight() {
addBaseColor(nvgRGB(25, 150, 252));
}
};
hi JW!
I've been reading your code, you've got a lot of "how did he do that" stuff. Very educational!
While I was trying to be sure I can't use quantization, quite, in some of my creations, I took a close look at your quantization algorithm. The intervals it produces are a bit odd. By instrumentation as well as isolating the heart of your technique, I find that in an octave, the notes output enjoy different size slices of the 1 volt. For a C major scale, for example, the following widths are seen:
0.09 | C
0.17 | D
0.12 | E
0.12 | F
0.17 | G
0.17 | A
0.15 | B
I changed the code in quantizeutils.cpp like:
for (int i = 1; i < notesInScale; i++) {
scaleNoteInVolts = curScaleArr[i] / 12.0;
if (scaleNoteInVolts > voltMinusOct) {
closestVal = curScaleArr[i - 1] / 12.0;
break;
}
closestVal = curScaleArr[i] / 12.0;
}
which produces these widths:
0.17 | C
0.17 | D
0.08 | E
0.17 | F
0.16 | G
0.17 | A
0.07 | B
One could also imagine just cutting the one volt range into notesInScale number of same-sized "buckets". Here 0.143 volts each.
My sense is that there is no right or wrong, but I write to ask if this behaviour is what you intended and is it a synthesizer/quantizer general method, given that I did see it implemented elsewhere as you did it, with the same intervals/switching points.
My stuff just produces note numbers, it breaks the standard volt/octave model but I do all of that before output. It was in looking into providing a selection of scales that got me onto thinking I could just rely on someone's external quantizer. I don't think that will work, so I will have to bring the whole scale thing into my module.
a7
I can't tell if I'm being dumb or NoteSeq is not working right. My expectation was that when I had three notes stacked in the grid that it would send three channels of notes out the poly v/oct jack. As it is it seems to send 16 channels of notes with most of them being set to zero. This means that if I send that into Bleak (for instance) it will produce 16 channels of notes rather than the 3 I want. Am I missing something? I know there's an "include inactive" switch but that doesn't seem to do very much.
(win 7)
As you know your quantizer module displays the scale that is selected by the scale-selection knob.
However it does not display the current scale when it is selected by CV inputs instead. The same is true for the current root note when selected by CV.
This makes the module very difficult to use with CVs, unless you really don't care about the result or can easily tell the difference between scattered notes quantized in an Aeolian vs. a Phrygian scale, say.
I'd be grateful if you could update the module to display scales and root notes whether selected by knobs or CVs.
NoteSeq only outputs a short blast of signal when the playhead gets to a note, messing with the ADSR.
A gate mode option like in GridSeq would fix that.
I guess the topic says it all. I'd like to be able to use a trigger input to randomize the shape of the pattern on the xypad instead of clicking the button. Any chance of this being implemented?
I would also love a trigger input which causes the the pattern to play once, in addition to the current gate input. :)
I downloaded JW-Modules, hoping to use NoteSEQ on my windows computer, but it just doesn't show up in the menu.
Hi Jeremy,
I've noticed that the lydian scale used by the NoteSeq sequencers isn't quite right, as it has a flat seventh instead of a major seventh. Not a huge issue, but slightly frustrating that the lydian mode isn't right on my favourite sequencer ever.
I love your stuff! helps make some great music.
Cheers
Hi JW,
In Win 10 , rack v 0.6c when I unzip your plugins to document\rack\plugins folder and start vcvrack I get error "could not load plugin \path to plugin" and in the log.txt the following is observed : Failed to load library C:\Users\myusername\Documents/Rack/plugins/JW-Modules/plugin.dll: code 127.
Any idea how to solve this please ?
Regards
bob
Rack v1.0.0 crashes when selecting any of the 3 blank modules ("JW Head") in the module browser.
Stack trace:
Program terminated with signal SIGSEGV, Segmentation fault.
#0 rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button> (e=..., f=&virtual table offset 72, this=0x56529fb188d0) at include/widget/Widget.hpp:122
122 if (!e.isPropagating())
[Current thread is 1 (Thread 0x7fa8cd649180 (LWP 22220))]
(gdb) bt
#0 0x000056529ca6bf77 in rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button>(void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button const&) (e=..., f=&virtual table offset 72, this=0x56529fb188d0)
at include/widget/Widget.hpp:122
#1 0x000056529ca6bf77 in rack::widget::Widget::onButton(rack::event::Button const&) (this=0x56529fb188d0, e=...) at include/widget/Widget.hpp:143
#2 0x000056529cabaddd in rack::engine::Module::toJson() (this=0x56529fb188d0) at src/engine/Module.cpp:58
#3 0x000056529caa2174 in rack::app::ModuleWidget::toJson() (this=0x56529edd72e0) at src/app/ModuleWidget.cpp:498
#4 0x000056529ca34e05 in rack::history::ModuleAdd::setModule(rack::app::ModuleWidget*) (this=this@entry=0x56529ed8d490, mw=mw@entry=0x56529edd72e0) at src/history.cpp:51
#5 0x000056529ca9d052 in rack::app::ModelBox::onButton(rack::event::Button const&) (this=0x56529ed4b470, e=...) at src/app/ModuleBrowser.cpp:585
#6 0x000056529ca6bf64 in rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button>(void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button const&) (e=..., f=&virtual table offset 72, this=0x56529ec009a0)
at include/widget/Widget.hpp:135
#7 0x000056529ca6bf64 in rack::widget::Widget::onButton(rack::event::Button const&) (this=0x56529ec009a0, e=...) at include/widget/Widget.hpp:143
#8 0x000056529ca6bf64 in rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button>(void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button const&) (e=..., f=&virtual table offset 72, this=0x56529ebfdcb0)
at include/widget/Widget.hpp:135
#9 0x000056529ca6bf64 in rack::widget::Widget::onButton(rack::event::Button const&) (this=0x56529ebfdcb0, e=...) at include/widget/Widget.hpp:143
#10 0x000056529ca6bf64 in rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button>(void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button const&) (e=..., f=&virtual table offset 72, this=0x56529ebfdbd0)
at include/widget/Widget.hpp:135
#11 0x000056529ca6bf64 in rack::widget::Widget::onButton(rack::event::Button const&) (this=0x56529ebfdbd0, e=...) at include/widget/Widget.hpp:143
#12 0x000056529ca73914 in rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button>(void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button const&) (e=..., f=&virtual table offset 72, this=0x56529ec00870)
at include/widget/Widget.hpp:135
#13 0x000056529ca73914 in rack::widget::Widget::onButton(rack::event::Button const&) (e=..., this=0x56529ec00870) at include/widget/Widget.hpp:143
#14 0x000056529ca73914 in rack::ui::ScrollWidget::onButton(rack::event::Button const&) (this=0x56529ec00870, e=...) at src/ui/ScrollWidget.cpp:67
#15 0x000056529ca6f23e in rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button>(void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button const&) (e=..., f=&virtual table offset 72, this=0x56529ec026e0)
at include/widget/Widget.hpp:135
#16 0x000056529ca6f23e in rack::widget::Widget::onButton(rack::event::Button const&) (e=..., this=0x56529ec026e0) at include/widget/Widget.hpp:143
#17 0x000056529ca6f23e in rack::widget::OpaqueWidget::onButton(rack::event::Button const&) (this=0x56529ec026e0, e=...) at include/widget/OpaqueWidget.hpp:21
#18 0x000056529ca99a52 in rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button>(void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button const&) (e=..., f=&virtual table offset 72, this=0x56529ebfd770)
at include/widget/Widget.hpp:135
#19 0x000056529ca99a52 in rack::widget::Widget::onButton(rack::event::Button const&) (e=..., this=0x56529ebfd770) at include/widget/Widget.hpp:143
#20 0x000056529ca99a52 in rack::widget::OpaqueWidget::onButton(rack::event::Button const&) (e=..., this=0x56529ebfd770) at include/widget/OpaqueWidget.hpp:21
#21 0x000056529ca99a52 in rack::app::BrowserOverlay::onButton(rack::event::Button const&) (this=0x56529ebfd770, e=...) at src/app/ModuleBrowser.cpp:110
#22 0x000056529ca6f23e in rack::widget::Widget::recursePositionEvent<void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button>(void (rack::widget::Widget::*)(rack::event::Button const&), rack::event::Button const&) (e=..., f=&virtual table offset 72, this=0x56529e7e7de0)
at include/widget/Widget.hpp:135
#23 0x000056529ca6f23e in rack::widget::Widget::onButton(rack::event::Button const&) (e=..., this=0x56529e7e7de0) at include/widget/Widget.hpp:143
#24 0x000056529ca6f23e in rack::widget::OpaqueWidget::onButton(rack::event::Button const&) (this=0x56529e7e7de0, e=...) at include/widget/OpaqueWidget.hpp:21
#25 0x000056529ca6ab9b in rack::event::State::handleButton(rack::math::Vec, int, int, int) (this=0x56529e792350, pos=..., button=0, action=1, mods=<optimized out>) at src/event.cpp:124
#26 0x000056529cace733 in processEvent (event=0x7ffffcd9fef0) at /home/cschol/src/Rack-1.0/dep/glfw/src/x11_window.c:1391
#27 0x000056529cace733 in _glfwPlatformPollEvents () at /home/cschol/src/Rack-1.0/dep/glfw/src/x11_window.c:2698
#28 0x000056529cac5de0 in glfwPollEvents () at /home/cschol/src/Rack-1.0/dep/glfw/src/window.c:1070
#29 0x000056529ca649d7 in rack::Window::run() (this=0x56529e7e1560) at src/window.cpp:318
#30 0x000056529c9dd4ac in main(int, char**) (argc=<optimized out>, argv=<optimized out>) at src/main.cpp:174
If you try and turn the 'Speed' knob -- i.e. what controls the generation time in the Game of Life mode, it goes fully counterclockwise and won't move.
WORKAROUND: You can still set values if you right click on the knob and type in a value.
Lol sry lack of sleep figured it out.
On VCV v0.4.0 (havent tried latest dev build), MacOS
Noticed this today with a patch, the plug lights and graphics freeze temporarily and sporadically when gridseq is part of the patch. Sound is not interupted, just graphics. This behavior was not present until the scale and random outputs were added.
Here is a screencap: https://www.dropbox.com/s/3kjyjln9y8rrnmx/GridSeq%20pauses.mov?dl=0
Is your development of the Bouncing Balls Module your take on SOU - Source Of Uncertainty or something else?
hi there. I was wondering if it is possible to get a single multitrack sequencer each out is a different sequence. But all of them are linked to global root and scale mode. Adding randomization. that would be cool I think.
OS: Windows 7, Windows 10.
VCV Rack 0.6.1 (official release).
Plugin: v0.6.1 (Latest commit 92b3d85 on 16 May).
Hi Jeremy,
By placing 0Cat module on rack, Rack may crash as soon as you attempt to add cable between two modules. Video here!
Regards.
Dominique
Grid Seq is great, thanks! I would love to have separate outputs for X and Y gates, the ablity to
skip steps and memorized coordinate sets similar to rene if possible.
I'm reporting this both to you and to stoermelder, as I have no way of knowing where the problem originates.
8vert_noteseq_bug.zip
When 8face recalls the data in NoteSeq, certain of the recalled notes are displayed correctly, but they don't reach the playback mechanism. Re-editing and re-storing the notes will start to correct the problem, if new notes are entered, but the fix is quirky, as this video illustrates.
The missing notes seem consistently to be in the later part of the pattern. If you need more info, I'm at [email protected].
yeah, what the title says...
NoteSeq is performing memory allocations with new
and overwriting the cells
variable on each step of life, rotate, flip and shift. This has two consequences:
A potential solution to this is to continuously flip between two preallocated cells arrays.
make
g++ -fPIC -I../../include -I../../dep/include -MMD -g -O3 -march=nocona -ffast-math -fno-finite-math-only -Wall -Wextra -Wno-unused-parameter -DARCH_LIN -Wsuggest-override -std=c++11 -c -o build/src/BouncyBall.cpp.o src/BouncyBall.cpp
In file included from src/BouncyBall.cpp:2:0:
src/JWModules.hpp:27:7: warning: ‘virtual void FullScopeWidget::step()’ can be marked override [-Wsuggest-override]
void step();
^~~~
src/JWModules.hpp:28:10: warning: ‘virtual json_t* FullScopeWidget::toJson()’ can be marked override [-Wsuggest-override]
json_t toJson();
^~~~~~
src/JWModules.hpp:29:7: warning: ‘virtual void FullScopeWidget::fromJson(json_t)’ can be marked override [-Wsuggest-override]
void fromJson(json_t rootJ);
^~~~~~~~
src/JWModules.hpp:40:8: warning: ‘virtual rack::Menu GridSeqWidget::createContextMenu()’ can be marked override [-Wsuggest-override]
Menu createContextMenu();
^~~~~~~~~~~~~~~~~
src/JWModules.hpp:94:7: error: ‘void SmallWhiteKnob::onChange()’ marked ‘override’, but does not override
void onChange() override {
^~~~~~~~
src/JWModules.hpp: In member function ‘void SmallWhiteKnob::onChange()’:
src/JWModules.hpp:95:23: error: no matching function for call to ‘SmallWhiteKnob::onChange()’
RoundKnob::onChange();
^
In file included from ../../include/gui.hpp:2:0,
from ../../include/rack.hpp:8,
from src/JWModules.hpp:1,
from src/BouncyBall.cpp:2:
../../include/app.hpp:219:7: note: candidate: virtual void rack::SVGKnob::onChange(rack::EventChange&)
void onChange(EventChange &e) override;
^~~~~~~~
../../include/app.hpp:219:7: note: candidate expects 1 argument, 0 provided
In file included from src/BouncyBall.cpp:2:0:
src/JWModules.hpp: At global scope:
src/JWModules.hpp:121:43: error: expected class-name before ‘{’ token
struct MyBlueValueLight : ColorValueLight {
^
src/JWModules.hpp: In constructor ‘MyBlueValueLight::MyBlueValueLight()’:
src/JWModules.hpp:123:3: error: ‘baseColor’ was not declared in this scope
baseColor = nvgRGB(25, 150, 252);
^~~~~~~~~
src/JWModules.hpp:123:3: note: suggested alternative: ‘bndTextColor’
baseColor = nvgRGB(25, 150, 252);
^~~~~~~~~
bndTextColor
src/BouncyBall.cpp: At global scope:
src/BouncyBall.cpp:31:7: warning: ‘virtual void BouncyBall::step()’ can be marked override [-Wsuggest-override]
void step();
^~~~
src/BouncyBall.cpp:32:7: error: virtual function ‘virtual void BouncyBall::initialize()’
void initialize(){
^~~~~~~~~~
In file included from ../../include/rack.hpp:7:0,
from src/JWModules.hpp:1,
from src/BouncyBall.cpp:2:
../../include/engine.hpp:70:15: error: overriding final function ‘virtual void rack::Module::initialize()’
virtual void initialize() final {}
^~~~~~~~~~
src/BouncyBall.cpp:32:7: warning: ‘virtual void BouncyBall::initialize()’ can be marked override [-Wsuggest-override]
void initialize(){
^~~~~~~~~~
src/BouncyBall.cpp:36:10: warning: ‘virtual json_t BouncyBall::toJson()’ can be marked override [-Wsuggest-override]
json_t toJson() {
^~~~~~
src/BouncyBall.cpp:41:7: warning: ‘virtual void BouncyBall::fromJson(json_t)’ can be marked override [-Wsuggest-override]
void fromJson(json_t rootJ) {
^~~~~~~~
src/BouncyBall.cpp: In member function ‘virtual void BouncyBall::step()’:
src/BouncyBall.cpp:62:39: error: ‘gSampleRate’ was not declared in this scope
bool pulse = gatePulse.process(1.0 / gSampleRate);
^~~~~~~~~~~
src/BouncyBall.cpp:62:39: note: suggested alternative: ‘glSampleMaski’
bool pulse = gatePulse.process(1.0 / gSampleRate);
^~~~~~~~~~~
glSampleMaski
src/BouncyBall.cpp: At global scope:
src/BouncyBall.cpp:89:7: warning: ‘virtual void BouncyBallDisplay::draw(NVGcontext)’ can be marked override [-Wsuggest-override]
void draw(NVGcontext *vg) {
^~~~
make: *** [../../compile.mk:54: build/src/BouncyBall.cpp.o] Error 1
Hello! I was playing with your module and since I am a HUGE fan of Cellular Automata I have some suggestions you might (or might not) taking in consideration. I am not a programmer/coder so I fear it would take ages for me to implement, that's why I have opened this issue:
BTW, that module is AWEEEESOMEEEE!!!!!!! <3
Hi Jeremy,
see this thread here:
https://community.vcvrack.com/t/rack-crash-upon-file-load/6741/
Rack crashed after opening an older patch that had Fullscope spawning multiple rows,
the crash was debugged by Ben and he found out that Fullscope crashed Rack.
Just to let you know about it :)
Take care!
Deleting wav head is causing a crash in Rack. Latest version, also tried it with a previous version.
As discussed on the VCVRack forum.
Add an option -- context menu, or even better, per-divisor toggle -- to have the Nth divisor put out a trigger on the first clock pulse after reset.
In other words: consider the /4 output. It will generate this stream of pulses
. . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . |
With 'start from 1st pulse mode:'
| . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . .
Hi,
Noteseq16 is awesome, thx for making it!
Can we have pentatonic minor among the scales maybe replacing one of (Aeolian, nat. Minor, Minor which are all the same thing?!?)
I noticed that the grid remains one half step per line if you quantise it with the scale/note nob. Could you perhaps switch the grid view to 1 diatonic step per line so we could get two octaves range on the grid?
Cheers!
I can consistently get NoteSeq v1.03 to crash VCV Rack 1.1.1 by:
1, Load NoteSeq into a rack (doesn't even need to be connected to anything)
2. Draw a few random notes
3. Engage the Life button
4. Increase the speed knob
Result: within a second or two of playing with the speed knob, VCV Rack will crash to desktop.
Using Windows 10 x64, Windows MIDI, RME Fireface via ASIO in case any of that matters.
Hello! Feature requests OK here? I'd like video frame sharing support, aka spout 2 for fullScope so that I can use it with Cathodemer. Any possibility of that happening? :)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.