GithubHelp home page GithubHelp logo

jpcima / hybridreverb2 Goto Github PK

View Code? Open in Web Editor NEW
44.0 9.0 9.0 9.05 MB

Reverb effect using hybrid impulse convolution

License: Other

CMake 0.24% C 0.51% C++ 98.89% Objective-C++ 0.04% R 0.01% Shell 0.04% Makefile 0.22% Roff 0.04%
reverb lv2-plugin vst-plugin acoustics audio-effect convolution impulse-response

hybridreverb2's Introduction

HybridReverb2

Reverb effect using hybrid impulse convolution

Build Status

Original author: Christian Borß
Current maintainer: Jean Pierre Cimalando
Contributor: Olivier Humbert

The goal of this project is to keep the HybridReverb2 project maintained and fix the issues.
The original 2009 page is archived and the research paper is available A VST Reverberation Effect Plugin Based on Synthetic Room Impulse Responses.

Introduction

(quoted from the original project page)

HybridReverb2 is a convolution-based reverberation effect which combines the superior sound quality of a convolution reverb with the tuning capability of a feedback delay network. The sound quality of a convolution reverb depends on the quality of the used room impulse responses. HybridReverb2 comes with a set of room impulse responses which were synthesized with tinyAVE, an auralization software which was developed at the Institute of Communication Acoustics, Ruhr-Universität Bochum (Borß and Martin, 2009; Borß, 2009a). These room impulse responses are designed for a speaker setup with two front and two rear speakers (Borß, 2009b). For a full surround sound effect, you will need two plugins, one plugin which uses a "front" preset for the front channels and a second plugin which uses the corresponding "rear" preset for the rear channels.

Enjoy,
Christian Borß

Downloads

Windows development builds

Impulse response database - CC-BY-SA 4.0 license

Building

A CMake build file is provided to Linux users for the ability to build LV2 and cross-compile.
The traditional Juce build process has build files for all platforms in the Builds folder. It supports all formats except LV2.

To perform a CMake-based build:

git submodule init
git submodule update
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build .
Build option Description
-DHybridReverb2_VST2=ON/OFF Build a VST2 plugin
-DHybridReverb2_LV2=ON/OFF Build a LV2 plugin
-DHybridReverb2_Standalone=ON/OFF Build a standalone program
-DHybridReverb2_AdvancedJackStandalone=ON/OFF Build a standalone for Jack with better features
-DHybridReverb2_UseLocalDatabase=ON/OFF Use a preinstalled RIR database in PREFIX/share/HybridReverb2
-DHybridReverb2_Assertions=ON/OFF Force building with assertions regardless of build type

Usage

The LV2 plugin is identified as https://github.com/jpcima/HybridReverb2.
Load this in your favorite plugin hosting software. A free compatible plugin host is Carla.

hybridreverb2's People

Contributors

brunovernay avatar jpcima avatar trebmuh 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hybridreverb2's Issues

erreur de compilation sous Debian 11

[  3%] Building CXX object CMakeFiles/juce_graphics.dir/JuceLibraryCode/include_juce_graphics.cpp.o
In file included from /build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/juce_graphics.h:121,
                 from /build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/juce_graphics.cpp:42,
                 from /build/hybridreverb2-2.1.2+20211217/JuceLibraryCode/include_juce_graphics.cpp:9:
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/colour/juce_PixelFormats.h: In member function 'juce::uint8& juce::PixelARGB::getAlpha()':
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/colour/juce_PixelFormats.h:116:77: error: cannot bind packed field '((juce::PixelARGB*)this)->juce::PixelARGB::<anonymous>.juce::PixelARGB::<unnamed union>::comps[3]' to 'juce::uint8&' {aka 'unsigned char&'}
  116 |     forcedinline uint8& getAlpha() noexcept           { return comps [indexA]; }
      |                                                                ~~~~~~~~~~~~~^
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/colour/juce_PixelFormats.h: In member function 'juce::uint8& juce::PixelARGB::getRed()':
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/colour/juce_PixelFormats.h:117:77: error: cannot bind packed field '((juce::PixelARGB*)this)->juce::PixelARGB::<anonymous>.juce::PixelARGB::<unnamed union>::comps[2]' to 'juce::uint8&' {aka 'unsigned char&'}
  117 |     forcedinline uint8& getRed() noexcept             { return comps [indexR]; }
      |                                                                ~~~~~~~~~~~~~^
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/colour/juce_PixelFormats.h: In member function 'juce::uint8& juce::PixelARGB::getGreen()':
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/colour/juce_PixelFormats.h:118:77: error: cannot bind packed field '((juce::PixelARGB*)this)->juce::PixelARGB::<anonymous>.juce::PixelARGB::<unnamed union>::comps[1]' to 'juce::uint8&' {aka 'unsigned char&'}
  118 |     forcedinline uint8& getGreen() noexcept           { return comps [indexG]; }
      |                                                                ~~~~~~~~~~~~~^
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/colour/juce_PixelFormats.h: In member function 'juce::uint8& juce::PixelARGB::getBlue()':
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/colour/juce_PixelFormats.h:119:77: error: cannot bind packed field '((juce::PixelARGB*)this)->juce::PixelARGB::<anonymous>.juce::PixelARGB::<unnamed union>::comps[0]' to 'juce::uint8&' {aka 'unsigned char&'}
  119 |     forcedinline uint8& getBlue() noexcept            { return comps [indexB]; }
      |                                                                ~~~~~~~~~~~~~^
