powertab / powertabeditor Goto Github PK
View Code? Open in Web Editor NEWView and edit guitar tablature.
Home Page: https://powertab.github.io
License: GNU General Public License v3.0
View and edit guitar tablature.
Home Page: https://powertab.github.io
License: GNU General Public License v3.0
Currently, the MIDI player just switches the instrument to "Electric Guitar (Muted)" whenever it has to play a muted note. Version 1.7 was able to get a decent muted sound for each instrument, so it definitely is possible.
This will be a bit challenging due to the differences between the v1.7 format and the new file format.
Floating text in v1.7 is stored at an absolute position, but the new file format doesn't store any layout information (e.g. the height in pixels of a system, or how much space is between systems). This has a bunch of advantages, since it will let us do things like widescreen layouts very easily. But that also means that allowing users to place floating text anywhere in the score won't work well (for example, if you switched to a different layout, your floating text would all be out of position).
One option would be to only allow floating text to be inside a system, so if the layout moves a system around any text inside it will move along with it. That might be a bit problematic if someone deletes a staff and causes some text to end up outside the system though. Another option is to make it more like chord text, where it has to be located at the top of a system
The notes aren't given the full space that they command. There isn't any formatting done for guitar pro yet, so the notes are just placed one after another. So the red line "current location" marker might finish a measure by the third beat, for example. The visual doesn't align with the audio.
Test file: See the passage for the top staff at system 4, position 26.
https://onedrive.live.com/redir?resid=BF1A7BA5AAA1B4E4!159&authkey=!AKIy8FAlQeI9LiY&ithint=file%2cgp4
Create enough systems to produce the scroll bar. Click on one system, move your mouse wheel one notch, and click on another system, move your mouse wheel in the opposite direction of the first time, click on a third system. You can do this indefinitely until all your systems have carets in them.
Currently, the behaviour is:
Possible options are:
I intentionally left this out so that people don't accidentally save files in a format that may change substantially before the release. But we could probably add this in sometime soon.
For any duration shorter than a quarter note, the grace notes get included into the beaming pattern.
For any duration longer than an eighth note, the grace notes look like an eighth note.
We'd need this for printing, but it might be nice as an option in general.
Measure 6 (position 18) should be a grace note.
See attached example file:
https://drive.google.com/file/d/0Byd1IDWcGH1OOWZfMGtzcWZod3c/edit?usp=sharing
Ideally this should also work if you have multiple selected notes.
Typing in a note into the notation produces a pitch immediately so that you may hear whether you're entering the correct note. This feature can be toggled on/off in preferences.
Rit./Accel. measures operate at a constant pace for the duration of measures between the current and ending tempo markers. The pace is fixed regardless of the tempos before or after them, or whether they are higher/lower than the rit/accel constant tempo pace.
If the rit/accel markers occur within a measure, they'll play at the aforementioned constant tempo, but the measure itself occupies the space of the measure as set by the tempo marker before it.
If the rit/accel markers are placed on the barline instead, there is no extra empty space at the end of the measure.
The Rit. tempo is somewhere above 300BPM (the limit for PTE1.7). The Accel. tempo is at about 250.
In 1.7, a rit. and an accel. perform identically. The only thing that truly matters is the starting/ending tempo markers.
For instance, a
(t=120 -accel- t=180) will play identically to a
(t=120 -rit- t=180.)
Test files:
https://onedrive.live.com/redir?resid=BF1A7BA5AAA1B4E4!157&authkey=!AOxEDsTIUlHlVk4&ithint=folder%2c
No editing. Imports don't display.
-Display swell start/stop volumes (can be hidden during playback).
Test file -
https://onedrive.live.com/redir?resid=BF1A7BA5AAA1B4E4!150&authkey=!AAOADj63_NhYSuo&ithint=file%2cptb
Copy measure A to B
Copy rehearsal C.
Copy key changes.
Allows you to copy without having to highlight/copy more than one section, multiple times.
https://drive.google.com/file/d/0Byd1IDWcGH1ON0EyR1VWcjVrMDA/edit?usp=sharing
Looks like a rendering error - the tab is suddenly cut off if you scroll down.
Similar to Firefox / Chrome / etc
See the attached file for an example:
https://drive.google.com/file/d/0Byd1IDWcGH1Oc21xcjMyNU5WT0E/edit?usp=sharing
Test file - see measures 4,7,8:
https://onedrive.live.com/redir?resid=BF1A7BA5AAA1B4E4!160&authkey=!ADWtebl2YFlm_0A&ithint=file%2cgp4
File> New results in a segmentation fault:
Platform:
$uname -a
Linux laptopvincent 3.14-1-amd64 #1 SMP Debian 3.14.12-1 (2014-07-11) x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux testing (jessie)
Release: testing
Codename: jessie
GIT version:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Backtrace:
$ valgrind bin/powertabeditor
==32112== Memcheck, a memory error detector
==32112== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==32112== Using Valgrind-3.9.0 and LibVEX; rerun with -h for copyright info
==32112== Command: bin/powertabeditor
==32112==
==32112== Conditional jump or move depends on uninitialised value(s)
==32112== at 0x120780A5: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x839B5E6: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112== by 0x83B4087: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112== by 0x83B5211: g_signal_emit_by_name (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112== by 0x83A2B38: g_object_set_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112== by 0x83A3396: g_object_set (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112== by 0x504FF85: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== by 0x4FD60DC: QStyleFactory::create(QString const&) (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== by 0x4F73A02: QApplication::style() (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== by 0x4F73DEC: QApplicationPrivate::initialize() (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== by 0x4F73E42: QApplicationPrivate::construct() (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== by 0x83F38C: main (in /home/vincent/projects/pte/build/bin/powertabeditor)
==32112==
==32112== Conditional jump or move depends on uninitialised value(s)
==32112== at 0x8652330: g_utf8_offset_to_pointer (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x1207B340: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x1207B8E3: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x1207BBCE: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x839B3B7: g_closure_invoke (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112== by 0x83AC556: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112== by 0x83B4A28: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112== by 0x83B4CE1: g_signal_emit (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112== by 0x121FF4E3: gtk_widget_realize (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x12200797: gtk_widget_set_parent (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x120A8D42: gtk_fixed_put (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x839E486: g_cclosure_marshal_VOID__OBJECTv (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112==
==32112== Conditional jump or move depends on uninitialised value(s)
==32112== at 0x865235F: g_utf8_offset_to_pointer (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x1207B340: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x1207B8E3: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x1207BBCE: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x839B3B7: g_closure_invoke (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112== by 0x83AC556: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112== by 0x83B4A28: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112== by 0x83B4CE1: g_signal_emit (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112== by 0x121FF4E3: gtk_widget_realize (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x12200797: gtk_widget_set_parent (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x120A8D42: gtk_fixed_put (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x839E486: g_cclosure_marshal_VOID__OBJECTv (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4000.0)
==32112==
==32112== Conditional jump or move depends on uninitialised value(s)
==32112== at 0x8652330: g_utf8_offset_to_pointer (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x1207B340: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x1207B8E3: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x1207B9BF: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x1261DD06: ??? (in /usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.0.2400.24)
==32112== by 0x8624CE4: g_main_context_dispatch (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x8625047: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x86250EB: g_main_context_iteration (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x73B68C6: QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.1)
==32112== by 0x735FEC1: QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.1)
==32112== by 0x73675FC: QCoreApplication::exec() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.1)
==32112== by 0x83FD8B: main (in /home/vincent/projects/pte/build/bin/powertabeditor)
==32112==
==32112== Conditional jump or move depends on uninitialised value(s)
==32112== at 0x865235F: g_utf8_offset_to_pointer (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x1207B340: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x1207B8E3: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x1207B9BF: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x1261DD06: ??? (in /usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.0.2400.24)
==32112== by 0x8624CE4: g_main_context_dispatch (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x8625047: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x86250EB: g_main_context_iteration (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x73B68C6: QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.1)
==32112== by 0x735FEC1: QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.1)
==32112== by 0x73675FC: QCoreApplication::exec() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.1)
==32112== by 0x83FD8B: main (in /home/vincent/projects/pte/build/bin/powertabeditor)
==32112==
==32112== Conditional jump or move depends on uninitialised value(s)
==32112== at 0x8652330: g_utf8_offset_to_pointer (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x1207B340: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x1207B9D8: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x1261DD06: ??? (in /usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.0.2400.24)
==32112== by 0x8624CE4: g_main_context_dispatch (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x8625047: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x86250EB: g_main_context_iteration (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x73B68C6: QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.1)
==32112== by 0x735FEC1: QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.1)
==32112== by 0x73675FC: QCoreApplication::exec() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.1)
==32112== by 0x83FD8B: main (in /home/vincent/projects/pte/build/bin/powertabeditor)
==32112==
==32112== Conditional jump or move depends on uninitialised value(s)
==32112== at 0x865235F: g_utf8_offset_to_pointer (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x1207B340: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x1207B9D8: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.24)
==32112== by 0x1261DD06: ??? (in /usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.0.2400.24)
==32112== by 0x8624CE4: g_main_context_dispatch (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x8625047: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x86250EB: g_main_context_iteration (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==32112== by 0x73B68C6: QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.1)
==32112== by 0x735FEC1: QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.1)
==32112== by 0x73675FC: QCoreApplication::exec() (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.1)
==32112== by 0x83FD8B: main (in /home/vincent/projects/pte/build/bin/powertabeditor)
==32112==
Tab creation started ...
Using 1 worker thread(s)
Score rendered in 1297 ms
Rendered 11 items
Tap opened in 3077 ms
load glyph failed err=23 face=0x0, glyph=48
==32112== Invalid read of size 8
==32112== at 0xE78285D: QFontEngineFT::loadGlyph(QFontEngineFT::QGlyphSet*, unsigned int, QFixed, QFontEngine::GlyphFormat, bool) const (in /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so)
==32112== by 0xE787019: QFontEngineFT::lockedAlphaMapForGlyph(unsigned int, QFixed, QFontEngine::GlyphFormat, QTransform const&, QPoint*) (in /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so)
==32112== by 0x6C8617F: QRasterPaintEngine::drawCachedGlyphs(int, unsigned int const*, QFixedPoint const*, QFontEngine*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.3.1)
==32112== by 0x6C8850E: QRasterPaintEngine::drawStaticTextItem(QStaticTextItem*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.3.1)
==32112== by 0x6CA083B: QPainter::drawStaticText(QPointF const&, QStaticText const&) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.3.1)
==32112== by 0x97C85E: QPainter::drawStaticText(int, int, QStaticText const&) (in /home/vincent/projects/pte/build/bin/powertabeditor)
==32112== by 0x97C3D3: TempoMarkerPainter::paint(QPainter*, QStyleOptionGraphicsItem const*, QWidget*) (in /home/vincent/projects/pte/build/bin/powertabeditor)
==32112== by 0x5270813: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== by 0x527159D: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== by 0x52708F2: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== by 0x527159D: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== by 0x5271C2A: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== Address 0x98 is not stack'd, malloc'd or (recently) free'd
==32112==
==32112==
==32112== Process terminating with default action of signal 11 (SIGSEGV)
==32112== Access not within mapped region at address 0x98
==32112== at 0xE78285D: QFontEngineFT::loadGlyph(QFontEngineFT::QGlyphSet*, unsigned int, QFixed, QFontEngine::GlyphFormat, bool) const (in /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so)
==32112== by 0xE787019: QFontEngineFT::lockedAlphaMapForGlyph(unsigned int, QFixed, QFontEngine::GlyphFormat, QTransform const&, QPoint*) (in /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so)
==32112== by 0x6C8617F: QRasterPaintEngine::drawCachedGlyphs(int, unsigned int const*, QFixedPoint const*, QFontEngine*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.3.1)
==32112== by 0x6C8850E: QRasterPaintEngine::drawStaticTextItem(QStaticTextItem*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.3.1)
==32112== by 0x6CA083B: QPainter::drawStaticText(QPointF const&, QStaticText const&) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.3.1)
==32112== by 0x97C85E: QPainter::drawStaticText(int, int, QStaticText const&) (in /home/vincent/projects/pte/build/bin/powertabeditor)
==32112== by 0x97C3D3: TempoMarkerPainter::paint(QPainter*, QStyleOptionGraphicsItem const*, QWidget*) (in /home/vincent/projects/pte/build/bin/powertabeditor)
==32112== by 0x5270813: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== by 0x527159D: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== by 0x52708F2: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== by 0x527159D: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== by 0x5271C2A: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.3.1)
==32112== If you believe this happened as a result of a stack
==32112== overflow in your program's main thread (unlikely but
==32112== possible), you can try to increase the size of the
==32112== main thread stack using the --main-stacksize= flag.
==32112== The main thread stack size used in this run was 8388608.
==32112==
==32112== HEAP SUMMARY:
==32112== in use at exit: 4,940,506 bytes in 30,907 blocks
==32112== total heap usage: 143,931 allocs, 113,024 frees, 37,412,671 bytes allocated
==32112==
==32112== LEAK SUMMARY:
==32112== definitely lost: 5,552 bytes in 38 blocks
==32112== indirectly lost: 24,077 bytes in 593 blocks
==32112== possibly lost: 61,853 bytes in 1,025 blocks
==32112== still reachable: 4,667,768 bytes in 28,391 blocks
==32112== suppressed: 0 bytes in 0 blocks
==32112== Rerun with --leak-check=full to see details of leaked memory
==32112==
==32112== For counts of detected and suppressed errors, rerun with: -v
==32112== Use --track-origins=yes to see where uninitialised values come from
==32112== ERROR SUMMARY: 8 errors from 8 contexts (suppressed: 5 from 3)
Currently, only files that you open are added to that menu, but this would make it easier to re-open a file that you recently created.
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.