Coder Social home page Coder Social logo

cycfi / q Goto Github PK

View Code? Open in Web Editor NEW
1.1K 44.0 146.0 169.57 MB

C++ Library for Audio Digital Signal Processing

License: MIT License

C++ 98.14% CMake 1.66% Python 0.20%
dsp-library synth c-plus-plus dsp audio audio-processing pitch-detection pitch-tracking effects music frequency function-composition modern-cpp cpp14-library cpp11 cpp14 cpp17 cpp-library guitar-processor

q's Introduction

Q-Logo Audio DSP Library

CMake Build Matrix

Introduction

Q is a cross-platform C++ library for audio digital signal processing. Q is named after the "Q factor," a dimensionless parameter that describes the quality of a resonant circuit. The Q DSP Library is designed to be simple and elegant, as the simplicity of its name suggests, and efficient enough to run on small microcontrollers.

Q simplifies complex DSP programming tasks without sacrificing readability by leveraging the power of modern C++ and efficient use of functional programming techniques, especially function composition using fine-grained and reusable function objects (both stateless and stateful).

Q is the host of some experimental Music related DSP facilities the author has accumulated over the years as part of research and development, and will continue to evolve to accommodate more facilities necessary for the fulfillment of various Music related projects.

The library is Open Source and released under the very liberal MIT license.

WARNING The library is currently undergoing massive refactoring as writing documentation is underway. Changes will happen in the develop branch, but the master branch will follow as soon as things stabilize. Because of this situation, the code in master will not be in sync with the documentation. There will be significant changes to the API, but such changes will be reflected in the documentation being written.

Overview

The Q library comprises of two layers:

  1. q_io: Audio and MIDI I/O layer. The q_io layer provides cross-platform audio and MIDI host connectivity straight out of the box. The q_io layer is optional. The q_lib layer is usable without it.

  2. q_lib: The core DSP library, q_lib is a no-frills, lightweight, header-only library.

Dependencies

The dependencies are determined by the arrows.

  • q_io has very minimal dependencies (portaudio and portmidi) with very loose coupling via thin wrappers that are easy to transplant and port to a host, with or without an operating system, such as an audio plugin or direct to hardware ADC and DAC.

  • q_io is used in the tests and examples, but can be easily replaced by other mechanisms in an application. DAW (digital audio workstations), for example, have their own audio and MIDI I/O mechanisms.

  • q_lib has no dependencies except the standard c++ library.

The q_io layer provides cross-platform audio and MIDI host connectivity straight out of the box. The q_io layer is optional. The q_lib layer is usable without it. q_io is used in the tests and examples, but can be easily replaced by other mechanisms in an application.

Documentation

Documentation is currently work in progress.

About the Author

Joel got into electronics and programming in the 80s because almost everything in music, his first love, is becoming electronic and digital. Since then, he builds his own guitars, effect boxes and synths. He enjoys playing distortion-laden rock guitar, composes and produces his own music in his home studio.

Joel de Guzman is the principal architect and engineer at Cycfi Research. He is a software engineer specializing in advanced C++ and an advocate of Open Source. He has authored a number of highly successful Open Source projects such as Boost.Spirit, Boost.Phoenix and Boost.Fusion. These libraries are all part of the Boost Libraries, a well respected, peer-reviewed, Open Source, collaborative development effort.

Discord

Feel free to join the discord channel for discussion and chat with the developer.

Copyright (c) 2014-2023 Joel de Guzman. All rights reserved. Distributed under the MIT License

q's People

Contributors

alperc84 avatar andersama avatar christofmuc avatar colinbarry avatar dependabot[bot] avatar dissonancedev avatar djowel avatar mikelange49 avatar propeller3d avatar redtide avatar sarahcrowle avatar schult avatar thirtythreeforty 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  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

q's Issues

Mac os 11.2 needs latest portaudio for running

Hey,

Thanks for a great library!

It seems however that building and running the examples on a modern mac needs some of the latest stuff from portaudio master https://github.com/PortAudio/portaudio instead of the currently used sha from the head of the submodule @09087cf5a63d6fdb6aca139331f017da970f8177, which is behind

[submodule "q_io/external/portaudio"]
	path = q_io/external/portaudio
	url = https://git.assembla.com/portaudio.git

Currently most examples are failing with

❯ example/example_sin_synth
||PaMacCore (AUHAL)|| Error on line 1316: err='-66748', msg=Unknown Error

Is there a reason for using portaudio from git.assembla.com instead of the github one?

Would you care to update the portaudio submodule to include its latest commits from master, or would you accept a PR that moves to the head portaudio from github?

Regards
Torgeir

Explanation of how to best use the pitch detector

Hello! I've tried out the q library for hardware pitchtracking on a Bela. It works very well! As of now I'm simply calling the operator and subsequently "get_frequency" every time the operator returns true.

I'm curious to the structure of the pitch_detector.hpp and the public member functions.
Some things are not clear to me.
What are the purpose of the different functions? How and when should they be called? If they return something, what is the expected range (for example periodicity)?

A more general description would be much aprreciated. Here are some more specific questions I have:

  • What does the hysteresis parameter in the constructor do?
  • What's the difference between "predict_frequency" and "get_frequency"? What is the init parameter for "predict_frequency"?
  • What does is_note_shift do? I guess it returns true if there is a switch in frequency identified? But how about onset from silence? Does it return true also?

Grateful for any response <3

Incorrect Implementation in WAV memory read

The issue was when I tried to read the entire wav file with the following code, the program will crash when it is reaching the end:

q::wav_memory wav{ "test\wav" };
for (int i = 0; i < wav.length(); i++)
    auto temp = wav();

After a dig through the code, I found the issue was caused by an incorrect implementation in "q/q_io/include/q_io/audio_file.hpp", in the function "inline iterator_range<float const*> const wav_memory::operator()()".

The implementation was adding the number of channels that the audio WAV has for each call, which is correct but did not consider the case that the offset is incorrect when a new buffer is read. In that case, the pointer should equal buf.begin() rather than buf.begin() + num_channels().

So the resolve the issue, simply change the following code:

if ((_pos + num_channels()) >= _buff.end())
{
    auto read_len = read(_buff.data(), _buff.size());
     if (read_len == 0)
     {
        _buff.resize(num_channels());
        std::fill(_buff.begin(), _buff.end(), 0.0f);
     }
     else if (read_len != _buff.size())
     {
         std::fill(_buff.begin()+read_len, _buff.end(), 0.0f);
     }
     _pos = _buff.begin();
}
float const* p = &*_pos;
iterator_range<float const*> r{ p, p + num_channels() };
_pos +=  num_channels();
return r;

