/* Esta es un programa que permite la espacializacón en tiempo real de una fuente sonora monofónica. El sonido puede ser desplazado en tres dimensiones. Es necesaria una tarjeta de sonido de 8 canales */ import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import com.softsynth.jsyn.*; import com.softsynth.jsyn.util.*; public class Espacializador extends java.applet.Applet implements MouseInputListener, KeyListener { int tamDeCanvas = 300; int numeroDeTarjetas; int tarjetaEntradaID; int tarjetaSalidaID; int canalesDeEntrada; int canalesDeSalida; int numMov = 0; double valActX; double valActY; double valActZ; Canvas AreaDeMov; Canvas AreaDeAltura; Label etiTitulo; Label etiValores; Label etiTit1; Label etiTit2; Label etiTit3; Label etiTit4; Label etiTit5; Label etiTit6; Label etiTit7; Label etiTit8; Label etiVal1; Label etiVal2; Label etiVal3; Label etiVal4; Label etiVal5; Label etiVal6; Label etiVal7; Label etiVal8; Font titFont; Font etiFont; Font valFont; ChannelOut salidas[]; SynthMixer mezcladoras[]; ChannelIn entrada; public static void main(String arg[]) { Espacializador t1 = new Espacializador(); t1.start(); t1.setSize(600,750); t1.setVisible(true); Frame f = new Frame("Espacializador"); f.addWindowListener(new java.awt.event.WindowAdapter(){ public void windowClosing(java.awt.event.WindowEvent e) { Synth.stopEngine(); System.exit(0); } }); f.add(t1, BorderLayout.CENTER); f.setSize(600,750); f.setVisible(true); } public void start() { Font titFont = new Font("TimesRoman", Font.BOLD, 30); Font etiFont = new Font("TimesRoman", Font.BOLD, 20); Font valFont = new Font("TimesRoman", Font.BOLD, 15); setLayout (new BorderLayout()); Panel n = new Panel(); etiTitulo = new Label("ESPACIALIZADOR DE AUDIO", Label.CENTER); etiTitulo.setFont(titFont); n.add(etiTitulo); Panel c = new Panel(); AreaDeMov = new Canvas(); AreaDeMov.setBackground(Color.red); AreaDeMov.addMouseListener(this); AreaDeMov.addMouseMotionListener(this); AreaDeMov.setVisible(true); AreaDeMov.setSize(tamDeCanvas, tamDeCanvas); c.add(AreaDeMov); AreaDeAltura = new Canvas(); AreaDeAltura.setBackground(Color.green); AreaDeAltura.addMouseListener(this); AreaDeAltura.addMouseMotionListener(this); AreaDeAltura.setVisible(true); AreaDeAltura.setSize(tamDeCanvas / 5, tamDeCanvas); c.add(AreaDeAltura); addKeyListener(this); Panel s = new Panel(); s.setLayout(new BorderLayout()); Panel sn = new Panel(); etiValores = new Label("Valores", Label.CENTER); etiValores.setFont(etiFont); sn.add(etiValores); Panel sc = new Panel(); sc.setLayout(new GridLayout(8,2,15,5)); etiTit1 = new Label("Valor 1", Label.CENTER); etiVal1 = new Label("-----", Label.CENTER); etiTit2 = new Label("Valor 2", Label.CENTER); etiVal2 = new Label("-----", Label.CENTER); etiTit3 = new Label("Valor 3", Label.CENTER); etiVal3 = new Label("-----", Label.CENTER); etiTit4 = new Label("Valor 4", Label.CENTER); etiVal4 = new Label("-----", Label.CENTER); etiTit5 = new Label("Valor 5", Label.CENTER); etiVal5 = new Label("-----", Label.CENTER); etiTit6 = new Label("Valor 6", Label.CENTER); etiVal6 = new Label("-----", Label.CENTER); etiTit7 = new Label("Valor 7", Label.CENTER); etiVal7 = new Label("-----", Label.CENTER); etiTit8 = new Label("Valor 8", Label.CENTER); etiVal8 = new Label("-----", Label.CENTER); etiTit1.setFont(valFont); etiTit2.setFont(valFont); etiTit3.setFont(valFont); etiTit4.setFont(valFont); etiTit5.setFont(valFont); etiTit6.setFont(valFont); etiTit7.setFont(valFont); etiTit8.setFont(valFont); etiVal1.setFont(valFont); etiVal2.setFont(valFont); etiVal3.setFont(valFont); etiVal4.setFont(valFont); etiVal5.setFont(valFont); etiVal6.setFont(valFont); etiVal7.setFont(valFont); etiVal8.setFont(valFont); sc.add(etiTit1); sc.add(etiVal1); sc.add(etiTit2); sc.add(etiVal2); sc.add(etiTit3); sc.add(etiVal3); sc.add(etiTit4); sc.add(etiVal4); sc.add(etiTit5); sc.add(etiVal5); sc.add(etiTit6); sc.add(etiVal6); sc.add(etiTit7); sc.add(etiVal7); sc.add(etiTit8); sc.add(etiVal8); s.add("North", sn); s.add("Center", sc); add("North", n); add("Center", c); add("South", s); //Determina la tarjeta de audio y los canales a utilizar. numeroDeTarjetas = AudioDevice.getNumDevices(); tarjetaEntradaID = AudioDevice.getDefaultInputDeviceID(); tarjetaSalidaID = AudioDevice.getDefaultOutputDeviceID(); canalesDeEntrada = AudioDevice.getMaxInputChannels( tarjetaEntradaID ); canalesDeSalida = AudioDevice.getMaxOutputChannels( tarjetaSalidaID ); if (numeroDeTarjetas > 1) { tarjetaEntradaID = 0; tarjetaSalidaID = 0; canalesDeEntrada = AudioDevice.getMaxInputChannels( tarjetaEntradaID ); canalesDeSalida = AudioDevice.getMaxOutputChannels( tarjetaSalidaID ); for (int i = 1; i < numeroDeTarjetas; i++) { if (AudioDevice.getMaxInputChannels(i) > AudioDevice.getMaxInputChannels(i - 1)) { tarjetaEntradaID = i; canalesDeEntrada = AudioDevice.getMaxInputChannels( i ); } if (AudioDevice.getMaxOutputChannels(i) > AudioDevice.getMaxOutputChannels(i - 1)) { tarjetaSalidaID = i; canalesDeSalida = AudioDevice.getMaxInputChannels( i ); } } if (AudioDevice.getMaxInputChannels(tarjetaEntradaID) == AudioDevice.getDefaultInputDeviceID()) { tarjetaEntradaID = AudioDevice.getDefaultInputDeviceID(); canalesDeEntrada = AudioDevice.getMaxInputChannels( tarjetaEntradaID ); } if (AudioDevice.getMaxOutputChannels(tarjetaSalidaID) == AudioDevice.getDefaultOutputDeviceID()) { tarjetaSalidaID = AudioDevice.getDefaultOutputDeviceID(); canalesDeSalida = AudioDevice.getMaxOutputChannels( tarjetaSalidaID ); } } try { Synth.requestVersion( 142 ); Synth.initialize(); Synth.start( 0, Synth.DEFAULT_FRAME_RATE, tarjetaEntradaID, canalesDeEntrada, tarjetaSalidaID, canalesDeSalida ); } catch (SynthException e) { SynthAlert.showError(this,e); } entrada = new ChannelIn(0); entrada.start(); salidas = new ChannelOut[8]; mezcladoras = new SynthMixer[8]; for (int i = 0; i < 8; i++) { salidas[i] = new ChannelOut(i); salidas[i].start(); mezcladoras[i] = new SynthMixer(1,1); mezcladoras[i].start(); mezcladoras[i].setGain(0, 0, 1.0); mezcladoras[i].connectInput(0, entrada.output, 0); mezcladoras[i].connectOutput(0, salidas[i].input, 0); } } void manejadorDeValores(double ejeX, double ejeY, double ejeZ) { mezcladoras[0].setGain(0,0, Math.abs(ejeX - 1) * ejeY * ejeZ); mezcladoras[1].setGain(0,0, Math.abs(ejeX - 1) * Math.abs(ejeY - 1) * ejeZ); mezcladoras[2].setGain(0,0, ejeX * Math.abs(ejeY - 1) * ejeZ); mezcladoras[3].setGain(0,0, ejeX * ejeY * ejeZ); mezcladoras[4].setGain(0,0, Math.abs(ejeX - 1) * ejeY * Math.abs(ejeZ - 1)); mezcladoras[5].setGain(0,0, Math.abs(ejeX - 1) * Math.abs(ejeY - 1) * Math.abs(ejeZ - 1)); mezcladoras[6].setGain(0,0, ejeX * Math.abs(ejeY - 1) * Math.abs(ejeZ - 1)); mezcladoras[7].setGain(0,0, ejeX * ejeY * Math.abs(ejeZ - 1)); etiVal1.setText(Integer.toString((int)((Math.abs(ejeX - 1) * ejeY * ejeZ)* 100))); etiVal2.setText(Integer.toString((int)((Math.abs(ejeX - 1) * Math.abs(ejeY - 1) * ejeZ)* 100))); etiVal3.setText(Integer.toString((int)((ejeX * Math.abs(ejeY - 1) * ejeZ)* 100))); etiVal4.setText(Integer.toString((int)((ejeX * ejeY * ejeZ)* 100))); etiVal5.setText(Integer.toString((int)((Math.abs(ejeX - 1) * ejeY * Math.abs(ejeZ - 1))* 100))); etiVal6.setText(Integer.toString((int)((Math.abs(ejeX - 1) * Math.abs(ejeY - 1) * Math.abs(ejeZ - 1))* 100))); etiVal7.setText(Integer.toString((int)((ejeX * Math.abs(ejeY - 1) * Math.abs(ejeZ - 1))* 100))); etiVal8.setText(Integer.toString((int)((ejeX * ejeY * Math.abs(ejeZ - 1))* 100))); } public double rectificador (double valor) { valor = valor / tamDeCanvas; return valor; } public void actualizadorZ (double valorZ) { System.out.println(valorZ); valActZ = valorZ / 9; AreaDeAltura.getGraphics().fill3DRect(0, (int)(tamDeCanvas / 9 * valorZ), tamDeCanvas / 5, (int)(tamDeCanvas - (tamDeCanvas / 9 * valorZ)), false); AreaDeAltura.repaint(0, 0, tamDeCanvas / 5, (int)(tamDeCanvas / 9 * valorZ)); manejadorDeValores(valActX, valActY, valActZ); } public void mouseDragged(MouseEvent e) { Object source = e.getSource(); if (source == AreaDeMov) { int x = e.getX(); if (x < 0) x = 0; if (x > tamDeCanvas) x = tamDeCanvas; int y = e.getY(); if (y < 0) y = 0; if (y > tamDeCanvas) y = tamDeCanvas; if (numMov == 5) { AreaDeMov.repaint(); numMov = 0; } AreaDeMov.getGraphics().fillOval(x -10, y - 10, 20, 20); numMov = numMov + 1; valActX = rectificador(x); valActY = rectificador(y); manejadorDeValores(valActX, valActY, valActZ); } if (source == AreaDeAltura) { int z = e.getY(); if (z < 0) z = 0; if (z > tamDeCanvas) z = tamDeCanvas; AreaDeAltura.getGraphics().fill3DRect(0, z, tamDeCanvas / 5, tamDeCanvas - z, true); AreaDeAltura.repaint(0, 0, tamDeCanvas / 5, z); valActZ = rectificador(z); manejadorDeValores(valActX, valActY, valActZ); } } public void mousePressed(MouseEvent e) { Object source = e.getSource(); if (source == AreaDeMov) { AreaDeMov.repaint(); AreaDeMov.getGraphics().fillOval(e.getX()-10 , e.getY()-10, 20, 20); valActX = rectificador(e.getX()); valActY = rectificador(e.getY()); manejadorDeValores(valActX, valActY, valActZ); } if (source == AreaDeAltura) { AreaDeAltura.getGraphics().fill3DRect(0, e.getY(), tamDeCanvas / 5, tamDeCanvas - e.getY(), true); AreaDeAltura.repaint(0, 0, tamDeCanvas / 5, e.getY()); valActZ = rectificador(e.getY()); manejadorDeValores(valActX, valActY, valActZ); } } public void mouseReleased(MouseEvent e) { Object source = e.getSource(); if (source == AreaDeMov) { int x = e.getX(); if (x < 0) x = 0; if (x > tamDeCanvas) x = tamDeCanvas; int y = e.getY(); if (y < 0) y = 0; if (y > tamDeCanvas) y = tamDeCanvas; AreaDeMov.getGraphics().fillOval(x -10, y - 10, 20, 20); valActX = rectificador(x); valActY = rectificador(y); manejadorDeValores(valActX, valActY, valActZ); } if (source == AreaDeAltura) { int z = e.getY(); if (z < 0) z = 0; if (z > tamDeCanvas) z = tamDeCanvas; AreaDeAltura.getGraphics().fill3DRect(0, z, tamDeCanvas / 5, tamDeCanvas - z, true); AreaDeAltura.repaint(0, 0, tamDeCanvas / 5, z); valActZ = rectificador(z); manejadorDeValores(valActX, valActY, valActZ); } requestFocus(); } public void keyPressed(KeyEvent e) { double k = (double)e.getKeyChar() - 48; if (k < 10 && k >= 0) actualizadorZ(k); } public void keyTyped(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public void mouseMoved(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited (MouseEvent e) { } }