Git Product home page Git Product logo

usbmidiklik4x4's Introduction

    __ __| |           |  /_) |     ___|             |           |
       |   __ \   _ \  ' /  | |  / |      _ \ __ \   |      _` | __ \   __|
       |   | | |  __/  . \  |   <  |   |  __/ |   |  |     (   | |   |\__ \
      _|  _| |_|\___| _|\_\_|_|\_\\____|\___|_|  _| _____|\__,_|_.__/ ____/

NEWS

Limited number of the new UMK4x4 PCB v2.3 available at Tindie right now !

The inclination towards smaller hardware devices has made it increasingly difficult to make use of DIN connectors for MIDI In/Out in the past few years. Many manufacturers have chosen to use 3.5mm "TRS" connectors instead. It is why The KikGen Labs team released a new UM4x4 V2.3 board based on the STM32F103 Bluepill. This new board uses 3,5MM TRS jacks instead of midi DIN, with full MMA RP-054 type A compliance. Midi DIN is still possible obviously, under the form of a 4 mini 3.5mm jacks to DINs rail board, so you can "patch" midi in and out as you want.
The Kikgen Labs Tindie place

New release V2.5.2 : Velocity curve transformation pipes

3 news pipes have been added in that release :
  • VLCURV1 : allows you to define a default 5 segments velocity curve by adjusting 4 in ranges to out values.
  • VLCURV2 : allows you to define a single segment of the velocity curve with a (midi in, midi out) pairs. You can use that to define a fully customized curve, by adding, for example, eight pipes that will form 9 segments. It can be combined with VLCURV1 to adjust only some specify segments of a the 4 values curve.
  • VLCURV3 : allows you to choose a predefined velocity curve between 6 presets : compressed for hard player, medium velocity, compresser/expander, low velocity 1 & 2, top and bottom ends cut

https://github.com/TheKikGen/USBMidiKliK4x4/releases/tag/v2.5.2

New release : V2.5.1 correcting the MSGFLTR pipe bug

This v2.5.1 release includes a bug correction in parameters validation of the MSGFLTR pipe that was blocking the function #2. https://github.com/TheKikGen/USBMidiKliK4x4/releases/tag/v2.5.1

USBMidiKliK4x4

A multi-port USB MIDI interface for the STM32DUINO platform.

Download the last firmware here : https://github.com/TheKikGen/USBMidiKliK4x4/releases

User manual is here : https://github.com/TheKikGen/USBMidiKliK4x4/wiki/UMK4x4-V2.5-User-Manual

Check also the wiki here : https://github.com/TheKikGen/USBMidiKliK4x4/wiki

The story of this project starts with a hack of the MIDIPLUS/MIDITECH 4x4 USB to MIDI interface. Needing more midi jacks, I bought a second Miditech interface, but I discovered it was not possible to use 2 Miditech / Midiplus MIDI USB 4X4 on the same computer to get 8x8, and according to the Miditech support, as that usb midi interface was not updateable at all ! I was stucked....That was motivating me enough to write a totally new and better firmware : the UsbMidiKlik4x4 project was born.

The current version V2.5 supports full USB midi until 16xIN , 16XOUT plus routing features, enabling configurables standalone mode, merge mode, thru mode, split mode, midi transformation, midi clock, etc., huge sysex flow, configuration menu from serial USB, and is very fast and stable thanks to the STM32F103. More of that, you can aggregate until 5 3x3 boards seen as one by activating the "Bus mode".

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.

If you are a regular user of USBMidiKlik, please consider making a donation to encourage our team, and to pay for the coffees swallowed during the long nights of coding !

Donate

USBMidiKliK4x4 features

  • STM32F103C8 / STM32F103CB / STM32F103RB / STM32F103RC uC support
  • Bluepill and Miditech 4x4 board support
  • 16 MIDI USB IN/OUT
  • 15-16 MIDI JACK IN / JACKS OUT *1
  • 8 Virtual internal IN/OUT
  • 4 midi clock and Midi Time Code generators
  • Full remote configuration by SYSEX
  • Configuration user interface from a serial USB terminal
  • Support of large sysex flow
  • Complex routing engine allowing to route any IN to any OUT
  • Transformation pipes allowing dynamic modification of midi messages
  • Customisable USB device ProductStringName, Vendor and Product Ids
  • STANDALONE mode (no USB host needed)
  • INTELLITHRU mode allowing specific routing rules when USB is idle
  • Stackable interfaces in bus mode to get 6x6 to 15x15 physical midi ports

The "pipeline" feature allows you to modify an incoming midi message through a chain of transformation functions (a "pipe"), e.g., transpose notes, split, map channel to another, map CC to another, etc...New pipes can be easily added in order to obtain complex midi transformations without degrading performances.

4 Midi clock generator / 8 virtual ports are available within the routing engine. Below is an overview of the possible paths for a midi message packet, coming from a physical in port to a physical out port :

The bus mode allows the aggregation of up to five interfaces using the I2C protocol, which will be seen as a single interface by the usb host and/or the midi routing engine (including standalone mode).

Last release of the firmware can be found here : https://github.com/TheKikGen/USBMidiKliK4x4/releases/ Update tool is included. Unzip and launch the UMK_BluePillUpdate.bat file (Windows only currently).

USBMidiKlik 4x4 PCB ready to be used

The Kikgen Labs Tindie place

A new version of the USBMidiKlik 4x4 PCB ready-to-use (based on a STM32F103) is available now at Tindie

The board is USB Powered, so no additional power supply necessary. It works driverless as a class compliant device, with all Windows and Linux versions, Mac OS X, Akai MPC Live/X/Force, IOS, Android...

To simplify connectivity, this board uses now only 3.5mm jacks for MIDI and I2C :

  • 6 TRS jacks : 3 MIDI in, 3 out, compliants with the MMA RP-054 type A specifications.
  • You can use TRS to Midi DIN conversion cables, or connect your MIDI device directly with a simple stereo cable.
  • 4 TRS jacks are now used instead connectors for stacking multiple boards on the I2C bus with 1 pair of stereo cables (power and data).

You will find also at Tindie, a 4 ports "midi rail" PCB allowing MIDI DIN from/to TRS. This can help if your need MIDI DIN ports and/or to arange the order of the DIN ports.
With a single board, you can set e.g. 2 MIDI DIN IN and 2 OUT or 3 IN, 1 OUT, or you can set a 16 DIN ports (8 IN, 8 OUT) with 4 PCB, etc.. With 8 midi rail boards and 5 UMK4x4 stacked boards, it is possbile to get 30 midi DIN ports (15 x IN + 16 x OUT). NB: The UMK4x4 supports only 3 physical IN and 3 physical OUT.

The first protoype of the bus mode I use every day !

MKPI : UMK4x4 graphical frontend

Orzdk has developped a graphical UI for manipulating and configuring the USBMidiKliK settings in sysex mode, from a web browser. It also allows to show visual representation of the routes and transformations that are currently applied in your USBMidiKlik.

https://github.com/orzdk/mkpi

USBMidiKliK4x4 - Configuration overview

Prebuilt binaries are compiled for the tkg-hid-bootloader since the 2.5 version, so you need the tkg-hid-bootloader firmware here : https://github.com/TheKikGen/stm32-tkg-hid-bootloader/blob/master/F1/bootloader_only_binaries/tkg_hid_generic_pc13.bin

You can then use TKG-FLASH.EXE provided in the release to flash the 128K or the 64k bluepill version.
The 128K firmware should work on a 64K Bluepill most of the time. If it is not the case, try the 64K firmware version.

2 modes can be used to configure the USBMidiKlik midi : system exclusive messages or a configuration menu. Sysex messages have the following format, and ARE ONLY INTERPRETED ON CABLE 0 OR MIDI IN JACK 1 :

F0 77 77 78 <sysex function id > <data> F7

The "F0 77 77 78" is the specific sysex header for USBMidiKlik4x4. Know that it is a totally unofficial header. You will find the sysex V2.5 documentation in the repository :

https://raw.githubusercontent.com/TheKikGen/USBMidiKliK4x4/master/UMK-4X4-SYSEX-IPL.TXT

The second way is to activate the configuration menu on the serial port with the following sysex :

   F0 77 77 78 06 08 F7

To send that Sysex, you can use for example, MIDIOX, or the "sendmidi" command line utility by gbevin :

   sendmidi dev "USB MIDIKliK 4x4" syx hex 77 77 78 06 08

You will find the last binary release of sendmidi here : https://github.com/gbevin/SendMIDI/releases

Immediatly after sending this sequence with your prefered midi software, the interface will reboot in CDC serial COM mode, allowing you to open a terminal to configure easily USBMIDIKLIK.

You can use any software like TERATERM, on Windows, or "screen" on MacOs. The bauds rate must be set to 115200. The following menu should appear after connecting to the right serial USB port , and pressing ENTER :

USBMIDIKLIK 4x4 - BLUEPILL STMF103C8x - V2.0
(c) TheKikGen Labs
https://github.com/TheKikGen/USBMidiKliK4x4

[0] View global settings         [a] Show active devices
[1] View midi routing            [d] SYSEX settings dump
[2] Usb VID PID
[3] Usb product string
[4] Cable OUT routing            [e] Reload settings
[5] Jack IN routing              [f] Factory settings
[6] IntelliThru routing          [r] Factory routing
[7] IntelliThru timeout          [s] Save settings
[8] Toggle bus mode              [z] Debug on Serial3
[9] Set device Id                [x] Exit
=>

Don't forget to save your settings with the "s" option before leaving the configuration menu with "x".

WIKI

usbmidiklik4x4's People

Contributors

orzdk avatar thekikgen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

usbmidiklik4x4's Issues

Just a little help ?

Hello,
This issue is just to start conversation, this is not an issue on your project ...
I m working on a midi device with a blue pill. I m working with STM32duino USBComposite library.
Your library seems close to this USBComposite library. So I would appreciate your help if possible :) I think it could be quickly fixed.
I have a problem : I can receive data but I can't transmit... If you have a little bit time to help me, I ll be thankful. I think its perhaps :

  • usb descriptors which are not correct.
  • bootloader issue but I m not sure...