to the following code:

if ((_pos + num_channels()) >= _buff.end())
{
    auto read_len = read(_buff.data(), _buff.size());
     if (read_len == 0)
     {
        _buff.resize(num_channels());
        std::fill(_buff.begin(), _buff.end(), 0.0f);
     }
     else if (read_len != _buff.size())
     {
         std::fill(_buff.begin()+read_len, _buff.end(), 0.0f);
     }
     _pos = _buff.begin();
}
else
{
    _pos +=  num_channels();
}
float const* p = &*_pos;
iterator_range<float const*> r{ p, p + num_channels() };
return r;

Not able to compile the examples

I'm using g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 on WSL2 and can't compile the examples in the Q/example directory.

Here's what I did so far.

  • Cloning the repo
git clone --recurse-submodules https://github.com/cycfi/Q.git
  • Installation of portaudio dependencies
sudo apt-get install libasound-dev
  • Invoking cmake after creating the Q/build directory
cd Q && \
mkdir  build && \
cd build && \
cmake -G"CodeBlocks - Unix Makefiles" ../

Finally, I navigated to the Q/example directory and tried to compile the sin_synth.cpp file using g++. But, it gives a compilation error.

$ g++ sin_synth.cpp
/usr/bin/ld: /tmp/ccdapcKc.o: in function `main':
sin_synth.cpp:(.text+0x3a): undefined reference to `cycfi::q::port_audio_stream::start()'
/usr/bin/ld: sin_synth.cpp:(.text+0x55): undefined reference to `cycfi::q::port_audio_stream::stop()'
/usr/bin/ld: /tmp/ccdapcKc.o: in function `sin_synth::sin_synth(cycfi::q::frequency)':
sin_synth.cpp:(.text._ZN9sin_synthC2EN5cycfi1q9frequencyE[_ZN9sin_synthC5EN5cycfi1q9frequencyE]+0x33): undefined reference to `cycfi::q::port_audio_stream::port_audio_stream(unsigned long, unsigned long, int, int)'
/usr/bin/ld: sin_synth.cpp:(.text._ZN9sin_synthC2EN5cycfi1q9frequencyE[_ZN9sin_synthC5EN5cycfi1q9frequencyE]+0x55): undefined reference to `cycfi::q::port_audio_stream::sampling_rate() const'
/usr/bin/ld: sin_synth.cpp:(.text._ZN9sin_synthC2EN5cycfi1q9frequencyE[_ZN9sin_synthC5EN5cycfi1q9frequencyE]+0x7f): undefined reference to `cycfi::q::port_audio_stream::~port_audio_stream()'
/usr/bin/ld: /tmp/ccdapcKc.o: in function `sin_synth::~sin_synth()':
sin_synth.cpp:(.text._ZN9sin_synthD2Ev[_ZN9sin_synthD5Ev]+0x26): undefined reference to `cycfi::q::port_audio_stream::~port_audio_stream()'
/usr/bin/ld: /tmp/ccdapcKc.o:(.data.rel.ro._ZTI9sin_synth[_ZTI9sin_synth]+0x10): undefined reference to `typeinfo for cycfi::q::port_audio_stream'
collect2: error: ld returned 1 exit status

I wonder if I am missing any flags that I need to pass with g++.

Deprecated space in "" operator overloads causes compiler warnings, which causes errors in our release builds

The file q_lib/include/q/support/literals.hpp contains 18 operator overloads for e.g.

constexpr frequency operator "" _Hz(long double val)

The space between " and _Hztriggers a compiler warning, which in our case leads to a compiler error, since we compile with warnings are errors, to force ourselves to produce clean(er) code.

All operator overloads in that file have that problem. Removing the space fixes it and has no side effects.

Additional macOS setup instructions

Hey Joel,

thank you for this wonderful library, the pitch tracking results it produces are really impressive. I would like to share my experience in setting up the library and tests and the additional steps that I needed to go through in order to make it work on macOS:

  • Add /usr/local/Cellar/portmidi/217_2/include to header search path of libqio, when portmidi.h can not be found
  • Add a "New Link Binary with Libraries Phase" and add libportaudio.a which for me was installed by brew under /usr/local/Cellar/portaudio/19.6.0/lib/libportaudio.a
  • Also add these frameworks to the phase as described here
    • CoreAudio.framework
    • AudioToolbox.framework
    • AudioUnit.framework
    • CoreServices.framework
    • Carbon.framework
  • When executing tests, make sure to execute them from 1 folder up, otherwise q::wav_reader cannot find the files but will also not file any error

Some values for lowest and highest pitch cause blank output pitch detection

While working on integrating this into a Vamp plugin xavriley/bitstream_autocorrelation_vamp#1 I've found that some values for low and high pitch appear to work whereas other values cause the output to be empty.

All the values I've tested are within four octaves of each other and I've not seen runtime errors so I don't think that is the issue.

For example, running the code linked in the issue above with a lower limit of 100Hz and an upper limit of 800Hz I get the following output:

$ make -f Makefile.osx && VAMP_PATH=. ~/Downloads/vamp-plugin-sdk-2.9.0-binaries-macos/vamp-simple-host qlib_pitch:qlib_pitch ./Q/test/audio_files/sin_440.wav
c++ -o qlib_pitch.dylib QlibPitch.o plugins.o -mmacosx-version-min=10.7 -arch x86_64 -stdlib=libc++   -dynamiclib -exported_symbols_list vamp-plugin.list ../vamp-plugin-sdk/libvamp-sdk.a

vamp-simple-host: Running...
Reading file: "./Q/test/audio_files/sin_440.wav", writing to standard output
Running plugin: "qlib_pitch"...
Using block size = 1024, step size = 1024
Plugin accepts 1 -> 1 channel(s)
Sound file has 1 (will mix/augment if necessary)
Output is: "frequency"
 0.000000000: 439.963
 0.023219955:
 0.046439909:
 0.069659864:
 0.092879819:
 0.116099773:
 0.139319728:

The 439.963 suggests this is working.

If I run the same code with a lower limit of 64Hz and an upper limit of 512Hz I get no output

