aboutsummaryrefslogtreecommitdiff
path: root/audio/softsynth/mt32/LA32Ramp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'audio/softsynth/mt32/LA32Ramp.cpp')
-rw-r--r--audio/softsynth/mt32/LA32Ramp.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/audio/softsynth/mt32/LA32Ramp.cpp b/audio/softsynth/mt32/LA32Ramp.cpp
index 4e4d6b4f30..b4ac6f1d46 100644
--- a/audio/softsynth/mt32/LA32Ramp.cpp
+++ b/audio/softsynth/mt32/LA32Ramp.cpp
@@ -1,5 +1,5 @@
/* Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009 Dean Beeler, Jerome Fisher
- * Copyright (C) 2011 Dean Beeler, Jerome Fisher, Sergey V. Mikayev
+ * Copyright (C) 2011, 2012, 2013 Dean Beeler, Jerome Fisher, Sergey V. Mikayev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
@@ -82,9 +82,13 @@ void LA32Ramp::startRamp(Bit8u target, Bit8u increment) {
if (increment == 0) {
largeIncrement = 0;
} else {
- // Using integer argument here, no precision loss:
+ // Three bits in the fractional part, no need to interpolate
// (unsigned int)(EXP2F(((increment & 0x7F) + 24) / 8.0f) + 0.125f)
- largeIncrement = (unsigned int)(EXP2I(((increment & 0x7F) + 24) << 9) + 0.125f);
+ Bit32u expArg = increment & 0x7F;
+ largeIncrement = 8191 - Tables::getInstance().exp9[~(expArg << 6) & 511];
+ largeIncrement <<= expArg >> 3;
+ largeIncrement += 64;
+ largeIncrement >>= 9;
}
descending = (increment & 0x80) != 0;
if (descending) {