-
Notifications
You must be signed in to change notification settings - Fork 0
/
visualizer.js
112 lines (98 loc) · 2.2 KB
/
visualizer.js
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
let song;
let mic;
let fft;
let usingMic = false;
let video;
let batteryLevel = 1;
/**
* Preload assets if needed (none currently).
*/
function preload() {
// Nothing to preload initially
}
/**
* Setup the canvas, audio input, video capture, and battery monitoring.
*/
function setup() {
createCanvas(windowWidth, windowHeight);
fft = new p5.FFT();
mic = new p5.AudioIn();
mic.start();
setupBatteryMonitoring();
}
/**
* Adjust the canvas size when the window is resized.
*/
function windowResized() {
resizeCanvas(windowWidth, windowHeight);
}
/**
* Draw the visualizer, which reacts to the audio input and other environmental factors.
*/
function draw() {
background(0);
// Draw video as background with transparency
tint(255, 150);
// Adjust visuals based on battery level
let batteryColor = color(map(batteryLevel, 0, 1, 0, 255), 0, 255);
if (usingMic) {
fft.setInput(mic);
} else if (song && song.isPlaying()) {
fft.setInput(song);
}
let spectrum = fft.analyze();
noStroke();
fill(batteryColor);
for (let i = 0; i < spectrum.length; i++) {
let x = map(i, 0, spectrum.length, 0, width);
let h = -height + map(spectrum[i], 0, 255, height, 0);
rect(x, height, width / spectrum.length, h);
}
}
/**
* Toggle the playback of the song.
*/
function togglePlay() {
if (song && song.isPlaying()) {
song.pause();
} else if (song) {
song.loop();
usingMic = false;
}
}
/**
* Use the microphone as the audio input.
*/
function useMicrophone() {
if (song) {
song.stop();
}
usingMic = true;
}
/**
* Load an audio file from the user's input.
*/
function loadFile(event) {
let file = event.target.files[0];
if (file) {
let reader = new FileReader();
reader.onload = function(e) {
song = loadSound(e.target.result, () => {
song.play();
usingMic = false;
});
};
reader.readAsDataURL(file);
}
}
/**
* Monitor the battery level and update the visuals accordingly.
*/
function setupBatteryMonitoring() {
navigator.getBattery().then(function(battery) {
batteryLevel = battery.level;
battery.addEventListener('levelchange', () => {
batteryLevel = battery.level;
});
});
}