$ make -f Makefile.osx && VAMP_PATH=. ~/Downloads/vamp-plugin-sdk-2.9.0-binaries-macos/vamp-simple-host qlib_pitch:qlib_pitch ./Q/test/audio_files/sin_440.wav
make: `qlib_pitch.dylib' is up to date.

vamp-simple-host: Running...
Reading file: "./Q/test/audio_files/sin_440.wav", writing to standard output
Running plugin: "qlib_pitch"...
Using block size = 1024, step size = 1024
Plugin accepts 1 -> 1 channel(s)
Sound file has 1 (will mix/augment if necessary)
Output is: "frequency"
 0.000000000:
 0.023219955:
 0.046439909:
 0.069659864:
 0.092879819:
 0.116099773:
 0.139319728:

I will continue to look into this but I'd be interested if you have any idea why this might be happening?

use with raw audio stream pointers (int16_t * audio)

could an example be provided to show how this can be used with audio buffer stream pointers?

for example

class Delay {
public:
    /**
     * return true if we still have data to write, otherwise false
     */
    bool write(PortUtils2 * in, PortUtils2 * out, unsigned int samples) {
        //
        // called as delay.write(mixerPortA, tmpPort);
        //
        // the value of samples is dependant on the audio engine, but is always equal to the samples
        // remaining in the audio block
        // it is one of two values:
        //
        // value 1: mixerPortA->ports.samples - i
        // value 2: mixerPortA->ports.samples
        //
        // example code to produce silence
        for (int i = 0; i < out->ports.samples; i += 2) {
            reinterpret_cast<int16_t *>(out->ports.outputStereo->l->buf)[i] = 0;
            reinterpret_cast<int16_t *>(out->ports.outputStereo->r->buf)[i] = 0;
        }
        return true;
    }
};

BiQuad lowpass filter problem

I have problem with BiQuad lowpass filter.

When I have filter in class for example

class Something
{
public:
     Something();
     q::lowpass filter1;
     q::lowpass filter2;
     void process(float *in, float *out);
}
Something::Something() : filter1(1500.0, 44000), filter2(800.0, 44000, 2.5) {}

it is working as expected, but under same code, when I add another filter in process, filter is not working

void process(float * in, float *out)
{
    // filter created here are not working, they output is not audible
     auto frL = q::lowpass( q::frequency(1500.0), 44000 ); 
     auto frR = q::lowpass{ q::frequency(900.0), (uint32_t)m_sampleRate };

     float L = frL(in[0]); // not audible
     float R = frR(in[1]); // not audible
     L = filter1(in[0]); // working
     R = filter2(in[1]); // working
}

Releases

Hello,

first, this library is really awesome! It really makes DSP effortless.

I wonder if releases are possible, so that it's easier for developers (and packagers) to refer to a specific version of Q.

= operator overload

Hello! I have a question about the = operator overload in the dc_block struct. Why does it take a boolean argument _y and assign it to the object? It’s not clear why this is done. Forgive me if the question is stupid because my c++ skills are limited and I’m still learning.

Use q with a float array ?

Hi, I am working on making a vst that performs some equalization tasks by reducing two frequency peaks and increasing two others.
I work in a run function that receives a const float **inputs and a const float **outputs and the uint32_t frame count, i'm not sure how i'm supposed to go about modifying this signal with q

I tried

cycfi::q::audio_channels<const float> inputChannels(inputs,sizeof(const float) * frames,frames);
cycfi::q::audio_channels<float> outputChannels(outputs,sizeof(float) * frames,frames);
cycfi::q::audio_stream stream;
stream.process(inputChannels,outputChannels);

which seems to compile but I am not sure yet if it is the right way to use these methods, I also am not sure about the way to go to do some EQ on the signal

Problems with CMakeLists

I can’t compile your library Q-master in Android Studio. The error message is: ERROR: /Users.../CMakeLists.txt : C/C++ debug|x86 : CMake Error at /Users.../CMakeLists.txt:15 (add_subdirectory):add_subdirectory given source „../infra“ which is not an existing directory.

I’m kinda of new in this subject. Could you check the Error message please?

C# or Dart port

Hi there! This is a question, not an issue =)
Does it possible to convert your lib to c# or dart(by myself)? I would try to use with Unity or Flutter.

Non-existent folder for infra library

When trying to run cmake get the following error:

CMake Error at CMakeLists.txt:15 (add_subdirectory):
  add_subdirectory given source "../infra" which is not an existing
  directory.

It looks like the infra library is missing from the repo.

Are you looking for contributors?

This project looks great. There haven't been any commits in a few months so I wanted to first ask if this project is still in development? If so, are you looking for contributors? Finally, if you are open to help, is there any area in particular?

So is this the way to phase/shift 180 a signal, for example?

This sounds promising - I'm looking to implement phase shifting using your all pass. Let's say I want an 180 shift at a float[] buffer with a sz size:

`
auto ph = cycfi::q::phase(3.1415f);