Thanks in advance.
Regards
Aurélien

MSGFLTR Double Status Filter not possible to set

Sorry if I misunderstand, but MSGFLTR double status option par3 & par4 seems to expect values from 80 to FF which will not go into a sysex message. Parameter range for par3/4 should probably be 0x8-0xE (or +0xF if common/realtime can also be removed) BR

Possible ProcessSysExInternal() filtermask bug?

Had some trouble setting filters with sysex, but only on source type 1 serial, so I examined the parsing. Could there be an error in line 738 in UsbMidiKliK4x4.ino:

*filterRouting = (*filterRouting & 0xF0 ) | ( filtersMsk << 4) ;

should be

*filterRouting = (*filterRouting & 0xF0 ) | filtersMsk;

BR Jesper

Tiny bug in filter dump

1
Filter dumps cable filters when serial filters are requested (mask 0x0F020100). Line 599 in the .ino should probably be

if (src) {

2
Dump engine is not able to report cable/serial targets >7 due to inadequate var size. Changing line 539 to

uint16_t msk;

seems to work.

BR !

CHANMAP does not work in channel map mode because of a code bug

The code below is missing else statement after the second if. Currently it causes any pipe with CHANMAP set to channel map (i.e. ==0) mode just to drop the MIDI message because the last if fires unconditionally, returns false thus the whole function returns false. Observed live in my setup.

mod_miditransfn_pipes.h
...
  // Map channel to channel
  if (pipe->par1 == 0 ) {
...
  }
  else
  // Map channel to port (of the same port type)
  if (pipe->par1 == 1 ) {
...
  }
  // channel offset
  if (pipe->par1 == 2 ) {
...
  }
  else return false; // Error

Pre-build binaries do not work for STM32F103C8T6

I try to flash a STM32F103C8T6 (bluepill) but it does not work: after uploading the firmware (with the following commands), the board seems to be stuck in bootloader mode and no midi device is detected.

To install bootloader:

git clone https://github.com/TheKikGen/stm32-tkg-hid-bootloader.git
cd cli
make -f Makefile.linux
install -m 755 binaries_dist/tkg-flash /usr/bin
cd ../stm32-tkg-hid-bootloader/F1/bootloader_only_binaries
st-flash write tkg_hid_generic_pc13.bin 0x08000000

To install firmware

git clone https://github.com/TheKikGen/USBMidiKliK4x4.git
cd USBMidiKliK4x4umk4x4/bin
tkg-flash umk4x4.stm32f103c8-64k-o2.bin

All is fine but after reset, the board is stuck in bootloader mode:

dmesg | tail -4
[ 1015.285729] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 1015.285731] usb 2-2: Product: TKGL BTL
[ 1015.285731] usb 2-2: Manufacturer: TKGL BTL
[ 1015.286856] hid-generic 0003:1209:BEBA.0004: hiddev0,hidraw1: USB HID v1.11 Device [TKGL BTL TKGL BTL] on usb-0000:01:1b.0-2/inp

