xypad theremin for LPC1768

Dependencies:   MODDMA mbed

Committer:
exopiped
Date:
Mon Mar 14 23:43:44 2016 +0000
Revision:
2:c5eeaf1c8e69
Parent:
0:8ee38453bad9
touch screen driver glitches removed; debug statements commented out

Who changed what in which revision?

UserRevisionLine numberNew contents of line
exopiped 0:8ee38453bad9 1 /*
exopiped 0:8ee38453bad9 2 * envlp.c -- manage the note's envelope state machine
exopiped 0:8ee38453bad9 3 */
exopiped 0:8ee38453bad9 4 #include "mbed.h"
exopiped 0:8ee38453bad9 5 #include "debug.h"
exopiped 0:8ee38453bad9 6 #include "touch.h"
exopiped 0:8ee38453bad9 7 #include "jswitch.h"
exopiped 0:8ee38453bad9 8 #include "envlp.h"
exopiped 0:8ee38453bad9 9 /*
exopiped 0:8ee38453bad9 10 * sound envelope follows ADSR pattern
exopiped 0:8ee38453bad9 11 * (Attack, Decay, Sustain, Release)
exopiped 0:8ee38453bad9 12 * three parameters below control the envelope shape
exopiped 0:8ee38453bad9 13 * It should be easy to consider these default values
exopiped 0:8ee38453bad9 14 * and modify the code below to set the variables
exopiped 0:8ee38453bad9 15 * envlp_attack_bufs, envlp_release_bufs,
exopiped 0:8ee38453bad9 16 * and envlp_release_delta dynamically,
exopiped 0:8ee38453bad9 17 * depending upon external inputs
exopiped 0:8ee38453bad9 18 */
exopiped 0:8ee38453bad9 19 #define ATTACK_BUFFERS_MIN 2
exopiped 0:8ee38453bad9 20 #define ATTACK_BUFFERS_MAX 20
exopiped 0:8ee38453bad9 21 #define ATTACK_BUFFERS 5 // attack buffers
exopiped 0:8ee38453bad9 22 #define DECAY_BUFFERS_MIN 1
exopiped 0:8ee38453bad9 23 #define DECAY_BUFFERS_MAX 40
exopiped 0:8ee38453bad9 24 #define DECAY_BUFFERS ATTACK_BUFFERS/2 // decay buffers
exopiped 0:8ee38453bad9 25 #define RELEASE_DELTA_MIN 1
exopiped 0:8ee38453bad9 26 #define RELEASE_DELTA_MAX 128
exopiped 0:8ee38453bad9 27 #define RELEASE_DELTA 8 // inverse release duration param
exopiped 0:8ee38453bad9 28
exopiped 0:8ee38453bad9 29 /*
exopiped 0:8ee38453bad9 30 * local envelope functions
exopiped 0:8ee38453bad9 31 */
exopiped 0:8ee38453bad9 32 static void envlp_set_attack_bufs(void);
exopiped 0:8ee38453bad9 33 static void envlp_set_decay_bufs(void);
exopiped 0:8ee38453bad9 34 static void envlp_set_release_delta(void);
exopiped 0:8ee38453bad9 35
exopiped 0:8ee38453bad9 36 /*
exopiped 0:8ee38453bad9 37 * local envelop veriables
exopiped 0:8ee38453bad9 38 */
exopiped 0:8ee38453bad9 39 static int envlp_attack_bufs;
exopiped 0:8ee38453bad9 40 static int envlp_decay_bufs;
exopiped 0:8ee38453bad9 41 static int envlp_release_delta;
exopiped 0:8ee38453bad9 42
exopiped 0:8ee38453bad9 43 void envlp_init(void)
exopiped 0:8ee38453bad9 44 {
exopiped 0:8ee38453bad9 45 envlp_attack_bufs=ATTACK_BUFFERS;
exopiped 0:8ee38453bad9 46 envlp_decay_bufs=DECAY_BUFFERS;
exopiped 0:8ee38453bad9 47 envlp_release_delta=RELEASE_DELTA;
exopiped 0:8ee38453bad9 48 }
exopiped 0:8ee38453bad9 49
exopiped 0:8ee38453bad9 50 void envlp_update(void)
exopiped 0:8ee38453bad9 51 {
exopiped 0:8ee38453bad9 52 envlp_set_attack_bufs();
exopiped 0:8ee38453bad9 53 envlp_set_decay_bufs();
exopiped 0:8ee38453bad9 54 envlp_set_release_delta();
exopiped 0:8ee38453bad9 55 }
exopiped 0:8ee38453bad9 56
exopiped 0:8ee38453bad9 57 void envlp_set_attack_bufs()
exopiped 0:8ee38453bad9 58 {
exopiped 0:8ee38453bad9 59 unsigned char js_val;
exopiped 0:8ee38453bad9 60
exopiped 0:8ee38453bad9 61 js_val = js_read((JS_UP | JS_DOWN));
exopiped 0:8ee38453bad9 62 if (js_val & JS_UP) {
exopiped 0:8ee38453bad9 63 if (envlp_attack_bufs < ATTACK_BUFFERS_MAX) {
exopiped 0:8ee38453bad9 64 envlp_attack_bufs++;
exopiped 0:8ee38453bad9 65 }
exopiped 0:8ee38453bad9 66 } else if(js_val & JS_DOWN) {
exopiped 0:8ee38453bad9 67 if (envlp_attack_bufs > ATTACK_BUFFERS_MIN) {
exopiped 0:8ee38453bad9 68 envlp_attack_bufs--;
exopiped 0:8ee38453bad9 69 }
exopiped 0:8ee38453bad9 70 }
exopiped 0:8ee38453bad9 71 }
exopiped 0:8ee38453bad9 72
exopiped 0:8ee38453bad9 73 int envlp_get_attack_bufs(void)
exopiped 0:8ee38453bad9 74 {
exopiped 0:8ee38453bad9 75 return envlp_attack_bufs;
exopiped 0:8ee38453bad9 76 }
exopiped 0:8ee38453bad9 77
exopiped 0:8ee38453bad9 78 void envlp_set_decay_bufs(void)
exopiped 0:8ee38453bad9 79 {
exopiped 0:8ee38453bad9 80 if (envlp_attack_bufs>1) {
exopiped 0:8ee38453bad9 81 envlp_decay_bufs = envlp_attack_bufs/2;
exopiped 0:8ee38453bad9 82 } else {
exopiped 0:8ee38453bad9 83 envlp_decay_bufs = 1;
exopiped 0:8ee38453bad9 84 }
exopiped 0:8ee38453bad9 85 }
exopiped 0:8ee38453bad9 86
exopiped 0:8ee38453bad9 87 int envlp_get_decay_bufs(void)
exopiped 0:8ee38453bad9 88 {
exopiped 0:8ee38453bad9 89 return envlp_decay_bufs;
exopiped 0:8ee38453bad9 90 }
exopiped 0:8ee38453bad9 91
exopiped 0:8ee38453bad9 92 void envlp_set_release_delta(void)
exopiped 0:8ee38453bad9 93 {
exopiped 0:8ee38453bad9 94 unsigned char js_val;
exopiped 0:8ee38453bad9 95
exopiped 0:8ee38453bad9 96 js_val = js_read((JS_LEFT | JS_RIGHT));
exopiped 0:8ee38453bad9 97 if (js_val & JS_LEFT) {
exopiped 0:8ee38453bad9 98 if (envlp_release_delta < RELEASE_DELTA_MAX) {
exopiped 0:8ee38453bad9 99 envlp_release_delta++;
exopiped 0:8ee38453bad9 100 }
exopiped 0:8ee38453bad9 101 } else if(js_val & JS_RIGHT) {
exopiped 0:8ee38453bad9 102 if (envlp_release_delta > RELEASE_DELTA_MIN) {
exopiped 0:8ee38453bad9 103 envlp_release_delta--;
exopiped 0:8ee38453bad9 104 }
exopiped 0:8ee38453bad9 105 }
exopiped 0:8ee38453bad9 106 }
exopiped 0:8ee38453bad9 107
exopiped 0:8ee38453bad9 108 int envlp_get_release_delta(void)
exopiped 0:8ee38453bad9 109 {
exopiped 0:8ee38453bad9 110 return envlp_release_delta;
exopiped 0:8ee38453bad9 111 }