some sfx processing minor fixes

This commit is contained in:
BADIM-PC\Vadim 2017-12-26 00:15:13 +03:00
parent a2ed1a0453
commit bac3a9c3b6
1 changed files with 11 additions and 11 deletions

View File

@ -37,7 +37,7 @@
#define MIN_PERIOD_VALUE 10
#define MAX_PERIOD_VALUE 4096
#define BASE_NOTE_FREQ 440.0
#define BASE_NOTE_POS 49
#define BASE_NOTE_POS 49.0
#define ENVELOPE_FREQ_SCALE 2
#define NOTES_PER_MUNUTE (TIC_FRAMERATE / NOTES_PER_BEET * 60)
#define min(a,b) ((a) < (b) ? (a) : (b))
@ -89,25 +89,25 @@ static void update_amp(blip_buffer_t* blip, tic_sound_register_data* data, s32 n
blip_add_delta( blip, data->time, delta );
}
static inline s32 freq2note(double freq)
static inline double freq2note(double freq)
{
return (s32)round((double)NOTES * log2(freq / BASE_NOTE_FREQ)) + BASE_NOTE_POS;
return (double)NOTES * log2(freq / BASE_NOTE_FREQ) + BASE_NOTE_POS;
}
static inline double note2freq(s32 note)
static inline s32 note2freq(double note)
{
return pow(2, (note - BASE_NOTE_POS) / (double)NOTES) * BASE_NOTE_FREQ;
return round(pow(2, (note - BASE_NOTE_POS) / (double)NOTES) * BASE_NOTE_FREQ);
}
static inline s32 freq2period(double freq)
{
if(freq == 0.0) return MAX_PERIOD_VALUE;
if(freq == 0.0) return MAX_PERIOD_VALUE;
enum {Rate = CLOCKRATE * ENVELOPE_FREQ_SCALE / ENVELOPE_VALUES};
s32 period = (s32)round(Rate / freq - 1.0);
s32 period = round((double)Rate / freq - 1.0);
if(period < MIN_PERIOD_VALUE) return MIN_PERIOD_VALUE;
if(period > MAX_PERIOD_VALUE) return MAX_PERIOD_VALUE;
if(period < MIN_PERIOD_VALUE) return MIN_PERIOD_VALUE;
if(period > MAX_PERIOD_VALUE) return MAX_PERIOD_VALUE;
return period;
}
@ -391,7 +391,7 @@ static void channelSfx(tic_mem* memory, s32 index, s32 note, s32 octave, s32 dur
// start index of idealized piano
enum {PianoStart = -8};
s32 freq = (s32)note2freq(note + octave * NOTES + PianoStart);
s32 freq = note2freq(note + octave * NOTES + PianoStart);
c->duration = duration;
c->freq = freq;
@ -1129,7 +1129,7 @@ static void sfx(tic_mem* memory, s32 index, s32 freq, Channel* channel, tic_soun
{
s8 arp = effect->data[channel->pos.arpeggio].arpeggio * (effect->reverse ? -1 : 1);
if(arp) freq = (s32)note2freq(freq2note(freq)+arp);
if(arp) freq = note2freq(freq2note(freq)+arp);
freq += effect->data[channel->pos.pitch].pitch * (effect->pitch16x ? 16 : 1);