diff --git a/plugin/ic29.cpp b/plugin/ic29.cpp index 3f6a83e..6df42eb 100644 --- a/plugin/ic29.cpp +++ b/plugin/ic29.cpp @@ -23,10 +23,10 @@ Synth ic29; Synth::Synth() { d_debug("initialising synth\n"); - envAtk = atkTable[0]; - envDcy = dcyTable[90]; - envRls = dcyTable[10]; - envStn = 0xfff; + envAtk = 0x20; + envDcy = 0x50; + envStn = 0x1f; + envRls = 0x3f; portaCoeff = 0x0; } @@ -76,25 +76,27 @@ Envelope::Envelope() { } void Envelope::run() { + + uint16_t tempStn = ic29.envStn << 6; switch (phase) { case ENV_ATK: - level += ic29.envAtk; + level += atkTable[ic29.envAtk]; if (level > 0x3fff) { level = 0x3fff; phase = ENV_DCY; } break; case ENV_DCY: - if (level > ic29.envStn) { - level -= ic29.envStn; - level = (level * ic29.envDcy) >> 16; - level += ic29.envStn; + if (level > tempStn) { +// level = ((level * ic29.envDcy) >> 16; + level = (((level - tempStn) * dcyTable[ic29.envDcy]) >> 16) + tempStn; + } else { - level = ic29.envStn; + level = tempStn; } break; case ENV_RLS: - level = (level * ic29.envRls) >> 16; + level = (level * dcyTable[ic29.envRls]) >> 16; break; case ENV_IDLE: default: diff --git a/plugin/ic29.hpp b/plugin/ic29.hpp index a41c17c..245da2a 100644 --- a/plugin/ic29.hpp +++ b/plugin/ic29.hpp @@ -45,6 +45,8 @@ class Envelope { ENV_RLS, ENV_IDLE } phase; + static const uint16_t atkTable[128]; + static const uint16_t dcyTable[128]; }; class Voice { diff --git a/plugin/ic29tables.hpp b/plugin/ic29tables.hpp index 86ee4be..2ff3acb 100644 --- a/plugin/ic29tables.hpp +++ b/plugin/ic29tables.hpp @@ -20,7 +20,7 @@ #include "ic29.hpp" -extern const uint16_t atkTable[] = { +const uint16_t Envelope::atkTable[128] = { 0x4000, 0x2000, 0x1000, 0x0aaa, 0x0800, 0x0666, 0x0555, 0x0492, 0x0400, 0x038e, 0x0333, 0x02e9, 0x02ab, 0x0276, 0x0249, 0x0222, 0x0200, 0x01e2, 0x01c7, 0x01af, 0x0199, 0x0186, 0x0174, 0x0164, 0x0155, 0x0148, 0x013b, @@ -37,7 +37,7 @@ extern const uint16_t atkTable[] = { 0x001d, 0x001c, 0x001c, 0x001b, 0x001b, 0x001a, 0x0019, 0x0018, 0x0017, 0x0016, 0x0015}; -extern const uint16_t dcyTable[128] = { +const uint16_t Envelope::dcyTable[128] = { 0x1000, 0x3000, 0x5000, 0x7000, 0x9000, 0xa000, 0xa800, 0xb000, 0xb800, 0xc000, 0xc800, 0xd000, 0xd800, 0xe000, 0xe800, 0xf000, 0xf080, 0xf100, 0xf180, 0xf200, 0xf280, 0xf300, 0xf380, 0xf400, 0xf480, 0xf500, 0xf580,