Giter Site home page Giter Site logo

jpcima / adljack Goto Github PK

View Code? Open in Web Editor NEW
41.0 7.0 3.0 528 KB

OPL3/OPN2 synthesizer using ADLMIDI and OPNMIDI, for Jack and cross-platform audio

License: Boost Software License 1.0

CMake 3.63% C 52.63% C++ 42.98% Common Lisp 0.38% Shell 0.37%
synthesizer emulator chip midi opl audio adlmidi opnmidi opl3-emulator opn2-emulator

adljack's Introduction

adljack

OPL3/OPN2 synthesizer using ADLMIDI and OPNMIDI

This is a standalone synthesizer for ADLMIDI and OPNMIDI on the text console. It is based on libADLMIDI and libOPNMIDI.

  • adljack is the version for the Jack audio system.
  • adlrt is the portable version for Linux, Windows and Mac.

screenshot

Feature list

  • Real time, low latency FM synthesizer
  • Support of multiple FM chip emulators
  • Support of multiple chips for extended polyphony
  • Loading instrument banks in WOPL and WOPN formats
  • General MIDI level 1 and 2
  • Multi-channel MIDI playback
  • Automatic bank reloading when the file changes on disk
  • User interface for the terminal with dynamic controls
  • Session management with the NSM protocol (adljack only)

Usage

This is how you use adljack in the console.

  • -h: Show a help message, and lists available players and emulators
  • -p [player]: Selects the player. (ADLMIDI, OPNMIDI)
  • -n [chips]: Defines the number of chips.
  • -b [bank]: Loads the indicated bank file.
  • -e [emulator]: Selects the emulator. (by number, as listed in -h)
  • -L [latency]: (adlrt only) Defines the audio latency. The unit is milliseconds. Default 20ms.

Development builds

Build Status

Find automatic builds of the development branch here (Windows).

Build instructions

Installed required dependencies:

  • a C++ compiler for the 2011 standard
  • at least one development package for audio, and one for MIDI: ALSA, PulseAudio, Jack
  • either: (n)curses for a terminal interface, or SDL2 for a PDCurses pseudo-terminal (needed on Windows)

Compiling

git clone --recursive https://github.com/jpcima/adljack.git
mkdir adljack/build
cd adljack/build
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build .

Installing

sudo cmake --build . --target install

Questions

Why are the colors odd-looking in a X11 terminal?

The default terminal setting may prevent the program from being able to define its own colors. In the initialization of your shell, try setting a 256-color terminal type: test "$TERM" = "xterm" && export TERM=xterm-256color

How to force the AdlRt to work with ALSA?

You can run the AdlRt with the -A alsa command-line argument:

adlrt -A alsa

which forces it to select ALSA as a sound system instead of PulseAudio.

Change Log

Dev

  • ability to set initial volume using the option -v

Version 1.3.1

  • fixed build on Arch Linux
  • updated libADLMIDI, libOPNMIDI, and other modules

Version 1.3.0

  • support for different channel allocation modes
  • support of YMFM OPN2 and YMFM OPNA emulators at libOPNMIDI
  • updated versions of libADLMIDI and libOPNMIDI
  • support for newer RtAudio 6.x
  • configuration will be saved in the config file and reloaded if not overriden by command-line arguments
  • experimental support for GTK system tray icon with context menu and file dialogues

Version 1.2.0

  • support of new emulators
  • support of MIDI portamento
  • support of OPN2 soft panning
  • resolved a possible crash occurring on the PDCurses build

Version 1.1.0

  • ability to connect audio ports automatically using the option -a

Version 1.1.0-rc.1

  • fidelity improvement of DosBox, MAME and Gens emulators by processing at native sample rate
  • update of the DosBox OPL emulator
  • support of MIDI aftertouch
  • fixed issues with pitch bend and pitch bend sensitivity
  • support of Roland SC-55 sysex: text insert
  • improved computation of the optimal 4 operator channel setting for OPL3
  • fixed long notes cutting prematurely
  • translation support on Windows
  • various fixes

Version 1.0.0

This is the initial release.

adljack's People

Contributors

jpcima avatar luzpaz avatar trebmuh avatar wohlstand 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

adljack's Issues

1.3.0 fails to build due to flatbuffer

Hi! when trying to build 1.3.0 using the provided combined source tarball, I get:

[ 97%] Building CXX object CMakeFiles/adljack.dir/sources/player_traits.cc.o
/usr/bin/c++ -DADLJACK_HAVE_MLOCKALL -DADLJACK_I18N -DADLJACK_PREFIX=\"/usr\" -DADLJACK_USE_CURSES -DADLJACK_USE_NSM -DADLMIDI_DISABLE_MIDI_SEQUENCER -DBWMIDI_DISABLE_MUS_SUPPORT -DBWMIDI_DISABLE_XMI_SUPPORT -I/build/adljack/src/adljack-1.3.0/thirdparty/ini-processing/src -I/build/adljack/src/adljack-1.3.0/thirdparty/
nonlib -I/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include -I/build/adljack/src/adljack-1.3.0/thirdparty/libADLMIDI/include -I/build/adljack/src/adljack-1.3.0/thirdparty/libOPNMIDI/include -I/build/adljack/src/adljack-1.3.0/thirdparty/ring-buffer/include -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -f
exceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection -Wp,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/build/adljack/src=/usr/src/debug/adljack -flto=auto -Wall -std=gnu++11 -MD -MT CMakeFiles/adljack.dir/sources/i18n.cc.o -MF CMakeFiles/adljack.dir
/sources/i18n.cc.o.d -o CMakeFiles/adljack.dir/sources/i18n.cc.o -c /build/adljack/src/adljack-1.3.0/sources/i18n.cc
/usr/bin/c++ -DADLJACK_HAVE_MLOCKALL -DADLJACK_I18N -DADLJACK_PREFIX=\"/usr\" -DADLJACK_USE_CURSES -DADLJACK_USE_NSM -DADLMIDI_DISABLE_MIDI_SEQUENCER -DBWMIDI_DISABLE_MUS_SUPPORT -DBWMIDI_DISABLE_XMI_SUPPORT -I/build/adljack/src/adljack-1.3.0/thirdparty/ini-processing/src -I/build/adljack/src/adljack-1.3.0/thirdparty/
nonlib -I/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include -I/build/adljack/src/adljack-1.3.0/thirdparty/libADLMIDI/include -I/build/adljack/src/adljack-1.3.0/thirdparty/libOPNMIDI/include -I/build/adljack/src/adljack-1.3.0/thirdparty/ring-buffer/include -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -f
exceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection -Wp,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/build/adljack/src=/usr/src/debug/adljack -flto=auto -Wall -std=gnu++11 -MD -MT CMakeFiles/adljack.dir/sources/state.cc.o -MF CMakeFiles/adljack.di
r/sources/state.cc.o.d -o CMakeFiles/adljack.dir/sources/state.cc.o -c /build/adljack/src/adljack-1.3.0/sources/state.cc
/usr/bin/c++ -DADLJACK_HAVE_MLOCKALL -DADLJACK_I18N -DADLJACK_PREFIX=\"/usr\" -DADLJACK_USE_CURSES -DADLJACK_USE_NSM -DADLMIDI_DISABLE_MIDI_SEQUENCER -DBWMIDI_DISABLE_MUS_SUPPORT -DBWMIDI_DISABLE_XMI_SUPPORT -I/build/adljack/src/adljack-1.3.0/thirdparty/ini-processing/src -I/build/adljack/src/adljack-1.3.0/thirdparty/
nonlib -I/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include -I/build/adljack/src/adljack-1.3.0/thirdparty/libADLMIDI/include -I/build/adljack/src/adljack-1.3.0/thirdparty/libOPNMIDI/include -I/build/adljack/src/adljack-1.3.0/thirdparty/ring-buffer/include -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -f
exceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection -Wp,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/build/adljack/src=/usr/src/debug/adljack -flto=auto -Wall -std=gnu++11 -MD -MT CMakeFiles/adljack.dir/sources/tui_fileselect.cc.o -MF CMakeFiles/a
dljack.dir/sources/tui_fileselect.cc.o.d -o CMakeFiles/adljack.dir/sources/tui_fileselect.cc.o -c /build/adljack/src/adljack-1.3.0/sources/tui_fileselect.cc
/usr/bin/c++ -DADLJACK_HAVE_MLOCKALL -DADLJACK_I18N -DADLJACK_PREFIX=\"/usr\" -DADLJACK_USE_CURSES -DADLJACK_USE_NSM -DADLMIDI_DISABLE_MIDI_SEQUENCER -DBWMIDI_DISABLE_MUS_SUPPORT -DBWMIDI_DISABLE_XMI_SUPPORT -I/build/adljack/src/adljack-1.3.0/thirdparty/ini-processing/src -I/build/adljack/src/adljack-1.3.0/thirdparty/
nonlib -I/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include -I/build/adljack/src/adljack-1.3.0/thirdparty/libADLMIDI/include -I/build/adljack/src/adljack-1.3.0/thirdparty/libOPNMIDI/include -I/build/adljack/src/adljack-1.3.0/thirdparty/ring-buffer/include -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -f
exceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection -Wp,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/build/adljack/src=/usr/src/debug/adljack -flto=auto -Wall -std=gnu++11 -MD -MT CMakeFiles/adljack.dir/sources/player_traits.cc.o -MF CMakeFiles/ad
ljack.dir/sources/player_traits.cc.o.d -o CMakeFiles/adljack.dir/sources/player_traits.cc.o -c /build/adljack/src/adljack-1.3.0/sources/player_traits.cc
/usr/bin/c++ -DADLJACK_HAVE_MLOCKALL -DADLJACK_I18N -DADLJACK_PREFIX=\"/usr\" -DADLJACK_USE_CURSES -DADLJACK_USE_NSM -DADLMIDI_DISABLE_MIDI_SEQUENCER -DBWMIDI_DISABLE_MUS_SUPPORT -DBWMIDI_DISABLE_XMI_SUPPORT -I/build/adljack/src/adljack-1.3.0/thirdparty/ini-processing/src -I/build/adljack/src/adljack-1.3.0/thirdparty/
nonlib -I/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include -I/build/adljack/src/adljack-1.3.0/thirdparty/libADLMIDI/include -I/build/adljack/src/adljack-1.3.0/thirdparty/libOPNMIDI/include -I/build/adljack/src/adljack-1.3.0/thirdparty/ring-buffer/include -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -f
exceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection -Wp,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/build/adljack/src=/usr/src/debug/adljack -flto=auto -Wall -std=gnu++11 -MD -MT CMakeFiles/adljack.dir/sources/common.cc.o -MF CMakeFiles/adljack.d
ir/sources/common.cc.o.d -o CMakeFiles/adljack.dir/sources/common.cc.o -c /build/adljack/src/adljack-1.3.0/sources/common.cc
/build/adljack/src/adljack-1.3.0/sources/player_traits.cc: In static member function ‘static int Player_Traits<Player_Type::OPN2>::set_bank(player*, unsigned int)’:
/build/adljack/src/adljack-1.3.0/sources/player_traits.cc:14:83: note: ‘#pragma message: Using my own bank embed for OPN2. Remove this in the future.’
   14 |     #pragma message("Using my own bank embed for OPN2. Remove this in the future.")
      |                                                                                   ^