What am I missing?

sharing PCB design files for 3x3 shield

Hello,

First of all thank you very much for this amazing piece of software, the usb/midi devices (which are actually working as expected) are pretty expensive and this is perfect solution for DIY people out there.

I saw you also created a shield PCB for 3x3 interface which you sell on tindie.
Would it be possible to include eagle/kicad design files (or whatever PCB design software you used) in the git repo, maybe also including the BOM ?

I know you do this for free and the PCB shield you sell on tindie is at least some sort of income, but i think it would really benefit some people, especially from poor countries and countries where the shipping cost would actually be higher than the price for the shield itself ( in which case it would be even cheaper to buy some proprietary interface ).

Thank you !

General confusion

Hello,
I am having some trouble configuring my 4x4 device to do something simple- I want to merge all 3 DIN input jacks to 1 output. I do not want to filter or transform any data, just merge it. I am using V2.5.

This is likely my fault as I am trying to use the Terminal configuration and I'm likely missing something simple as this is far more customizable that I need and I'm getting lost in the details. Can you explain simply how to do this from within the Configuration Menu- not Sysex? I think I'm having an issue defining the function of the Pipeline but I can't see any way to do so from this menu either.
Thank you

Building Arduino Code!

Hey thanks for the code, im trying to build the arduino code, but the file midiXparser.h is missing, I trying to mod the code cause I need to get the multi midi usb cable(ports ) code for another project. Please help

