uint16_t logsinTable[256]; uint16_t expTable[256]; void initTables() { for (int i = 0; i < 256; ++i) { logsinTable[i] = round(-log2(sin((double(i) + 0.5) * M_PI / 256.0 / 2.0)) * 256.0); expTable[i] = round((exp2(double(i) / 256.0) - 1.0) * 1024.0); } } uint16_t lookupSin(uint16_t val) { bool sign = val & 512; bool mirror = val & 256; val &= 255; auto result = logsinTable[mirror ? val ^ 0xFF : val]; if (sign) result |= 0x8000; return result; } int16_t lookupExp(uint16_t val) { bool sign = val & 0x8000; int t = (expTable[(val & 0xFF) ^ 0xFF] << 1) | 0x0800; int result = t >> ((val & 0x7F00) >> 8); if (sign) result = ~result; return result >> 4; } int main() { initTables(); int vol = 0; // 0..15 int env = 0; // 0..127 int am = 0; // 0..13 for (int i = 0; i < 1024; ++i) { auto s = lookupSin(i); cout << lookupExp(s + 128 * vol + 16 * env + 16 * am) + 256 << endl; } }