#include "osc.h" osc_t OSC_tri = { .name = "w_triangle", .start = 0, .end = 2, .len = 2, }; static float tri(int index) { if (index == 0) return -1.0f; else if (index == 1) return 1.0f; else return 0.0f; } float osc_tri(float offset) { return osc_interpolate(offset, tri((int)offset), tri(osc_next_index(&OSC_tri, offset))); } float osc_tri_next(float f, float offset) { return osc_next_offset(&OSC_tri, f, offset); } static float tri_sample(osc_t * osc, float offset) { return osc_interpolate(offset, tri((int)offset), tri(osc_next_index(osc, offset))); } static float tri_next(osc_t * osc, float f, float offset) { return osc_next_offset(osc, f, offset); } static const struct osc_ops osc_operations = { .sample = tri_sample, .next = tri_next, }; osc_t * make_tri(const char * name) { osc_t * osc = (osc_t *)malloc(sizeof(osc_t)); int len = strlen(name); strncpy(osc->name, name, 16); osc->data = NULL; osc->len = 2; osc->start = 0; osc->end = 2; osc->type = WAVE; osc->ops = &osc_operations; return osc; } void free_tri(osc_t * osc) { free(osc); }