/
SVF2PCADBlock.java
122 lines (98 loc) · 3.13 KB
/
SVF2PCADBlock.java
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
/* SpinCAD Designer - DSP Development Tool for the Spin FV-1
* Copyright (C) 2013 - 2014 - Gary Worsham
* Based on ElmGen by Andrew Kilpatrick. Modified by Gary Worsham 2013 - 2014. Look for GSW in code.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.holycityaudio.SpinCAD.CADBlocks;
import java.awt.Color;
import com.holycityaudio.SpinCAD.SpinCADPin;
import com.holycityaudio.SpinCAD.SpinFXBlock;
public class SVF2PCADBlock extends FilterCADBlock{
/**
*
*/
private static final long serialVersionUID = 5711126291575876825L;
double f0 = 740.0;
double q0 = 1;
double fZ;
double q1;
public SVF2PCADBlock(int x, int y) {
super(x, y);
hasControlPanel = true;
setBorderColor(new Color(0x24f26f));
addInputPin(this, "Audio Input");
addControlInputPin(this, "Frequency");
addOutputPin(this, "Lowpass Out");
addOutputPin(this, "Bandpass Out");
addOutputPin(this, "Hipass Out");
setCoefficients();
setName("SVF 2P");
}
public void editBlock(){
new SVF2PControlPanel(this);
}
public void generateCode(SpinFXBlock sfxb) {
// coefficients
int input = -1;
SpinCADPin p = this.getPin("Audio Input").getPinConnection();
if(p != null) {
setCoefficients();
input = p.getRegister();
int highPass = sfxb.allocateReg();
int bandPass = sfxb.allocateReg();
int lowPass = sfxb.allocateReg();
sfxb.comment(getName());
sfxb.scaleOffset(0, 0);
sfxb.readRegister(input, 1.0);
sfxb.readRegister(lowPass, -1);
sfxb.readRegister(bandPass, -q1);
sfxb.writeRegister(highPass, fZ);
SpinCADPin p2 = this.getPin("Frequency").getPinConnection();
if(p2 != null) {
sfxb.mulx(p2.getRegister());
}
sfxb.readRegister(bandPass, 1.0);
sfxb.writeRegister(bandPass, fZ);
if(p2 != null) {
sfxb.mulx(p2.getRegister());
}
sfxb.readRegister(lowPass, 1);
sfxb.writeRegister(lowPass, 0);
this.getPin("Lowpass Out").setRegister(lowPass);
this.getPin("Bandpass Out").setRegister(bandPass);
this.getPin("Hipass Out").setRegister(highPass);
}
System.out.println("SVF 2P code gen!");
}
public double getFreq() {
return f0;
}
public void setFreq(double f) {
f0 = f;
// setCoefficients();
}
public void setQ(double value) {
q0 = value;
// setCoefficients();
}
public double getQ() {
return q0;
}
public void setCoefficients() {
q1 = 1.0/q0;
fZ = Math.sin(2 * Math.PI * f0/getSamplerate());
}
}