EmbedEd
/
mbed_theremin
xypad theremin for LPC1768
envlp.cpp@2:c5eeaf1c8e69, 2016-03-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |