Skip to content

Commit 98a134d

Browse files
tgfmfccodingjoe
andauthored
Add two new effects: Vortex & Raindrops (#66)
Co-authored-by: Johannes Maron <[email protected]>
1 parent a18667f commit 98a134d

File tree

4 files changed

+246
-6
lines changed

4 files changed

+246
-6
lines changed

MusicBeam/MusicBeam.pde

+5-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import controlP5.*;
1010
import ddf.minim.*;
1111
import ddf.minim.analysis.*;
1212

13-
String version = "2.6.1";
13+
String version = "2.7.0";
1414

1515
public Boolean debugMode = false;
1616

@@ -43,7 +43,7 @@ float randomTimer = 0;
4343

4444
int randomEffect = 0;
4545
int width = 775;
46-
int height = 570;
46+
int height = 670;
4747

4848
float maxLevel = 0;
4949
float goalMaxLevel=0;
@@ -243,7 +243,7 @@ void initEffects()
243243
{
244244
initRandomControls();
245245

246-
effectArray = new Effect[9];
246+
effectArray = new Effect[11];
247247
effectArray[0] = new Blackout_Effect(this, 0);
248248
effectArray[1] = new Strobe_Effect(this, 1);
249249
effectArray[2] = new Scanner_Effect(this, 2);
@@ -253,6 +253,8 @@ void initEffects()
253253
effectArray[6] = new Snowstorm_Effect(this, 6);
254254
effectArray[7] = new LaserBurst_Effect(this, 7);
255255
effectArray[8] = new Polygon_Effect(this, 8);
256+
effectArray[9] = new Vortex_Effect(this, 9);
257+
effectArray[10] = new Raindrops_Effect(this, 10);
256258

257259
activeSetting.activate(0);
258260

MusicBeam/Raindrops_Effect.pde

+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
class Raindrops_Effect extends Effect //<>//
2+
{
3+
String getName()
4+
{
5+
return "Raindrops";
6+
}
7+
8+
char triggeredByKey() {
9+
return 'a';
10+
}
11+
12+
Toggle interactionToggle, directionToggle, bwToggle;
13+
Slider fadeSpeedSlider, densitySlider;
14+
int tmpCounter, maxSize;
15+
int halfWidth = stg.width/2;
16+
int halfHeight = stg.height/2;
17+
int dirUP=1;
18+
int dirDOWN=-1;
19+
ArrayList<Drop> drops = new ArrayList<Drop>();
20+
21+
Raindrops_Effect(MusicBeam controller, int y)
22+
{
23+
super(controller, y);
24+
maxSize = min(stg.width, stg.height);
25+
tmpCounter = 0;
26+
stg.noStroke();
27+
stg.ellipseMode(CENTER);
28+
fadeSpeedSlider = cp5.addSlider("speed"+getName()).setPosition(105, 5).setSize(290, 45).setRange(1, 10).setGroup(controlGroup);
29+
fadeSpeedSlider.getCaptionLabel().set("fadespeed").align(ControlP5.RIGHT, ControlP5.CENTER);
30+
fadeSpeedSlider.setValue(5);
31+
directionToggle = ctrl.cp5.addToggle("direction"+getName()).setPosition(0, 5).setSize(100, 45).setGroup(controlGroup);
32+
directionToggle.getCaptionLabel().set("raindrops").align(ControlP5.CENTER, ControlP5.CENTER);
33+
directionToggle.setState(false);
34+
interactionToggle = ctrl.cp5.addToggle("interaction"+getName()).setPosition(0, 55).setSize(100, 45).setGroup(controlGroup);
35+
interactionToggle.getCaptionLabel().set("music").align(ControlP5.CENTER, ControlP5.CENTER);
36+
interactionToggle.setState(true);
37+
densitySlider = cp5.addSlider("density"+getName()).setPosition(105, 55).setSize(290, 45).setRange(1, 10).setGroup(controlGroup);
38+
densitySlider.getCaptionLabel().set("density").align(ControlP5.RIGHT, ControlP5.CENTER);
39+
densitySlider.setValue(5);
40+
bwToggle = ctrl.cp5.addToggle("bw"+getName()).setPosition(0, 105).setSize(45, 45).setGroup(controlGroup);
41+
bwToggle.getCaptionLabel().set("BW").align(ControlP5.CENTER, ControlP5.CENTER);
42+
bwToggle.setState(true);
43+
}
44+
45+
void draw() {
46+
directionToggle.getCaptionLabel().set(directionToggle.getState() ? "Sunrays" : "Raindrops");
47+
stg.fill(100, 0, 100);
48+
if (!interactionToggle.getState()) {
49+
interactionToggle.getCaptionLabel().set("auto");
50+
if (tmpCounter==0) {
51+
addDrop();
52+
}
53+
tmpCounter += 1;
54+
if (tmpCounter >= 10 - densitySlider.getValue()) {
55+
tmpCounter = 0;
56+
}
57+
} else {
58+
interactionToggle.getCaptionLabel().set("music");
59+
if (isHat()) addDrop();
60+
if (isSnare()) addDrop();
61+
if (isKick()) addDrop();
62+
}
63+
for (Drop dr : drops) {
64+
dr.draw();
65+
}
66+
for (int i=drops.size()-1; i>=0; i--) {
67+
Drop dr = drops.get(i);
68+
if (dr.size <= 0) {
69+
drops.remove(i);
70+
}
71+
}
72+
}
73+
74+
class Drop {
75+
int posX, posY, direction, hue;
76+
float size, targetSize;
77+
78+
Drop(int dir) {
79+
targetSize = random(maxSize / 100, maxSize / 10);
80+
posX = int(random(halfWidth*-1, halfWidth));
81+
posY = int(random(halfHeight*-1, halfHeight));
82+
hue = int(random(0, 360));
83+
direction = dir;
84+
size = (dir == dirUP) ? 1: targetSize;
85+
targetSize = (dir == dirUP) ? targetSize : 1;
86+
87+
bwToggle.getState();
88+
89+
}
90+
91+
void draw() {
92+
size += fadeSpeedSlider.getValue() * direction / sqrt(size);
93+
if (direction == dirUP && size >= targetSize) {
94+
direction = dirDOWN;
95+
}
96+
stg.fill(hue % 360, bwToggle.getState() ? 0 : 100, 100);
97+
if (size > 0) {
98+
stg.ellipse(posX, posY, size, size);
99+
}
100+
}
101+
}
102+
103+
void addDrop() {
104+
drops.add(new Drop(directionToggle.getState() ? dirUP : dirDOWN));
105+
}
106+
}

MusicBeam/Settings.pde

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ void initSettings()
1010
saveSliderLabelAlign();
1111
cp5.getProperties().setFormat(ControlP5.SERIALIZED);
1212

13-
loadDefaultSettingsButton = cp5.addButton("loadDefaultSettings").setSize(129, 45).setPosition(10, 515);
13+
loadDefaultSettingsButton = cp5.addButton("loadDefaultSettings").setPosition(10, height-55).setSize(129, 45);
1414
loadDefaultSettingsButton.getCaptionLabel().set("Default Settings").align(ControlP5.CENTER, ControlP5.CENTER);
1515

16-
loadSettingsButton = cp5.addButton("loadSettings").setSize(129, 45).setPosition(143, 515);
16+
loadSettingsButton = cp5.addButton("loadSettings").setPosition(143, height-55).setSize(129, 45);
1717
loadSettingsButton.getCaptionLabel().set("Load Settings").align(ControlP5.CENTER, ControlP5.CENTER);
1818

19-
saveSettingsButton = cp5.addButton("saveSettings").setSize(129, 45).setPosition(276, 515);
19+
saveSettingsButton = cp5.addButton("saveSettings").setPosition(276, height-55).setSize(129, 45);
2020
saveSettingsButton.getCaptionLabel().set("Save Settings").align(ControlP5.CENTER, ControlP5.CENTER);
2121
}
2222

MusicBeam/Vortex_Effect.pde

+132
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
class Vortex_Effect extends Effect
2+
{
3+
String getName()
4+
{
5+
return "Spinner";
6+
}
7+
8+
char triggeredByKey() {
9+
return '9';
10+
}
11+
int currentPulseValue, maxSize;
12+
float offset, gap;
13+
boolean swap;
14+
Toggle bwToggle, dualColourToggle, swapColourToggle, pulseToggle;
15+
Slider weightSlider, sizeSlider, gapSlider, hueSlider, hue2Slider, speedSlider;
16+
17+
Vortex_Effect(MusicBeam controller, int y)
18+
{
19+
super(controller, y);
20+
swap=false;
21+
int maxWeight =20;
22+
maxSize = min(stg.width, stg.height) - maxWeight;
23+
currentPulseValue=0;
24+
weightSlider = cp5.addSlider("weight"+getName()).setPosition(0, 5).setSize(395, 45).setRange(1, 100).setGroup(controlGroup);
25+
weightSlider.getCaptionLabel().set("Weight").align(ControlP5.RIGHT, ControlP5.CENTER);
26+
weightSlider.setValue(20);
27+
28+
sizeSlider = cp5.addSlider("size"+getName()).setPosition(0, 55).setSize(395, 45).setRange(200, maxSize).setGroup(controlGroup);
29+
sizeSlider.getCaptionLabel().set("Size").align(ControlP5.RIGHT, ControlP5.CENTER);
30+
sizeSlider.setValue(maxSize/4*3);
31+
32+
speedSlider = cp5.addSlider("speed"+getName()).setPosition(0, 105).setSize(395, 45).setRange(-45, 45).setGroup(controlGroup);
33+
speedSlider.getCaptionLabel().set("Speed").align(ControlP5.RIGHT, ControlP5.CENTER);
34+
speedSlider.setValue(7.5);
35+
36+
gapSlider = cp5.addSlider("gap"+getName()).setPosition(0, 155).setSize(395, 45).setRange(0, 180).setGroup(controlGroup);
37+
gapSlider.getCaptionLabel().set("gap").align(ControlP5.RIGHT, ControlP5.CENTER);
38+
gapSlider.setValue(90);
39+
40+
hueSlider = cp5.addSlider("hue"+getName()).setPosition(0, 205).setSize(395, 45).setRange(0, 360).setGroup(controlGroup);
41+
hueSlider.getCaptionLabel().set("hue").align(ControlP5.RIGHT, ControlP5.CENTER);
42+
hueSlider.setValue(50);
43+
44+
hue2Slider = cp5.addSlider("hue2"+getName()).setPosition(0, 255).setSize(395, 45).setRange(0, 360).setGroup(controlGroup);
45+
hue2Slider.getCaptionLabel().set("hue2").align(ControlP5.RIGHT, ControlP5.CENTER);
46+
hue2Slider.setValue(300);
47+
48+
bwToggle = ctrl.cp5.addToggle("bw"+getName()).setPosition(0, 305).setSize(45, 45).setGroup(controlGroup);
49+
bwToggle.getCaptionLabel().set("BW").align(ControlP5.CENTER, ControlP5.CENTER);
50+
bwToggle.setState(false);
51+
52+
dualColourToggle = ctrl.cp5.addToggle("link"+getName()).setPosition(50, 305).setSize(110, 45).setGroup(controlGroup);
53+
dualColourToggle.getCaptionLabel().set("Dual Colours").align(ControlP5.CENTER, ControlP5.CENTER);
54+
dualColourToggle.setState(true);
55+
56+
swapColourToggle = ctrl.cp5.addToggle("swapclolour"+getName()).setPosition(165, 305).setSize(110, 45).setGroup(controlGroup);
57+
swapColourToggle.getCaptionLabel().set("Swap Colours").align(ControlP5.CENTER, ControlP5.CENTER);
58+
swapColourToggle.setState(false);
59+
60+
pulseToggle = ctrl.cp5.addToggle("pulse"+getName()).setPosition(280, 305).setSize(115, 45).setGroup(controlGroup);
61+
pulseToggle.getCaptionLabel().set("pulse").align(ControlP5.CENTER, ControlP5.CENTER);
62+
pulseToggle.setState(false);
63+
}
64+
65+
int weight, circleSize, hue, hue2;
66+
67+
void draw() {
68+
stg.noFill();
69+
stg.strokeWeight(weight);
70+
offset += speedSlider.getValue();
71+
offset = getDegree(offset);
72+
gap = 180 - gapSlider.getValue();
73+
weight = int(weightSlider.getValue());
74+
circleSize = int(sizeSlider.getValue());
75+
hue = int(hueSlider.getValue());
76+
hue2 = int(dualColourToggle.getState()?hue2Slider.getValue():hue);
77+
78+
if (isKick()) {
79+
currentPulseValue = maxSize - circleSize;
80+
}
81+
if (currentPulseValue > 0) {
82+
currentPulseValue -= sqrt(currentPulseValue);
83+
}
84+
85+
if (pulseToggle.getState()) {
86+
circleSize += currentPulseValue;
87+
}
88+
89+
90+
if (dualColourToggle.getState() && swapColourToggle.getState()) {
91+
if (isHat()) {
92+
swap=!swap;
93+
}
94+
if (swap) {
95+
int tmp=hue;
96+
hue=hue2;
97+
hue2=tmp;
98+
}
99+
}
100+
101+
stg.stroke(hue%360, bwToggle.getState()?0:100, 100);
102+
stg.arc(0, 0, circleSize, circleSize, radians(offset), radians(getDegree(offset+gap)));
103+
stg.stroke(hue2%360, bwToggle.getState()?0:100, 100);
104+
stg.arc(0, 0, circleSize, circleSize, radians(getDegree(offset + 180)), radians(getDegree(offset + gap + 180)));
105+
}
106+
107+
void keyPressed(char key, int keyCode)
108+
{
109+
super.keyPressed(key, keyCode);
110+
if (key == CODED) {
111+
if (keyCode == LEFT)
112+
sizeSlider.setValue(sizeSlider.getValue() - maxSize/20);
113+
else if (keyCode == RIGHT)
114+
sizeSlider.setValue(sizeSlider.getValue() + maxSize/20);
115+
else if (keyCode == DOWN)
116+
speedSlider.setValue(speedSlider.getValue()-1);
117+
else if (keyCode == UP)
118+
speedSlider.setValue(speedSlider.getValue()+1);
119+
else if (keyCode == CONTROL)
120+
bwToggle.setValue(!bwToggle.getState());
121+
}
122+
}
123+
float getDegree(float in) {
124+
if (in<0) {
125+
return in+360;
126+
}
127+
if (offset>=360) {
128+
return in-360;
129+
}
130+
return in;
131+
}
132+
}

0 commit comments

Comments
 (0)