Skip to content
Permalink
Browse files

add linlin operator

  • Loading branch information
boqs committed Dec 15, 2017
1 parent 85898cb commit e1defac095f8055c87d30390e1297199ac90c8c1
@@ -66,6 +66,7 @@ CSRCS += \
$(APP_DIR)/src/ops/op_iter.c \
$(APP_DIR)/src/ops/op_kria.c \
$(APP_DIR)/src/ops/op_life_classic.c \
$(APP_DIR)/src/ops/op_linlin.c \
$(APP_DIR)/src/ops/op_list2.c \
$(APP_DIR)/src/ops/op_list8.c \
$(APP_DIR)/src/ops/op_list16.c \
@@ -44,6 +44,7 @@ const op_id_t userOpTypes[NUM_USER_OP_TYPES] = {
eOpIter,
eOpKria,
eOpLifeClassic,
eOpLinlin,
eOpList2,
eOpList8,
eOpList16,
@@ -409,6 +410,11 @@ const op_desc_t op_registry[numOpClasses] = {
.size = sizeof(op_ckdiv_t),
.init = &op_ckdiv_init,
.deinit = &op_ckdiv_deinit
}, {
.name = "LINLIN",
.size = sizeof(op_linlin_t),
.init = &op_linlin_init,
.deinit = NULL
}
};

