summaryrefslogtreecommitdiff
path: root/src/instrument.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/instrument.cc')
-rw-r--r--src/instrument.cc76
1 files changed, 27 insertions, 49 deletions
diff --git a/src/instrument.cc b/src/instrument.cc
index 9f18233..3348a4f 100644
--- a/src/instrument.cc
+++ b/src/instrument.cc
@@ -34,7 +34,8 @@
#include "sample.h"
#include "configuration.h"
-Instrument::Instrument()
+Instrument::Instrument(Settings& settings)
+ : settings(settings)
{
DEBUG(instrument, "new %p\n", this);
mod = 1.0;
@@ -65,28 +66,41 @@ Sample* Instrument::sample(level_t level, size_t pos)
{
Sample *sample = NULL;
- if(Conf::enable_velocity_modifier == false) {
+ // Read out all values from settings.
+ auto enable_velocity_randomiser = settings.enable_velocity_randomiser.load();
+ auto velocity_randomiser_weight = settings.velocity_randomiser_weight.load();
+ auto samplerate = settings.samplerate.load();
+ auto velocity_modifier_falloff = settings.velocity_modifier_falloff.load();
+ auto enable_velocity_modifier = settings.enable_velocity_modifier.load();
+ auto velocity_modifier_weight = settings.velocity_modifier_weight.load();
+
+ if(enable_velocity_modifier == false)
+ {
mod = 1.0;
lastpos = 0;
}
- if(Conf::enable_velocity_randomiser) {
- float r = rand.floatInRange(-1.0*Conf::velocity_randomiser_weight,
- Conf::velocity_randomiser_weight);
+ if(enable_velocity_randomiser)
+ {
+ float r = (float)rand() / (float)RAND_MAX; // random number: [0;1]
+ r -= 0.5; // random number [-0.5;0.5]
+ r *= velocity_randomiser_weight * 2; // ex. random number [-0.1;0.1]
level += r;
if(level > 1.0)
{
level = 1.0;
}
+
if(level < 0.0)
{
level = 0.0;
}
}
- if(Conf::enable_velocity_modifier) {
+ if(enable_velocity_modifier)
+ {
mod += (pos - lastpos) /
- (Conf::samplerate * Conf::velocity_modifier_falloff);
+ (samplerate * velocity_modifier_falloff);
if(mod > 1.0)
{
mod = 1.0;
@@ -98,7 +112,8 @@ Sample* Instrument::sample(level_t level, size_t pos)
// Version 2.0
sample = powerlist.get(level * mod);
}
- else {
+ else
+ {
// Version 1.0
std::vector<Sample*> s = samples.get(level * mod);
if(s.size() == 0)
@@ -106,13 +121,14 @@ Sample* Instrument::sample(level_t level, size_t pos)
return NULL;
}
- sample = rand.choose(s);
+ size_t idx = rand()%(s.size());
+ sample = s[idx];
}
- if(Conf::enable_velocity_modifier)
+ if(enable_velocity_modifier)
{
lastpos = pos;
- mod *= Conf::velocity_modifier_weight;
+ mod *= velocity_modifier_weight;
}
return sample;
@@ -157,41 +173,3 @@ void Instrument::setGroup(const std::string& g)
{
_group = g;
}
-
-#ifdef TEST_INSTRUMENT
-// deps: channel.cc sample.cc audiofile.cc
-// cflags: $(SNDFILE_CFLAGS)
-// libs: $(SNDFILE_LIBS)
-#include "test.h"
-
-TEST_BEGIN;
-
-Instrument i("test");
-
-Sample* a = new Sample();
-i.addSample(0.0, 1.0, a);
-
-Sample* b = new Sample();
-i.addSample(0.0, 1.0, b);
-
-Sample* c = new Sample();
-i.addSample(1.5, 1.7, c);
-
-TEST_EQUAL(i.sample(0.0), b, "?");
-TEST_EQUAL(i.sample(0.0), a, "?");
-TEST_EQUAL(i.sample(0.0), b, "?");
-TEST_EQUAL(i.sample(0.0), b, "?");
-TEST_EQUAL(i.sample(0.0), b, "?");
-TEST_EQUAL(i.sample(0.0), b, "?");
-TEST_EQUAL(i.sample(0.0), a, "?");
-TEST_EQUAL(i.sample(0.0), a, "?");
-
-TEST_EQUAL(i.sample(2.0), NULL, "?");
-
-TEST_EQUAL(i.sample(1.6), c, "?");
-TEST_EQUAL(i.sample(1.6), c, "?");
-TEST_EQUAL(i.sample(1.6), c, "?");
-
-TEST_END;
-
-#endif /*TEST_INSTRUMENT*/