diff options
Diffstat (limited to 'src/instrument.cc')
-rw-r--r-- | src/instrument.cc | 76 |
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*/ |