summaryrefslogtreecommitdiff
path: root/src/instrument.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/instrument.cc')
-rw-r--r--src/instrument.cc205
1 files changed, 100 insertions, 105 deletions
diff --git a/src/instrument.cc b/src/instrument.cc
index 96a6bfd..eeaa956 100644
--- a/src/instrument.cc
+++ b/src/instrument.cc
@@ -34,147 +34,142 @@
#include "sample.h"
#include "configuration.h"
-Instrument::Instrument()
+Instrument::Instrument(Settings& settings)
+ : settings(settings)
{
- DEBUG(instrument, "new %p\n", this);
- mod = 1.0;
- lastpos = 0;
+ DEBUG(instrument, "new %p\n", this);
+ mod = 1.0;
+ lastpos = 0;
- magic = this;
+ magic = this;
}
Instrument::~Instrument()
{
- magic = NULL;
-
- DEBUG(instrument, "delete %p\n", this);
- std::vector<AudioFile*>::iterator i = audiofiles.begin();
- while(i != audiofiles.end()) {
- delete *i;
- i++;
- }
+ magic = NULL;
+
+ DEBUG(instrument, "delete %p\n", this);
+ std::vector<AudioFile*>::iterator i = audiofiles.begin();
+ while(i != audiofiles.end())
+ {
+ delete *i;
+ i++;
+ }
}
bool Instrument::isValid()
{
- return this == magic;
+ return this == magic;
}
Sample *Instrument::sample(level_t level, size_t pos)
{
- Sample *sample = NULL;
-
- if(Conf::enable_velocity_modifier == false) {
- mod = 1.0;
- lastpos = 0;
- }
-
- if(Conf::enable_velocity_randomiser) {
- float r = (float)rand() / (float)RAND_MAX; // random number: [0;1]
- r -= 0.5; // random number [-0.5;0.5]
- r *= Conf::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) {
- mod += (pos - lastpos) /
- (Conf::samplerate * Conf::velocity_modifier_falloff);
- if(mod > 1.0) mod = 1.0;
- }
-
- if(version >= VersionStr("2.0")) {
- // Version 2.0
- sample = powerlist.get(level * mod);
- } else {
- // Version 1.0
- std::vector<Sample*> s = samples.get(level * mod);
- if(s.size() == 0) return NULL;
- size_t idx = rand()%(s.size());
- sample = s[idx];
- }
-
- if(Conf::enable_velocity_modifier) {
- lastpos = pos;
- mod *= Conf::velocity_modifier_weight;
- }
-
- return sample;
+ Sample *sample = NULL;
+
+ // 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(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(enable_velocity_modifier)
+ {
+ mod += (pos - lastpos) /
+ (samplerate * velocity_modifier_falloff);
+ if(mod > 1.0)
+ {
+ mod = 1.0;
+ }
+ }
+
+ if(version >= VersionStr("2.0"))
+ {
+ // Version 2.0
+ sample = powerlist.get(level * mod);
+ }
+ else
+ {
+ // Version 1.0
+ std::vector<Sample*> s = samples.get(level * mod);
+ if(s.size() == 0)
+ {
+ return NULL;
+ }
+
+ size_t idx = rand()%(s.size());
+ sample = s[idx];
+ }
+
+ if(enable_velocity_modifier)
+ {
+ lastpos = pos;
+ mod *= velocity_modifier_weight;
+ }
+
+ return sample;
}
void Instrument::addSample(level_t a, level_t b, Sample *s)
{
- samples.insert(a, b, s);
+ samples.insert(a, b, s);
}
void Instrument::finalise()
{
- if(version >= VersionStr("2.0")) {
- std::vector<Sample*>::iterator s = samplelist.begin();
- while(s != samplelist.end()) {
- powerlist.add(*s);
- s++;
- }
-
- powerlist.finalise();
- }
+ if(version >= VersionStr("2.0"))
+ {
+ std::vector<Sample*>::iterator s = samplelist.begin();
+ while(s != samplelist.end())
+ {
+ powerlist.add(*s);
+ s++;
+ }
+
+ powerlist.finalise();
+ }
}
std::string Instrument::name()
{
- return _name;
+ return _name;
}
std::string Instrument::description()
{
- return _description;
+ return _description;
}
std::string Instrument::group()
{
- return _group;
+ return _group;
}
void Instrument::setGroup(std::string g)
{
- _group = 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*/