diff -urN libmikmod-3.1.10/drivers/drv_AF.c libmikmod-3.1.10-filter/drivers/drv_AF.c --- libmikmod-3.1.10/drivers/drv_AF.c Tue Jan 8 22:09:08 2002 +++ libmikmod-3.1.10-filter/drivers/drv_AF.c Sun Aug 4 19:45:14 2002 @@ -210,7 +210,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; #else diff -urN libmikmod-3.1.10/drivers/drv_aix.c libmikmod-3.1.10-filter/drivers/drv_aix.c --- libmikmod-3.1.10/drivers/drv_aix.c Tue Jan 8 22:09:08 2002 +++ libmikmod-3.1.10-filter/drivers/drv_aix.c Sun Aug 4 19:45:28 2002 @@ -195,7 +195,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; #else diff -urN libmikmod-3.1.10/drivers/drv_alsa.c libmikmod-3.1.10-filter/drivers/drv_alsa.c --- libmikmod-3.1.10/drivers/drv_alsa.c Tue Jan 8 22:09:08 2002 +++ libmikmod-3.1.10-filter/drivers/drv_alsa.c Sun Aug 4 19:45:36 2002 @@ -452,7 +452,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; #else diff -urN libmikmod-3.1.10/drivers/drv_dart.c libmikmod-3.1.10-filter/drivers/drv_dart.c --- libmikmod-3.1.10/drivers/drv_dart.c Thu Jan 10 08:52:53 2002 +++ libmikmod-3.1.10-filter/drivers/drv_dart.c Sun Aug 4 19:45:46 2002 @@ -304,7 +304,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; #else diff -urN libmikmod-3.1.10/drivers/drv_ds.c libmikmod-3.1.10-filter/drivers/drv_ds.c --- libmikmod-3.1.10/drivers/drv_ds.c Tue Jan 8 22:03:13 2002 +++ libmikmod-3.1.10-filter/drivers/drv_ds.c Sun Aug 4 19:45:54 2002 @@ -377,7 +377,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; #else diff -urN libmikmod-3.1.10/drivers/drv_esd.c libmikmod-3.1.10-filter/drivers/drv_esd.c --- libmikmod-3.1.10/drivers/drv_esd.c Sat Jan 12 19:00:36 2002 +++ libmikmod-3.1.10-filter/drivers/drv_esd.c Sun Aug 4 19:46:03 2002 @@ -344,7 +344,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; #else diff -urN libmikmod-3.1.10/drivers/drv_hp.c libmikmod-3.1.10-filter/drivers/drv_hp.c --- libmikmod-3.1.10/drivers/drv_hp.c Tue Jan 8 22:03:38 2002 +++ libmikmod-3.1.10-filter/drivers/drv_hp.c Sun Aug 4 19:46:10 2002 @@ -192,7 +192,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; #else diff -urN libmikmod-3.1.10/drivers/drv_mac.c libmikmod-3.1.10-filter/drivers/drv_mac.c --- libmikmod-3.1.10/drivers/drv_mac.c Tue Jan 8 22:09:08 2002 +++ libmikmod-3.1.10-filter/drivers/drv_mac.c Sun Aug 4 19:46:18 2002 @@ -295,7 +295,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; /* ex:set ts=4: */ diff -urN libmikmod-3.1.10/drivers/drv_nos.c libmikmod-3.1.10-filter/drivers/drv_nos.c --- libmikmod-3.1.10/drivers/drv_nos.c Tue Jan 8 22:09:08 2002 +++ libmikmod-3.1.10-filter/drivers/drv_nos.c Sun Aug 4 19:46:24 2002 @@ -100,7 +100,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; diff -urN libmikmod-3.1.10/drivers/drv_os2.c libmikmod-3.1.10-filter/drivers/drv_os2.c --- libmikmod-3.1.10/drivers/drv_os2.c Tue Jan 8 22:09:08 2002 +++ libmikmod-3.1.10-filter/drivers/drv_os2.c Sun Aug 4 19:46:30 2002 @@ -367,7 +367,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; /* ex:set ts=4: */ diff -urN libmikmod-3.1.10/drivers/drv_oss.c libmikmod-3.1.10-filter/drivers/drv_oss.c --- libmikmod-3.1.10/drivers/drv_oss.c Mon Jan 21 21:02:15 2002 +++ libmikmod-3.1.10-filter/drivers/drv_oss.c Sun Aug 4 19:46:39 2002 @@ -377,7 +377,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; #else diff -urN libmikmod-3.1.10/drivers/drv_pipe.c libmikmod-3.1.10-filter/drivers/drv_pipe.c --- libmikmod-3.1.10/drivers/drv_pipe.c Sun Jan 13 02:00:13 2002 +++ libmikmod-3.1.10-filter/drivers/drv_pipe.c Sun Aug 4 20:00:39 2002 @@ -208,7 +208,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; #else diff -urN libmikmod-3.1.10/drivers/drv_raw.c libmikmod-3.1.10-filter/drivers/drv_raw.c --- libmikmod-3.1.10/drivers/drv_raw.c Tue Jan 8 22:08:59 2002 +++ libmikmod-3.1.10-filter/drivers/drv_raw.c Sun Aug 4 20:00:46 2002 @@ -168,7 +168,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; /* ex:set ts=4: */ diff -urN libmikmod-3.1.10/drivers/drv_sam9407.c libmikmod-3.1.10-filter/drivers/drv_sam9407.c --- libmikmod-3.1.10/drivers/drv_sam9407.c Tue Jan 8 22:05:43 2002 +++ libmikmod-3.1.10-filter/drivers/drv_sam9407.c Sun Aug 4 20:00:53 2002 @@ -504,7 +504,8 @@ voiceStop, voiceStopped, voiceGetPosition, - voiceRealVolume + voiceRealVolume, + NULL }; #else diff -urN libmikmod-3.1.10/drivers/drv_sgi.c libmikmod-3.1.10-filter/drivers/drv_sgi.c --- libmikmod-3.1.10/drivers/drv_sgi.c Sun Jan 13 00:50:57 2002 +++ libmikmod-3.1.10-filter/drivers/drv_sgi.c Sun Aug 4 20:01:01 2002 @@ -215,7 +215,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; #else diff -urN libmikmod-3.1.10/drivers/drv_stdout.c libmikmod-3.1.10-filter/drivers/drv_stdout.c --- libmikmod-3.1.10/drivers/drv_stdout.c Tue Jan 8 22:09:08 2002 +++ libmikmod-3.1.10-filter/drivers/drv_stdout.c Sun Aug 4 20:01:07 2002 @@ -115,7 +115,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; /* ex:set ts=4: */ diff -urN libmikmod-3.1.10/drivers/drv_sun.c libmikmod-3.1.10-filter/drivers/drv_sun.c --- libmikmod-3.1.10/drivers/drv_sun.c Sun Jan 13 01:58:57 2002 +++ libmikmod-3.1.10-filter/drivers/drv_sun.c Sun Aug 4 20:01:16 2002 @@ -491,7 +491,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; #else diff -urN libmikmod-3.1.10/drivers/drv_ultra.c libmikmod-3.1.10-filter/drivers/drv_ultra.c --- libmikmod-3.1.10/drivers/drv_ultra.c Tue Jan 8 22:09:08 2002 +++ libmikmod-3.1.10-filter/drivers/drv_ultra.c Sun Aug 4 20:01:23 2002 @@ -892,7 +892,8 @@ Ultra_VoiceStop, Ultra_VoiceStopped, Ultra_VoiceGetPosition, - Ultra_VoiceRealVolume + Ultra_VoiceRealVolume, + NULL }; #else diff -urN libmikmod-3.1.10/drivers/drv_wav.c libmikmod-3.1.10-filter/drivers/drv_wav.c --- libmikmod-3.1.10/drivers/drv_wav.c Sun Jan 13 02:00:14 2002 +++ libmikmod-3.1.10-filter/drivers/drv_wav.c Sun Aug 4 20:01:31 2002 @@ -183,7 +183,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; /* ex:set ts=4: */ diff -urN libmikmod-3.1.10/drivers/drv_win.c libmikmod-3.1.10-filter/drivers/drv_win.c --- libmikmod-3.1.10/drivers/drv_win.c Tue Jan 8 22:09:08 2002 +++ libmikmod-3.1.10-filter/drivers/drv_win.c Sun Aug 4 20:01:38 2002 @@ -198,7 +198,8 @@ VC_VoiceStop, VC_VoiceStopped, VC_VoiceGetPosition, - VC_VoiceRealVolume + VC_VoiceRealVolume, + VC_VoiceSetFilter }; #else diff -urN libmikmod-3.1.10/include/filtertable.h libmikmod-3.1.10-filter/include/filtertable.h --- libmikmod-3.1.10/include/filtertable.h Thu Jan 1 01:00:00 1970 +++ libmikmod-3.1.10-filter/include/filtertable.h Wed May 29 15:04:57 2002 @@ -0,0 +1,8 @@ +const int flttbl[]={2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, +3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, +7, 7, 8, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, +13, 13, 14, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 19, +21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28, 29, 29, 29, +31, 31, 32, 33, 34, 34, 35, 36, 37, 37, 38, 39, 40, 41, 41, 41, +43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, +58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 72}; diff -urN libmikmod-3.1.10/include/mikmod.h.in libmikmod-3.1.10-filter/include/mikmod.h.in --- libmikmod-3.1.10/include/mikmod.h.in Thu Jan 17 23:39:38 2002 +++ libmikmod-3.1.10-filter/include/mikmod.h.in Sun Aug 4 20:17:29 2002 @@ -383,6 +383,9 @@ UBYTE pitpancenter; /* pitch pan center (0 to 119) */ UBYTE rvolvar; /* random volume varations (0 - 100%) */ UBYTE rpanvar; /* random panning varations (0 - 100%) */ + + UBYTE ifc; /* initial filter settings */ + UBYTE ifr; /* volume envelope */ UBYTE volflg; /* bit 0: on 1: sustain 2: loop */ @@ -630,6 +633,7 @@ BOOL (*VoiceStopped) (UBYTE); SLONG (*VoiceGetPosition) (UBYTE); ULONG (*VoiceRealVolume) (UBYTE); + void (*VoiceSetFilter) (SBYTE,UBYTE,UBYTE); } MDRIVER; /* These variables can be changed at ANY time and results will be immediate */ @@ -702,6 +706,7 @@ MIKMODAPI extern void VC_VoiceSetPanning(UBYTE,ULONG); MIKMODAPI extern ULONG VC_VoiceGetPanning(UBYTE); MIKMODAPI extern void VC_VoicePlay(UBYTE,SWORD,ULONG,ULONG,ULONG,ULONG,UWORD); +MIKMODAPI extern void VC_VoiceSetFilter(SBYTE,UBYTE,UBYTE); MIKMODAPI extern void VC_VoiceStop(UBYTE); MIKMODAPI extern BOOL VC_VoiceStopped(UBYTE); diff -urN libmikmod-3.1.10/include/mikmod_internals.h libmikmod-3.1.10-filter/include/mikmod_internals.h --- libmikmod-3.1.10/include/mikmod_internals.h Thu Jan 17 23:39:38 2002 +++ libmikmod-3.1.10-filter/include/mikmod_internals.h Sun Aug 4 20:20:27 2002 @@ -332,7 +332,8 @@ SS_PATLOOP, SS_NOTECUT, SS_NOTEDELAY, - SS_PATDELAY + SS_PATDELAY, + SS_SETMACRO }; /* IT Volume column effects */ @@ -351,8 +352,8 @@ #define UF_MAXMACRO 0x10 #define UF_MAXFILTER 0x100 -#define FILT_CUT 0x80 -#define FILT_RESONANT 0x81 +#define FILT_CUTOFF 0x80 +#define FILT_RESO 0x81 typedef struct FILTER { UBYTE filter,inf; @@ -369,6 +370,7 @@ #define EF_SUSTAIN 2 #define EF_LOOP 4 #define EF_VOLENV 8 +#define EF_FILTER 16 /* New Note Action Flags */ #define NNA_CUT 0 @@ -431,6 +433,8 @@ UWORD period; /* period to play the sample at */ UBYTE nna; /* New note action type + master/slave flags */ + UBYTE reso; /* filter settings */ + UBYTE cutoff; UBYTE volflg; /* volume envelope settings */ UBYTE panflg; /* panning envelope settings */ UBYTE pitflg; /* pitch envelope settings */ @@ -561,9 +565,9 @@ extern UWORD* origpositions; extern BOOL filters; /* resonant filters in use */ -extern UBYTE activemacro; /* active midi macro number for Sxx */ +extern UBYTE activemacro[128]; /* active midi macro number for Sxx */ extern UBYTE filtermacros[UF_MAXMACRO]; /* midi macro settings */ -extern FILTER filtersettings[UF_MAXFILTER]; /* computed filter settings */ +extern FILTER filtersettings[UF_MAXFILTER]; /* only 16 needed actually? */ extern int* noteindex; @@ -668,6 +672,7 @@ extern void Voice_SetFrequency_internal(SBYTE,ULONG); extern void Voice_SetPanning_internal(SBYTE,ULONG); extern void Voice_SetVolume_internal(SBYTE,UWORD); +extern void Voice_SetFilter_internal(SBYTE,UBYTE,UBYTE); extern void Voice_Stop_internal(SBYTE); extern BOOL Voice_Stopped_internal(SBYTE); diff -urN libmikmod-3.1.10/loaders/load_it.c libmikmod-3.1.10-filter/loaders/load_it.c --- libmikmod-3.1.10/loaders/load_it.c Sun Jan 13 02:14:07 2002 +++ libmikmod-3.1.10-filter/loaders/load_it.c Sun Aug 4 20:08:25 2002 @@ -137,6 +137,8 @@ UBYTE ppcenter; /* Pitch-pan Center */ UBYTE rvolvar; /* random volume varations */ UBYTE rpanvar; /* random panning varations */ + UBYTE ifc; /* initial filter settings */ + UBYTE ifr; UWORD numsmp; /* Number of samples in instrument [files only] */ CHAR name[26]; /* Instrument name */ UBYTE blank01[6]; @@ -408,6 +410,7 @@ dat=_mm_read_I_UWORD(modreader); _mm_fseek(modreader,8*dat+0x120,SEEK_CUR); + /* read midi macros */ for(i=0;icmwt>=0x216) { + if(mh->cmwt>=0x214) { if(mh->special&8) { IT_LoadMidiConfiguration(modreader); if(_mm_eof(modreader)) { @@ -692,7 +691,8 @@ for(t=0;tinsnum;t++) { ITINSTHEADER ih; - + d->ifc=0x7f; + d->ifr=0x00; /* seek to instrument position */ _mm_fseek(modreader,paraptr[t]+4,SEEK_SET); @@ -727,8 +727,10 @@ ih.trkvers = _mm_read_I_UWORD(modreader); ih.numsmp = _mm_read_UBYTE(modreader); _mm_read_UBYTE(modreader); - _mm_read_string(ih.name,26,modreader); - _mm_read_UBYTES(ih.blank01,6,modreader); + _mm_read_string(ih.name,26,modreader); + ih.ifc=_mm_read_UBYTE(modreader); + ih.ifr=_mm_read_UBYTE(modreader); + _mm_read_UBYTES(ih.blank01,4,modreader); _mm_read_I_UWORDS(ih.samptable,ITNOTECNT,modreader); if(mh->cwt<0x200) { /* load IT 1xx volume envelope */ @@ -876,18 +878,7 @@ #undef IT_ProcessEnvelope if(ih.pitflg&0x80) { - /* filter envelopes not supported yet */ - d->pitflg&=~EF_ON; - ih.pitpts=ih.pitbeg=ih.pitend=0; -#ifdef MIKMOD_DEBUG - { - static int warn=0; - - if(!warn) - fprintf(stderr, "\rFilter envelopes not supported yet\n"); - warn=1; - } -#endif + d->pitflg|=EF_FILTER; } } diff -urN libmikmod-3.1.10/playercode/mdriver.c libmikmod-3.1.10-filter/playercode/mdriver.c --- libmikmod-3.1.10/playercode/mdriver.c Sun Jan 13 02:48:42 2002 +++ libmikmod-3.1.10-filter/playercode/mdriver.c Sun Aug 4 20:13:14 2002 @@ -385,6 +385,20 @@ return result; } +void Voice_SetFilter_internal(SBYTE voice,UBYTE cutoff, UBYTE reso) +{ + + if((voice<0)||(voice>=md_numchn)) return; + md_driver->VoiceSetFilter(voice,cutoff,reso); +} + +MIKMODAPI void Voice_SetFilter(SBYTE voice,UBYTE cutoff, UBYTE reso) +{ + MUTEX_LOCK(vars); + Voice_SetFilter_internal(voice,cutoff,reso); + MUTEX_UNLOCK(vars); +} + void Voice_Play_internal(SBYTE voice,SAMPLE* s,ULONG start) { ULONG repend; diff -urN libmikmod-3.1.10/playercode/mloader.c libmikmod-3.1.10-filter/playercode/mloader.c --- libmikmod-3.1.10/playercode/mloader.c Sun Jan 13 18:43:43 2002 +++ libmikmod-3.1.10-filter/playercode/mloader.c Sun Aug 4 20:14:10 2002 @@ -220,8 +220,13 @@ /* Init note / sample lookup table */ of.instruments[t].samplenote[n] = n; of.instruments[t].samplenumber[n] = t; + } of.instruments[t].globvol = 64; + if (!filters) { + of.instruments[t].ifc=0x7f; + of.instruments[t].ifr=0x00; + } } return 1; } diff -urN libmikmod-3.1.10/playercode/mlutil.c libmikmod-3.1.10-filter/playercode/mlutil.c --- libmikmod-3.1.10/playercode/mlutil.c Sun Jan 13 02:47:55 2002 +++ libmikmod-3.1.10-filter/playercode/mlutil.c Sun Aug 4 20:19:22 2002 @@ -64,7 +64,7 @@ UWORD* origpositions=NULL; BOOL filters; /* resonant filters in use */ -UBYTE activemacro; /* active midi macro number for Sxx,xx<80h */ +UBYTE activemacro[128]; /* active midi macro number for Sxx,xx<80h */ UBYTE filtermacros[UF_MAXMACRO]; /* midi macro settings */ FILTER filtersettings[UF_MAXFILTER]; /* computed filter settings */ @@ -239,21 +239,14 @@ UniEffect(UNI_S3MEFFECTR,inf); break; case 0x13: /* Sxx special commands */ - if (inf>=0xf0) { - /* change resonant filter settings if necessary */ - if((filters)&&((inf&0xf)!=activemacro)) { - activemacro=inf&0xf; - for(inf=0;inf<0x80;inf++) - filtersettings[inf].filter=filtermacros[activemacro]; - } - } else { - /* Scream Tracker does not have samples larger than - 64 Kb, thus doesn't need the SAx effect */ - if ((flags & S3MIT_SCREAM) && ((inf & 0xf0) == 0xa0)) - break; + + /* Scream Tracker does not have samples larger than + 64 Kb, thus doesn't need the SAx effect */ + if ((flags & S3MIT_SCREAM) && ((inf & 0xf0) == 0xa0)) + break; - UniEffect(UNI_ITEFFECTS0,inf); - } + UniEffect(UNI_ITEFFECTS0,inf); + break; case 0x14: /* Txx tempo */ if(inf>=0x20) @@ -289,11 +282,7 @@ UniEffect(UNI_ITEFFECTY,inf); break; case 0x1a: /* Zxx midi/resonant filters */ - if(filtersettings[inf].filter) { - UniWriteByte(UNI_ITEFFECTZ); - UniWriteByte(filtersettings[inf].filter); - UniWriteByte(filtersettings[inf].inf); - } + UniEffect(UNI_ITEFFECTZ,inf); break; } } diff -urN libmikmod-3.1.10/playercode/mplayer.c libmikmod-3.1.10-filter/playercode/mplayer.c --- libmikmod-3.1.10/playercode/mplayer.c Mon Jan 21 22:23:56 2002 +++ libmikmod-3.1.10-filter/playercode/mplayer.c Mon Aug 5 11:30:30 2002 @@ -2020,11 +2020,37 @@ case SS_PATDELAY: /* SEx patterndelay */ DoEEffects(tick, flags, a, mod, channel, 0xE0|inf); break; + case SS_SETMACRO: + activemacro[channel]=inf; + break; } return 0; } +static int DoITEffectZ(UWORD tick, UWORD flags, MP_CONTROL *a, MODULE *mod, SWORD channel) +{ + UBYTE dat; + + + dat=UniGetByte(); + if (dat<0x80) + { + if (filtermacros[activemacro[channel]]==FILT_CUTOFF) + a->main.cutoff=dat; + if (filtermacros[activemacro[channel]]==FILT_RESO) + a->main.reso=dat; + } + else { + if (filtersettings[dat].filter==FILT_CUTOFF) + a->main.cutoff=filtersettings[dat].inf; + if (filtersettings[dat].filter==FILT_RESO) + a->main.reso=filtersettings[dat].inf; + } + + return 0; +} + /*========== Impulse Tracker Volume/Pan Column effects */ /* @@ -2214,7 +2240,7 @@ DoITEffectU, /* UNI_ITEFFECTU */ DoITEffectW, /* UNI_ITEFFECTW */ DoITEffectY, /* UNI_ITEFFECTY */ - DoNothing, /* UNI_ITEFFECTZ */ + DoITEffectZ, /* UNI_ITEFFECTZ */ DoITEffectS0, /* UNI_ITEFFECTS0 */ DoULTEffect9, /* UNI_ULTEFFECT9 */ DoMEDSpeed, /* UNI_MEDSPEED */ @@ -2459,7 +2485,7 @@ /* process pitch envelope */ playperiod=aout->main.period; - if ((aout->main.pitflg&EF_ON)&&(envpit!=32)) { + if ((aout->main.pitflg&EF_ON)&&(envpit!=32)&&!(aout->main.pitflg&EF_FILTER)) { long p1; envpit-=32; @@ -2480,6 +2506,10 @@ } playperiod+=p1; } + + if ((aout->main.pitflg&EF_ON)&&((aout->main.pitflg&EF_FILTER))) { + aout->main.cutoff=envpit; + } if (!aout->main.fadevol) { /* check for a dead note (fadevol=0) */ Voice_Stop_internal(channel); @@ -2499,6 +2529,8 @@ } } + Voice_SetFilter_internal(channel, aout->main.cutoff, aout->main.reso); + md_bpm=mod->bpm+mod->relspd; if (md_bpm<32) md_bpm=32; @@ -2588,6 +2620,11 @@ else if ((i)&&(i->flags & IF_OWNPAN)) a->main.panning=i->panning; + /* FIXME : is this how it should be? Mikit doesn't do + this I think ... + a->main.cutoff=i->ifc; + a->main.reso=i->ifr;*/ + a->main.handle=s->handle; a->speed=s->speed; @@ -2966,6 +3003,7 @@ BOOL Player_Init(MODULE* mod) { + int i; mod->extspd=1; mod->panflag=1; mod->wrap=0; @@ -2979,6 +3017,10 @@ return 1; if (!(mod->voice=(MP_VOICE*)_mm_calloc(md_sngchn,sizeof(MP_VOICE)))) return 1; + for(i=0;inumchn;i++) { + mod->control[i].main.cutoff=0x7f; + mod->control[i].main.reso=0x00; + } Player_Init_internal(mod); return 0; diff -urN libmikmod-3.1.10/playercode/munitrk.c libmikmod-3.1.10-filter/playercode/munitrk.c --- libmikmod-3.1.10/playercode/munitrk.c Thu Jan 17 02:04:08 2002 +++ libmikmod-3.1.10-filter/playercode/munitrk.c Sun Aug 4 18:29:23 2002 @@ -92,7 +92,7 @@ 1, /* UNI_ITEFFECTU */ 1, /* UNI_ITEFFECTW */ 1, /* UNI_ITEFFECTY */ - 2, /* UNI_ITEFFECTZ */ + 1, /* UNI_ITEFFECTZ */ 1, /* UNI_ITEFFECTS0 */ 2, /* UNI_ULTEFFECT9 */ 2, /* UNI_MEDSPEED */ diff -urN libmikmod-3.1.10/playercode/virtch.c libmikmod-3.1.10-filter/playercode/virtch.c --- libmikmod-3.1.10/playercode/virtch.c Mon Jan 14 01:14:36 2002 +++ libmikmod-3.1.10-filter/playercode/virtch.c Sun Aug 4 19:23:02 2002 @@ -1,3 +1,4 @@ +extern const int flttbl[]; /* MikMod sound library (c) 1998, 1999, 2000, 2001, 2002 Miodrag Vallat and others - see file AUTHORS for complete list. @@ -72,7 +73,7 @@ #define TICKWSIZE (TICKLSIZE<<1) #define TICKBSIZE (TICKWSIZE<<1) -#define CLICK_SHIFT 6 +#define CLICK_SHIFT 4 #define CLICK_BUFFER (1L<>FRACBITS,f=index&FRACMASK; - sample=((((SLONGLONG)srce[i]*(FRACMASK+1L-f)) + - ((SLONGLONG)srce[i+1] * f)) >> FRACBITS); + if (increment>=FRACMASK) + { + while(todo--) { + sample=srce[index>>FRACBITS]; index += increment; - + if (vnf->reso!=0) + { + vnf->low+=((vnf->band*(vnf->cutoff))>>7); + vnf->band+=((vnf->high*(vnf->cutoff))>>7); + vnf->high=sample-vnf->low-((vnf->band*vnf->reso)>>7); + sample=vnf->low; + } + if(vnf->rampvol) { - *dest++ += (long)( - ( ( ((SLONGLONG)vnf->oldlvol*vnf->rampvol) + - (vnf->lvolsel*(CLICK_BUFFER-vnf->rampvol)) - ) * (SLONGLONG)sample ) >> CLICK_SHIFT ); - *dest++ += (long)( - ( ( ((SLONGLONG)vnf->oldrvol*vnf->rampvol) + - (vnf->rvolsel*(CLICK_BUFFER-vnf->rampvol)) - ) * (SLONGLONG)sample ) >> CLICK_SHIFT ); + outl = (SLONGLONG)( + (((((SLONGLONG)vnf->oldlvol)<lvolsel-vnf->oldlvol)*(CLICK_BUFFER-vnf->rampvol)) + * (SLONGLONG)sample) >> CLICK_SHIFT ); + outr = (SLONGLONG)( + (((((SLONGLONG)vnf->oldrvol)<rvolsel-vnf->oldrvol)*(CLICK_BUFFER-vnf->rampvol)) + * (SLONGLONG)sample ) >> CLICK_SHIFT ); + vnf->rampvol--; + } else + if(vnf->click) { + outl = (SLONGLONG)( + (((SLONGLONG)vnf->lvolsel*(SLONGLONG)sample-vnf->lastvalL) * + (CLICK_BUFFER-vnf->click) + + ((vnf->lastvalL)<> CLICK_SHIFT ); + + outr = (SLONGLONG)( + (((SLONGLONG)vnf->rvolsel*(SLONGLONG)sample-vnf->lastvalR) * + (CLICK_BUFFER-vnf->click) + + ((vnf->lastvalR)<> CLICK_SHIFT ); + vnf->click--; + } else { + outl =vnf->lvolsel*sample; + outr =vnf->rvolsel*sample; + } + *dest++ +=outl; + *dest++ +=outr; + } + } else + { + while(todo--) { + i=index>>FRACBITS;f=index&FRACMASK; + delta=srce[i+1]-srce[i]; + sample=(SLONGLONG)srce[i]+((f*delta)>>FRACBITS); + index += increment; + if (vnf->reso!=0) + { + vnf->low+=((vnf->band*(vnf->cutoff))>>7); + vnf->band+=((vnf->high*(vnf->cutoff))>>7); + vnf->high=sample-vnf->low-((vnf->band*vnf->reso)>>7); + sample=vnf->low; + } + + if(vnf->rampvol) { + outl = (SLONGLONG)( + (((((SLONGLONG)vnf->oldlvol)<lvolsel-vnf->oldlvol)*(CLICK_BUFFER-vnf->rampvol)) + * (SLONGLONG)sample) >> CLICK_SHIFT ); + outr = (SLONGLONG)( + (((((SLONGLONG)vnf->oldrvol)<rvolsel-vnf->oldrvol)*(CLICK_BUFFER-vnf->rampvol)) + * (SLONGLONG)sample ) >> CLICK_SHIFT ); vnf->rampvol--; } else if(vnf->click) { - *dest++ += (long)( - ( ( (SLONGLONG)(vnf->lvolsel*(CLICK_BUFFER-vnf->click)) * - (SLONGLONG)sample ) + (vnf->lastvalL * vnf->click) ) - >> CLICK_SHIFT ); - *dest++ += (long)( - ( ( ((SLONGLONG)vnf->rvolsel*(CLICK_BUFFER-vnf->click)) * - (SLONGLONG)sample ) + (vnf->lastvalR * vnf->click) ) - >> CLICK_SHIFT ); + outl = (SLONGLONG)( + (((SLONGLONG)vnf->lvolsel*(SLONGLONG)sample-vnf->lastvalL) * + (CLICK_BUFFER-vnf->click) + + ((vnf->lastvalL)<> CLICK_SHIFT ); + + outr = (SLONGLONG)( + (((SLONGLONG)vnf->rvolsel*(SLONGLONG)sample-vnf->lastvalR) * + (CLICK_BUFFER-vnf->click) + + ((vnf->lastvalR)<> CLICK_SHIFT ); vnf->click--; } else { - *dest++ +=vnf->lvolsel*sample; - *dest++ +=vnf->rvolsel*sample; + outl =vnf->lvolsel*sample; + outr =vnf->rvolsel*sample; } + *dest++ +=outl; + *dest++ +=outr; + } } - vnf->lastvalL=vnf->lvolsel*sample; - vnf->lastvalR=vnf->rvolsel*sample; + vnf->lastvalL=outl; /*vnf->lvolsel*sample;*/ + vnf->lastvalR=outr; /*vnf->rvolsel*sample;*/ + return index; } @@ -463,9 +527,9 @@ } /* Mixing macros */ -#define EXTRACT_SAMPLE(var,attenuation) var=*srce++/(MAXVOL_FACTOR*attenuation) -#define CHECK_SAMPLE(var,bound) var=(var>=bound)?bound-1:(var<-bound)?-bound:var +#define EXTRACT_SAMPLE(var,attenuation) var=((*srce++)>>MAXVOL_SHIFT) +#define CHECK_SAMPLE(var,bound) var=(var>=bound)?bound-1:(var<-bound)?-bound:var static void Mix32To16_Normal(SWORD* dste,SLONG* srce,NATIVE count) { NATIVE x1,x2,tmpx; @@ -474,7 +538,7 @@ for(count/=SAMPLING_FACTOR;count;count--) { tmpx=0; - for(i=SAMPLING_FACTOR/2;i;i--) { + for(i=SAMPLING_FACTOR;i;i--) { EXTRACT_SAMPLE(x1,1); EXTRACT_SAMPLE(x2,1); CHECK_SAMPLE(x1,32768); CHECK_SAMPLE(x2,32768); @@ -487,24 +551,13 @@ static void Mix32To16_Stereo(SWORD* dste,SLONG* srce,NATIVE count) { - NATIVE x1,x2,x3,x4,tmpx,tmpy; - int i; + NATIVE x1,x2; for(count/=SAMPLING_FACTOR;count;count--) { - tmpx=tmpy=0; - - for(i=SAMPLING_FACTOR/2;i;i--) { - EXTRACT_SAMPLE(x1,1); EXTRACT_SAMPLE(x2,1); - EXTRACT_SAMPLE(x3,1); EXTRACT_SAMPLE(x4,1); - - CHECK_SAMPLE(x1,32768); CHECK_SAMPLE(x2,32768); - CHECK_SAMPLE(x3,32768); CHECK_SAMPLE(x4,32768); - - tmpx+=x1+x3; - tmpy+=x2+x4; - } - *dste++ =tmpx/SAMPLING_FACTOR; - *dste++ =tmpy/SAMPLING_FACTOR; + EXTRACT_SAMPLE(x1,1); EXTRACT_SAMPLE(x2,1); + CHECK_SAMPLE(x1,32767); CHECK_SAMPLE(x2,32767); + *dste++ =x1; + *dste++ =x2; } } @@ -683,6 +736,7 @@ #define VC1_VoiceGetPanning VC2_VoiceGetPanning #define VC1_VoiceSetFrequency VC2_VoiceSetFrequency #define VC1_VoiceGetFrequency VC2_VoiceGetFrequency +#define VC1_VoiceSetFilter VC2_VoiceSetFilter #define VC1_VoicePlay VC2_VoicePlay #define VC1_VoiceStop VC2_VoiceStop #define VC1_VoiceStopped VC2_VoiceStopped @@ -708,7 +762,7 @@ if(!tickleft) { if(vc_mode & DMODE_SOFT_MUSIC) md_player(); tickleft=(md_mixfreq*125L*SAMPLING_FACTOR)/(md_bpm*50L); - tickleft&=~(SAMPLING_FACTOR-1); +/* tickleft&=~(SAMPLING_FACTOR-1);*/ } left = MIN(tickleft, todo); buffer = buf; @@ -879,6 +933,11 @@ for(t=0;t32) + if(abs((int)vinf[voice].vol-(int)vol)>8) vinf[voice].rampvol=CLICK_BUFFER; vinf[voice].vol=vol; } @@ -343,6 +357,18 @@ vinf[voice].pan=pan; } +void VC1_VoiceSetFilter(SBYTE voice,UBYTE cutoff, UBYTE reso) +{ + + + if ((cutoff==0x7f) && (reso==0)) + { + vinf[voice].reso=0; + } else { + vinf[voice].cutoff=flttbl[cutoff]; + vinf[voice].reso=(((cutoff*cutoff>>7)+32)*(80-((SLONGLONG)reso>>1)))>>5; + }; +} /*========== External mixer interface */ void VC1_SampleUnload(SWORD handle)