✨ noise command.
parent
eb95032dfa
commit
d023146c65
|
@ -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 440 1]
|
||||
|
||||
|
||||
Noise
|
||||
^^^^^
|
||||
|
||||
The noise command generate uniform random frames.
|
||||
|
||||
.. code-block::
|
||||
|
||||
[noise]
|
||||
|
|
|
@ -9,13 +9,18 @@ configure_file(
|
|||
|
||||
add_library(muz-lib OBJECT
|
||||
# Audio
|
||||
# =====
|
||||
Signal.cpp
|
||||
AudioEngine.cpp
|
||||
AudioConf.cpp
|
||||
# signals
|
||||
# -------
|
||||
Constant.cpp
|
||||
Sine.cpp
|
||||
Noise.cpp
|
||||
|
||||
# Language
|
||||
# ========
|
||||
Node.cpp
|
||||
Lexer.cpp
|
||||
Parser.cpp
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
#include "Compiler.hpp"
|
||||
|
||||
// signals
|
||||
// -------
|
||||
#include "Constant.hpp"
|
||||
#include "Sine.hpp"
|
||||
#include "Noise.hpp"
|
||||
|
||||
namespace muz
|
||||
{
|
||||
|
@ -38,23 +42,8 @@ namespace muz
|
|||
compile_node(node->child(i));
|
||||
}
|
||||
|
||||
if (name == "sine")
|
||||
{
|
||||
check_cmd_arity(*node, 2);
|
||||
execute_cmd(name, node);
|
||||
|
||||
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;
|
||||
|
||||
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)
|
||||
{
|
||||
m_signals.push_back(std::move(signal));
|
||||
|
|
|
@ -24,6 +24,7 @@ namespace muz
|
|||
|
||||
std::vector<std::unique_ptr<Signal>> compile(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:
|
||||
AudioConf const& m_conf;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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
|
Loading…
Reference in New Issue