diff --git a/src/msfa/controllers.h b/src/msfa/controllers.h index f5583fc..5ad5874 100755 --- a/src/msfa/controllers.h +++ b/src/msfa/controllers.h @@ -18,6 +18,7 @@ #define __CONTROLLERS_H #include "synth.h" +#include "../Dexed.h" #include #include #include "trace.h" @@ -113,14 +114,14 @@ public: applyMod(foot_cc, foot); applyMod(aftertouch_cc, at); - if ( ! ((wheel.eg || foot.eg) || (breath.eg || at.eg)) ) +/* if ( ! ((wheel.eg || foot.eg) || (breath.eg || at.eg)) ) eg_mod = 127; + */ TRACE("amp_mod %d pitch_mod %d", amp_mod, pitch_mod); } - FmCore *core=NULL; + FmCore *core; }; #endif // __CONTROLLERS_H - diff --git a/src/msfa/dx7note.cc b/src/msfa/dx7note.cc index b0b6505..7605d82 100644 --- a/src/msfa/dx7note.cc +++ b/src/msfa/dx7note.cc @@ -211,8 +211,8 @@ void Dx7Note::compute(int32_t *buf, int32_t lfo_val, int32_t lfo_delay, const Co uint32_t amd_mod = max(amod_1, amod_2); // ==== EG AMP MOD ==== - uint32_t amod_3 = (ctrls->eg_mod+1) << 16; - amd_mod = max((1<<23) - amod_3, amd_mod); + uint32_t amod_3 = (ctrls->eg_mod+1) << 17; + amd_mod = max((1<<24) - amod_3, amd_mod); // ==== OP RENDER ==== for (int op = 0; op < 6; op++) { diff --git a/src/msfa/lfo.cc b/src/msfa/lfo.cc index 6b1fdb0..e3ffddd 100644 --- a/src/msfa/lfo.cc +++ b/src/msfa/lfo.cc @@ -1,12 +1,12 @@ /* * Copyright 2013 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -24,74 +24,75 @@ uint32_t Lfo::unit_; void Lfo::init(double sample_rate) { - // constant is 1 << 32 / 15.5s / 11 - Lfo::unit_ = (int32_t)(N * 25190424 / sample_rate + 0.5); + // constant is 1 << 32 / 15.5s / 11 + Lfo::unit_ = (int32_t)(N * 25190424 / sample_rate + 0.5); } void Lfo::reset(const uint8_t params[6]) { - int rate = params[0]; // 0..99 - int sr = rate == 0 ? 1 : (165 * rate) >> 6; - sr *= sr < 160 ? 11 : (11 + ((sr - 160) >> 4)); - delta_ = unit_ * sr; - int a = 99 - params[1]; // LFO delay - if (a == 99) { - delayinc_ = ~0u; - delayinc2_ = ~0u; - } else { - a = (16 + (a & 15)) << (1 + (a >> 4)); - delayinc_ = unit_ * a; - a &= 0xff80; - a = max(0x80, a); - delayinc2_ = unit_ * a; - } - waveform_ = params[5]; - sync_ = params[4] != 0; + int rate = params[0]; // 0..99 + int sr = rate == 0 ? 1 : (165 * rate) >> 6; + sr *= sr < 160 ? 11 : (11 + ((sr - 160) >> 4)); + delta_ = unit_ * sr; + int a = 99 - params[1]; // LFO delay + if (a == 99) { + delayinc_ = ~0u; + delayinc2_ = ~0u; + } else { + a = (16 + (a & 15)) << (1 + (a >> 4)); + delayinc_ = unit_ * a; + a &= 0xff80; + a = max(0x80, a); + delayinc2_ = unit_ * a; + } + waveform_ = params[5]; + sync_ = params[4] != 0; } int32_t Lfo::getsample() { - phase_ += delta_; - int32_t x; - switch (waveform_) { - case 0: // triangle - x = phase_ >> 7; - x ^= -(phase_ >> 31); - x &= (1 << 24) - 1; - return x; - case 1: // sawtooth down - return (~phase_ ^ (1U << 31)) >> 8; - case 2: // sawtooth up - return (phase_ ^ (1U << 31)) >> 8; - case 3: // square - return ((~phase_) >> 7) & (1 << 24); - case 4: // sine - return (1 << 23) + (Sin::lookup(phase_ >> 8) >> 1); - case 5: // s&h - if (phase_ < delta_) { - randstate_ = (randstate_ * 179 + 17) & 0xff; + phase_ += delta_; + int32_t x; + switch (waveform_) { + case 0: // triangle + x = phase_ >> 7; + x ^= -(phase_ >> 31); + x &= (1 << 24) - 1; + return x; + case 1: // sawtooth down + return (~phase_ ^ (1U << 31)) >> 8; + case 2: // sawtooth up + return (phase_ ^ (1U << 31)) >> 8; + case 3: // square + return ((~phase_) >> 7) & (1 << 24); + case 4: // sine + return (1 << 23) + (Sin::lookup(phase_ >> 8) >> 1); + case 5: // s&h + if (phase_ < delta_) { + randstate_ = (randstate_ * 179 + 17) & 0xff; + } + x = randstate_ ^ 0x80; + return (x + 1) << 16; } - x = randstate_ ^ 0x80; - return (x + 1) << 16; - } - return 1 << 23; + return 1 << 23; } int32_t Lfo::getdelay() { - uint32_t delta = delaystate_ < (1U << 31) ? delayinc_ : delayinc2_; - uint32_t d = delaystate_ + delta; - if (d < delayinc_) { - return 1 << 24; - } - delaystate_ = d; - if (d < (1U << 31)) { - return 0; - } else { - return (d >> 7) & ((1 << 24) - 1); - } + uint32_t delta = delaystate_ < (1U << 31) ? delayinc_ : delayinc2_; + uint64_t d = ((uint64_t)delaystate_) + delta; + if (d > ~0u) { + return 1 << 24; + } + delaystate_ = d; + if (d < (1U << 31)) { + return 0; + } else { + return (d >> 7) & ((1 << 24) - 1); + } } void Lfo::keydown() { - if (sync_) { - phase_ = (1U << 31) - 1; - } - delaystate_ = 0; + if (sync_) { + phase_ = (1U << 31) - 1; + } + delaystate_ = 0; } +