aboutsummaryrefslogtreecommitdiff
path: root/utils/gen_adldata/progs_cache.h
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2017-11-04 13:01:18 +0300
committerWohlstand <admin@wohlnet.ru>2017-11-04 13:01:18 +0300
commit79a4100777d99c00e983ee78b4539acc349bd148 (patch)
treecd20074405f9ef42fbf83d5f579e33c317876b9f /utils/gen_adldata/progs_cache.h
parent3d04ebe23175c0b723d4bde8ecdecc57b31f3ad6 (diff)
downloadlibADLMIDI-79a4100777d99c00e983ee78b4539acc349bd148.tar.gz
libADLMIDI-79a4100777d99c00e983ee78b4539acc349bd148.tar.bz2
libADLMIDI-79a4100777d99c00e983ee78b4539acc349bd148.zip
Don't use force difference for pseudo-4op voices in GenAdlData
Diffstat (limited to 'utils/gen_adldata/progs_cache.h')
-rw-r--r--utils/gen_adldata/progs_cache.h13
1 files changed, 11 insertions, 2 deletions
diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h
index d652b9e..96dfe32 100644
--- a/utils/gen_adldata/progs_cache.h
+++ b/utils/gen_adldata/progs_cache.h
@@ -9,6 +9,8 @@
#include <cstdint>
#include <string>
#include <vector>
+#include <limits>
+#include <cmath>
struct insdata
{
@@ -37,6 +39,13 @@ struct insdata
}
};
+inline bool equal_approx(double const a, double const b)
+{
+ double const epsilon(std::numeric_limits<double>::epsilon() * 100);
+ double const scale(1.0);
+ return std::fabs(a - b) < epsilon * (scale + (std::max)(std::fabs(a), std::fabs(b)));
+}
+
struct ins
{
size_t insno1, insno2;
@@ -50,7 +59,7 @@ struct ins
&& insno1 == b.insno1
&& insno2 == b.insno2
&& pseudo4op == b.pseudo4op
- && voice2_fine_tune == b.voice2_fine_tune;
+ && equal_approx(voice2_fine_tune, b.voice2_fine_tune);
}
bool operator< (const ins &b) const
{
@@ -58,7 +67,7 @@ struct ins
if(insno2 != b.insno2) return insno2 < b.insno2;
if(notenum != b.notenum) return notenum < b.notenum;
if(pseudo4op != b.pseudo4op) return pseudo4op < b.pseudo4op;
- if(voice2_fine_tune != b.voice2_fine_tune) return voice2_fine_tune < b.voice2_fine_tune;
+ if(!equal_approx(voice2_fine_tune, b.voice2_fine_tune)) return voice2_fine_tune < b.voice2_fine_tune;
return 0;
}
bool operator!=(const ins &b) const