Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/dsp/envelope.cpp
2 views
1
#ifdef DSP_CPP
2
3
void DSP::envelope_run(voice_t &v) {
4
int env = v.env;
5
6
if(v.env_mode == env_release) { //60%
7
env -= 0x8;
8
if(env < 0) env = 0;
9
v.env = env;
10
return;
11
}
12
13
int rate;
14
int env_data = VREG(adsr1);
15
if(state.t_adsr0 & 0x80) { //99% ADSR
16
if(v.env_mode >= env_decay) { //99%
17
env--;
18
env -= env >> 8;
19
rate = env_data & 0x1f;
20
if(v.env_mode == env_decay) { //1%
21
rate = ((state.t_adsr0 >> 3) & 0x0e) + 0x10;
22
}
23
} else { //env_attack
24
rate = ((state.t_adsr0 & 0x0f) << 1) + 1;
25
env += rate < 31 ? 0x20 : 0x400;
26
}
27
} else { //GAIN
28
env_data = VREG(gain);
29
int mode = env_data >> 5;
30
if(mode < 4) { //direct
31
env = env_data << 4;
32
rate = 31;
33
} else {
34
rate = env_data & 0x1f;
35
if(mode == 4) { //4: linear decrease
36
env -= 0x20;
37
} else if(mode < 6) { //5: exponential decrease
38
env--;
39
env -= env >> 8;
40
} else { //6, 7: linear increase
41
env += 0x20;
42
if(mode > 6 && (unsigned)v.hidden_env >= 0x600) {
43
env += 0x8 - 0x20; //7: two-slope linear increase
44
}
45
}
46
}
47
}
48
49
//sustain level
50
if((env >> 8) == (env_data >> 5) && v.env_mode == env_decay) v.env_mode = env_sustain;
51
v.hidden_env = env;
52
53
//unsigned cast because linear decrease underflowing also triggers this
54
if((unsigned)env > 0x7ff) {
55
env = (env < 0 ? 0 : 0x7ff);
56
if(v.env_mode == env_attack) v.env_mode = env_decay;
57
}
58
59
if(counter_poll(rate) == true) v.env = env;
60
}
61
62
#endif
63
64