In file included from /build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/juce_graphics.h:143,
                 from /build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/juce_graphics.cpp:42,
                 from /build/hybridreverb2-2.1.2+20211217/JuceLibraryCode/include_juce_graphics.cpp:9:
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h: In instantiation of 'void juce::RenderingHelpers::EdgeTableFillers::SolidColour<PixelType, replaceExisting>::replaceLine(juce::PixelRGB*, juce::PixelARGB, int) const [with PixelType = juce::PixelRGB; bool replaceExisting = true]':
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h:627:29:   required from 'void juce::RenderingHelpers::EdgeTableFillers::SolidColour<PixelType, replaceExisting>::handleEdgeTableLine(int, int, int) const [with PixelType = juce::PixelRGB; bool replaceExisting = true]'
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h:2025:79:   required from 'void juce::RenderingHelpers::ClipRegions<SavedStateType>::RectangleListRegion::SubRectangleIteratorFloat::iterate(Renderer&) const [with Renderer = juce::RenderingHelpers::EdgeTableFillers::SolidColour<juce::PixelRGB, true>; SavedStateType = juce::RenderingHelpers::SoftwareRendererSavedState]'
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h:1591:26:   required from 'void juce::RenderingHelpers::EdgeTableFillers::renderSolidFill(Iterator&, const juce::Image::BitmapData&, juce::PixelARGB, bool, DestPixelType*) [with Iterator = juce::RenderingHelpers::ClipRegions<juce::RenderingHelpers::SoftwareRendererSavedState>::RectangleListRegion::SubRectangleIteratorFloat; DestPixelType = juce::PixelRGB]'
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h:2644:67:   required from 'void juce::RenderingHelpers::SoftwareRendererSavedState::fillWithSolidColour(IteratorType&, juce::PixelARGB, bool) const [with IteratorType = juce::RenderingHelpers::ClipRegions<juce::RenderingHelpers::SoftwareRendererSavedState>::RectangleListRegion::SubRectangleIteratorFloat]'
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h:1896:39:   required from 'void juce::RenderingHelpers::ClipRegions<SavedStateType>::RectangleListRegion::fillRectWithColour(SavedStateType&, juce::Rectangle<float>, juce::PixelARGB) const [with SavedStateType = juce::RenderingHelpers::SoftwareRendererSavedState]'
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h:1893:14:   required from here
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h:713:34: warning: converting a packed 'juce::PixelRGB' pointer (alignment 1) to a 'int' pointer (alignment 4) may result in an unaligned pointer value [-Waddress-of-packed-member]
  713 |                             auto d = reinterpret_cast<int*> (dest);
      |                                  ^
In file included from /build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/juce_graphics.h:121,
                 from /build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/juce_graphics.cpp:42,
                 from /build/hybridreverb2-2.1.2+20211217/JuceLibraryCode/include_juce_graphics.cpp:9:
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/colour/juce_PixelFormats.h:366:17: note: defined here
  366 | class JUCE_API  PixelRGB
      |                 ^~~~~~~~
