GithubHelp home page GithubHelp logo

cycfi / q Goto Github PK

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

C++ Library for Audio Digital Signal Processing

License: MIT License

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

q's Issues

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?

= 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.

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.

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;

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.

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.

Direct access to `audio_stream` samples

In short, I have an audio_stream doing some processing and I want to display a waveform in my GUI. Without copying the entire buffer somewhere else during each process() call, is there a way to read the current buffer of a running audio stream?

frequency to note conversion questions

Hi everyone.

I have a c++ code where I listen to the sound coming from the microphone and get the frequency of the sound. I don't expect it to work perfectly, but I want to find the musical note of the sound coming out of my guitar.
I used miniaudio and q for this. I use Miniaudio for audio io operations.
I will share the code with you.

My questions are:

  • How can I convert the frequency values ​​in range 0-1 returned by the get_frequency member function of the pitch_detector class into normal pitch values?
  • Then I want to get the note that matches this pitch value (I am aware of the difficulty of the algorithm here, but it is enough for it to tell me, for example, between A-G, I will optimize the algorithm when I start getting results).
  • I want to be able to do these with q in order not to make the project more complex. If it doesn't cover q's functionality, can you recommend me some suitable libraries?

code

#include <chrono>
#include <csignal>
#include <cstdint>
#include <format>
#include <iostream>
#include <thread>
#include <string>

#define MINIAUDIO_IMPLEMENTATION
#include "miniaudio/miniaudio.h"
#include "q/pitch/pitch_detector.hpp"
#include "q/support/literals.hpp"


namespace q = cycfi::q;
using namespace q::literals;

bool running = false;

std::vector<float> audio_buffer;

void printFreq(const ma_device *dev, void *pUserData)
{
	if (audio_buffer.size() < dev->sampleRate * 3) // 3 second buffer
	{
		return;
	}
	auto pitch_detector = static_cast<q::pitch_detector *>(pUserData);
	bool ok{};
	for (const auto &v : audio_buffer)
	{
		if (! running)
		{
			return;
		}
		ok = pitch_detector->operator()(v);
	}	 // val loop
	auto per = pitch_detector->periodicity();
	if (ok && per > 0.90)
	{
		auto freq = pitch_detector->get_frequency();
		if (freq > 0)
		{
			std::cout << std::format("Frequency: {}, per: {}\n", freq, per);
		}

		audio_buffer.clear();
		pitch_detector->reset();
	}	 // freq ok if
}

void data_callback(ma_device *pDevice, void *pOutput, const void *pInput,
									 ma_uint32 frameCount)
{
	const auto inputBuffer = static_cast<const float *>(pInput);

	if (! running)
	{
		return;
	}
	audio_buffer.insert(audio_buffer.end(), inputBuffer,
											inputBuffer + frameCount);
	printFreq(pDevice, pDevice->pUserData);
}

void signalHandler(int signum)
{
	std::cout << "Interrupt signal (" << signum << ") received.\n";

	running = false;	// stop the main loop
}

int main()
{
	q::pitch_detector pitch_detector{q::frequency(50), q::frequency(400), 1,
																	 -45_dB};

	ma_device_config device_config =
		ma_device_config_init(ma_device_type_capture);
	device_config.dataCallback = data_callback;
	device_config.capture.format = ma_format_f32;
	// device_config.sampleRate = 44100;
	device_config.capture.channels = 1;
	device_config.pUserData = static_cast<void *>(&pitch_detector);

	ma_device device;
	device.pUserData = static_cast<void *>(&pitch_detector);
	auto result = ma_device_init(NULL, &device_config, &device);
	if (result != MA_SUCCESS)
	{
		std::cerr << std::format("Failed to create miniaudio device: {}\n",
														 ma_result_description(result));
		return EXIT_FAILURE;
	}

	result = ma_device_start(&device);
	if (result != MA_SUCCESS)
	{
		std::cerr << std::format("Failed to start miniaudio device: {}\n",
														 ma_result_description(result));
		return EXIT_FAILURE;
	}
	std::cout << std::format("device: {}, sample rate: {}\n",
													 device.capture.name, device.sampleRate);

	running = true;
	std::signal(SIGINT, signalHandler);
	std::signal(SIGTERM, signalHandler);
	std::signal(SIGBREAK, signalHandler);
	std::signal(SIGABRT, signalHandler);

	while (running)
	{
		// no block for audio io because running with another thread
		std::this_thread::sleep_for(std::chrono::milliseconds(70));
	}

	std::cout << "done\n";
	ma_device_stop(&device);
	ma_device_uninit(&device);
	return EXIT_SUCCESS;
}

Although I don't think it's right to explain this here, I think it might be useful to share. There is currently no computer application that visually impaired musicians can use to tune their instruments. It's available for iOS and it money (using a mobile device isn't always practical). This is both a learning adventure for me and when something good happens, I want to publish it as a usable, accessible application with a gui toolset like wxWidgets. That's why your help is important :) .

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?

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

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?

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)

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

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!

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

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

[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.

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
}

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.

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.

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

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

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

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.

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

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?

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.

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++.

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;
    }
};

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

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.