From c8cd7f9298de876f2046fddd2e322a63c421a505 Mon Sep 17 00:00:00 2001 From: gramanas Date: Fri, 7 Jul 2023 01:09:12 +0300 Subject: suppa --- src/osc.h | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/osc.h (limited to 'src/osc.h') diff --git a/src/osc.h b/src/osc.h new file mode 100644 index 0000000..3915e5a --- /dev/null +++ b/src/osc.h @@ -0,0 +1,72 @@ +#ifndef OSC_H +#define OSC_H + +#include + +/** + * The main idea of the osc is the following: + * The root of the sound is a periodic wave function. + * This can be a stored period of a wave in a wavetable + * or a function like sin(). In order to play a sound with + * the wave an external float offset is kept that points to the + * next sample, a function is provided to advance this offset + * a calucalted step amount, depending on the desired frequency. + * Linear interpolation is used so that a float offset can work + * and provide autosmoothing. + */ + +enum osc_type { + WAVE, + SAMPLE +}; + +typedef struct osc_t { + char name[16]; + float * data; + long len; + long start; + long end; + enum osc_type type; +} osc_t; + +/* Initializes the wavetables and functions for the oscilators */ +void init_osc(); + +float osc_interpolate(float offset, float start, float end); +float osc_next_offset(osc_t * osc, float f, float offset); +int osc_next_index(osc_t * osc, float offset); + +int osc_load_wav(osc_t * osc, const char * path); + +/***************/ +/* OSCILATORS */ +/***************/ + +#define OSC_COMMON(osc) \ + void \ + set_##osc##_start(long start) \ + { OSC_##osc.start = start; } \ + void \ + set_##osc##_end(long end) \ + { OSC_##osc.end = end; } + +#define OSC_COMMON_H(osc) \ + void \ + set_##osc##_start(long start); \ + void \ + set_##osc##_end(long end); \ + float \ + osc_##osc(float offset); \ + float \ + osc_##osc##_next(float f, float offset); + +/*****************/ +/* osc functions */ +/*****************/ + +OSC_COMMON_H(tri) +OSC_COMMON_H(sin) +OSC_COMMON_H(weird) +OSC_COMMON_H(sound) + +#endif /* OSC_H */ -- cgit v1.2.3