In file included from /build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/juce_graphics.h:143,
                 from /build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/juce_graphics.cpp:42,
                 from /build/hybridreverb2-2.1.2+20211217/JuceLibraryCode/include_juce_graphics.cpp:9:
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h: In instantiation of 'void juce::RenderingHelpers::EdgeTableFillers::SolidColour<PixelType, replaceExisting>::replaceLine(juce::PixelRGB*, juce::PixelARGB, int) const [with PixelType = juce::PixelRGB; bool replaceExisting = false]':
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h:627:29:   required from 'void juce::RenderingHelpers::EdgeTableFillers::SolidColour<PixelType, replaceExisting>::handleEdgeTableLine(int, int, int) const [with PixelType = juce::PixelRGB; bool replaceExisting = false]'
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h:2025:79:   required from 'void juce::RenderingHelpers::ClipRegions<SavedStateType>::RectangleListRegion::SubRectangleIteratorFloat::iterate(Renderer&) const [with Renderer = juce::RenderingHelpers::EdgeTableFillers::SolidColour<juce::PixelRGB, false>; SavedStateType = juce::RenderingHelpers::SoftwareRendererSavedState]'
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h:1596:26:   required from 'void juce::RenderingHelpers::EdgeTableFillers::renderSolidFill(Iterator&, const juce::Image::BitmapData&, juce::PixelARGB, bool, DestPixelType*) [with Iterator = juce::RenderingHelpers::ClipRegions<juce::RenderingHelpers::SoftwareRendererSavedState>::RectangleListRegion::SubRectangleIteratorFloat; DestPixelType = juce::PixelRGB]'
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h:2644:67:   required from 'void juce::RenderingHelpers::SoftwareRendererSavedState::fillWithSolidColour(IteratorType&, juce::PixelARGB, bool) const [with IteratorType = juce::RenderingHelpers::ClipRegions<juce::RenderingHelpers::SoftwareRendererSavedState>::RectangleListRegion::SubRectangleIteratorFloat]'
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h:1896:39:   required from 'void juce::RenderingHelpers::ClipRegions<SavedStateType>::RectangleListRegion::fillRectWithColour(SavedStateType&, juce::Rectangle<float>, juce::PixelARGB) const [with SavedStateType = juce::RenderingHelpers::SoftwareRendererSavedState]'
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h:1893:14:   required from here
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/native/juce_RenderingHelpers.h:713:34: warning: converting a packed 'juce::PixelRGB' pointer (alignment 1) to a 'int' pointer (alignment 4) may result in an unaligned pointer value [-Waddress-of-packed-member]
  713 |                             auto d = reinterpret_cast<int*> (dest);
      |                                  ^
In file included from /build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/juce_graphics.h:121,
                 from /build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/juce_graphics.cpp:42,
                 from /build/hybridreverb2-2.1.2+20211217/JuceLibraryCode/include_juce_graphics.cpp:9:
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_graphics/colour/juce_PixelFormats.h:366:17: note: defined here
  366 | class JUCE_API  PixelRGB
      |                 ^~~~~~~~
make[3]: *** [CMakeFiles/juce_graphics.dir/build.make:82: CMakeFiles/juce_graphics.dir/JuceLibraryCode/include_juce_graphics.cpp.o] Error 1
make[3]: Leaving directory '/build/hybridreverb2-2.1.2+20211217'
make[2]: *** [CMakeFiles/Makefile2:629: CMakeFiles/juce_graphics.dir/all] Error 2
make[2]: *** Waiting for unfinished jobs....
In file included from /build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_core/juce_core.h:230,
                 from /build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_core/juce_core.cpp:37,
                 from /build/hybridreverb2-2.1.2+20211217/JuceLibraryCode/include_juce_core.cpp:9:
In member function 'void juce::CharPointer_UTF8::write(juce::juce_wchar)',
    inlined from 'static juce::String juce::String::charToString(juce::juce_wchar)' at /build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_core/text/juce_String.cpp:370:13:
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_core/text/juce_CharPointer_UTF8.h:345:25: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
  345 |                 *data++ = (CharType) (0x80 | (0x3f & (c >> (numExtraBytes * 6))));
      |                 ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_core/text/juce_CharPointer_UTF8.h:345:25: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
In file included from /build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_core/juce_core.cpp:128,
                 from /build/hybridreverb2-2.1.2+20211217/JuceLibraryCode/include_juce_core.cpp:9:
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_core/containers/juce_Variant.cpp: In static member function 'static juce::Result juce::JSONParser::parseArray(juce::String::CharPointerType&, juce::var&)':
/build/hybridreverb2-2.1.2+20211217/Thirdparty/JUCE/modules/juce_core/containers/juce_Variant.cpp:533:25: warning: '<anonymous>.juce::var::value' may be used uninitialized in this function [-Wmaybe-uninitialized]
  533 |       value (other.value)
      |                         ^
[  4%] Linking CXX static library libjuce_core.a
make[3]: Leaving directory '/build/hybridreverb2-2.1.2+20211217'
[  4%] Built target juce_core
make[2]: Leaving directory '/build/hybridreverb2-2.1.2+20211217'
make[1]: *** [Makefile:149: all] Error 2

Extra Large Impulse Response Database and Binary for MacOS Catalina

Dear Developers,

thank you very much for maintaining this project! Thanks to you, I was finally able to build again my plugin for MacOS. Since MacOS Catalina no longer supports 32bit binaries, I had to re-compile it from source code. Besides some minor issues regarding some path names, I had no issues compiling your release version 2.1.2. You can find my build here:

https://c.1und1.de/@926526086479613353/C_peK40DRBe3FGIvQFrX5g

I tested it on a 2012 MacMini (Intel). As an addon, you can also find my "extra large database" in this folder, which also includes binaural impulse responses for headphones.

Kind regards,
Christian Borss

IR database downloader

Have a component which will download the IR from the academic site, when the plugin is launched the first time.
It will save the necessity to package the proprietary IR database for its setup.

Construction sans GUI ?

Je viens de tenter une construction dont voici le log. Malheureusement, il semble que je n'ai pas de GUI si j'en crois jalv lorsque je le lance avec la commande : jalv.gtk3 https://github.com/jpcima/HybridReverb2.

J'ai ces paquets d'installés : cmake libasound2-dev libfftw3-dev libfreetype6-dev libgtk-3-dev libjack-jackd2-dev libxext-dev libx11-dev pkg-config

Tu vois quelque chose d'évident que je loupe ?

Arreglar directorio de dependencia JUCE

Para Linux se debería redireccionar la búsqueda de modulos JUCE a "/usr/share/juce/modules/". De lo contrario se hace muy difícil compilar HybridReverb2.

LV2 pour windows

Je lisais le log du builder, et j'ai remarqué qu'il était configuré avec Build LV2: OFF.

Je suggère de fournir une version LV2 également pour windows si c'est possible car il y a des hôtes LV2 pour windows (Carla, Ardour, et peut être aussi Mixbus).

Licence

J'ai ouvert 2 ou 3 fichiers source et il semble bien que la licence soit GPL 2.
Ça serait utile d'avoir un fichier LICENCE à la racine.

Use a standard license

License file is here:
https://github.com/jpcima/HybridReverb2/blob/master/LICENSE

But GitHub detect as custom other license:
https://api.github.com/repos/jpcima/HybridReverb2/license

This is problematic when using the GitHub API to categorize plugins by license type. Compare to a standard license API request:
https://api.github.com/repos/asb2m10/dexed/license

If you could use a standard license from either:
https://choosealicense.com/

OR the list here:
https://api.github.com/licenses

Would be much appreciated!

Manually-specified variables were not used by the project:

I get the following warning when building:

CMake Warning:
  Manually-specified variables were not used by the project:

    CMAKE_INSTALL_INCLUDEDIR
    CMAKE_INSTALL_LIBDIR
    CMAKE_POLICY_DEFAULT_CMP0025
    HybridReverb2_AdvancedJackStandalone
    HybridReverb2_UseLocalDatabase

When I run the program, either standalone or LV2, it shows the download screen.
Clicking the download link opens it in my browser.
Clicking the "Load database file" button doesn't do anything.

I have:

ls /my_prefix/share/HybridReverb2/
HybridReverb2_presets.xml  RIR_Database

Decoupling of UI and convolver update logic

In current state of HR2, the parameter changes cause the convolver to be recomputed in the GUI task and to be submitted to the audio processor.

What problem arises from this? it's an issue when the plugin is run in background without a GUI. (for example, when loaded from Ardour DAW, as @sub26nico has reported)
It cannot compute changes of parameters, until the GUI gets launched.

In order to fix this, the convolver update logic must be moved to a working task independent from GUI.
When I checked, there was not a trivial way to attack the problem, it needs to reorganize elements of plugin. This is not helped by fact that some elements which participate in convolver updates are deeply tied to logic of the GUI.

To solve it, I have engaged in work to rearrange into a less coupled software design.
After completing this, it will be welcome to do another round of testing.

Problem with git clone

$ git clone https://github.com/jpcima/HybridReverb2.git --recursive
Clonage dans 'HybridReverb2'...
remote: Counting objects: 282, done.
remote: Compressing objects: 100% (139/139), done.
remote: Total 282 (delta 165), reused 246 (delta 132), pack-reused 0
Réception d'objets: 100% (282/282), 429.00 KiB | 439.00 KiB/s, fait.
Résolution des deltas: 100% (165/165), fait.
Sous-module 'Thirdparty/JUCE' (https://github.com/jpcima/JUCE.git) enregistré pour le chemin 'Thirdparty/JUCE'
Clonage dans 'xxxx/HybridReverb2/Thirdparty/JUCE'...
remote: Counting objects: 170923, done.        
remote: Compressing objects: 100% (15/15), done.        
remote: Total 170923 (delta 15), reused 8 (delta 8), pack-reused 170900        
Réception d'objets: 100% (170923/170923), 203.70 MiB | 718.00 KiB/s, fait.
Résolution des deltas: 100% (134179/134179), fait.
error: no such remote ref d492f3b666808ce712e84d52de711e9503c7302d
Chemin de sous-module 'Thirdparty/JUCE' récupéré, mais il ne contenait pas d492f3b666808ce712e84d52de711e9503c7302d. La récupération directe de ce commit a échoué.

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.