add audio generate and audio example

This commit is contained in:
2025-08-31 12:02:29 +03:00
parent e217920fe8
commit 7832b2095b
9 changed files with 99 additions and 12 deletions

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

View File

@@ -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)

View File

@@ -34,5 +34,3 @@ namespace hack::audio
sf_close(outfile);
}
}

View File

@@ -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)
{

View 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
)