Páginas

NIMADRES

Simular un Ecualizador en Java

Un ecualizador es un dispositivo que procesa señales de audio.
Modifica el contenido en frecuencias de la señal que procesa. Para ello, cambia las amplitudes de sus coeficientes de Fourier, lo que se traduce en diferentes volúmenes para cada frecuencia. Con esto se puede variar de forma independiente la intensidad de los tonos básicos.
Ciertos modelos de ecualizadores gráficos actúan sobre la fase de las señales que procesan, en lugar de actuar sobre la amplitud.

De un modo doméstico generalmente se usa para reforzar ciertas bandas de frecuencias, ya sea para compensar la respuesta del equipo de audio (amplificador + altavoces) o para ajustar el resultado a gustos personales.
Los hay analógicos y digitales, activos o pasivos, paramétricos, gráficos y paragráficos. Los ecualizadores profesionales suelen tener, al menos, 10 bandas. Las normas ISO establecen que las bandas de frecuencia han de ser, al menos, 31, 63, 125, 250, 500, 1000, 2000, 4000, 8000 y 16 000 Hercios.
Estas bandas de frecuencias básicas son controladas por un fader (u otro potenciómetro o control alternativo) que puede atenuar o introducir ganancia hasta en 12 dB, o aún más. Para evitar distorsión por saturación ("clipping"), cada fader cuenta con un diodo LED, que se enciende justo antes de que se recorte la señal.










Esta vez les traigo una pequeña aplicación en Java, que nos muestra como se comporta un ecualizador, estos se generan de manera aleatoria, el color se puede cambiar aunque eso es lo de menos. Esta aplicación esta hecha con un arreglo de hilos extendidos de JPanel en donde se dibujan rectangulos con el public void paint
El archivo se guarda como Ecualizador.java


import javax.swing.*;
import java.awt.*;
import java.util.Random;
public class Ecualizador extends JFrame{
    public Ecualizador(){
        setTitle("NIMADRES");
        setVisible(true);
        setBounds(150,150,500,335);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new GridLayout(1, 10));
        Barra[]eqBar = new Barra[10];
        Thread[]Barra = new Thread[10];
        for(int i = 0; i<eqBar.length; i++){
            eqBar[i] = new Barra();
            Barra[i] = new Thread(eqBar[i]);
            Barra[i].start();
            this.add(eqBar[i]);
        }
    }
    class Barra extends JPanel implements Runnable{
        private int limite;
        private int inferior;
        private Rectangle rectangulo;
        public Barra(){
            setBackground(Color.BLACK);
            Random rand =  new Random();
            limite = rand.nextInt(300);
            inferior = 0;
            rectangulo = new Rectangle(0,400,250,inferior);
        }
        public void paint(Graphics g){
            super.paint(g);
            g.setColor(Color.yellow);
            //g.setColor(Color.red);
            g.fillRect((int) rectangulo.getX(), (int) rectangulo.getY(), 
            (int) rectangulo.getWidth(), (int) rectangulo.getHeight());
        }
        public void run(){
            try{
                while(true){
                    rectangulo.setLocation((int) rectangulo.getX(),
                    (int) rectangulo.getY()-5);
                    inferior += 5;
                    if(inferior > limite){
                        inferior = 0;
                        rectangulo.setLocation((int) rectangulo.getX(), 300);
                    }
                    rectangulo.setSize(48, inferior);
                    repaint();
                    Thread.sleep(10);
                }
            } catch(InterruptedException e) {}
        }
    }
}
Ahora en otro archivo generamos el Main para ejecutar nuestro programa, este se guarda como Main.java en la misma carpeta que el Ecualizador.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Main{
    public static void main(String args[]){
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) {}
        java.awt.EventQueue.invokeLater(new Runnable(){
                    @Override
            public void run(){
                new Ecualizador().setVisible(true);
            }
        });
    }
}