✨ 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 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]
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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