Wiki: Circuit Mod Diagram Error

Hi y'all 👋🏼

I found an error on the Wiki article "The Miditech Midiplus 4x4 hack and STM32Duino".

The [RST] callout in the fifth image down is pointing to the [+3.3V] line coming from the LDO, not the [RST] pin.

It looks like R26 is a pull-up resistor. In that image, the top of R26 is [3v3] and the bottom is [RST]. Note that its neighbor C16 is decoupling [RST] with respect to ground.

Although this wiring may be working for folks, it's bad practice and should be corrected. While I haven't tested it, I'm guessing that the reset pulse sent by the TTL-to-serial converter may be sufficiently brief to pull the LDO output low enough that the uC resets. However this shorts the LDO output to ground through the TTL-to-serial converter every time.

Thanks for your work, TheKikGen team! This project writeup is fantastic 🙏🏼

Loopback question

I understand that if a LOOPBCK pipe is used, no more pipes in the slot is run (illustrated by the red dashed object), but how about the "original" route, will that still be fullfilled? Consider this example, a channel voice filtered loopback to virtual0in has been added to jack0in.

Question is, will channel voice reach virtual0in and the unfiltered message still reach cable0out, or will only channel voice reach virtual0in ?

Thanks for clarification : )
BR

ex1

Bus related unit crash on sysex route reset

