📜 ⬆️ ⬇️

My music visualizer

I have long wanted to write some kind of music visualizer, but there were no interesting ideas. Then I saw this - Audio Game “Devil's Tuning Fork” and wanted to do something similar.



Introduction


I decided to write in the Processing language, to see at the same time what kind of animal it is.


In the folder with the language there are many examples and, more importantly, there is a library for working with sound, in which FFT is already implemented. There is an even more important example for us, where the frequencies are divided into three groups and three words jump on the screen to the rhythm of music (the example is called FrequencyEnergy).



Demonstration of work




Code


We create a new project, which is called a sketch in terms of Processing. The sketch will consist of three files. The first one is BeatListener, which we simply drag from the FrequencyEnergy example, it is needed to detect the rhythm of the music. The second is the class of our cube, it looks like this:

class Box {<br> // <br> int x,y,z;<br> // <br> int boxSize;<br> // ( 0 255) <br> int bright;<br> <br> Box( int x, int y, int z, int boxSize) {<br> this .x = x;<br> this .y = y;<br> this .z = z;<br> this .boxSize = boxSize;<br> this .bright = 0; // <br> }<br> <br> // <br> void setBright( int bright) {<br> if (bright > 255) bright = 255;<br> if (bright < 0) bright = 0;<br> this .bright = bright;<br> }<br> <br> // <br> int getBright() {<br> return bright; <br> }<br> <br> // <br> void display() {<br> // <br> fill(bright);<br> // <br> pushMatrix();<br> // <br> translate(x,y,z);<br> // <br> box(boxSize);<br> // <br> popMatrix();<br> }<br>} <br><br> * This source code was highlighted with Source Code Highlighter .

')

Well, the third file, which actually produces all the useful nishtyaki:

// <br>import ddf.minim.*;<br>import ddf.minim.signals.*;<br>import ddf.minim.analysis.*;<br>import ddf.minim.effects.*;<br><br>import processing.opengl.*;<br><br> // <br> int boxSize = 40;<br> //- <br> int build_width = 20;<br> //- <br> int build_length = 20;<br> //- <br> int build_height = 10;<br> // <br> int space = 10;<br> // <br>Box[][][] build;<br><br> //, , .., FrequencyEnergy <br>Minim minim;<br>AudioPlayer song;<br>BeatDetect beat;<br>BeatListener bl;<br><br> // setup <br> void setup() {<br> // <br> size(800,600, OPENGL);<br> // <br> background(0);<br> build = new Box[build_width][build_length][build_height];<br> // <br> for ( int i = 0; i < build_width; i++) {<br> for ( int j = 0; j < build_length; j++) {<br> build[i][j][0] = new Box((boxSize+space)*i,(boxSize+space)*j,0,boxSize);<br> }<br> } <br> // <br> for ( int i = 0; i < build_width; i++) {<br> for ( int j = 1; j < build_height; j++) {<br> build[i][build_length-1][j] = new Box((boxSize+space)*i,(boxSize+space)*(build_length-1),(boxSize+space)*j,boxSize);<br> }<br> }<br> // <br> for ( int i = 0; i < build_length; i++) {<br> for ( int j = 1; j < build_height; j++) {<br> build[build_width-1][i][j] = new Box((boxSize+space)*(build_width-1),(boxSize+space)*i,(boxSize+space)*j,boxSize);<br> }<br> }<br> // <br> for ( int i = 0; i < build_width; i++) {<br> for ( int j = 1; j < build_height; j++) {<br> build[i][0][j] = new Box((boxSize+space)*i,0,(boxSize+space)*j,boxSize);<br> }<br> }<br> // <br> for ( int i = 0; i < build_length; i++) {<br> for ( int j = 1; j < build_height; j++) {<br> build[0][i][j] = new Box(0,(boxSize+space)*i,(boxSize+space)*j,boxSize);<br> }<br> }<br> // <br> for ( int i = 0; i < build_width; i++) {<br> for ( int j = 0; j < build_length; j++) {<br> build[i][j][build_height-1] = new Box((boxSize+space)*i,(boxSize+space)*j,(boxSize+space)*(build_height-1),boxSize);<br> }<br> } <br> <br> // <br> build[9][9][1] = new Box((boxSize+space)*9,(boxSize+space)*9,(boxSize+space),boxSize);<br> build[10][9][1] = new Box((boxSize+space)*10,(boxSize+space)*9,(boxSize+space),boxSize);<br> build[9][10][1] = new Box((boxSize+space)*9,(boxSize+space)*10,(boxSize+space),boxSize);<br> build[10][10][1] = new Box((boxSize+space)*10,(boxSize+space)*10,(boxSize+space),boxSize);<br> <br> build[18][10][1] = new Box((boxSize+space)*18,(boxSize+space)*10,(boxSize+space),boxSize);<br> build[17][10][1] = new Box((boxSize+space)*17,(boxSize+space)*10,(boxSize+space),boxSize);<br> build[16][10][1] = new Box((boxSize+space)*16,(boxSize+space)*10,(boxSize+space),boxSize);<br> build[16][9][1] = new Box((boxSize+space)*16,(boxSize+space)*9,(boxSize+space),boxSize);<br> build[16][8][1] = new Box((boxSize+space)*16,(boxSize+space)*8,(boxSize+space),boxSize);<br> build[17][8][1] = new Box((boxSize+space)*17,(boxSize+space)*8,(boxSize+space),boxSize);<br> build[18][8][1] = new Box((boxSize+space)*18,(boxSize+space)*8,(boxSize+space),boxSize);<br> <br> build[10][18][1] = new Box((boxSize+space)*10,(boxSize+space)*18,(boxSize+space),boxSize);<br> build[10][17][1] = new Box((boxSize+space)*10,(boxSize+space)*17,(boxSize+space),boxSize);<br> build[10][16][1] = new Box((boxSize+space)*10,(boxSize+space)*16,(boxSize+space),boxSize);<br> build[9][16][1] = new Box((boxSize+space)*9,(boxSize+space)*16,(boxSize+space),boxSize);<br> build[8][16][1] = new Box((boxSize+space)*8,(boxSize+space)*16,(boxSize+space),boxSize);<br> build[8][17][1] = new Box((boxSize+space)*8,(boxSize+space)*17,(boxSize+space),boxSize);<br> build[8][18][1] = new Box((boxSize+space)*8,(boxSize+space)*18,(boxSize+space),boxSize);<br> <br> // <br> //x,y,z , x,y,z , , , <br> camera(50, 50, 250, 500, 500, 150, 0, 0, -1);<br> <br> // <br> minim = new Minim( this );<br> // ( ) <br> String loadPath = selectInput();<br> // <br> song = minim.loadFile(loadPath, 2048);<br> // <br> song.play();<br> // <br> beat = new BeatDetect(song.bufferSize(), song.sampleRate());<br> // , 100 <br> beat.setSensitivity(100); <br> bl = new BeatListener(beat, song); <br>}<br><br> // draw <br> void draw() {<br> // <br> for ( int i = 0; i < build_width; i++) {<br> for ( int j = 0; j < build_length; j++) {<br> for ( int k = 0; k < build_height; k++) {<br> if (build[i][j][k] != null ) {<br> build[i][j][k].display();<br> // <br> if (build[i][j][k].getBright() > 0)<br> {<br> <br> if (i-1 >= 0 && build[i-1][j][k] != null )<br> {<br> build[i-1][j][k].setBright(build[i-1][j][k].getBright()/2 + 18*build[i][j][k].getBright() / 32);<br> } <br> if (i+1 < build_width && build[i+1][j][k] != null )<br> {<br> build[i+1][j][k].setBright(build[i+1][j][k].getBright()/2 + 17*build[i][j][k].getBright() / 32); <br> }<br> if (j-1 >= 0 && build[i][j-1][k] != null )<br> {<br> build[i][j-1][k].setBright(build[i][j-1][k].getBright()/2 + 18*build[i][j][k].getBright() / 32); <br> }<br> if (j+1 < build_length && build[i][j+1][k] != null )<br> {<br> build[i][j+1][k].setBright(build[i][j+1][k].getBright()/2 + 17*build[i][j][k].getBright() / 32);<br> }<br> if (k-1 >= 0 && build[i][j][k-1] != null )<br> {<br> build[i][j][k-1].setBright(build[i][j][k-1].getBright()/2 + 17*build[i][j][k].getBright() / 32); <br> }<br> if (k+1 < build_height && build[i][j][k+1] != null )<br> {<br> build[i][j][k+1].setBright(build[i][j][k+1].getBright()/2 + 17*build[i][j][k].getBright() / 32); <br> }<br><br> build[i][j][k].setBright(3 * build[i][j][k].getBright() / 4); <br> }<br> }<br> }<br> }<br> }<br> <br> // - <br> // <br> if ( beat.isHat() ) {<br> process(15,15,0,255);<br> }<br> if ( beat.isKick() ) {<br> process(15,5,0,255);<br> }<br> if ( beat.isSnare() ) {<br> process(5,15,0,255);<br> }<br>}<br><br> // , x,y,z <br> void process( int x, int y, int z, int bright) {<br> build[x][y][z].setBright(bright);<br>} <br><br> * This source code was highlighted with Source Code Highlighter .

Source: https://habr.com/ru/post/79937/


All Articles