#ifndef _FTABLE_H
#define _FTABLE_H

/*
 * return amplitude between [-255, 255]
 */
int32_t Get_VibratoValue(uint32_t type /* [0-7] */, uint32_t pos /* [0-255] */);
/*
 * In  - base frequency
 *     - actual frequency
 * Out - distance in 1/256 semitones
 */
int32_t Convert_RelTone(uint32_t base, uint32_t freq);
/*
 * In  - period [&FFFFFFFF..428*256..1] in 1/256 Amiga period
 * Out - tone in 1/256 of semitone ~[-119*256..64*256..265*256]
 */
int32_t Convert_PeriodToTone(uint32_t period);
/*
 * In  - tone [-119*256..64*256..261*256[ in 1/256 semitone
 * Out - period [&FFFFFFFF..428*256..1] in 1/256 Amiga period
 */
uint32_t Convert_ToneToPeriod(int32_t tone);
/*
 * In  - frac in 1/65536 of base freq
 * Out - tone [-128*256..64*256..256*256] in 1/256 semitones
 */
int32_t Convert_FracToTone(uint32_t frac);
/*
 * In  - tone [-128*256..64*256..256*256[ in 1/256 semitone
 * Out - frac in 1/65536 of base freq
 */
uint32_t Convert_ToneToFrac(int32_t tone);
/*
 * In  - frac in 1/65536 of base freq
 * Out - period [&FFFFFFFF..428*256..1] in 1/256 Amiga period
 */
uint32_t Convert_FracToPeriod(uint32_t frac);
/*
 * In  - period [&FFFFFFFF..428*256..1] in 1/256 Amiga period
 * Out - frac in 1/65536 of base freq
 */
uint32_t Convert_PeriodToFrac(uint32_t period);
/*
 * In  - cutoff [0..127*256]
 * Out - (2^-(cutoff/(24*256)) in 1/(1<<24)
 */
uint32_t Convert_Cutoff(uint32_t);
/*
 * In  - tempo
 *     - tempo base
 * Out - duration (in 1/256000000th of second)
 */
uint32_t Get_TempoTime(uint32_t, uint32_t);
/*
 * In  - amount of channels/polyphony
 * Out - amplification in 1/65536
 */
uint32_t Get_PreAmp(uint32_t channels);

int32_t Mul16(int32_t base, int32_t mul);
int32_t MulH16(int32_t base, int32_t mul);
int32_t CRandom(GlobHdr*);
uint32_t Convert_FreqToCutoff(uint32_t freq); // in c.Sample


#endif