Hey, i will collect findings in issues here.

Summary: Setting or resetting routings by sysex crashes program loop

Symptoms: Blinking unresponsive unit, hangs midiox upon exit. When physical reset button pressed, midiox exists, and unit works again. Important: The changes that was requested by the sysex that crashed the unit, has actually correctly taken place.

The sysex processing comes back fine from the SysExInternalFnVector call which explains why it saves correctly, but fails when subsequently trying to sync the bus in [mod_i2cbus.h\I2C_SlavesRoutingSyncFromMaster()]

483: I2C_SendCommand(0, B_CMD_START_SYNC);

Which is called from [mod_intsysex.h\SysExInternal_Process()]

192: if ( SysExInternalFnVector[i].needBusSyncIfSucceed && !(B_IS_SLAVE) ) I2C_SlavesRoutingSyncFromMaster();

I'm on a 3x3, verified bus mode is disabled and device id = 4. As it's not slave but not on the bus either, I2C sync should probably not start, so I made a hack to continue UI development, but it's probably not the correct solution.

192: if ( SysExInternalFnVector[i].needBusSyncIfSucceed && !(B_IS_SLAVE) && EE_Prm.I2C_BusModeState == B_ENABLED ) I2C_SlavesRoutingSyncFromMaster();

BR : )

Port out mask sampling seems to start one byte short

In mod_intsysex.h line 498, mask target sampling starts in message byte 4 which seems to be the outporttype for 0E 03 messages. Should this be 5 ?
|
v
for ( uint8_t i = 5 ; i <= msgLen ; i++) {
if ( sxMsg[i] < SERIAL_INTERFACE_COUNT )
newMsk |= 1 << sxMsg[i] ;
else return SX_ERROR_BAD_PORT;
}

BR : )

Allow for "blind" serial target configuration ?

Hey : )

Setting non-existant serial targets by sysex config is blocked by line 1045 and 1052.
1045 if (dstType == 1 && msgLen > (SERIAL_INTERFACE_COUNT + 5) ) break;
1052 (dstType == 1 && b < SERIAL_INTERFACE_COUNT) ) {

I propose allowing setting blind serial targets, as it will allow for configuration of a bus environment without having all units connected, and should be safe from a routing perspective as the serialOutTargets iterator only counts to SERIAL_INTERFACE_COUNT anyway.

Fixed in my local branch by defining SERIAL_INTERFACE_CONFIG_MAX and using that in 1045,1052, so just a suggestion.

BR

Blue Pill Prototype Board

Any chance to get in contact with for trying your STMF103C8T6 3x3 midi interface prototype boards ? :-) I tried writing on the stm32duino forum but it seems that its closing and private messages aren´t allowed for newbies.

Problem in version 2.5

Good work!
In version 2.5 (testing on blackpill F103c8, 64K firmware umk4x4.stm32f103c8-64k-o2.bin) :
after sending command: Reboot in configuration mode (F0 77 77 78 06 08 F7) -
device is reboot in update mode!
USB\VID_1209&PID_BEBA
After reflashing - device onсe enter to config mode (COM Port is on),
and after - no entering to configuration mode.

cant get to configuration menu in serial mode

Hi,

Iam trying for multiple days now to get to the configuration menu and cannot get it to show up.
The firmware itself works as expected and whole device performs nicely, but i need to change few things in the configuration and cannot get there.
Iam using bluepill (aliexpress/china clone, yes might be the cause but i ran other simple sketches which print and shows serial output without issues, so i would use that as last resort excuse). Latest version of the bootloader and the firmware.

So what i tried (everything like 20+ times):
Erased / zeroed out the stm32
Reflashed tkg bootloader (from binary, but also compiled my own)
Reflashed the firmware (from binary, but also compiled my own)

