-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathenvelope.cpp
More file actions
418 lines (399 loc) · 28.7 KB
/
envelope.cpp
File metadata and controls
418 lines (399 loc) · 28.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
//
// envelope.cpp
//
#include "envelope.h"
const float CEnvelope::expLUT[2048] = {
0.00000000, 0.00198859, 0.00397330, 0.00595414, 0.00793111, 0.00990422, 0.01187348, 0.01383890,
0.01580047, 0.01775822, 0.01971215, 0.02166226, 0.02360857, 0.02555107, 0.02748979, 0.02942471,
0.03135587, 0.03328324, 0.03520687, 0.03712673, 0.03904285, 0.04095522, 0.04286386, 0.04476878,
0.04666997, 0.04856746, 0.05046124, 0.05235133, 0.05423772, 0.05612043, 0.05799947, 0.05987484,
0.06174655, 0.06361460, 0.06547901, 0.06733978, 0.06919691, 0.07105042, 0.07290031, 0.07474659,
0.07658926, 0.07842834, 0.08026383, 0.08209573, 0.08392406, 0.08574882, 0.08757002, 0.08938766,
0.09120176, 0.09301231, 0.09481933, 0.09662282, 0.09842279, 0.10021924, 0.10201219, 0.10380164,
0.10558759, 0.10737006, 0.10914905, 0.11092456, 0.11269662, 0.11446521, 0.11623035, 0.11799204,
0.11975029, 0.12150511, 0.12325650, 0.12500449, 0.12674904, 0.12849019, 0.13022795, 0.13196233,
0.13369331, 0.13542090, 0.13714513, 0.13886599, 0.14058350, 0.14229766, 0.14400846, 0.14571592,
0.14742005, 0.14912085, 0.15081835, 0.15251251, 0.15420337, 0.15589094, 0.15757520, 0.15925619,
0.16093388, 0.16260831, 0.16427946, 0.16594735, 0.16761199, 0.16927338, 0.17093152, 0.17258643,
0.17423810, 0.17588654, 0.17753178, 0.17917380, 0.18081261, 0.18244824, 0.18408066, 0.18570989,
0.18733595, 0.18895884, 0.19057855, 0.19219510, 0.19380850, 0.19541875, 0.19702584, 0.19862981,
0.20023064, 0.20182835, 0.20342293, 0.20501442, 0.20660278, 0.20818806, 0.20977023, 0.21134932,
0.21292531, 0.21449825, 0.21606810, 0.21763490, 0.21919863, 0.22075930, 0.22231695, 0.22387153,
0.22542310, 0.22697163, 0.22851713, 0.23005962, 0.23159909, 0.23313557, 0.23466904, 0.23619953,
0.23772702, 0.23925152, 0.24077305, 0.24229161, 0.24380721, 0.24531986, 0.24682954, 0.24833629,
0.24984008, 0.25134096, 0.25283888, 0.25433388, 0.25582597, 0.25731516, 0.25880143, 0.26028478,
0.26176527, 0.26324284, 0.26471755, 0.26618937, 0.26765832, 0.26912439, 0.27058762, 0.27204797,
0.27350548, 0.27496013, 0.27641198, 0.27786097, 0.27930713, 0.28075045, 0.28219098, 0.28362870,
0.28506359, 0.28649569, 0.28792500, 0.28935152, 0.29077524, 0.29219618, 0.29361436, 0.29502976,
0.29644242, 0.29785231, 0.29925945, 0.30066383, 0.30206546, 0.30346438, 0.30486056, 0.30625403,
0.30764475, 0.30903277, 0.31041807, 0.31180069, 0.31318060, 0.31455779, 0.31593233, 0.31730416,
0.31867331, 0.32003981, 0.32140362, 0.32276478, 0.32412329, 0.32547915, 0.32683235, 0.32818291,
0.32953084, 0.33087611, 0.33221880, 0.33355883, 0.33489627, 0.33623108, 0.33756331, 0.33889291,
0.34021991, 0.34154436, 0.34286618, 0.34418544, 0.34550214, 0.34681624, 0.34812781, 0.34943679,
0.35074323, 0.35204712, 0.35334843, 0.35464725, 0.35594350, 0.35723722, 0.35852844, 0.35981712,
0.36110330, 0.36238694, 0.36366811, 0.36494675, 0.36622292, 0.36749658, 0.36876774, 0.37003645,
0.37130266, 0.37256640, 0.37382770, 0.37508652, 0.37634286, 0.37759677, 0.37884822, 0.38009724,
0.38134384, 0.38258797, 0.38382968, 0.38506898, 0.38630587, 0.38754031, 0.38877237, 0.39000201,
0.39122924, 0.39245409, 0.39367655, 0.39489663, 0.39611432, 0.39732963, 0.39854255, 0.39975312,
0.40096134, 0.40216717, 0.40337068, 0.40457183, 0.40577063, 0.40696707, 0.40816119, 0.40935299,
0.41054246, 0.41172960, 0.41291443, 0.41409695, 0.41527715, 0.41645506, 0.41763067, 0.41880396,
0.41997498, 0.42114371, 0.42231017, 0.42347434, 0.42463624, 0.42579585, 0.42695323, 0.42810833,
0.42926121, 0.43041179, 0.43156016, 0.43270627, 0.43385014, 0.43499178, 0.43613121, 0.43726841,
0.43840337, 0.43953612, 0.44066668, 0.44179499, 0.44292113, 0.44404507, 0.44516680, 0.44628635,
0.44740373, 0.44851890, 0.44963193, 0.45074275, 0.45185143, 0.45295793, 0.45406225, 0.45516446,
0.45626450, 0.45736238, 0.45845813, 0.45955172, 0.46064320, 0.46173254, 0.46281976, 0.46390483,
0.46498781, 0.46606866, 0.46714741, 0.46822405, 0.46929860, 0.47037104, 0.47144139, 0.47250965,
0.47357583, 0.47463992, 0.47570193, 0.47676188, 0.47781974, 0.47887555, 0.47992930, 0.48098099,
0.48203063, 0.48307821, 0.48412374, 0.48516726, 0.48620871, 0.48724815, 0.48828554, 0.48932093,
0.49035427, 0.49138561, 0.49241495, 0.49344227, 0.49446756, 0.49549088, 0.49651217, 0.49753150,
0.49854884, 0.49956417, 0.50057751, 0.50158888, 0.50259835, 0.50360572, 0.50461119, 0.50561470,
0.50661629, 0.50761586, 0.50861353, 0.50960922, 0.51060295, 0.51159477, 0.51258463, 0.51357257,
0.51455855, 0.51554269, 0.51652485, 0.51750511, 0.51848340, 0.51945984, 0.52043438, 0.52140701,
0.52237767, 0.52334654, 0.52431345, 0.52527851, 0.52624166, 0.52720296, 0.52816236, 0.52911985,
0.53007555, 0.53102934, 0.53198129, 0.53293133, 0.53387958, 0.53482592, 0.53577048, 0.53671312,
0.53765398, 0.53859293, 0.53953016, 0.54046547, 0.54139900, 0.54233068, 0.54326051, 0.54418862,
0.54511482, 0.54603928, 0.54696190, 0.54788274, 0.54880178, 0.54971904, 0.55063444, 0.55154812,
0.55246001, 0.55337012, 0.55427843, 0.55518496, 0.55608976, 0.55699277, 0.55789399, 0.55879349,
0.55969125, 0.56058723, 0.56148142, 0.56237394, 0.56326467, 0.56415367, 0.56504095, 0.56592649,
0.56681031, 0.56769234, 0.56857270, 0.56945139, 0.57032830, 0.57120353, 0.57207704, 0.57294881,
0.57381892, 0.57468730, 0.57555401, 0.57641906, 0.57728237, 0.57814401, 0.57900393, 0.57986224,
0.58071882, 0.58157378, 0.58242702, 0.58327866, 0.58412856, 0.58497685, 0.58582348, 0.58666843,
0.58751172, 0.58835340, 0.58919346, 0.59003180, 0.59086859, 0.59170371, 0.59253716, 0.59336901,
0.59419930, 0.59502786, 0.59585488, 0.59668028, 0.59750402, 0.59832621, 0.59914678, 0.59996569,
0.60078305, 0.60159886, 0.60241300, 0.60322559, 0.60403657, 0.60484600, 0.60565382, 0.60646009,
0.60726476, 0.60806787, 0.60886943, 0.60966939, 0.61046779, 0.61126465, 0.61205995, 0.61285371,
0.61364591, 0.61443657, 0.61522567, 0.61601323, 0.61679924, 0.61758375, 0.61836672, 0.61914814,
0.61992806, 0.62070644, 0.62148333, 0.62225866, 0.62303251, 0.62380481, 0.62457567, 0.62534499,
0.62611276, 0.62687910, 0.62764394, 0.62840724, 0.62916905, 0.62992942, 0.63068831, 0.63144565,
0.63220155, 0.63295603, 0.63370895, 0.63446045, 0.63521045, 0.63595903, 0.63670611, 0.63745177,
0.63819593, 0.63893867, 0.63967991, 0.64041972, 0.64115810, 0.64189506, 0.64263058, 0.64336467,
0.64409727, 0.64482850, 0.64555830, 0.64628661, 0.64701355, 0.64773905, 0.64846319, 0.64918584,
0.64990711, 0.65062696, 0.65134543, 0.65206248, 0.65277815, 0.65349239, 0.65420526, 0.65491676,
0.65562683, 0.65633553, 0.65704286, 0.65774876, 0.65845335, 0.65915650, 0.65985835, 0.66055876,
0.66125780, 0.66195554, 0.66265190, 0.66334683, 0.66404051, 0.66473275, 0.66542369, 0.66611326,
0.66680145, 0.66748834, 0.66817391, 0.66885811, 0.66954100, 0.67022252, 0.67090273, 0.67158157,
0.67225915, 0.67293537, 0.67361027, 0.67428386, 0.67495614, 0.67562711, 0.67629677, 0.67696512,
0.67763215, 0.67829788, 0.67896235, 0.67962545, 0.68028730, 0.68094790, 0.68160713, 0.68226510,
0.68292183, 0.68357724, 0.68423134, 0.68488425, 0.68553579, 0.68618613, 0.68683517, 0.68748295,
0.68812943, 0.68877470, 0.68941867, 0.69006139, 0.69070286, 0.69134313, 0.69198209, 0.69261980,
0.69325626, 0.69389153, 0.69452554, 0.69515830, 0.69578981, 0.69642007, 0.69704914, 0.69767702,
0.69830358, 0.69892901, 0.69955313, 0.70017612, 0.70079786, 0.70141834, 0.70203763, 0.70265573,
0.70327264, 0.70388830, 0.70450282, 0.70511609, 0.70572817, 0.70633906, 0.70694876, 0.70755726,
0.70816457, 0.70877075, 0.70937568, 0.70997947, 0.71058202, 0.71118343, 0.71178371, 0.71238279,
0.71298069, 0.71357739, 0.71417296, 0.71476740, 0.71536064, 0.71595269, 0.71654361, 0.71713340,
0.71772206, 0.71830952, 0.71889585, 0.71948105, 0.72006506, 0.72064799, 0.72122973, 0.72181040,
0.72238988, 0.72296822, 0.72354549, 0.72412157, 0.72469658, 0.72527045, 0.72584319, 0.72641480,
0.72698528, 0.72755468, 0.72812301, 0.72869015, 0.72925621, 0.72982121, 0.73038507, 0.73094779,
0.73150945, 0.73207003, 0.73262948, 0.73318785, 0.73374516, 0.73430133, 0.73485643, 0.73541045,
0.73596340, 0.73651528, 0.73706609, 0.73761582, 0.73816442, 0.73871201, 0.73925853, 0.73980397,
0.74034834, 0.74089164, 0.74143386, 0.74197507, 0.74251521, 0.74305427, 0.74359226, 0.74412924,
0.74466521, 0.74520004, 0.74573392, 0.74626672, 0.74679846, 0.74732918, 0.74785882, 0.74838752,
0.74891508, 0.74944168, 0.74996722, 0.75049174, 0.75101525, 0.75153774, 0.75205922, 0.75257969,
0.75309908, 0.75361753, 0.75413489, 0.75465131, 0.75516671, 0.75568110, 0.75619447, 0.75670683,
0.75721818, 0.75772858, 0.75823796, 0.75874633, 0.75925374, 0.75976014, 0.76026553, 0.76076996,
0.76127338, 0.76177585, 0.76227731, 0.76277781, 0.76327735, 0.76377589, 0.76427346, 0.76477009,
0.76526570, 0.76576036, 0.76625407, 0.76674682, 0.76723856, 0.76772940, 0.76821923, 0.76870811,
0.76919609, 0.76968306, 0.77016908, 0.77065420, 0.77113831, 0.77162153, 0.77210379, 0.77258509,
0.77306551, 0.77354491, 0.77402341, 0.77450097, 0.77497762, 0.77545333, 0.77592808, 0.77640194,
0.77687490, 0.77734691, 0.77781796, 0.77828813, 0.77875733, 0.77922571, 0.77969313, 0.78015959,
0.78062516, 0.78108984, 0.78155363, 0.78201652, 0.78247845, 0.78293955, 0.78339970, 0.78385895,
0.78431731, 0.78477478, 0.78523135, 0.78568709, 0.78614187, 0.78659576, 0.78704882, 0.78750092,
0.78795218, 0.78840256, 0.78885204, 0.78930068, 0.78974843, 0.79019529, 0.79064131, 0.79108644,
0.79153067, 0.79197407, 0.79241657, 0.79285824, 0.79329908, 0.79373896, 0.79417807, 0.79461628,
0.79505366, 0.79549015, 0.79592586, 0.79636061, 0.79679459, 0.79722774, 0.79765999, 0.79809141,
0.79852200, 0.79895175, 0.79938066, 0.79980868, 0.80023593, 0.80066234, 0.80108792, 0.80151260,
0.80193651, 0.80235958, 0.80278188, 0.80320328, 0.80362386, 0.80404365, 0.80446261, 0.80488080,
0.80529809, 0.80571461, 0.80613029, 0.80654520, 0.80695927, 0.80737257, 0.80778503, 0.80819666,
0.80860752, 0.80901760, 0.80942684, 0.80983531, 0.81024295, 0.81064981, 0.81105590, 0.81146115,
0.81186563, 0.81226933, 0.81267226, 0.81307435, 0.81347567, 0.81387621, 0.81427598, 0.81467497,
0.81507319, 0.81547064, 0.81586730, 0.81626314, 0.81665826, 0.81705260, 0.81744617, 0.81783897,
0.81823099, 0.81862229, 0.81901276, 0.81940252, 0.81979150, 0.82017970, 0.82056719, 0.82095391,
0.82133985, 0.82172501, 0.82210946, 0.82249320, 0.82287610, 0.82325834, 0.82363975, 0.82402050,
0.82440042, 0.82477969, 0.82515812, 0.82553589, 0.82591289, 0.82628918, 0.82666469, 0.82703948,
0.82741356, 0.82778692, 0.82815951, 0.82853138, 0.82890254, 0.82927299, 0.82964271, 0.83001173,
0.83037996, 0.83074754, 0.83111435, 0.83148044, 0.83184588, 0.83221054, 0.83257455, 0.83293778,
0.83330035, 0.83366221, 0.83402336, 0.83438379, 0.83474350, 0.83510256, 0.83546090, 0.83581853,
0.83617544, 0.83653170, 0.83688724, 0.83724207, 0.83759624, 0.83794969, 0.83830243, 0.83865452,
0.83900595, 0.83935666, 0.83970666, 0.84005600, 0.84040469, 0.84075266, 0.84109998, 0.84144658,
0.84179252, 0.84213781, 0.84248239, 0.84282631, 0.84316957, 0.84351212, 0.84385407, 0.84419531,
0.84453589, 0.84487581, 0.84521508, 0.84555364, 0.84589159, 0.84622884, 0.84656543, 0.84690142,
0.84723669, 0.84757131, 0.84790534, 0.84823865, 0.84857136, 0.84890342, 0.84923476, 0.84956551,
0.84989560, 0.85022509, 0.85055387, 0.85088205, 0.85120958, 0.85153645, 0.85186273, 0.85218829,
0.85251331, 0.85283762, 0.85316133, 0.85348439, 0.85380685, 0.85412866, 0.85444987, 0.85477042,
0.85509038, 0.85540968, 0.85572839, 0.85604644, 0.85636389, 0.85668069, 0.85699689, 0.85731250,
0.85762745, 0.85794181, 0.85825557, 0.85856873, 0.85888124, 0.85919315, 0.85950446, 0.85981512,
0.86012524, 0.86043471, 0.86074358, 0.86105186, 0.86135954, 0.86166662, 0.86197305, 0.86227894,
0.86258423, 0.86288887, 0.86319298, 0.86349648, 0.86379939, 0.86410171, 0.86440343, 0.86470455,
0.86500508, 0.86530507, 0.86560440, 0.86590320, 0.86620140, 0.86649901, 0.86679608, 0.86709249,
0.86738837, 0.86768371, 0.86797839, 0.86827260, 0.86856616, 0.86885917, 0.86915159, 0.86944348,
0.86973476, 0.87002546, 0.87031561, 0.87060523, 0.87089425, 0.87118268, 0.87147057, 0.87175792,
0.87204468, 0.87233090, 0.87261653, 0.87290168, 0.87318617, 0.87347019, 0.87375361, 0.87403649,
0.87431884, 0.87460059, 0.87488180, 0.87516248, 0.87544262, 0.87572217, 0.87600124, 0.87627971,
0.87655765, 0.87683505, 0.87711191, 0.87738824, 0.87766403, 0.87793928, 0.87821400, 0.87848812,
0.87876177, 0.87903488, 0.87930745, 0.87957948, 0.87985098, 0.88012195, 0.88039237, 0.88066232,
0.88093174, 0.88120055, 0.88146889, 0.88173676, 0.88200402, 0.88227081, 0.88253707, 0.88280278,
0.88306797, 0.88333267, 0.88359684, 0.88386053, 0.88412368, 0.88438630, 0.88464838, 0.88491005,
0.88517112, 0.88543171, 0.88569176, 0.88595134, 0.88621044, 0.88646901, 0.88672704, 0.88698459,
0.88724166, 0.88749820, 0.88775420, 0.88800979, 0.88826483, 0.88851935, 0.88877344, 0.88902700,
0.88928002, 0.88953263, 0.88978469, 0.89003623, 0.89028734, 0.89053792, 0.89078808, 0.89103770,
0.89128679, 0.89153546, 0.89178365, 0.89203131, 0.89227849, 0.89252520, 0.89277142, 0.89301717,
0.89326245, 0.89350724, 0.89375156, 0.89399540, 0.89423877, 0.89448166, 0.89472407, 0.89496601,
0.89520746, 0.89544845, 0.89568901, 0.89592904, 0.89616865, 0.89640778, 0.89664644, 0.89688462,
0.89712232, 0.89735955, 0.89759636, 0.89783269, 0.89806855, 0.89830399, 0.89853895, 0.89877343,
0.89900744, 0.89924103, 0.89947414, 0.89970684, 0.89993906, 0.90017080, 0.90040213, 0.90063298,
0.90086335, 0.90109330, 0.90132284, 0.90155190, 0.90178049, 0.90200865, 0.90223634, 0.90246361,
0.90269047, 0.90291685, 0.90314281, 0.90336829, 0.90359336, 0.90381801, 0.90404218, 0.90426594,
0.90448922, 0.90471214, 0.90493459, 0.90515655, 0.90537816, 0.90559930, 0.90582001, 0.90604025,
0.90626013, 0.90647954, 0.90669852, 0.90691710, 0.90713525, 0.90735292, 0.90757024, 0.90778708,
0.90800351, 0.90821952, 0.90843511, 0.90865028, 0.90886503, 0.90907937, 0.90929329, 0.90950680,
0.90971988, 0.90993255, 0.91014481, 0.91035664, 0.91056806, 0.91077906, 0.91098964, 0.91119981,
0.91140962, 0.91161901, 0.91182792, 0.91203648, 0.91224462, 0.91245234, 0.91265970, 0.91286659,
0.91307312, 0.91327924, 0.91348499, 0.91369027, 0.91389519, 0.91409969, 0.91430384, 0.91450757,
0.91471088, 0.91491377, 0.91511631, 0.91531843, 0.91552019, 0.91572154, 0.91592246, 0.91612303,
0.91632318, 0.91652298, 0.91672236, 0.91692132, 0.91711992, 0.91731817, 0.91751599, 0.91771346,
0.91791052, 0.91810715, 0.91830349, 0.91849935, 0.91869491, 0.91889006, 0.91908479, 0.91927922,
0.91947317, 0.91966683, 0.91986006, 0.92005295, 0.92024541, 0.92043751, 0.92062926, 0.92082065,
0.92101163, 0.92120224, 0.92139250, 0.92158240, 0.92177188, 0.92196101, 0.92214978, 0.92233819,
0.92252624, 0.92271388, 0.92290121, 0.92308813, 0.92327470, 0.92346090, 0.92364675, 0.92383224,
0.92401731, 0.92420208, 0.92438650, 0.92457050, 0.92475420, 0.92493749, 0.92512047, 0.92530304,
0.92548531, 0.92566717, 0.92584872, 0.92602992, 0.92621070, 0.92639118, 0.92657131, 0.92675108,
0.92693049, 0.92710954, 0.92728829, 0.92746663, 0.92764467, 0.92782235, 0.92799968, 0.92817664,
0.92835331, 0.92852956, 0.92870551, 0.92888111, 0.92905641, 0.92923129, 0.92940587, 0.92958009,
0.92975402, 0.92992753, 0.93010074, 0.93027365, 0.93044621, 0.93061841, 0.93079025, 0.93096179,
0.93113297, 0.93130386, 0.93147439, 0.93164456, 0.93181443, 0.93198395, 0.93215317, 0.93232203,
0.93249059, 0.93265879, 0.93282670, 0.93299425, 0.93316144, 0.93332839, 0.93349493, 0.93366122,
0.93382710, 0.93399274, 0.93415803, 0.93432295, 0.93448758, 0.93465191, 0.93481588, 0.93497956,
0.93514293, 0.93530595, 0.93546867, 0.93563110, 0.93579316, 0.93595493, 0.93611640, 0.93627751,
0.93643832, 0.93659884, 0.93675905, 0.93691891, 0.93707848, 0.93723774, 0.93739671, 0.93755531,
0.93771362, 0.93787163, 0.93802935, 0.93818676, 0.93834382, 0.93850064, 0.93865710, 0.93881327,
0.93896914, 0.93912470, 0.93927997, 0.93943495, 0.93958962, 0.93974394, 0.93989801, 0.94005173,
0.94020522, 0.94035834, 0.94051123, 0.94066375, 0.94081604, 0.94096798, 0.94111967, 0.94127101,
0.94142210, 0.94157284, 0.94172335, 0.94187355, 0.94202346, 0.94217300, 0.94232231, 0.94247139,
0.94262010, 0.94276851, 0.94291669, 0.94306451, 0.94321209, 0.94335938, 0.94350636, 0.94365311,
0.94379950, 0.94394565, 0.94409150, 0.94423705, 0.94438237, 0.94452733, 0.94467205, 0.94481647,
0.94496065, 0.94510448, 0.94524807, 0.94539142, 0.94553441, 0.94567716, 0.94581962, 0.94596183,
0.94610375, 0.94624537, 0.94638675, 0.94652784, 0.94666862, 0.94680917, 0.94694942, 0.94708943,
0.94722915, 0.94736856, 0.94750774, 0.94764662, 0.94778526, 0.94792360, 0.94806170, 0.94819951,
0.94833708, 0.94847435, 0.94861138, 0.94874811, 0.94888455, 0.94902080, 0.94915670, 0.94929242,
0.94942778, 0.94956297, 0.94969785, 0.94983244, 0.94996685, 0.95010090, 0.95023477, 0.95036834,
0.95050162, 0.95063466, 0.95076746, 0.95090002, 0.95103228, 0.95116431, 0.95129603, 0.95142758,
0.95155883, 0.95168978, 0.95182049, 0.95195103, 0.95208120, 0.95221120, 0.95234090, 0.95247036,
0.95259959, 0.95272851, 0.95285726, 0.95298570, 0.95311391, 0.95324183, 0.95336956, 0.95349699,
0.95362419, 0.95375115, 0.95387787, 0.95400435, 0.95413053, 0.95425653, 0.95438224, 0.95450771,
0.95463294, 0.95475793, 0.95488268, 0.95500714, 0.95513141, 0.95525545, 0.95537919, 0.95550275,
0.95562601, 0.95574909, 0.95587188, 0.95599443, 0.95611680, 0.95623887, 0.95636070, 0.95648235,
0.95660371, 0.95672482, 0.95684576, 0.95696640, 0.95708686, 0.95720702, 0.95732701, 0.95744675,
0.95756620, 0.95768547, 0.95780450, 0.95792329, 0.95804185, 0.95816022, 0.95827830, 0.95839620,
0.95851380, 0.95863122, 0.95874840, 0.95886534, 0.95898211, 0.95909858, 0.95921487, 0.95933092,
0.95944673, 0.95956230, 0.95967764, 0.95979279, 0.95990771, 0.96002239, 0.96013689, 0.96025109,
0.96036512, 0.96047890, 0.96059251, 0.96070588, 0.96081901, 0.96093190, 0.96104461, 0.96115702,
0.96126932, 0.96138132, 0.96149313, 0.96160471, 0.96171612, 0.96182728, 0.96193820, 0.96204895,
0.96215945, 0.96226972, 0.96237981, 0.96248966, 0.96259934, 0.96270877, 0.96281797, 0.96292698,
0.96303582, 0.96314436, 0.96325272, 0.96336091, 0.96346885, 0.96357661, 0.96368414, 0.96379143,
0.96389854, 0.96400547, 0.96411216, 0.96421862, 0.96432489, 0.96443093, 0.96453685, 0.96464247,
0.96474791, 0.96485317, 0.96495819, 0.96506304, 0.96516764, 0.96527207, 0.96537626, 0.96548033,
0.96558410, 0.96568769, 0.96579111, 0.96589434, 0.96599734, 0.96610016, 0.96620274, 0.96630514,
0.96640736, 0.96650934, 0.96661115, 0.96671271, 0.96681416, 0.96691537, 0.96701634, 0.96711719,
0.96721780, 0.96731818, 0.96741843, 0.96751845, 0.96761829, 0.96771795, 0.96781737, 0.96791661,
0.96801567, 0.96811455, 0.96821320, 0.96831167, 0.96840996, 0.96850806, 0.96860594, 0.96870369,
0.96880120, 0.96889848, 0.96899563, 0.96909261, 0.96918935, 0.96928591, 0.96938229, 0.96947849,
0.96957451, 0.96967030, 0.96976596, 0.96986139, 0.96995664, 0.97005171, 0.97014660, 0.97024131,
0.97033584, 0.97043014, 0.97052431, 0.97061825, 0.97071207, 0.97080564, 0.97089905, 0.97099227,
0.97108537, 0.97117823, 0.97127092, 0.97136343, 0.97145575, 0.97154790, 0.97163987, 0.97173166,
0.97182322, 0.97191465, 0.97200590, 0.97209698, 0.97218788, 0.97227859, 0.97236913, 0.97245950,
0.97254968, 0.97263968, 0.97272950, 0.97281921, 0.97290868, 0.97299796, 0.97308713, 0.97317606,
0.97326487, 0.97335351, 0.97344190, 0.97353017, 0.97361827, 0.97370619, 0.97379398, 0.97388154,
0.97396898, 0.97405618, 0.97414327, 0.97423017, 0.97431690, 0.97440344, 0.97448987, 0.97457606,
0.97466213, 0.97474802, 0.97483373, 0.97491926, 0.97500467, 0.97508985, 0.97517490, 0.97525984,
0.97534454, 0.97542906, 0.97551346, 0.97559768, 0.97568178, 0.97576565, 0.97584939, 0.97593296,
0.97601634, 0.97609961, 0.97618270, 0.97626561, 0.97634834, 0.97643095, 0.97651339, 0.97659564,
0.97667778, 0.97675973, 0.97684151, 0.97692317, 0.97700459, 0.97708595, 0.97716707, 0.97724807,
0.97732890, 0.97740960, 0.97749013, 0.97757047, 0.97765070, 0.97773075, 0.97781062, 0.97789037,
0.97796994, 0.97804940, 0.97812867, 0.97820777, 0.97828674, 0.97836554, 0.97844422, 0.97852272,
0.97860110, 0.97867924, 0.97875732, 0.97883523, 0.97891295, 0.97899055, 0.97906798, 0.97914523,
0.97922242, 0.97929937, 0.97937620, 0.97945291, 0.97952944, 0.97960579, 0.97968203, 0.97975814,
0.97983408, 0.97990984, 0.97998548, 0.98006099, 0.98013633, 0.98021156, 0.98028660, 0.98036152,
0.98043627, 0.98051089, 0.98058534, 0.98065966, 0.98073387, 0.98080790, 0.98088175, 0.98095548,
0.98102909, 0.98110259, 0.98117590, 0.98124903, 0.98132205, 0.98139495, 0.98146772, 0.98154032,
0.98161274, 0.98168510, 0.98175728, 0.98182929, 0.98190117, 0.98197293, 0.98204458, 0.98211604,
0.98218739, 0.98225856, 0.98232961, 0.98240054, 0.98247129, 0.98254198, 0.98261243, 0.98268282,
0.98275304, 0.98282313, 0.98289311, 0.98296291, 0.98303258, 0.98310214, 0.98317158, 0.98324084,
0.98330998, 0.98337895, 0.98344785, 0.98351657, 0.98358518, 0.98365366, 0.98372197, 0.98379016,
0.98385823, 0.98392618, 0.98399401, 0.98406166, 0.98412919, 0.98419660, 0.98426384, 0.98433101,
0.98439801, 0.98446488, 0.98453164, 0.98459828, 0.98466474, 0.98473114, 0.98479736, 0.98486346,
0.98492944, 0.98499525, 0.98506099, 0.98512655, 0.98519200, 0.98525733, 0.98532254, 0.98538762,
0.98545259, 0.98551738, 0.98558211, 0.98564667, 0.98571110, 0.98577541, 0.98583961, 0.98590368,
0.98596764, 0.98603141, 0.98609513, 0.98615867, 0.98622215, 0.98628545, 0.98634863, 0.98641169,
0.98647469, 0.98653752, 0.98660022, 0.98666281, 0.98672521, 0.98678756, 0.98684978, 0.98691189,
0.98697388, 0.98703569, 0.98709744, 0.98715907, 0.98722053, 0.98728192, 0.98734313, 0.98740429,
0.98746532, 0.98752618, 0.98758698, 0.98764759, 0.98770815, 0.98776859, 0.98782885, 0.98788905,
0.98794913, 0.98800910, 0.98806888, 0.98812860, 0.98818821, 0.98824769, 0.98830706, 0.98836631,
0.98842543, 0.98848444, 0.98854339, 0.98860216, 0.98866081, 0.98871940, 0.98877782, 0.98883617,
0.98889434, 0.98895246, 0.98901045, 0.98906833, 0.98912609, 0.98918372, 0.98924130, 0.98929870,
0.98935604, 0.98941320, 0.98947030, 0.98952729, 0.98958415, 0.98964089, 0.98969758, 0.98975408,
0.98981053, 0.98986685, 0.98992306, 0.98997915, 0.99003512, 0.99009097, 0.99014676, 0.99020243,
0.99025798, 0.99031341, 0.99036872, 0.99042398, 0.99047905, 0.99053407, 0.99058896, 0.99064380,
0.99069846, 0.99075305, 0.99080753, 0.99086189, 0.99091613, 0.99097031, 0.99102437, 0.99107832,
0.99113214, 0.99118590, 0.99123949, 0.99129301, 0.99134648, 0.99139977, 0.99145299, 0.99150610,
0.99155909, 0.99161202, 0.99166477, 0.99171746, 0.99177009, 0.99182254, 0.99187493, 0.99192721,
0.99197942, 0.99203151, 0.99208349, 0.99213535, 0.99218714, 0.99223882, 0.99229038, 0.99234188,
0.99239320, 0.99244452, 0.99249566, 0.99254674, 0.99259770, 0.99264860, 0.99269933, 0.99275005,
0.99280059, 0.99285108, 0.99290144, 0.99295175, 0.99300194, 0.99305201, 0.99310201, 0.99315190,
0.99320167, 0.99325138, 0.99330097, 0.99335045, 0.99339986, 0.99344915, 0.99349838, 0.99354750,
0.99359649, 0.99364543, 0.99369425, 0.99374300, 0.99379164, 0.99384016, 0.99388862, 0.99393696,
0.99398524, 0.99403340, 0.99408150, 0.99412942, 0.99417734, 0.99422514, 0.99427283, 0.99432039,
0.99436790, 0.99441534, 0.99446267, 0.99450988, 0.99455702, 0.99460411, 0.99465102, 0.99469793,
0.99474466, 0.99479139, 0.99483794, 0.99488443, 0.99493086, 0.99497718, 0.99502343, 0.99506956,
0.99511558, 0.99516153, 0.99520743, 0.99525321, 0.99529886, 0.99534446, 0.99539000, 0.99543542,
0.99548078, 0.99552602, 0.99557114, 0.99561620, 0.99566120, 0.99570608, 0.99575090, 0.99579561,
0.99584025, 0.99588478, 0.99592924, 0.99597359, 0.99601787, 0.99606210, 0.99610621, 0.99615026,
0.99619418, 0.99623799, 0.99628180, 0.99632549, 0.99636906, 0.99641258, 0.99645597, 0.99649936,
0.99654257, 0.99658579, 0.99662888, 0.99667186, 0.99671477, 0.99675763, 0.99680036, 0.99684304,
0.99688560, 0.99692810, 0.99697053, 0.99701285, 0.99705511, 0.99709731, 0.99713939, 0.99718142,
0.99722332, 0.99726516, 0.99730694, 0.99734861, 0.99739021, 0.99743170, 0.99747318, 0.99751449,
0.99755579, 0.99759698, 0.99763811, 0.99767911, 0.99772006, 0.99776095, 0.99780172, 0.99784243,
0.99788308, 0.99792367, 0.99796414, 0.99800450, 0.99804485, 0.99808508, 0.99812526, 0.99816531,
0.99820530, 0.99824524, 0.99828511, 0.99832487, 0.99836457, 0.99840420, 0.99844372, 0.99848318,
0.99852258, 0.99856186, 0.99860108, 0.99864024, 0.99867934, 0.99871832, 0.99875724, 0.99879611,
0.99883485, 0.99887359, 0.99891222, 0.99895072, 0.99898922, 0.99902761, 0.99906594, 0.99910414,
0.99914235, 0.99918044, 0.99921846, 0.99925643, 0.99929428, 0.99933207, 0.99936980, 0.99940747,
0.99944502, 0.99948257, 0.99952000, 0.99955732, 0.99959463, 0.99963182, 0.99966896, 0.99970603,
0.99974304, 0.99977994, 0.99981683, 0.99985361, 0.99989033, 0.99992692, 0.99996352, 1.00000000
};
CEnvelope::CEnvelope(unsigned sampleRate)
: m_sampleRate((float)sampleRate),
m_state(State::Idle),
m_attackTime(1.5f),
m_decayTime(0.5f),
m_sustainLevel(0.7f),
m_releaseTime(0.5f),
m_level(0.0f),
m_phase(0.0f),
m_phaseInc(0.0f)
{
}
void CEnvelope::NoteOn(void)
{
m_state = State::Attack;
}
void CEnvelope::NoteOff(void)
{
m_state = State::Release;
m_levelOff = m_level;
m_phase = 0.0f;
}
void CEnvelope::NoteSlowKill(void)
{
m_state = State::Kill;
m_levelOff = m_level;
m_phase = 0.0f;
}
void CEnvelope::NoteReset(void)
{
m_state = State::Idle;
m_phase = 0.0f;
m_level = 0.0f;
m_levelOff = 0.0f;
}
void CEnvelope::SetAttack(float ms) // 1.5ms < attack time < 7400ms
{
m_attackTime = ms * 0.001f;
if (m_attackTime < 0.0015f)
m_attackTime = 0.0015f;
if (m_attackTime > 7.4f)
m_attackTime = 7.4f;
}
void CEnvelope::SetDecay(float ms) // 0.5ms < decay time < 11000ms
{
m_decayTime = ms * 0.001f;
if (m_decayTime < 0.0005f)
m_decayTime = 0.0005f;
if (m_decayTime > 11.0f)
m_decayTime = 11.0f;
}
void CEnvelope::SetSustain(float s) // 0.0f < sustain level < 1.0f
{
m_sustainLevel = s;
if (m_sustainLevel < 0.0f)
m_sustainLevel = 0.0f;
if (m_sustainLevel > 1.0f)
m_sustainLevel = 1.0f;
}
void CEnvelope::SetRelease(float ms) // 0.5ms < release time < 11000ms
{
m_releaseTime = ms * 0.001f;
if (m_releaseTime < 0.0005f)
m_releaseTime = 0.0005f;
if (m_releaseTime > 11.0f)
m_releaseTime = 11.0f;
}
float CEnvelope::Process(void)
{
const unsigned LUT_SIZE = 2048;
switch (m_state)
{
case State::Idle:
return 0.0f;
case State::Attack:
if (m_phase < 1.0f)
{
m_level = expLUT[(unsigned)(m_phase * (LUT_SIZE - 1))];
m_phase += 1.0f / (m_attackTime * m_sampleRate);
}
else
{
m_phase = 0.0f;
m_level = 1.0f;
m_state = State::Decay;
}
break;
case State::Decay:
if (m_phase < 1.0f)
{
float env = 1.0f - expLUT[(unsigned)(m_phase * (LUT_SIZE - 1))];
m_level = m_sustainLevel + env * (1.0f - m_sustainLevel);
m_phase += 1.0f / (m_decayTime * m_sampleRate);
}
else
{
m_phase = 0.0f;
m_level = m_sustainLevel;
m_state = State::Sustain;
}
break;
case State::Sustain:
m_level = m_sustainLevel;
break;
case State::Release:
if (m_phase < 1.0f || m_level > 0.1f)
{
float env = 1.0f - expLUT[(unsigned)(m_phase * (LUT_SIZE - 1))];
m_level = env * m_levelOff;
m_phase += 1.0f / (m_releaseTime * m_sampleRate);
}
else
{
m_phase = 0.0f;
m_state = State::Idle;
m_level = 0.0f;
m_levelOff = 0.0f;
}
break;
case State::Kill:
if (m_phase < 1.0f || m_level > 0.01f)
{
float env = 1.0f - expLUT[(unsigned)(m_phase * (LUT_SIZE - 1))];
m_level = env * m_levelOff;
m_phase += 1.0f / (0.005f * m_sampleRate);
}
else
{
m_phase = 0.0f;
m_state = State::Idle;
m_level = 0.0f;
m_levelOff = 0.0f;
}
break;
}
return m_level;
}