In file included from /build/adljack/src/adljack-1.3.0/sources/state.cc:8:
/build/adljack/src/adljack-1.3.0/sources/state_generated.h: In member function ‘bool fb::state::State::Verify(flatbuffers::Verifier&) const’:
/build/adljack/src/adljack-1.3.0/sources/state_generated.h:46:27: error: no matching function for call to ‘flatbuffers::Verifier::Verify(const flatbuffers::Vector<flatbuffers::Offset<fb::state::Channel_State> >*)’
   46 |            verifier.Verify(channel()) &&
      |            ~~~~~~~~~~~~~~~^~~~~~~~~~~
In file included from /build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/buffer_ref.h:21,
                 from /build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/flatbuffers.h:25,
                 from /build/adljack/src/adljack-1.3.0/sources/state_generated.h:7:
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:88:29: note: candidate: ‘template<class T> bool flatbuffers::Verifier::Verify(size_t) const’
   88 |   template<typename T> bool Verify(const size_t elem) const {
      |                             ^~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:88:29: note:   template argument deduction/substitution failed:
/build/adljack/src/adljack-1.3.0/sources/state_generated.h:46:27: note:   couldn’t deduce template parameter ‘T’
   46 |            verifier.Verify(channel()) &&
      |            ~~~~~~~~~~~~~~~^~~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:72:8: note: candidate: ‘bool flatbuffers::Verifier::Verify(size_t, size_t) const’
   72 |   bool Verify(const size_t elem, const size_t elem_len) const {
      |        ^~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:72:8: note:   candidate expects 2 arguments, 1 provided
/build/adljack/src/adljack-1.3.0/sources/state_generated.h:49:27: error: no matching function for call to ‘flatbuffers::Verifier::Verify(const flatbuffers::Vector<flatbuffers::Offset<fb::state::Player_State> >*)’
   49 |            verifier.Verify(player()) &&
      |            ~~~~~~~~~~~~~~~^~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:88:29: note: candidate: ‘template<class T> bool flatbuffers::Verifier::Verify(size_t) const’
   88 |   template<typename T> bool Verify(const size_t elem) const {
      |                             ^~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:88:29: note:   template argument deduction/substitution failed:
/build/adljack/src/adljack-1.3.0/sources/state_generated.h:49:27: note:   couldn’t deduce template parameter ‘T’
   49 |            verifier.Verify(player()) &&
      |            ~~~~~~~~~~~~~~~^~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:72:8: note: candidate: ‘bool flatbuffers::Verifier::Verify(size_t, size_t) const’
   72 |   bool Verify(const size_t elem, const size_t elem_len) const {
      |        ^~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:72:8: note:   candidate expects 2 arguments, 1 provided
/build/adljack/src/adljack-1.3.0/sources/state_generated.h:51:32: error: no matching function for call to ‘fb::state::State::VerifyField<uint8_t>(flatbuffers::Verifier&, fb::state::State::<unnamed enum>) const’
   51 |            VerifyField<uint8_t>(verifier, VT_CHIP_COUNT) &&
      |            ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/flatbuffer_builder.h:32,
                 from /build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/flatbuffers.h:27:
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/table.h:115:8: note: candidate: ‘template<class T> bool flatbuffers::Table::VerifyField(const flatbuffers::Verifier&, flatbuffers::voffset_t, size_t) const’
  115 |   bool VerifyField(const Verifier &verifier, voffset_t field,
      |        ^~~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/table.h:115:8: note:   candidate expects 3 arguments, 2 provided
/build/adljack/src/adljack-1.3.0/sources/state_generated.h:52:33: error: no matching function for call to ‘fb::state::State::VerifyField<uint16_t>(flatbuffers::Verifier&, fb::state::State::<unnamed enum>) const’
   52 |            VerifyField<uint16_t>(verifier, VT_VOLUME) &&
      |            ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/table.h:115:8: note: candidate: ‘template<class T> bool flatbuffers::Table::VerifyField(const flatbuffers::Verifier&, flatbuffers::voffset_t, size_t) const’
  115 |   bool VerifyField(const Verifier &verifier, voffset_t field,
      |        ^~~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/table.h:115:8: note:   candidate expects 3 arguments, 2 provided
/build/adljack/src/adljack-1.3.0/sources/state_generated.h: In member function ‘bool fb::state::Channel_State::Verify(flatbuffers::Verifier&) const’:
/build/adljack/src/adljack-1.3.0/sources/state_generated.h:137:32: error: no matching function for call to ‘fb::state::Channel_State::VerifyField<uint8_t>(flatbuffers::Verifier&, fb::state::Channel_State::<unnamed enum>) const’
  137 |            VerifyField<uint8_t>(verifier, VT_PROGRAM) &&
      |            ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/table.h:115:8: note: candidate: ‘template<class T> bool flatbuffers::Table::VerifyField(const flatbuffers::Verifier&, flatbuffers::voffset_t, size_t) const’
  115 |   bool VerifyField(const Verifier &verifier, voffset_t field,
      |        ^~~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/table.h:115:8: note:   candidate expects 3 arguments, 2 provided
/build/adljack/src/adljack-1.3.0/sources/state_generated.h:138:33: error: no matching function for call to ‘fb::state::Channel_State::VerifyField<uint16_t>(flatbuffers::Verifier&, fb::state::Channel_State::<unnamed enum>) const’
  138 |            VerifyField<uint16_t>(verifier, VT_BANK) &&
      |            ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/table.h:115:8: note: candidate: ‘template<class T> bool flatbuffers::Table::VerifyField(const flatbuffers::Verifier&, flatbuffers::voffset_t, size_t) const’
  115 |   bool VerifyField(const Verifier &verifier, voffset_t field,
      |        ^~~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/table.h:115:8: note:   candidate expects 3 arguments, 2 provided
/build/adljack/src/adljack-1.3.0/sources/state_generated.h: In member function ‘bool fb::state::Player_Id::Verify(flatbuffers::Verifier&) const’:
/build/adljack/src/adljack-1.3.0/sources/state_generated.h:188:27: error: no matching function for call to ‘flatbuffers::Verifier::Verify(const flatbuffers::String*)’
  188 |            verifier.Verify(player()) &&
      |            ~~~~~~~~~~~~~~~^~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:88:29: note: candidate: ‘template<class T> bool flatbuffers::Verifier::Verify(size_t) const’
   88 |   template<typename T> bool Verify(const size_t elem) const {
      |                             ^~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:88:29: note:   template argument deduction/substitution failed:
/build/adljack/src/adljack-1.3.0/sources/state_generated.h:188:27: note:   couldn’t deduce template parameter ‘T’
  188 |            verifier.Verify(player()) &&
      |            ~~~~~~~~~~~~~~~^~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:72:8: note: candidate: ‘bool flatbuffers::Verifier::Verify(size_t, size_t) const’
   72 |   bool Verify(const size_t elem, const size_t elem_len) const {
      |        ^~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:72:8: note:   candidate expects 2 arguments, 1 provided
/build/adljack/src/adljack-1.3.0/sources/state_generated.h:190:27: error: no matching function for call to ‘flatbuffers::Verifier::Verify(const flatbuffers::String*)’
  190 |            verifier.Verify(emulator()) &&
      |            ~~~~~~~~~~~~~~~^~~~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:88:29: note: candidate: ‘template<class T> bool flatbuffers::Verifier::Verify(size_t) const’
   88 |   template<typename T> bool Verify(const size_t elem) const {
      |                             ^~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:88:29: note:   template argument deduction/substitution failed:
/build/adljack/src/adljack-1.3.0/sources/state_generated.h:190:27: note:   couldn’t deduce template parameter ‘T’
  190 |            verifier.Verify(emulator()) &&
      |            ~~~~~~~~~~~~~~~^~~~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:72:8: note: candidate: ‘bool flatbuffers::Verifier::Verify(size_t, size_t) const’
   72 |   bool Verify(const size_t elem, const size_t elem_len) const {
      |        ^~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:72:8: note:   candidate expects 2 arguments, 1 provided
/build/adljack/src/adljack-1.3.0/sources/state_generated.h: In member function ‘bool fb::state::Player_State::Verify(flatbuffers::Verifier&) const’:
/build/adljack/src/adljack-1.3.0/sources/state_generated.h:254:27: error: no matching function for call to ‘flatbuffers::Verifier::Verify(const flatbuffers::String*)’
  254 |            verifier.Verify(bank_file()) &&
      |            ~~~~~~~~~~~~~~~^~~~~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:88:29: note: candidate: ‘template<class T> bool flatbuffers::Verifier::Verify(size_t) const’
   88 |   template<typename T> bool Verify(const size_t elem) const {
      |                             ^~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:88:29: note:   template argument deduction/substitution failed:
/build/adljack/src/adljack-1.3.0/sources/state_generated.h:254:27: note:   couldn’t deduce template parameter ‘T’
  254 |            verifier.Verify(bank_file()) &&
      |            ~~~~~~~~~~~~~~~^~~~~~~~~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:72:8: note: candidate: ‘bool flatbuffers::Verifier::Verify(size_t, size_t) const’
   72 |   bool Verify(const size_t elem, const size_t elem_len) const {
      |        ^~~~~~
/build/adljack/src/adljack-1.3.0/thirdparty/flatbuffers/include/flatbuffers/verifier.h:72:8: note:   candidate expects 2 arguments, 1 provided
make[2]: Leaving directory '/build/adljack/src/build'
[ 97%] Built target adlrt
/build/adljack/src/adljack-1.3.0/sources/jackmain.cc: In function ‘int session_save(char**, void*)’:
/build/adljack/src/adljack-1.3.0/sources/jackmain.cc:206:20: warning: unused variable ‘ctx’ [-Wunused-variable]
  206 |     Audio_Context &ctx = *(Audio_Context *)user_data;
      |                    ^~~
make[2]: *** [CMakeFiles/adljack.dir/build.make:216: CMakeFiles/adljack.dir/sources/state.cc.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[2]: Leaving directory '/build/adljack/src/build'
make[1]: *** [CMakeFiles/Makefile2:160: CMakeFiles/adljack.dir/all] Error 2
make[1]: Leaving directory '/build/adljack/src/build'
make: *** [Makefile:156: all] Error 2

MIDI latency work

Feature request by @Wohlstand

Process in segmented buffers for latency reduction. A work was made in the timestamps branch.

Problem
RtMidi sends wrong timestamps! 👿 The problem is present in different APIs. (ALSA, WinMM)
Certainly, the timestamping code is not very robust and needs rework..

At the first event with Wine and DirectSound, RtMidi can emit a timestamp 4292560.577000 seconds.

In ALSA, there is seemingly a wrong calculation in a difference of timespec values...
I converted the computation to using floating point, since after all timeStamp is typed double...
This particular problem seemed resolved, but latency problems were still present..
rtmidi-alsa.diff.gz

No source tarball for 1.3.0

Hi! While trying to upgrade to 1.3.0 I ran into the issue, that no source tarball for the release is available.
The auto-generated tarballs do not contain git submodules. Can you please add one?

CMake Error at CMakeLists.txt:43

Hello, I'm getting this cmake error:

CMake Error at CMakeLists.txt:43 (add_library):
  Target "pdcurses" links to item "-L/usr/lib/x86_64-linux-gnu -lSDL2 " which
  has leading or trailing whitespace.  This is now an error according to
  policy CMP0004.

Though the configuration completes successfully and the code compiles without errors.

My OS is Ubuntu 16.04 (cmake version 3.5.1)

AZERTY keyboard mapping

The current key mapping must be terrible for AZERTY keyboard users.
If I can detect the keyboard, I'll assign a mapping which is more comfortable.

No Midi Input devices on Windows 7

my problem is ADLjack can't find any MiDi input devices and thus won't work
do i need the OPNMidi and/or OPLMidi first?

for clarification, i want to use the OPNMidi with dosbox

nouvelle version ?

Je vois qu'il y a 48 commits depuis la version 1.0.0 .
Penses-tu relâcher une nouvelle version d'ici peu ?

NSM announce pid

It's interesting that you created a terminal application that works with NSM, I didn't realize that it was possible.

But it also raises a question, which pid should you announce with. The NSM server launches the NSM client and needs to manage it's pid (SIGTERM). In the case of adljack, the announced pid differs from the pid of the process which is started and controlled by the NSM server.
Houston4444/RaySession#16 (comment)

Do I understand it correctly that the NSM server actually starts a terminal, not adljack directly? And shouldn't adljack announce with the pid of that terminal process and so the NSM server can kill that terminal process when stopping adljack?

I think the announced pid of adljack should be the same as the process that is started by the NSM server, otherwise we can't be 100% certain that the server is killing the right pid, if it uses the by adljack announced pid. At least, that is how I understand it.

https://mywiki.wooledge.org/ProcessManagement?highlight=%28processes%29#PIDs_and_parents

Session management "switch" capability

For this, I must add the ability for a player to reload its default bank.
Either do this on libADLMIDI side, or on my side by disabling bank embeds of the library and using only my own defaults.

rtaudio 6 compatibility

Hi! rtaudio 6 has been released with a few breaking changes.

On Arch Linux I'm currently attempting a rebuild, but there seem to be incompatibilities:

[ 80%] Building CXX object CMakeFiles/adlrt.dir/sources/tui_channels.cc.o
/usr/bin/c++ -DADLJACK_HAVE_MLOCKALL -DADLJACK_I18N -DADLJACK_PREFIX=\"/usr\" -DADLJACK_USE_CURSES -DADLMIDI_DISABLE_CPP_EXTRAS -DADLMIDI_DISABLE_MIDI_SEQUENCER -DBWMIDI_DISABLE_MUS_SUPPORT -DBWMIDI_DISABLE_XMI_SUPPORT -I/usr/include/rtaudio -I/usr/include/rtmidi -I/build/adljack/src/adljack-1.2.0/thirdparty/libADLMID
I/include -I/build/adljack/src/adljack-1.2.0/thirdparty/libOPNMIDI/include -I/build/adljack/src/adljack-1.2.0/thirdparty/ring-buffer/include -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection -Wp
,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/build/adljack/src=/usr/src/debug/adljack -flto=auto -Wall -std=gnu++11 -MD -MT CMakeFiles/adlrt.dir/sources/i18n.cc.o -MF CMakeFiles/adlrt.dir/sources/i18n.cc.o.d -o CMakeFiles/adlrt.dir/sources/i18n.cc.o -c /build/adljack/src/adljack-1.2.0/sources/i18n.cc
/usr/bin/c++ -DADLJACK_HAVE_MLOCKALL -DADLJACK_I18N -DADLJACK_PREFIX=\"/usr\" -DADLJACK_USE_CURSES -DADLMIDI_DISABLE_CPP_EXTRAS -DADLMIDI_DISABLE_MIDI_SEQUENCER -DBWMIDI_DISABLE_MUS_SUPPORT -DBWMIDI_DISABLE_XMI_SUPPORT -I/usr/include/rtaudio -I/usr/include/rtmidi -I/build/adljack/src/adljack-1.2.0/thirdparty/libADLMID
I/include -I/build/adljack/src/adljack-1.2.0/thirdparty/libOPNMIDI/include -I/build/adljack/src/adljack-1.2.0/thirdparty/ring-buffer/include -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection -Wp
,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/build/adljack/src=/usr/src/debug/adljack -flto=auto -Wall -std=gnu++11 -MD -MT CMakeFiles/adlrt.dir/sources/rtmain.cc.o -MF CMakeFiles/adlrt.dir/sources/rtmain.cc.o.d -o CMakeFiles/adlrt.dir/sources/rtmain.cc.o -c /build/adljack/src/adljack-1.2.0/sources/rtmain.cc
[ 80%] Building CXX object CMakeFiles/adlrt.dir/sources/player.cc.o
/usr/bin/c++ -DADLJACK_HAVE_MLOCKALL -DADLJACK_I18N -DADLJACK_PREFIX=\"/usr\" -DADLJACK_USE_CURSES -DADLMIDI_DISABLE_CPP_EXTRAS -DADLMIDI_DISABLE_MIDI_SEQUENCER -DBWMIDI_DISABLE_MUS_SUPPORT -DBWMIDI_DISABLE_XMI_SUPPORT -I/usr/include/rtaudio -I/usr/include/rtmidi -I/build/adljack/src/adljack-1.2.0/thirdparty/libADLMID
I/include -I/build/adljack/src/adljack-1.2.0/thirdparty/libOPNMIDI/include -I/build/adljack/src/adljack-1.2.0/thirdparty/ring-buffer/include -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection -Wp
,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/build/adljack/src=/usr/src/debug/adljack -flto=auto -Wall -std=gnu++11 -MD -MT CMakeFiles/adlrt.dir/sources/tui_fileselect.cc.o -MF CMakeFiles/adlrt.dir/sources/tui_fileselect.cc.o.d -o CMakeFiles/adlrt.dir/sources/tui_fileselect.cc.o -c /build/adljack/src/adljack-1.2.0/sou
rces/tui_fileselect.cc
/usr/bin/c++ -DADLJACK_HAVE_MLOCKALL -DADLJACK_I18N -DADLJACK_PREFIX=\"/usr\" -DADLJACK_USE_CURSES -DADLMIDI_DISABLE_CPP_EXTRAS -DADLMIDI_DISABLE_MIDI_SEQUENCER -DBWMIDI_DISABLE_MUS_SUPPORT -DBWMIDI_DISABLE_XMI_SUPPORT -I/usr/include/rtaudio -I/usr/include/rtmidi -I/build/adljack/src/adljack-1.2.0/thirdparty/libADLMID
I/include -I/build/adljack/src/adljack-1.2.0/thirdparty/libOPNMIDI/include -I/build/adljack/src/adljack-1.2.0/thirdparty/ring-buffer/include -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection -Wp
,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/build/adljack/src=/usr/src/debug/adljack -flto=auto -Wall -std=gnu++11 -MD -MT CMakeFiles/adlrt.dir/sources/tui.cc.o -MF CMakeFiles/adlrt.dir/sources/tui.cc.o.d -o CMakeFiles/adlrt.dir/sources/tui.cc.o -c /build/adljack/src/adljack-1.2.0/sources/tui.cc
[ 82%] Building CXX object CMakeFiles/adlrt.dir/sources/common.cc.o
/usr/bin/c++ -DADLJACK_HAVE_MLOCKALL -DADLJACK_I18N -DADLJACK_PREFIX=\"/usr\" -DADLJACK_USE_CURSES -DADLMIDI_DISABLE_CPP_EXTRAS -DADLMIDI_DISABLE_MIDI_SEQUENCER -DBWMIDI_DISABLE_MUS_SUPPORT -DBWMIDI_DISABLE_XMI_SUPPORT -I/usr/include/rtaudio -I/usr/include/rtmidi -I/build/adljack/src/adljack-1.2.0/thirdparty/libADLMID
I/include -I/build/adljack/src/adljack-1.2.0/thirdparty/libOPNMIDI/include -I/build/adljack/src/adljack-1.2.0/thirdparty/ring-buffer/include -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection -Wp
,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/build/adljack/src=/usr/src/debug/adljack -flto=auto -Wall -std=gnu++11 -MD -MT CMakeFiles/adlrt.dir/sources/tui_channels.cc.o -MF CMakeFiles/adlrt.dir/sources/tui_channels.cc.o.d -o CMakeFiles/adlrt.dir/sources/tui_channels.cc.o -c /build/adljack/src/adljack-1.2.0/sources/t
ui_channels.cc
/usr/bin/c++ -DADLJACK_HAVE_MLOCKALL -DADLJACK_I18N -DADLJACK_PREFIX=\"/usr\" -DADLJACK_USE_CURSES -DADLMIDI_DISABLE_CPP_EXTRAS -DADLMIDI_DISABLE_MIDI_SEQUENCER -DBWMIDI_DISABLE_MUS_SUPPORT -DBWMIDI_DISABLE_XMI_SUPPORT -I/usr/include/rtaudio -I/usr/include/rtmidi -I/build/adljack/src/adljack-1.2.0/thirdparty/libADLMID
I/include -I/build/adljack/src/adljack-1.2.0/thirdparty/libOPNMIDI/include -I/build/adljack/src/adljack-1.2.0/thirdparty/ring-buffer/include -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection -Wp
,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/build/adljack/src=/usr/src/debug/adljack -flto=auto -Wall -std=gnu++11 -MD -MT CMakeFiles/adlrt.dir/sources/insnames.cc.o -MF CMakeFiles/adlrt.dir/sources/insnames.cc.o.d -o CMakeFiles/adlrt.dir/sources/insnames.cc.o -c /build/adljack/src/adljack-1.2.0/sources/insnames.cc
/usr/bin/c++ -DADLJACK_HAVE_MLOCKALL -DADLJACK_I18N -DADLJACK_PREFIX=\"/usr\" -DADLJACK_USE_CURSES -DADLMIDI_DISABLE_CPP_EXTRAS -DADLMIDI_DISABLE_MIDI_SEQUENCER -DBWMIDI_DISABLE_MUS_SUPPORT -DBWMIDI_DISABLE_XMI_SUPPORT -I/usr/include/rtaudio -I/usr/include/rtmidi -I/build/adljack/src/adljack-1.2.0/thirdparty/libADLMID
I/include -I/build/adljack/src/adljack-1.2.0/thirdparty/libOPNMIDI/include -I/build/adljack/src/adljack-1.2.0/thirdparty/ring-buffer/include -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection -Wp
,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/build/adljack/src=/usr/src/debug/adljack -flto=auto -Wall -std=gnu++11 -MD -MT CMakeFiles/adlrt.dir/sources/player_traits.cc.o -MF CMakeFiles/adlrt.dir/sources/player_traits.cc.o.d -o CMakeFiles/adlrt.dir/sources/player_traits.cc.o -c /build/adljack/src/adljack-1.2.0/source
s/player_traits.cc
/usr/bin/c++ -DADLJACK_HAVE_MLOCKALL -DADLJACK_I18N -DADLJACK_PREFIX=\"/usr\" -DADLJACK_USE_CURSES -DADLMIDI_DISABLE_CPP_EXTRAS -DADLMIDI_DISABLE_MIDI_SEQUENCER -DBWMIDI_DISABLE_MUS_SUPPORT -DBWMIDI_DISABLE_XMI_SUPPORT -I/usr/include/rtaudio -I/usr/include/rtmidi -I/build/adljack/src/adljack-1.2.0/thirdparty/libADLMID
I/include -I/build/adljack/src/adljack-1.2.0/thirdparty/libOPNMIDI/include -I/build/adljack/src/adljack-1.2.0/thirdparty/ring-buffer/include -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection -Wp
,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/build/adljack/src=/usr/src/debug/adljack -flto=auto -Wall -std=gnu++11 -MD -MT CMakeFiles/adlrt.dir/sources/player.cc.o -MF CMakeFiles/adlrt.dir/sources/player.cc.o.d -o CMakeFiles/adlrt.dir/sources/player.cc.o -c /build/adljack/src/adljack-1.2.0/sources/player.cc
/usr/bin/c++ -DADLJACK_HAVE_MLOCKALL -DADLJACK_I18N -DADLJACK_PREFIX=\"/usr\" -DADLJACK_USE_CURSES -DADLMIDI_DISABLE_CPP_EXTRAS -DADLMIDI_DISABLE_MIDI_SEQUENCER -DBWMIDI_DISABLE_MUS_SUPPORT -DBWMIDI_DISABLE_XMI_SUPPORT -I/usr/include/rtaudio -I/usr/include/rtmidi -I/build/adljack/src/adljack-1.2.0/thirdparty/libADLMID
I/include -I/build/adljack/src/adljack-1.2.0/thirdparty/libOPNMIDI/include -I/build/adljack/src/adljack-1.2.0/thirdparty/ring-buffer/include -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection -Wp
,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/build/adljack/src=/usr/src/debug/adljack -flto=auto -Wall -std=gnu++11 -MD -MT CMakeFiles/adlrt.dir/sources/common.cc.o -MF CMakeFiles/adlrt.dir/sources/common.cc.o.d -o CMakeFiles/adlrt.dir/sources/common.cc.o -c /build/adljack/src/adljack-1.2.0/sources/common.cc
/build/adljack/src/adljack-1.2.0/sources/player_traits.cc: In static member function ‘static int Player_Traits<Player_Type::OPN2>::set_bank(player*, unsigned int)’:
/build/adljack/src/adljack-1.2.0/sources/player_traits.cc:14:83: note: ‘#pragma message: Using my own bank embed for OPN2. Remove this in the future.’
   14 |     #pragma message("Using my own bank embed for OPN2. Remove this in the future.")
      |                                                                                   ^
/build/adljack/src/adljack-1.2.0/sources/rtmain.cc:123:6: error: variable or field ‘audio_error_callback’ declared void
  123 | void audio_error_callback(RtAudioError::Type type, const std::string &text)
      |      ^~~~~~~~~~~~~~~~~~~~
/build/adljack/src/adljack-1.2.0/sources/rtmain.cc:123:27: error: ‘RtAudioError’ has not been declared
  123 | void audio_error_callback(RtAudioError::Type type, const std::string &text)
      |                           ^~~~~~~~~~~~
/build/adljack/src/adljack-1.2.0/sources/rtmain.cc:123:52: error: expected primary-expression before ‘const’
  123 | void audio_error_callback(RtAudioError::Type type, const std::string &text)
      |                                                    ^~~~~
/build/adljack/src/adljack-1.2.0/sources/rtmain.cc: In function ‘int audio_main()’:
/build/adljack/src/adljack-1.2.0/sources/rtmain.cc:180:40: error: ‘audio_error_callback’ was not declared in this scope; did you mean ‘midi_error_callback’?
  180 |         &process, &ctx, &stream_opts, &audio_error_callback);
      |                                        ^~~~~~~~~~~~~~~~~~~~
      |                                        midi_error_callback
make[2]: *** [CMakeFiles/adlrt.dir/build.make:76: CMakeFiles/adlrt.dir/sources/rtmain.cc.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[2]: Leaving directory '/build/adljack/src/build'
make[1]: *** [CMakeFiles/Makefile2:209: CMakeFiles/adlrt.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 83%] Linking CXX static library libflatbuffers.a
cd /build/adljack/src/build/thirdparty/flatbuffers && /usr/bin/cmake -P CMakeFiles/flatbuffers.dir/cmake_clean_target.cmake
cd /build/adljack/src/build/thirdparty/flatbuffers && /usr/bin/cmake -E cmake_link_script CMakeFiles/flatbuffers.dir/link.txt --verbose=1
/usr/bin/ar qc libflatbuffers.a CMakeFiles/flatbuffers.dir/src/code_generators.cpp.o CMakeFiles/flatbuffers.dir/src/idl_parser.cpp.o CMakeFiles/flatbuffers.dir/src/idl_gen_text.cpp.o CMakeFiles/flatbuffers.dir/src/reflection.cpp.o CMakeFiles/flatbuffers.dir/src/util.cpp.o
/usr/bin/ranlib libflatbuffers.a
make[2]: Leaving directory '/build/adljack/src/build'
[ 83%] Built target flatbuffers
make[1]: Leaving directory '/build/adljack/src/build'
make: *** [Makefile:156: all] Error 2

FWIW, I'm not building against the vendored sources, as vendoring them is a problem for distributions (see https://fedoraproject.org/wiki/Bundled_Libraries).

Full build logs:

adljack-1.2.0-5-x86_64-build.log

Change the program/instrument via GUI

I'm using a sequencer that has no way to send a program change or bank change (to be clear: just note on and off, nothing else).

Could you make it possible to select the instruments per channel in adljack directly?

I'm using adljack in the non session manager so it can remember the instruments that way.

dependency for ALSA unclear

hi! wonderfull instrument you made here! (played with it in Manjaro)
I am trying to install this on a Raspberry Pi ZeroW, but these pop up during the config process of cmake:

!!   virtualMIDI: NO
!!   RtAudio system library: NO
!!   RtMidi system library: NO

which i think results in adlrt after compiling, installing and starting to output:

terminate called after throwing an instance of 'RtAudioError'
  what():  RtApiPulse::probeDeviceOpen: error connecting output to PulseAudio server.
Aborted

what should be in place for this to work? This only works with PulseAudio running?

auto-connection à jackd

Ça serait super si les sorties audio pouvaient s'auto-connecter aux sorties "system" du graph de jackd. Un switch en CLI serait idéal car on pourrait alors choisir d'utiliser cette fonctionnalité (ou pas, cas d'un gestionnaire de session par exemple).

git build fails

build]$ cmake -DCMAKE_BUILD_TYPE=Release ..

CMake Error at CMakeLists.txt:35 (add_subdirectory):
  The source directory

    /home/user/git/adljack/thirdparty/libADLMIDI

  does not contain a CMakeLists.txt file.


CMake Error at CMakeLists.txt:36 (add_subdirectory):
  The source directory

    /home/user/git/adljack/thirdparty/libOPNMIDI

  does not contain a CMakeLists.txt file.


CMake Error at CMakeLists.txt:37 (add_subdirectory):
  The source directory

    /home/user/git/adljack/thirdparty/flatbuffers

  does not contain a CMakeLists.txt file.

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.