OSDN Git Service

Fix modenv.
authorSaito <saito2@digitalme.com>
Sat, 14 Feb 2004 13:56:11 +0000 (13:56 +0000)
committerSaito <saito2@digitalme.com>
Sat, 14 Feb 2004 13:56:11 +0000 (13:56 +0000)
ChangeLog
timidity/mix.c
timidity/tables.c
timidity/tables.h
timidity/timidity.c

index b516f2f..85293b5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,8 @@
 2004-02-14  Saito <saito2@digitalme.com>
 
        * timidity/playmidi.[ch], timidity/mix.c,
-         timidity/sndfont.c, timidity/instrum.c:
+         timidity/sndfont.c, timidity/instrum.c
+         timidity/tables.c, timidity/timidity.c:
          Fix modulation envelope of SoundFont.
          Fix bahaviour of filter.
          Hack up around load_instrument().
index 25f3739..7ec921f 100644 (file)
@@ -1823,10 +1823,10 @@ int apply_modulation_envelope(int v)
        if(!opt_modulation_envelope) {return 0;}
 
        if (vp->sample->modes & MODES_ENVELOPE) {
-       /*      if (vp->modenv_stage > 1)
-                       vp->last_modenv_volume = attack_vol_table[vp->modenv_volume >> 20];
-               else*/
-                       vp->last_modenv_volume = convex_vol_table[vp->modenv_volume >> 20];
+               if (vp->modenv_stage > 1)
+                       vp->last_modenv_volume = modenv_decay_vol_table[vp->modenv_volume >> 20];
+               else
+                       vp->last_modenv_volume = modenv_attack_vol_table[vp->modenv_volume >> 20];
        }
 
        recompute_voice_filter(v);
index 4ef881a..ed28f01 100644 (file)
@@ -1371,19 +1371,25 @@ void init_sb_vol_table(void)
                sb_vol_table[i] = pow(10.0, (double)(1023 - i) * 960.0 / (1023.0 * -200.0));
 }
 
-FLOAT_T convex_vol_table[1024];
+FLOAT_T modenv_attack_vol_table[1024];
+FLOAT_T modenv_decay_vol_table[1024];
 
-void init_convex_vol_table(void)
+void init_modenv_vol_table(void)
 {
        int i;
-       
+       double x;
+
        for (i = 0; i < 1024; i++) {
-               convex_vol_table[i] = 1.0 - (-20.0 / 96.0 * log(((double)i * (double)i) / (1023.0 * 1023.0)) / log(10.0));
-               if(convex_vol_table[i] < 0) {convex_vol_table[i] = 0;}
+               modenv_decay_vol_table[i] = log((double)i / 1023.0f + 1) / log(2);
        }
 
-       convex_vol_table[0] = 0;
-       convex_vol_table[1023] = 1.0;
+       modenv_attack_vol_table[0] = 0;
+       for (i = 1; i < 1023; i++) {
+               x = (1.0 - (-20.0 / 96.0 * log(((double)i * (double)i) / (1023.0 * 1023.0)) / log(10.0)));
+               if(x < 0) {x = 0;}
+               modenv_attack_vol_table[i] = log(x + 1) / log(2);
+       }
+       modenv_attack_vol_table[1023] = 1.0;
 }
 
 FLOAT_T cb_to_amp_table[961] = 
index d7716d4..7ed73c6 100644 (file)
@@ -75,7 +75,8 @@ extern FLOAT_T sc_vol_table[];
 extern FLOAT_T sc_pan_table[], gm2_pan_table[];
 extern FLOAT_T sc_drum_level_table[];
 extern FLOAT_T sb_vol_table[];
-extern FLOAT_T convex_vol_table[];
+extern FLOAT_T modenv_attack_vol_table[];
+extern FLOAT_T modenv_decay_vol_table[];
 extern FLOAT_T cb_to_amp_table[];
 extern FLOAT_T reverb_time_table[];
 extern FLOAT_T pan_delay_table[];
@@ -95,7 +96,7 @@ extern void init_tables(void);
 extern void init_gm2_pan_table(void);
 extern void init_attack_vol_table(void);
 extern void init_sb_vol_table(void);
-extern void init_convex_vol_table(void);
+extern void init_modenv_vol_table(void);
 extern void init_def_vol_table(void);
 extern void init_gs_vol_table(void);
 extern void init_perceived_vol_table(void);
index b374d58..7f2e04e 100644 (file)
@@ -4761,7 +4761,7 @@ MAIN_INTERFACE void timidity_start_initialize(void)
        init_gm2_pan_table();
        init_attack_vol_table();
        init_sb_vol_table();
-       init_convex_vol_table();
+       init_modenv_vol_table();
        init_def_vol_table();
        init_gs_vol_table();
        init_perceived_vol_table();