add audio generate and audio example
This commit is contained in:
56
src/hack/audio/generate.hpp
Normal file
56
src/hack/audio/generate.hpp
Normal file
@@ -0,0 +1,56 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include <math.h>
|
||||
|
||||
// Генерация разнообразных звуковых волн
|
||||
namespace hack::audio::generate
|
||||
{
|
||||
// Генерация синусоидального сигнала
|
||||
inline std::vector<double> sine(double frequency, double duration, int sample_rate)
|
||||
{
|
||||
std::vector<double> samples;
|
||||
int total_samples = static_cast<int>(duration * sample_rate);
|
||||
|
||||
for (int i = 0; i < total_samples; ++i)
|
||||
{
|
||||
double time = static_cast<double>(i) / sample_rate;
|
||||
double sample = 0.5 * std::sin(2.0 * M_PI * frequency * time);
|
||||
samples.push_back(sample);
|
||||
}
|
||||
|
||||
return samples;
|
||||
}
|
||||
|
||||
// Генерация прямоугольного сигнала
|
||||
inline std::vector<double> square_wave(double frequency, double duration, int sample_rate)
|
||||
{
|
||||
std::vector<double> samples;
|
||||
int total_samples = static_cast<int>(duration * sample_rate);
|
||||
int samples_per_period = sample_rate / frequency;
|
||||
|
||||
for (int i = 0; i < total_samples; ++i)
|
||||
{
|
||||
double sample = ((i / samples_per_period) % 2 == 0) ? 0.5 : -0.5;
|
||||
samples.push_back(sample);
|
||||
}
|
||||
|
||||
return samples;
|
||||
}
|
||||
|
||||
// Генерация белого шума
|
||||
inline std::vector<double> white_noise(double duration, int sample_rate)
|
||||
{
|
||||
std::vector<double> samples;
|
||||
int total_samples = static_cast<int>(duration * sample_rate);
|
||||
|
||||
for (int i = 0; i < total_samples; ++i)
|
||||
{
|
||||
double sample = (static_cast<double>(rand()) / RAND_MAX) * 2.0 - 1.0;
|
||||
samples.push_back(sample * 0.3); // Уменьшаем громкость
|
||||
}
|
||||
|
||||
return samples;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include "hack/logger/logger.hpp"
|
||||
#include <portaudio.h>
|
||||
#include "hack/logger/logger.hpp"
|
||||
|
||||
namespace hack::audio
|
||||
{
|
||||
// namespace
|
||||
// {
|
||||
namespace
|
||||
{
|
||||
const int FRAMES_PER_BUFFER = 256;
|
||||
|
||||
// callback - вызывается, когда нужны новые аудио-данные
|
||||
@@ -26,7 +26,7 @@ namespace hack::audio
|
||||
|
||||
return (pos >= samples.size()) ? paComplete : paContinue;
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
// пока только wav
|
||||
inline void play(std::vector<double>& samples, int sample_rate)
|
||||
|
||||
@@ -34,5 +34,3 @@ namespace hack::audio
|
||||
sf_close(outfile);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -5,12 +5,15 @@
|
||||
#include <iostream>
|
||||
#include "hack/logger/logger.hpp"
|
||||
|
||||
// Записывает массив в файл с указанным разделителем
|
||||
namespace hack::range
|
||||
{
|
||||
namespace {
|
||||
template<typename T>
|
||||
void save_to_file_impl(const std::filesystem::path& p, T& v, std::string delemiter = ", ")
|
||||
{
|
||||
// Создаем директорию, если ее нет.
|
||||
std::filesystem::create_directories(p.parent_path());
|
||||
std::ofstream file(p);
|
||||
if (!file)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
inc += include_directories('.')
|
||||
|
||||
headers = [
|
||||
'hack/audio/generate.hpp',
|
||||
'hack/audio/play.hpp',
|
||||
'hack/audio/save.hpp',
|
||||
|
||||
|
||||
'hack/concepts/concepts.hpp',
|
||||
|
||||
'hack/iterators/associative_ostream_iterator.hpp',
|
||||
@@ -18,12 +23,10 @@ headers = [
|
||||
'hack/utils/color.hpp'
|
||||
]
|
||||
|
||||
sources = []
|
||||
|
||||
lib = library(
|
||||
meson.project_name(),
|
||||
include_directories : inc,
|
||||
sources: [headers, sources],
|
||||
sources: [headers],
|
||||
dependencies : deps,
|
||||
cpp_args: args
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user