ArtSound Circle

Preview image for Sound Circle

SampleDot.pde

class SampleDot {
	float amount;
	float angle;
	
	float start_from_center = 10;
	int num_dots = 35;
	float divider = 8;
	float radius = 4;
	
	SampleDot(float amount_) {
		amount = amount_;
		angle = 0;
	}
	
	void update(float angleStep) {
		angle += angleStep;
	}
	
	void render() {
		pushMatrix();
		pushStyle();
		
		translate((width / 2), (height / 2));
		
		noStroke();
		
		float mapped_i = (map(amount, 0, 1, 0, num_dots) * 2);
		
		for(int i = 0; i < num_dots; i++) {
			float raw_radius = (start_from_center + (divider * i));
			
			float x = (cos(radians(-90 + angle)) * raw_radius);
			float y = (sin(radians(-90 + angle)) * raw_radius);
			
			if(i <= mapped_i) {
				color col = lerpColor(col_start, col_end, map(i, 0, num_dots, 0, 1));
				
				if(angle > 270) {
					float opacity = map(angle, 270, 359, 255, 0);
					
					fill(red(col), green(col), blue(col), opacity);
				} else {
					fill(col);
				}
				
				ellipseMode(CENTER);
				ellipse(x, y, radius, radius);
			}
		}
		
		popStyle();
		popMatrix();
	}
	
	boolean isDone() {
		return (angle >= 360);
	}
}

sound_circle.pde

import processing.sound.*;

float angle_step = 1;

int frames_per_sample = 3;

color col_start = color(21, 107, 193);
color col_end = color(6, 229, 78);

SoundFile sample;
Amplitude amp;

ArrayList<SampleDot> sample_dots;
FloatList pending_amplitudes;

void setup() {
	size(640, 640);
	
	//device = new AudioDevice(this, 44000, bands);
	
	sample = new SoundFile(this, "alpines-chances-cyril-hahn-remix-mono.mp3");
	//sample = new SoundFile(this, "cyril-hahn-say-my-name-mono.mp3");
	sample.loop();
	
	//song = new SoundFile(this, "alpines-chances-cyril-hahn-remix.mp3");
	//song.loop();
	
	//fft = new FFT(this, bands);
	//fft.input(sample);
	
	amp = new Amplitude(this);
	amp.input(sample);
	
	pending_amplitudes = new FloatList();
	sample_dots = new ArrayList<SampleDot>();
}

void draw() {
	background(30);
	
	// fft.analyze(spectrum);
	
	// for(int i = 0; i < bands; i++) {
	// 	line((width/2)+i, height, (width/2)+i, height - spectrum[i] * height);
	// }
	
	pending_amplitudes.append(amp.analyze());
	
	if((frameCount % frames_per_sample) == 0) {
		int num_amps = pending_amplitudes.size();
		float total_amps = 0.0;
		
		for(float amp_i : pending_amplitudes) {
			total_amps += amp_i;
		}
		
		pending_amplitudes.clear();
		
		sample_dots.add(new SampleDot( (total_amps / num_amps) ));
		//sample_dots.add(new SampleDot(amp.analyze()));
	}
	
	for(SampleDot dot : sample_dots) {
		dot.render();
		dot.update(angle_step);
	}
	
	for(int i = sample_dots.size() - 1; i >= 0; i--) {
		SampleDot dot = sample_dots.get(i);
		
		if(dot.isDone()) {
			sample_dots.remove(i);
		}
	}
	
	if(frameCount == 400) { save("preview.png"); }
}
pyxol © 2023
built with React + Next.js