Skip to content

Commit 86dbde6

Browse files
Updated/fully implemented the theremin
1 parent db5c67b commit 86dbde6

1 file changed

Lines changed: 68 additions & 10 deletions

File tree

examples/theremin/theremin.html

Lines changed: 68 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,38 +18,96 @@
1818
<script>
1919
let detuneRange = 4800;
2020

21-
let oscillator = createjs.Sound.context.createOscillator();
22-
oscillator.start();
2321
let oscillatorBus = new createjs.Group();
24-
oscillator.connect(oscillatorBus.inputNode); // Web audio nodes can be connected into SoundJS 2!
25-
22+
oscillatorBus.volume = 0;
23+
oscillatorBus.mute();
2624
oscillatorBus.volume = 0.1;
2725

26+
let oscillator = createjs.Sound.context.createOscillator();
27+
oscillator.connect(oscillatorBus.inputNode); // Web audio nodes can be connected into SoundJS 2!
28+
2829
let stage = new createjs.Stage("demoCanvas");
2930

30-
stage.on("stagemousedown", (e) => oscillatorBus.unmute());
31+
let backgroundFilter = new createjs.Shape();
32+
33+
backgroundFilter.on("mousedown", (e) => oscillator.start(), window, true); // Start the oscillator on first click
34+
35+
stage.on("stageMouseDown", (e) => oscillatorBus.unmute());
36+
backgroundFilter.on("mousedown", (e) => oscillatorBus.unmute());
3137
stage.on("stagemouseup", (e) => oscillatorBus.mute());
3238
stage.on("stagemousemove", handleMouseMove);
3339
stage.enableMouseOver();
3440

41+
let fillColor = null, dotFillColor = null;
42+
3543
function handleMouseMove(e){
3644
oscillator.detune.value = detuneRange * (e.stageX/stage.canvas.width - 1/2);
45+
46+
if(!oscillatorBus.muted){
47+
fillColor = getCanvasColor(bgColorCanvas, e.stageX, e.stageY, 0.05);
48+
dotFillColor = getCanvasColor(dotColorCanvas, e.stageX, e.stageY);
49+
fillCmd.style = fillColor;
50+
dotFillCmd.style = dotFillColor;
51+
dot.visible = true;
52+
dot.x = e.stageX;
53+
dot.y = e.stageY;
54+
}else{
55+
dot.visible = false;
56+
}
57+
3758
}
3859

3960
// Visuals only beyond this point
61+
stage.autoClear = false;
4062

4163
createjs.Ticker.addEventListener("tick", handleTick);
4264
createjs.Ticker.timingMode = createjs.Ticker.RAF;
4365

4466
function handleTick(e){
4567
stage.update();
68+
console.log(fillColor);
69+
}
70+
71+
72+
let fillCmd = backgroundFilter.graphics.beginFill("#9999CC").command;
73+
backgroundFilter.graphics.drawRect( 0, 0, stage.canvas.width, stage.canvas.height);
74+
backgroundFilter.graphics.endFill();
75+
stage.addChild(backgroundFilter);
76+
77+
fillCmd.style = "rgba(200,100,150,0.01)";
78+
79+
let dotColor = "#FF0000";
80+
let dot = new createjs.Shape();
81+
let dotFillCmd = dot.graphics.beginFill(dotColor).command;
82+
dot.graphics.drawCircle(0,0,7);
83+
dot.graphics.endFill();
84+
stage.addChild(dot);
85+
86+
87+
let bgColorImage = document.createElement("img");
88+
let bgColorCanvas = document.createElement("canvas");
89+
bgColorCanvas.width = 800;
90+
bgColorCanvas.height = 600;
91+
bgColorImage.onload = () => bgColorCanvas.getContext("2d").drawImage(bgColorImage, 0, 0); console.log('loaded');
92+
bgColorImage.src = "./assets/art/sjs2_examples_theremin_gradient6.png";
93+
94+
let dotColorImage = document.createElement("img");
95+
let dotColorCanvas = document.createElement("canvas");
96+
dotColorCanvas.width = 800;
97+
dotColorCanvas.height = 600;
98+
dotColorImage.onload = () => dotColorCanvas.getContext("2d").drawImage(dotColorImage, 0, 0);
99+
dotColorImage.src = "./assets/art/sjs2_examples_theremin_gradient5.png";
100+
101+
function getCanvasColor(canvas, x, y, alpha = 1){
102+
let data = canvas.getContext("2d").getImageData(x, y, 1, 1).data;
103+
if(data[3] > 0.001){
104+
return `rgba(${data[0]}, ${data[1]}, ${data[2]}, ${alpha})`
105+
}else{
106+
return "rgba(200,100,150,0.01)";
107+
}
108+
46109
}
47110

48-
let background = new createjs.Shape();
49-
background.graphics.beginFill("#FF00FF");
50-
background.graphics.drawRect( 0, 0, stage.canvas.width, stage.canvas.height);
51-
background.graphics.endFill();
52-
stage.addChild(background);
53111

54112
</script>
55113
</body>

0 commit comments

Comments
 (0)