noise command.

main
bog 2024-01-31 10:23:03 +01:00
parent eb95032dfa
commit d023146c65
6 changed files with 104 additions and 16 deletions

View File

@ -39,3 +39,13 @@ To generate a sine, we can use the ``sine`` command.
# sine signal with a frequency of 440 and an amplitude of 1 # sine signal with a frequency of 440 and an amplitude of 1
[sine 440 1] [sine 440 1]
Noise
^^^^^
The noise command generate uniform random frames.
.. code-block::
[noise]

View File

@ -9,13 +9,18 @@ configure_file(
add_library(muz-lib OBJECT add_library(muz-lib OBJECT
# Audio # Audio
# =====
Signal.cpp Signal.cpp
AudioEngine.cpp AudioEngine.cpp
AudioConf.cpp AudioConf.cpp
# signals
# -------
Constant.cpp Constant.cpp
Sine.cpp Sine.cpp
Noise.cpp
# Language # Language
# ========
Node.cpp Node.cpp
Lexer.cpp Lexer.cpp
Parser.cpp Parser.cpp

View File

@ -1,6 +1,10 @@
#include "Compiler.hpp" #include "Compiler.hpp"
// signals
// -------
#include "Constant.hpp" #include "Constant.hpp"
#include "Sine.hpp" #include "Sine.hpp"
#include "Noise.hpp"
namespace muz namespace muz
{ {
@ -38,23 +42,8 @@ namespace muz
compile_node(node->child(i)); compile_node(node->child(i));
} }
if (name == "sine") execute_cmd(name, node);
{
check_cmd_arity(*node, 2);
auto one = pop();
auto signal = std::make_unique<Sine>(m_conf,
std::move(pop()),
std::move(one));
push(std::move(signal));
}
else
{
throw compile_error {
std::string()
+ "cannot compile unknown command '" + name + "'."
};
}
} break; } break;
case NODE_DIR: { case NODE_DIR: {
@ -84,6 +73,34 @@ namespace muz
} }
} }
void Compiler::execute_cmd(std::string const& name,
std::shared_ptr<Node> node)
{
if (name == "sine")
{
check_cmd_arity(*node, 2);
auto one = pop();
auto signal = std::make_unique<Sine>(m_conf,
pop(),
std::move(one));
push(std::move(signal));
}
else if (name == "noise")
{
check_cmd_arity(*node, 0);
auto signal = std::make_unique<Noise>(m_conf);
push(std::move(signal));
}
else
{
throw compile_error {
std::string()
+ "cannot compile unknown command '" + name + "'."
};
}
}
void Compiler::push(std::unique_ptr<Signal> signal) void Compiler::push(std::unique_ptr<Signal> signal)
{ {
m_signals.push_back(std::move(signal)); m_signals.push_back(std::move(signal));

View File

@ -24,6 +24,7 @@ namespace muz
std::vector<std::unique_ptr<Signal>> compile(std::shared_ptr<Node> node); std::vector<std::unique_ptr<Signal>> compile(std::shared_ptr<Node> node);
void compile_node(std::shared_ptr<Node> node); void compile_node(std::shared_ptr<Node> node);
void execute_cmd(std::string const& name, std::shared_ptr<Node> node);
private: private:
AudioConf const& m_conf; AudioConf const& m_conf;

28
lib/Noise.cpp Normal file
View File

@ -0,0 +1,28 @@
#include "Noise.hpp"
namespace muz
{
/*explicit*/ Noise::Noise(AudioConf const& conf)
: m_conf { conf }
{
m_rand.seed(std::chrono::steady_clock::now().time_since_epoch().count());
}
/*virtual*/ Noise::~Noise()
{
}
std::vector<float> Noise::next() /*override*/
{
std::vector<float> out;
float value = m_distribution(m_rand);
for (int i=0; i<m_conf.channels(); i++)
{
out.push_back(value);
}
return out;
}
}

27
lib/Noise.hpp Normal file
View File

@ -0,0 +1,27 @@
#ifndef muz_NOISE_HPP
#define muz_NOISE_HPP
#include <random>
#include <chrono>
#include "commons.hpp"
#include "AudioConf.hpp"
#include "Signal.hpp"
namespace muz
{
class Noise: public Signal
{
public:
explicit Noise(AudioConf const& conf);
virtual ~Noise();
std::vector<float> next() override;
private:
AudioConf m_conf;
std::mt19937 m_rand;
std::uniform_real_distribution<float> m_distribution {-0.5f, 0.5f};
};
}
#endif