for (int i = 0 ; i < sz ; i++)
{
auto out = q::sin(ph);
buff[i] += out;
}
`

Does that seem correct?

Thanks.

Detecting voiced vs unvoiced segments using BACF

I'm wondering if you had any suggestions for this:

example

In the example above the upper graph shows BACF results for this audio file with the "ground truth" annotation on the lower graph.

As you can see, the tracking is pretty good, however I'm having an issue with unvoiced segments. In lots of other pitch tracking literature these are represented by a value of 0 or -1 (see https://craffel.github.io/mir_eval/#module-mir_eval.melody) - for example when an audio region is silent or contains unpitched noise such as plosives or fricatives.

The issue I'm having is that the pitch detector only seems to put out estimates when it is confident that there's a pitch present. It would be nice if we could output a zero when no pitch is present - for example when a whole window has passed with no valid pitch estimates. Is there any way to achieve this with the existing codebase? Otherwise I end up with a situation like the graph above where it linearly interpolates between frequency estimates without ever getting to zero.

One issue that might be relevant is that the files from this dataset are fairly poor in terms of recording quality (think people singing into laptop mics) - the example track above peaks around -10dB and is one of the better ones. I've not had much success with the signal conditioner as a result as it seems to bring up the noise floor regardless of which settings I tried.

[SUGGESTION] Audio fingerprinting

Hi there, this SOUNDS to be a cool project !

I honestly don't know if it's in project goals, but some time ago I discovered a very cool lib called Aurio that "focuses on audio processing, analysis, media synchronization and media retrieval and implements various audio fingerprinting methods".

As this video demonstrates, those algorithms can align (through its GUI called AudioAlign) fingerprinted audios between many tracks.

The drawback is that it has been developed in C# for .NET (Windows-only), so it would be really great to establish some kind of collaboration between projects in order to (finally) obtain a platform-indipendent open source multitrack synchronizer.

Hope that inspires.

Floating point assert in zero_crossing::peak_pulse()

Hi, loving your work! I gave the pitchDetection a spin, and ran into a most strange issue that might have nothing to do with your code but might be CPU floating point bug.

The debug version asserts after a few hours in the std::max() function, in a piece of code that shouldn't assert. I am using Visual Studio 2017.

This is what I see:

SourceCode asserting with "invalid comperator":

template<class _Ty>
_Post_equal_to_(_Left < _Right ? _Right : _Left)
_NODISCARD constexpr const _Ty& (max)(const _Ty& _Left, const _Ty& _Right)
_NOEXCEPT_COND(_NOEXCEPT_OPER(_Left < _Right))
{	// return larger of _Left and _Right
    if (_Left < _Right)
    {
        _STL_ASSERT(!(_Right < _Left), "invalid comparator");
        return (_Right);
    }
return (_Left);
}

Float values displayed in Debugger:

_Left	5.04023665e-05	const float &
_Right	0.000307894428	const float &

32 bit Int cast of them:
(int)&_Left 944989985 int
(int)&_Right 966880484 int

Cleary there is no reason for the CPU to calculate _Left is smaller than _Right and _Right is smaller than left.

Have you encountered any of this? I post it here because this is where it happened, but it looks more like a compiler or CPU bug. The assembler looks good, it does nothing else than

00007FF7D063F5A5  mov         rax,qword ptr [_Left]  
00007FF7D063F5AA  mov         rcx,qword ptr [_Right]  
00007FF7D063F5AF  movss       xmm0,dword ptr [rax]  
00007FF7D063F5B3  comiss      xmm0,dword ptr [rcx]  
00007FF7D063F5B6  ja          std::max<float>+3Ah (07FF7D063F5BAh)  
00007FF7D063F5B8  jmp         std::max<float>+0A5h (07FF7D063F625h)  

Where I'd say the comiss can't be that bad.

CPU: i9-9900K

I tried googling this but didn't succeed.

issues with pitch detector

Hi there,
Im trying to use your pitch detector to calibrate a eurorack module.

(Bela - using ARM)

in my current tests, this involves simply outputting a sin wave, which i then read back in and get pitch detector to tell me the frequency (which in this case i know)

but Im having a few issues...

e.g. one output (but Ive tried also sorts of different things.

PD setup: 220.000000  - 100.000000/10000.000000 hZ
test freq 220.000000
done test 0 0.000000 220.000000 : 220.000000
test freq 440.000000
done test 1 0.200000 440.000000 : 220.000000
test freq 880.000000
done test 2 0.400000 880.000000 : 876.000000
test freq 1760.000000
done test 3 0.600000 1760.000000 : 103.500000
test freq 3520.000000
done test 4 0.800000 3520.000000 : 0.000000
test freq 7040.000000
done test 5 1.000000 7040.000000 : 0.000000
calibrated output : 0
tunedV [0] : 220.000000 
tunedV [1] : 220.000000 
tunedV [2] : 876.000000 
tunedV [3] : 103.500000 
tunedV [4] : 0.000000 
tunedV [5] : 0.000000 

here you can see....
at 440hz, it didnt adjust, and stayed at 220hz
and above about 1000hz, it stops, despite me giving a 10000hz upper limit.

this test is with creating one pitch detector...

but Ive also tried a lot of different variations on this...

  • calling reset in between tests
  • creating a new pitch detector for each test
    either with a fixed range, or change the range depending upon the frequency im expecting.

but nothing really seems to make it predicable.

I wonder if Im doing something wrong?

in its simplest form, all I'm doing is:

	q::frequency lowest_freq = 100;
	q::frequency highest_freq = 10000;
	rt_printf("PD setup: %f  - %f/%f hZ\n", tfreq, lowest_freq, highest_freq);
	t_pitchDetector = std::make_unique<q::pitch_detector>(lowest_freq, highest_freq , context->audioSampleRate, -45_dB);

(variations of this, are to set low/hi frequency to half/double test frequency)

later :

			float v0 = audioRead(context, n, 0);
			is_ready = (*t_pitchDetector)(v0);

and finally :

		if (is_ready) {
			t_ptFreq = t_pitchDetector->get_frequency();
		}

am I correct in saying 'theoretically' I should be able to just let pitch detector track the frequency, and there is no requirement to reset it, or create a new one - when the frequency changes?!

fyi:
ive tried to wait different 'times' (so how many samples are passed to PD) , and this doesn't appear to help.... (anything form 32000 samples, to 80000 samples)
my pitch range is 220hz to 7040hz (so 5 octaves over 220hz)

should is_ready indicate if the pitch has 'stabilised'?

fyi: its pretty straightforward code, as ive not got pass 'proof of concept' stage... since pitch detection is pretty vital.

https://github.com/TheTechnobear/BelaPatches/blob/dev/c%2B%2B/autocal/render.cpp

Id be grateful for any pointers that might help
Thanks
Mark

Android Support

debug|arm64-v8a :  Target "libqio" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_fft" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_pitch_detector_ex" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_period_detector" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_pitch_detector" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_onset_detector" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_peak_detector" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_comb" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_moving_maximum2" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_compressor_expander2" requires the language dialect "CXX17"
debug|arm64-v8a :  (with compiler extensions), but CMake does not know the compile flags to
debug|arm64-v8a :  use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_moving_maximum" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_moving_average2" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_moving_average" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_envelope_follower" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_saw" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_compressor_ff_fb" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_compressor_expander" requires the language dialect "CXX17"
debug|arm64-v8a :  (with compiler extensions), but CMake does not know the compile flags to
debug|arm64-v8a :  use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_agc" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_pulse" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_square" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_allpass" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_basic_pulse" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_sin" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_triangle" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_basic_triangle" requires the language dialect "CXX17"
debug|arm64-v8a :  (with compiler extensions), but CMake does not know the compile flags to
debug|arm64-v8a :  use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_bitset" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_basic_saw" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_decibel" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_basic_square" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_biquad_lp" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/example/CMakeLists.txt:
debug|arm64-v8a :  Target "example_list_devices" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/example/CMakeLists.txt:
debug|arm64-v8a :  Target "example_delay" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/example/CMakeLists.txt:
debug|arm64-v8a :  Target "example_sin_synth" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/example/CMakeLists.txt:
debug|arm64-v8a :  Target "example_square_synth" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/example/CMakeLists.txt:
debug|arm64-v8a :  Target "example_midi_monitor" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :-- Generating done
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/q_io/CMakeLists.txt:
debug|arm64-v8a :  Target "libqio" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/q_io/CMakeLists.txt:
debug|arm64-v8a :  Target "libqio" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/q_io/CMakeLists.txt:
debug|arm64-v8a :  Target "libqio" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/q_io/CMakeLists.txt:
debug|arm64-v8a :  Target "libqio" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/q_io/CMakeLists.txt:
debug|arm64-v8a :  Target "libqio" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_fft" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_pitch_detector_ex" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_period_detector" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_pitch_detector" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_onset_detector" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_peak_detector" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_comb" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_moving_maximum2" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_compressor_expander2" requires the language dialect "CXX17"
debug|arm64-v8a :  (with compiler extensions), but CMake does not know the compile flags to
debug|arm64-v8a :  use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_moving_maximum" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_moving_average2" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_moving_average" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_envelope_follower" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_saw" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_compressor_ff_fb" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_compressor_expander" requires the language dialect "CXX17"
debug|arm64-v8a :  (with compiler extensions), but CMake does not know the compile flags to
debug|arm64-v8a :  use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_agc" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_pulse" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_square" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_allpass" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_basic_pulse" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_sin" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_triangle" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_basic_triangle" requires the language dialect "CXX17"
debug|arm64-v8a :  (with compiler extensions), but CMake does not know the compile flags to
debug|arm64-v8a :  use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_bitset" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_basic_saw" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_decibel" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_gen_basic_square" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/test/CMakeLists.txt:
debug|arm64-v8a :  Target "test_biquad_lp" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/example/CMakeLists.txt:
debug|arm64-v8a :  Target "example_list_devices" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/example/CMakeLists.txt:
debug|arm64-v8a :  Target "example_delay" requires the language dialect "CXX17" (with compiler
debug|arm64-v8a :  extensions), but CMake does not know the compile flags to use to enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/example/CMakeLists.txt:
debug|arm64-v8a :  Target "example_sin_synth" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/example/CMakeLists.txt:
debug|arm64-v8a :  Target "example_square_synth" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :CMake Error in Oboe/Synths/Q/example/CMakeLists.txt:
debug|arm64-v8a :  Target "example_midi_monitor" requires the language dialect "CXX17" (with
debug|arm64-v8a :  compiler extensions), but CMake does not know the compile flags to use to
debug|arm64-v8a :  enable it.
debug|arm64-v8a :-- Build files have been written to: /Users/mac/StudioProjects/libmedia-Upated/app/.cxx/cmake/debug/arm64-v8a
executing external native build for cmake /Users/mac/StudioProjects/libmedia-Upated/app/src/main/java/libmedia/CMakeLists.txt

FAILURE: Build failed with an exception.

* What went wrong:
executing external native build for cmake /Users/mac/StudioProjects/libmedia-Upated/app/src/main/java/libmedia/CMakeLists.txt

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
com.intellij.openapi.externalSystem.model.ExternalSystemException: executing external native build for cmake /Users/mac/StudioProjects/libmedia-Upated/app/src/main/java/libmedia/CMakeLists.txt
	at org.jetbrains.plugins.gradle.model.ProjectImportAction.addBuildModels(ProjectImportAction.java:269)
	at org.jetbrains.plugins.gradle.model.ProjectImportAction.execute(ProjectImportAction.java:130)
	at org.jetbrains.plugins.gradle.model.ProjectImportAction.execute(ProjectImportAction.java:55)
	at org.gradle.tooling.internal.consumer.connection.InternalBuildActionAdapter.execute(InternalBuildActionAdapter.java:77)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner$ActionRunningListener.runAction(ClientProvidedPhasedActionRunner.java:120)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner$ActionRunningListener.run(ClientProvidedPhasedActionRunner.java:110)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner$ActionRunningListener.buildFinished(ClientProvidedPhasedActionRunner.java:104)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.event.DefaultListenerManager$ListenerDetails.dispatch(DefaultListenerManager.java:376)
	at org.gradle.internal.event.DefaultListenerManager$ListenerDetails.dispatch(DefaultListenerManager.java:358)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
	at org.gradle.internal.event.DefaultListenerManager$EventBroadcast$ListenerDispatch.dispatch(DefaultListenerManager.java:346)
	at org.gradle.internal.event.DefaultListenerManager$EventBroadcast$ListenerDispatch.dispatch(DefaultListenerManager.java:333)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:324)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:234)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
	at com.sun.proxy.$Proxy12.buildFinished(Unknown Source)
	at org.gradle.initialization.DefaultGradleLauncher.finishBuild(DefaultGradleLauncher.java:179)
	at org.gradle.initialization.DefaultGradleLauncher.finishBuild(DefaultGradleLauncher.java:141)
	at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:83)
	at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:75)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:183)
	at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:40)
	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:75)
	at org.gradle.internal.invocation.GradleBuildController.configure(GradleBuildController.java:64)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner.run(ClientProvidedPhasedActionRunner.java:62)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:58)
	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:39)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:51)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:45)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:49)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:46)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:78)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:46)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:31)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:42)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:28)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:52)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:68)
	at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:38)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:37)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:26)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:60)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:32)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:41)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:48)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:32)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
org.gradle.api.GradleException: executing external native build for cmake /Users/mac/StudioProjects/libmedia-Upated/app/src/main/java/libmedia/CMakeLists.txt
	at com.android.build.gradle.internal.cxx.logging.ErrorsAreFatalThreadLoggingEnvironment.close(ErrorsAreFatalThreadLoggingEnvironment.kt:50)
	at com.android.build.gradle.tasks.ExternalNativeJsonGenerator.buildForOneConfigurationConvertExceptions(ExternalNativeJsonGenerator.java:164)
	at com.android.build.gradle.tasks.ExternalNativeJsonGenerator.buildForOneAbiName(ExternalNativeJsonGenerator.java:208)
	at com.android.build.gradle.internal.ide.NativeModelBuilder.buildNativeVariantAbi(NativeModelBuilder.kt:149)
	at com.android.build.gradle.internal.ide.NativeModelBuilder.buildAll(NativeModelBuilder.kt:97)
	at com.android.build.gradle.internal.ide.NativeModelBuilder.buildAll(NativeModelBuilder.kt:38)
	at org.gradle.tooling.provider.model.internal.DefaultToolingModelBuilderRegistry$ParameterizedBuildOperationWrappingToolingModelBuilder$1$1.create(DefaultToolingModelBuilderRegistry.java:138)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry.withLenientState(DefaultProjectStateRegistry.java:132)
	at org.gradle.tooling.provider.model.internal.DefaultToolingModelBuilderRegistry$ParameterizedBuildOperationWrappingToolingModelBuilder$1.call(DefaultToolingModelBuilderRegistry.java:134)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
	at org.gradle.tooling.provider.model.internal.DefaultToolingModelBuilderRegistry$ParameterizedBuildOperationWrappingToolingModelBuilder.buildAll(DefaultToolingModelBuilderRegistry.java:131)
	at org.gradle.tooling.internal.provider.runner.DefaultBuildController.getParameterizedModel(DefaultBuildController.java:99)
	at org.gradle.tooling.internal.provider.runner.DefaultBuildController.getModel(DefaultBuildController.java:81)
	at org.gradle.tooling.internal.consumer.connection.InternalBuildActionAdapter$2.getModel(InternalBuildActionAdapter.java:74)
	at org.gradle.tooling.internal.consumer.connection.BuildControllerAdapter.getModel(BuildControllerAdapter.java:62)
	at org.gradle.tooling.internal.consumer.connection.AbstractBuildController.findModel(AbstractBuildController.java:57)
	at org.jetbrains.plugins.gradle.model.ProjectImportAction$MyBuildController.findModel(ProjectImportAction.java:555)
	at com.android.tools.idea.gradle.project.sync.idea.svs.SelectedVariantChooserKt.syncAndAddNativeVariantAbi(SelectedVariantChooser.kt:205)
	at com.android.tools.idea.gradle.project.sync.idea.svs.SelectedVariantChooserKt.chooseSelectedVariants(SelectedVariantChooser.kt:86)
	at com.android.tools.idea.gradle.project.sync.idea.svs.AndroidExtraModelProvider.populateAndroidModels(AndroidExtraModelProvider.kt:90)
	at com.android.tools.idea.gradle.project.sync.idea.svs.AndroidExtraModelProvider.populateBuildModels(AndroidExtraModelProvider.kt:40)
	at org.jetbrains.plugins.gradle.model.ProjectImportAction.addBuildModels(ProjectImportAction.java:257)
	at org.jetbrains.plugins.gradle.model.ProjectImportAction.execute(ProjectImportAction.java:130)
	at org.jetbrains.plugins.gradle.model.ProjectImportAction.execute(ProjectImportAction.java:55)
	at org.gradle.tooling.internal.consumer.connection.InternalBuildActionAdapter.execute(InternalBuildActionAdapter.java:77)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner$ActionRunningListener.runAction(ClientProvidedPhasedActionRunner.java:120)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner$ActionRunningListener.run(ClientProvidedPhasedActionRunner.java:110)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner$ActionRunningListener.buildFinished(ClientProvidedPhasedActionRunner.java:104)
	at sun.reflect.GeneratedMethodAccessor48.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.event.DefaultListenerManager$ListenerDetails.dispatch(DefaultListenerManager.java:376)
	at org.gradle.internal.event.DefaultListenerManager$ListenerDetails.dispatch(DefaultListenerManager.java:358)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
	at org.gradle.internal.event.DefaultListenerManager$EventBroadcast$ListenerDispatch.dispatch(DefaultListenerManager.java:346)
	at org.gradle.internal.event.DefaultListenerManager$EventBroadcast$ListenerDispatch.dispatch(DefaultListenerManager.java:333)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:324)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:234)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
	at com.sun.proxy.$Proxy12.buildFinished(Unknown Source)
	at org.gradle.initialization.DefaultGradleLauncher.finishBuild(DefaultGradleLauncher.java:179)
	at org.gradle.initialization.DefaultGradleLauncher.finishBuild(DefaultGradleLauncher.java:141)
	at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:83)
	at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:75)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:183)
	at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:40)
	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:75)
	at org.gradle.internal.invocation.GradleBuildController.configure(GradleBuildController.java:64)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner.run(ClientProvidedPhasedActionRunner.java:62)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:58)
	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:39)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:51)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:45)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:49)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:46)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:78)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:46)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:31)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:42)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:28)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:52)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:68)
	at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:38)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:37)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:26)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:60)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:32)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:41)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:48)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:32)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
	at java.lang.Thread.run(Thread.java:748)



* Get more help at https://help.gradle.org

CONFIGURE FAILED in 8s

Can't compile Xcode 11.3

      moving_average(duration d, std::size_t sps)
       : moving_average(std::size_t(sps * float(d)))
Showing All Messages
/Users/rrabien/dev.github/slPlugins/modules/Q/q_lib/include/q/fx/moving_average.hpp:50:43: Cannot convert 'cycfi::duration' (aka 'duration<double>') to 'float' without a conversion operator

Implementing Q_Lib with Juce - Linker errors

Hey,

As described earlier through facebook, I'm trying to implement Q_Lib with Juce.

I included search paths for infra and q_lib into an empty Juce Project and included pitch_detector.hpp into my Juce main class.

A few errors happen after that.

  1. q/support/base.hpp:
    The two last functions in the script (abs_within(), relwithin()) call std::abs(). Xcode reports that the call to abs is ambiguous.
    I "fixed" it by removing the std:: to make it use the namespace’s own constexpr abs()… bad fix probably? 


  2. q/utility/zero_crossing.hpp:
    Doesn’t know type decibel.
    My probably bad fix: included <q/support/decibel.hpp> into zero_crossing.hpp

After that no more errors in the scripts, but the attached linker errors show up.
What I can read from this is that there are duplicate symbols for the following functions:

count_bits()(in q/detail/count_bits.hpp) 
autocorreclate() (in q/pitch/period_detector.hpp)
predict_period() (in q/pitch/period_detector.hpp)

Any idea how I can tackle this? Or am I even the one causing these through my assumingly hacky fixes described above?

Here are the linker errors as reported by Xcode

duplicate symbol __ZN5cycfi1q6detail10count_bitsEy in:
    /Users/benediktsailer/Library/Developer/Xcode/DerivedData/PitchDetection-cftahhuurjbgrrfhpqyoqkkcntwm/Build/Intermediates.noindex/PitchDetection.build/Debug/PitchDetection - App.build/Objects-normal/x86_64/MainComponent.o
    /Users/benediktsailer/Library/Developer/Xcode/DerivedData/PitchDetection-cftahhuurjbgrrfhpqyoqkkcntwm/Build/Intermediates.noindex/PitchDetection.build/Debug/PitchDetection - App.build/Objects-normal/x86_64/Main.o
duplicate symbol __ZN5cycfi1q15period_detector13autocorrelateEv in:
    /Users/benediktsailer/Library/Developer/Xcode/DerivedData/PitchDetection-cftahhuurjbgrrfhpqyoqkkcntwm/Build/Intermediates.noindex/PitchDetection.build/Debug/PitchDetection - App.build/Objects-normal/x86_64/MainComponent.o
    /Users/benediktsailer/Library/Developer/Xcode/DerivedData/PitchDetection-cftahhuurjbgrrfhpqyoqkkcntwm/Build/Intermediates.noindex/PitchDetection.build/Debug/PitchDetection - App.build/Objects-normal/x86_64/Main.o
duplicate symbol __ZNK5cycfi1q15period_detector14predict_periodEv in:
    /Users/benediktsailer/Library/Developer/Xcode/DerivedData/PitchDetection-cftahhuurjbgrrfhpqyoqkkcntwm/Build/Intermediates.noindex/PitchDetection.build/Debug/PitchDetection - App.build/Objects-normal/x86_64/MainComponent.o
    /Users/benediktsailer/Library/Developer/Xcode/DerivedData/PitchDetection-cftahhuurjbgrrfhpqyoqkkcntwm/Build/Intermediates.noindex/PitchDetection.build/Debug/PitchDetection - App.build/Objects-normal/x86_64/Main.o
duplicate symbol __ZN5cycfi1q6detail10count_bitsEj in:
    /Users/benediktsailer/Library/Developer/Xcode/DerivedData/PitchDetection-cftahhuurjbgrrfhpqyoqkkcntwm/Build/Intermediates.noindex/PitchDetection.build/Debug/PitchDetection - App.build/Objects-normal/x86_64/MainComponent.o
    /Users/benediktsailer/Library/Developer/Xcode/DerivedData/PitchDetection-cftahhuurjbgrrfhpqyoqkkcntwm/Build/Intermediates.noindex/PitchDetection.build/Debug/PitchDetection - App.build/Objects-normal/x86_64/Main.o
ld: 4 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Is it possible to add audio effects with song in android using this lib?

Hi,
I am developing Karaoke app in android and i am using oboe livestream to record a voice and merge with music using ffmpeg. and i want to add effects to output audio file. Is it possible to process the audio to get effects? If you know please help me or please guide me.
Thanks in advance

Build fails with glibc>=2.34

Due to the SIGSTKSZ and MINSIGSTKSZ macros being redefined in newer versions of glibc, some header files pulled in from infra fail to compile.

Build log:

[  0%] Building C object q_io/external/portmidi/CMakeFiles/portmidi.dir/pm_common/portmidi.c.o
[  1%] Building C object q_io/external/portmidi/CMakeFiles/portmidi.dir/pm_common/pmutil.c.o
[  2%] Building C object q_io/external/portmidi/CMakeFiles/portmidi.dir/porttime/porttime.c.o
[  3%] Building C object q_io/external/portmidi/CMakeFiles/portmidi.dir/porttime/ptlinux.c.o
[  4%] Building C object q_io/external/portmidi/CMakeFiles/portmidi.dir/pm_linux/finddefault.c.o
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/finddefault.c: In function ‘skip_spaces’:
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/finddefault.c:16:12: warning: implicit declaration of function ‘isspace’ [-Wimplicit-function-declaration]
   16 |     while (isspace(c = getc(inf))) ;
      |            ^~~~~~~
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/finddefault.c:9:1: note: include ‘<ctype.h>’ or provide a declaration of ‘isspace’
    8 | #include "portmidi.h"
  +++ |+#include <ctype.h>
    9 | 
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/finddefault.c: In function ‘find_default_device’:
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/finddefault.c:84:13: warning: implicit declaration of function ‘pm_find_default_device’; did you mean ‘find_default_device’? [-Wimplicit-function-declaration]
   84 |         i = pm_find_default_device(pref_str, input);
      |             ^~~~~~~~~~~~~~~~~~~~~~
      |             find_default_device
[  5%] Building C object q_io/external/portmidi/CMakeFiles/portmidi.dir/pm_linux/pmlinux.c.o
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinux.c: In function ‘pm_init’:
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinux.c:45:34: warning: implicit declaration of function ‘find_default_device’; did you mean ‘pm_find_default_device’? [-Wimplicit-function-declaration]
   45 |     pm_default_input_device_id = find_default_device(
      |                                  ^~~~~~~~~~~~~~~~~~~
      |                                  pm_find_default_device
[  6%] Building C object q_io/external/portmidi/CMakeFiles/portmidi.dir/pm_linux/pmlinuxalsa.c.o
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c: In function ‘alsa_out_open’:
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c:36:40: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
   36 | #define GET_DESCRIPTOR_CLIENT(info) ((((int)(info)) >> 8) & 0xff)
      |                                        ^
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c:151:20: note: in expansion of macro ‘GET_DESCRIPTOR_CLIENT’
  151 |     desc->client = GET_DESCRIPTOR_CLIENT(client_port);
      |                    ^~~~~~~~~~~~~~~~~~~~~
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c:37:37: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
   37 | #define GET_DESCRIPTOR_PORT(info) (((int)(info)) & 0xff)
      |                                     ^
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c:152:18: note: in expansion of macro ‘GET_DESCRIPTOR_PORT’
  152 |     desc->port = GET_DESCRIPTOR_PORT(client_port);
      |                  ^~~~~~~~~~~~~~~~~~~
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c: In function ‘alsa_in_open’:
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c:36:40: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
   36 | #define GET_DESCRIPTOR_CLIENT(info) ((((int)(info)) >> 8) & 0xff)
      |                                        ^
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c:293:20: note: in expansion of macro ‘GET_DESCRIPTOR_CLIENT’
  293 |     desc->client = GET_DESCRIPTOR_CLIENT(client_port);
      |                    ^~~~~~~~~~~~~~~~~~~~~
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c:37:37: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
   37 | #define GET_DESCRIPTOR_PORT(info) (((int)(info)) & 0xff)
      |                                     ^
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c:294:18: note: in expansion of macro ‘GET_DESCRIPTOR_PORT’
  294 |     desc->port = GET_DESCRIPTOR_PORT(client_port);
      |                  ^~~~~~~~~~~~~~~~~~~
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c: In function ‘alsa_write_flush’:
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c:436:52: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
  436 |     VERBOSE printf("snd_seq_drain_output: 0x%x\n", (unsigned int) seq);
      |                                                    ^
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c: In function ‘pm_linuxalsa_init’:
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c:35:40: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   35 | #define MAKE_DESCRIPTOR(client, port) ((void*)(((client) << 8) | (port)))
      |                                        ^
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c:750:31: note: in expansion of macro ‘MAKE_DESCRIPTOR’
  750 |                               MAKE_DESCRIPTOR(snd_seq_port_info_get_client(pinfo),
      |                               ^~~~~~~~~~~~~~~
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c:35:40: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   35 | #define MAKE_DESCRIPTOR(client, port) ((void*)(((client) << 8) | (port)))
      |                                        ^
/home/aaron/Source/q/q_io/external/portmidi/pm_linux/pmlinuxalsa.c:760:31: note: in expansion of macro ‘MAKE_DESCRIPTOR’
  760 |                               MAKE_DESCRIPTOR(snd_seq_port_info_get_client(pinfo),
      |                               ^~~~~~~~~~~~~~~
[  6%] Linking C static library libportmidi.a
[  6%] Built target portmidi
[  7%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/common/pa_allocation.c.o
[  7%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/common/pa_converters.c.o
[  8%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/common/pa_cpuload.c.o
[  9%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/common/pa_debugprint.c.o
[ 10%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/common/pa_dither.c.o
[ 11%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/common/pa_front.c.o
[ 12%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/common/pa_process.c.o
[ 13%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/common/pa_ringbuffer.c.o
[ 14%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/common/pa_stream.c.o
[ 14%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/common/pa_trace.c.o
[ 15%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/hostapi/skeleton/pa_hostapi_skeleton.c.o
[ 16%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/os/unix/pa_unix_hostapis.c.o
[ 17%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/os/unix/pa_unix_util.c.o
[ 18%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/hostapi/jack/pa_jack.c.o
[ 19%] Building C object q_io/external/portaudio/CMakeFiles/portaudio_static.dir/src/hostapi/alsa/pa_linux_alsa.c.o
[ 20%] Linking C static library libportaudio.a
[ 20%] Built target portaudio_static
[ 20%] Building CXX object q_io/CMakeFiles/libqio.dir/src/audio_file.cpp.o
[ 21%] Building CXX object q_io/CMakeFiles/libqio.dir/src/audio_device.cpp.o
[ 22%] Building CXX object q_io/CMakeFiles/libqio.dir/src/audio_stream.cpp.o
[ 23%] Building CXX object q_io/CMakeFiles/libqio.dir/src/midi_device.cpp.o
[ 24%] Building CXX object q_io/CMakeFiles/libqio.dir/src/midi_stream.cpp.o
[ 25%] Linking CXX static library liblibqio.a
[ 25%] Built target libqio
[ 26%] Building CXX object example/CMakeFiles/example_list_devices.dir/list_devices.cpp.o
[ 26%] Linking CXX executable example_list_devices
[ 26%] Built target example_list_devices
[ 27%] Building CXX object example/CMakeFiles/example_sin_synth.dir/sin_synth.cpp.o
[ 28%] Linking CXX executable example_sin_synth
[ 28%] Built target example_sin_synth
[ 29%] Building CXX object example/CMakeFiles/example_square_synth.dir/square_synth.cpp.o
[ 30%] Linking CXX executable example_square_synth
[ 30%] Built target example_square_synth
[ 31%] Building CXX object example/CMakeFiles/example_delay.dir/delay.cpp.o
[ 32%] Linking CXX executable example_delay
[ 32%] Built target example_delay
[ 33%] Building CXX object example/CMakeFiles/example_io_delay.dir/io_delay.cpp.o
[ 34%] Linking CXX executable example_io_delay
[ 34%] Built target example_io_delay
[ 35%] Building CXX object example/CMakeFiles/example_midi_monitor.dir/midi_monitor.cpp.o
[ 36%] Linking CXX executable example_midi_monitor
[ 36%] Built target example_midi_monitor
[ 36%] Building CXX object example/CMakeFiles/example_biquad_filters.dir/biquad_filters.cpp.o
[ 37%] Linking CXX executable example_biquad_filters
[ 37%] Built target example_biquad_filters
[ 37%] Building CXX object test/CMakeFiles/test_bitset.dir/bitset.cpp.o
In file included from /usr/include/signal.h:328,
                 from /home/aaron/Source/q/infra/include/infra/catch.hpp:7712,
                 from /home/aaron/Source/q/test/bitset.cpp:7:
/home/aaron/Source/q/infra/include/infra/catch.hpp:10453:58: error: call to non-‘constexpr’ function ‘long int sysconf(int)’
10453 |     static constexpr std::size_t sigStackSize = 32768 >= MINSIGSTKSZ ? 32768 : MINSIGSTKSZ;
      |                                                          ^~~~~~~~~~~
In file included from /usr/include/bits/sigstksz.h:24,
                 from /usr/include/signal.h:328,
                 from /home/aaron/Source/q/infra/include/infra/catch.hpp:7712,
                 from /home/aaron/Source/q/test/bitset.cpp:7:
/usr/include/unistd.h:640:17: note: ‘long int sysconf(int)’ declared here
  640 | extern long int sysconf (int __name) __THROW;
      |                 ^~~~~~~
In file included from /home/aaron/Source/q/test/bitset.cpp:7:
/home/aaron/Source/q/infra/include/infra/catch.hpp:10512:45: error: size of array ‘altStackMem’ is not an integral constant-expression
10512 |     char FatalConditionHandler::altStackMem[sigStackSize] = {};
      |                                             ^~~~~~~~~~~~
make[2]: *** [test/CMakeFiles/test_bitset.dir/build.make:76: test/CMakeFiles/test_bitset.dir/bitset.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:591: test/CMakeFiles/test_bitset.dir/all] Error 2
make: *** [Makefile:136: all] Error 2

Example of using signal_conditioner with shared_ptr

I have two projects using qlib - one is a VAMP plugin for non-realtime analysis and feature extraction, the other is a SuperCollider plugin. Both of these use cases have an initialization step, followed by a processing step which works on a frame by frame basis.

With the pitch_detector class I'm able to use the following during the init:

    std::shared_ptr<cycfi::q::pitch_detector> m_pd = std::shared_ptr<cycfi::q::pitch_detector>(new cycfi::q::pitch_detector(
			    q::frequency(m_lowestPitch),
			    q::frequency(m_highestPitch),
			    m_inputSampleRate,
			    q::decibel(q::detail::db2a(m_threshold))));

and then call

bool is_ready = m_pd->operator()(s);

during the processing loop. However the same trick doesn't appear to work for the new signal_conditioner class as the compiler complains about it being a template function https://github.com/cycfi/q/blob/master/q_lib/include/q/fx/signal_conditioner.hpp#L43

I'm not sure what the magic spell is to assign a template class to a shared_ptr or indeed whether this is the right thing to do in the first place! I assume that the signal conditioner is stateful and that the state needs to be persisted across calls to process each frame. Do you have any recommendations for how to get this to work?

pitch detection example

hi there, not really an issue... i am interested in porting/implementing your pitch detection method and possibly the onset detector to axoloti (a dsp platform) i can read and understand a little c code, but i am a bit lost with your code :-) is one of the files here already a working pitch extraction example? or is this just the library? thanks for your work!

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.