summaryrefslogtreecommitdiffstats
path: root/src/osc_tri.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osc_tri.c')
-rw-r--r--src/osc_tri.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/osc_tri.c b/src/osc_tri.c
index c4a56f5..8d2ef82 100644
--- a/src/osc_tri.c
+++ b/src/osc_tri.c
@@ -28,3 +28,46 @@ 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);
+}