After this, i run the command from documentation: sendmidi dev "MidiKlik 4x" syx hex 77 77 78 06 08
Device reboots, and shows as virtual COM device, so far so good.
I try to connect to the COM device using seria software
Theres no output.
Hitting, enter, writing enter, sending that.. mashing all kinds of buttons and sending that to the device, nothing shows up.

I also tried this on multiple computers (2x win, 1x mac) using different softwares (5 or more different ones)

Thres just no output on the serial window on virtual USB COM port on either of the computers.

Am i doing something wrong or is there an issue hidden somewhere ?

Many thanks in advance.

Removing last intelliroute for specific target not possible, only entire jack

Removing the last intelliroute on a jack for a certain target, will exit from SysExInternal_fnIThruSettings() with SX_ERROR_BAD_MSG_SIZE because msglen 4 is currently not supported. This means the only way to clear an intellithru jack target is to clear the jack completely, which will remove both physical and virtual jacks, and we maybe only wanted to remove one of them, for example:

F0 77 78 0E 03 00 01 F7 (clear (last) jack ithru on jack0)
or
F0 77 78 0E 03 00 02 F7 (clear (last) virtual ithru on jack0)

Currently we can only
F0 77 78 0E 03 00 F7 (clear all ithrus on jack0)

Made a temporary fix in mod_intsysex.h that seemed to fix it,, by commenting out this line

if (msgLen < 5 ) return SX_ERROR_BAD_MSG_SIZE;

and then just set *msk = 0 if len =4.

But I am not sure at all if its the best solution, was just to continue testing.
BR : )

Cannot set Merge command w/ filter in config menu?

I have a 4x4 board and I can't see how to filter certain merged messages in the Config Menu.
I'm trying to send all MIDI messages (voice, clock & CC) from input jack 1 to output jack 1, but I want to merge ONLY the clock data from input/output 1 with the voice & cc data of jacks 2 & 3.
I can see how to filter the data, and I can see how to set up so that the data being sent out of one output jack can be looped back to come in to other inputs, but I can't see how to filter it in-between the first output and the second input I want certain data to be merged with

Need help to create midi on stm32

I wanna to tranform midi on arduino code to stm32 with 16 buttons but i can't find how to make it can you help me the code of 16 buttons on stm32f103c8t6 with this library?

Controlador midi personalizado

Hola, gracias por compartir tu libreria.

Quiero hacer mi propio controlador y que en el pc aparezcan dos puertos mido usb, pero solo usando un stm32, y me preguntaba si esta libreria soporta botones y potenciometros, o solo rutea el midi a usb.

Agradezco tu orientacion.

-03 opt fails upload and trashes bootloader

This is probably a problem in my environment, but when compiling with -O3 fastest optimization, the upload fails and bootloader gets overwritten and needs to be reloaded. Any idea why O3 code should trash the bootloader, and what could be done? Tried before and after 4dbdc59, no difference. Thanks for any advice ! : ) BR

Opening USB Device 0x1eaf:0x0003...
Found Runtime: [0x1eaf:0x0003] devnum=1, cfg=0, intf=0, alt=2, name="STM32duino bootloader v1.0 Upload to Flash 0x8002000"
Setting Configuration 1...
Claiming USB DFU Interface...
Setting Alternate Setting ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
Transfer Size = 0x0400
bytes_per_hash=1192
dfu_download error -5
Error during download
Starting download: [################################################
timeout waiting for COM3 serial

flashing of prebuild binaries?

any hint how to flash the 2.5.1 binary(ies)? with an ST-Link flasher?
Do I need the bootloader or how to combine the generic-bootloader + the MIDI firmware (addresses?)
The Bluepill has 128kB flash
I have flashed it with a ST-Link (success message) using the defaul start address and the length of the binary in HEX. but it seem not to work. AT least it was not recognized as USB device (or unknown device). It is somewhere mentioned, that there is a *.BAT file for flashing but I have not found it.
It would be good to have the parameters for flashing (e.g. for the ST-Link) or a HEX File containing the start address.

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.