@@ -107,6 +107,7 @@ typedef enum {
eOpMidiProg,
eOpMidiOutClock,
eOpCkdiv,
eOpLinlin,
// eOpMidiBend,
// eOpMidiTouch,
numOpClasses // dummy/count
@@ -33,6 +33,7 @@
#include "ops/op_is.h"
#include "ops/op_iter.h"
#include "ops/op_life_classic.h"
#include "ops/op_linlin.h"
#include "ops/op_kria.h"
#include "ops/op_list2.h"
#include "ops/op_list8.h"
@@ -0,0 +1,120 @@
#include "net_protected.h"
#include "op_linlin.h"

//-------------------------------------------------
//----- static function declaration
static void op_linlin_in_in(op_linlin_t* linlin, const io_t v);
static void op_linlin_in_imin(op_linlin_t* linlin, const io_t v);
static void op_linlin_in_imax(op_linlin_t* linlin, const io_t v);
static void op_linlin_in_omin(op_linlin_t* linlin, const io_t v);
static void op_linlin_in_omax(op_linlin_t* linlin, const io_t v);

// pickle / unpickle
static u8* op_linlin_pickle(op_linlin_t* op, u8* dst);
static const u8* op_linlin_unpickle(op_linlin_t* op, const u8* src);


//-------------------------------------------------
//----- static vars
static op_in_fn op_linlin_in_fn[5] = {
(op_in_fn)&op_linlin_in_in,
(op_in_fn)&op_linlin_in_imin,
(op_in_fn)&op_linlin_in_imax,
(op_in_fn)&op_linlin_in_omin,
(op_in_fn)&op_linlin_in_omax,
};

static const char* op_linlin_instring = "IN\0 IMIN\0 IMAX\0 OMIN\0 OMAX\0 ";
static const char* op_linlin_outstring = "VAL\0 ";
static const char* op_linlin_opstring = "LINLIN";

//-------------------------------------------------
//----- external function definitions
void op_linlin_init(void* mem) {
op_linlin_t* linlin = (op_linlin_t*)mem;
linlin->super.numInputs = 5;
linlin->super.numOutputs = 1;
linlin->outs[0] = -1;

linlin->super.in_fn = op_linlin_in_fn;
linlin->super.pickle = (op_pickle_fn) (&op_linlin_pickle);
linlin->super.unpickle = (op_unpickle_fn) (&op_linlin_unpickle);

linlin->super.in_val = linlin->in_val;
linlin->super.out = linlin->outs;
linlin->super.opString = op_linlin_opstring;
linlin->super.inString = op_linlin_instring;
linlin->super.outString = op_linlin_outstring;
linlin->super.type = eOpLinlin;

linlin->in_val[0] = &(linlin->in);
linlin->in_val[1] = &(linlin->imin);
linlin->in_val[2] = &(linlin->imax);
linlin->in_val[3] = &(linlin->omin);
linlin->in_val[4] = &(linlin->omax);

linlin->in = 0;
linlin->imin = 0;
linlin->imax = 1;
linlin->omin = 0;
linlin->omax = 1;
linlin->a = 1;
linlin->b = 0;
}

//-------------------------------------------------
//----- static function definitions
// set operand A
static void op_linlin_in_in(op_linlin_t* linlin, const io_t v) {
// out = (in - off) * a + b;
linlin->in = v;
s32 out = linlin->a * (v - linlin->off);
out += linlin->b;
out = out >> 16;
net_activate(linlin, 0, out);
}
void calculate_a_and_b(op_linlin_t *linlin) {
linlin->b = linlin->omin;
linlin->off = linlin->imin;
s32 mul = linlin->omax - linlin->omin;
s32 div = linlin->imax - linlin->imin;
linlin->a = mul << 16;
if (div) {
linlin->a /= div;
}
}
static void op_linlin_in_imin(op_linlin_t* linlin, const io_t v) {
linlin->imin = v;
calculate_a_and_b(linlin);
}
static void op_linlin_in_imax(op_linlin_t* linlin, const io_t v) {
linlin->imax = v;
calculate_a_and_b(linlin);
}
static void op_linlin_in_omin(op_linlin_t* linlin, const io_t v) {
linlin->omin = v;
calculate_a_and_b(linlin);
}
static void op_linlin_in_omax(op_linlin_t* linlin, const io_t v) {
linlin->omax = v;
calculate_a_and_b(linlin);
}

// pickle / unpickle
u8* op_linlin_pickle(op_linlin_t* op, u8* dst) {
dst = pickle_io(op->in, dst);
dst = pickle_io(op->imin, dst);
dst = pickle_io(op->imax, dst);
dst = pickle_io(op->omin, dst);
dst = pickle_io(op->omax, dst);
return dst;
}

const u8* op_linlin_unpickle(op_linlin_t* op, const u8* src ) {
src = unpickle_io(src, &(op->in));
src = unpickle_io(src, &(op->imin));
src = unpickle_io(src, &(op->imax));
src = unpickle_io(src, &(op->imin));
src = unpickle_io(src, &(op->imax));
return src;
}
@@ -0,0 +1,27 @@
#ifndef _op_linlin_H_
#define _op_linlin_H_

#include "op.h"
#include "op_math.h"
#include "types.h"

//--- op_linlin_t : linlintiplication
typedef struct op_linlin_struct {
op_t super;
io_t val;
volatile io_t in;
volatile io_t imin;
volatile io_t imax;
volatile io_t omin;
volatile io_t omax;
volatile io_t* in_val[5];
s32 a;
s32 b;
s32 off;
op_out_t outs[1];
} op_linlin_t;

void op_linlin_init(void* linlin);


#endif // header guard
@@ -55,6 +55,7 @@ src += \
$(bees)/src/ops/op_kria.c \
$(bees)/src/ops/op_iter.c \
$(bees)/src/ops/op_life_classic.c \
$(bees)/src/ops/op_linlin.c \
$(bees)/src/ops/op_list2.c \
$(bees)/src/ops/op_list8.c \
$(bees)/src/ops/op_list16.c \
@@ -54,6 +54,7 @@ beekeep_src += \
$(bees)/src/ops/op_iter.c \
$(bees)/src/ops/op_kria.c \
$(bees)/src/ops/op_life_classic.c \
$(bees)/src/ops/op_linlin.c \
$(bees)/src/ops/op_list2.c \
$(bees)/src/ops/op_list8.c \
$(bees)/src/ops/op_list16.c \
@@ -112,6 +112,13 @@
-1 -1;
#X obj 1224 322 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
-1 -1;
#X obj 1112 456 BEES_LINLIN _______;
#X floatatom 1092 389 5 0 0 0 - - -, f 5;
#X floatatom 1137 391 5 0 0 0 - - -, f 5;
#X floatatom 1187 392 5 0 0 0 - - -, f 5;
#X floatatom 1229 391 5 0 0 0 - - -, f 5;
#X floatatom 1272 387 5 0 0 0 - - -, f 5;
#X floatatom 1116 513 5 0 0 0 - - -, f 5;
#X connect 2 0 7 0;
#X connect 2 1 8 0;
#X connect 2 2 9 0;
@@ -222,11 +229,12 @@
#X connect 91 0 89 2;
#X connect 93 0 89 3;
#X connect 94 0 102 0;
#X connect 94 1 103 0;
#X connect 95 0 94 1;
#X connect 96 0 94 2;
#X connect 97 0 94 3;
#X connect 98 0 94 4;
#X connect 99 0 94 4;
#X connect 100 0 94 4;
#X connect 101 0 94 4;
#X connect 104 0 110 0;
#X connect 105 0 104 1;
#X connect 106 0 104 2;
#X connect 107 0 104 3;
#X connect 108 0 104 4;
#X connect 109 0 104 5;

0 comments on commit e1defac

Please sign in to comment.