diff options
-rw-r--r-- | src/drumgizmo.cc | 11 | ||||
-rw-r--r-- | src/events.h | 33 | ||||
-rw-r--r-- | src/inputprocessor.cc | 36 |
3 files changed, 44 insertions, 36 deletions
diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index d30952e..2d3e410 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -319,9 +319,8 @@ void DrumGizmo::getSamples(int ch, int pos, sample_t* s, size_t sz) } size_t t = 0; // Internal buffer counter - if(evt.rampdown == NO_RAMPDOWN) + if(!evt.rampdownInProgress()) { - #ifdef SSE size_t optend = ((end - n) / N) * N + n; @@ -352,19 +351,19 @@ void DrumGizmo::getSamples(int ch, int pos, sample_t* s, size_t sz) } else { // Ramp down in progress. - for(; (n < end) && (t < evt.buffer_size) && evt.rampdown; ++n) + for(; (n < end) && (t < evt.buffer_size) && evt.rampdown_count; ++n) { - float scale = (float)evt.rampdown/(float)evt.ramp_start; + float scale = std::min((float)evt.rampdown_count/evt.ramp_length, 1.f); s[n] += evt.buffer[t] * evt.scale * scale; ++t; - evt.rampdown--; + evt.rampdown_count--; } } // Add internal buffer counter to "global" event counter. evt.t += evt.buffer_size; - if((evt.t < af.size) && (evt.rampdown != 0)) + if((evt.t < af.size) && (evt.rampdown_count != 0)) { evt.buffer = audio_cache.next(evt.cache_id, evt.buffer_size); } diff --git a/src/events.h b/src/events.h index f953031..b78dd79 100644 --- a/src/events.h +++ b/src/events.h @@ -42,6 +42,11 @@ typedef unsigned int timepos_t; class Event { public: + Event(channel_t channel, timepos_t offset = 0) + : channel(channel), offset(offset) + { + } + virtual ~Event() { } @@ -57,22 +62,21 @@ public: timepos_t offset; //< Global position (ie. not relative to buffer) }; -#define NO_RAMPDOWN -1 class EventSample : public Event { public: EventSample(channel_t c, float g, AudioFile* af, const std::string& grp, void* instr) + : Event(c) + , cache_id(CACHE_NOID) + , gain(g) + , t(0) + , file(af) + , group(grp) + , instrument(instr) + , rampdown_count(-1) + , ramp_length(0) { - cache_id = CACHE_NOID; - channel = c; - gain = g; - t = 0; - file = af; - group = grp; - instrument = instr; - rampdown = NO_RAMPDOWN; - ramp_start = 0; } Event::type_t getType() const @@ -80,6 +84,11 @@ public: return Event::sample; } + bool rampdownInProgress() const + { + return rampdown_count != -1; + } + cacheid_t cache_id; sample_t* buffer; size_t buffer_size; @@ -89,8 +98,8 @@ public: AudioFile* file; std::string group; void* instrument; - int rampdown; - int ramp_start; + int rampdown_count; + int ramp_length; float scale{1.0f}; }; diff --git a/src/inputprocessor.cc b/src/inputprocessor.cc index 3af203c..1421d43 100644 --- a/src/inputprocessor.cc +++ b/src/inputprocessor.cc @@ -109,43 +109,43 @@ bool InputProcessor::processOnset(event_t& event, return false; } + auto orig_level = event.velocity; + for(auto& filter : filters) + { + // This line might change the 'event' variable + bool keep = filter->filter(event, event.offset + pos); + + if(!keep) + { + return false; // Skip event completely + } + } + if(instr->getGroup() != "") { // Add event to ramp down all existing events with the same groupname. for(Channel& ch: kit.channels) { - for(Event* event: activeevents[ch.num]) + for(Event* active_event: activeevents[ch.num]) { - if(event->getType() == Event::sample) + if(active_event->getType() == Event::sample) { - auto& event_sample = *static_cast<EventSample*>(event); + auto& event_sample = *static_cast<EventSample*>(active_event); if(event_sample.group == instr->getGroup() && event_sample.instrument != instr) { // Fixed ramp of 68ms, independent of samplerate - std::size_t ramp_length = (68./1000.)*settings.samplerate.load(); - event_sample.rampdown = ramp_length; // TODO: This must be configurable at some point... // ... perhaps even by instrument (ie. in the xml file) - event_sample.ramp_start = event_sample.rampdown; + std::size_t ramp_length = (68./1000.)*settings.samplerate.load(); + event_sample.rampdown_count = event.offset + ramp_length; + event_sample.ramp_length = ramp_length; } } } } } - auto orig_level = event.velocity; - for(auto& filter : filters) - { - // This line might change the 'event' variable - bool keep = filter->filter(event, event.offset + pos); - - if(!keep) - { - return false; // Skip event completely - } - } - Sample* sample = instr->sample(event.velocity, event.offset + pos); if(sample == nullptr) |