import java.util.*; import java.awt.*; import java.applet.Applet; import java.awt.event.*; import com.softsynth.jsyn.*; import com.softsynth.jsyn.util.*; import com.softsynth.jmsl.*; import com.softsynth.jsyn.view102.*; import java.io.*; public class Grabadora_azar extends Applet implements ActionListener, CustomFaderListener { //rangos int densidadMax = 50; int numTopeAudios = 25; int numProgramas = 15; double duracionMinimaAudio = 2; double duracionTopeAudio = 25; double intensidadMinimaAudio = 0.2; double intensidadTopeAudio = 1.0; // valores iniciales int densidad = 40; int numMaxAudios = 8; double duracionMaximaAudio = 10; double intensidadMaximaAudio = 0.8; Panel sur; Label etiNumInstrumentos; Label etiNumSalidas; Label etiNumMinutos; Label etiDensidad; Label etiNumAudios; Label etiDuracion; Label etiIntensidad; TextField texDensidad; TextField texNumAudios; TextField texDuracion; TextField texIntensidad; Choice lisNumInst; Choice lisNumSalidas; Choice lisNumMinutos; Button botConfigurar; Button botGrabacion[]; Button botProgramas[]; Button botSalvaProg; Button botActivaProc; CustomFader faderDensidad; CustomFader faderNumAudios; CustomFader faderDuracionAudio; CustomFader faderIntensidadAudio; int numeroDeTarjetas; int tarjetaEntradaID; int tarjetaSalidaID; int canalesDeEntrada; int canalesDeSalida; int numAudiosGrab = 0; int numAudiosSonando = 0; int distanciaMinima = (int)Synth.DEFAULT_FRAME_RATE * 2; boolean estadoSalvar = false; SynthSample audios[]; SampleReader_16F1 lectores[]; SampleWriter_16F1 grabadores[]; ChannelOut salidas[]; ChannelIn entradas[]; BusReader lectorPuertos[]; CentralDeAudio central; Programas programas; /* Can be run as either an application or as an applet. */ public static void main(String args[]) { Grabadora_azar applet = new Grabadora_azar(); AppletFrame frame = new AppletFrame("Grabadora_azar", applet); frame.setSize(500,500); frame.show(); /* Begin test after frame opened so that DirectSound will use Java window. */ frame.test(); frame.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { Synth.stopEngine(); System.exit(0); } }); } //Setup synthesis. public void start() { //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 ); } } // Procesos para leer y/o crear el archivo .dat para los valores de los programas try { programas = new Programas(numProgramas); } catch( IOException e ) { SynthAlert.showError(this,e); } //System.out.println("ID de tarjeta de entrada = " + tarjetaEntradaID + " ID de tarjeta de salida = " + tarjetaSalidaID + " canalesDeEntrada = " + canalesDeEntrada + " canalesDeSalida = " + canalesDeSalida); setLayout (new BorderLayout()); Panel n = new Panel(); n.setLayout(new GridLayout(4,2)); etiNumInstrumentos = new Label("Numero de Instrumentos"); lisNumInst = new Choice(); for (int i = 0; i < canalesDeEntrada; i++) { lisNumInst.addItem(Integer.toString(i + 1) + " Instrumento(s)"); } etiNumSalidas = new Label("Número de Salidas"); lisNumSalidas = new Choice(); for (int i = 0; i < canalesDeSalida; i++) { lisNumSalidas.addItem(Integer.toString(i + 1) + " Canal(es) de salida"); } etiNumMinutos = new Label("Número de minutos totales de la pieza"); lisNumMinutos = new Choice(); for (int i = 0; i < 15; i ++) { lisNumMinutos.addItem(Integer.toString(i + 1) + " Minutos"); } botConfigurar = new Button("Configurar"); botConfigurar.addActionListener(this); botActivaProc = new Button("Activar proceso"); botActivaProc.addActionListener(this); botActivaProc.setEnabled(false); n.add(etiNumInstrumentos); n.add(lisNumInst); n.add(etiNumSalidas); n.add(lisNumSalidas); n.add(etiNumMinutos); n.add(lisNumMinutos); n.add(botConfigurar); n.add(botActivaProc); Panel c = new Panel(); c.setLayout(new GridLayout(2,1)); Panel ca = new Panel(); ca.setLayout(new GridLayout(2,1)); Panel ca1 = new Panel(); ca1.setLayout(new GridLayout(numProgramas / 3,3)); botProgramas = new Button[numProgramas]; for (int i = 0; i < numProgramas; i++) { botProgramas[i] = new Button("Programa " + (i + 1)); botProgramas[i].addActionListener(this); botProgramas[i].setEnabled(false); ca1.add(botProgramas[i]); } Panel ca2 = new Panel(); botSalvaProg = new Button("salvar programa"); botSalvaProg.addActionListener(this); botSalvaProg.setEnabled(false); ca2.add(botSalvaProg); ca.add(ca1); ca.add(ca2); Panel cb = new Panel(); cb.setLayout(new GridLayout(4,3)); etiDensidad = new Label("Densidad sonora"); etiNumAudios = new Label("Cantidad máxima de audios"); etiDuracion = new Label("Duración máxima de audio"); etiIntensidad = new Label("Intensidad máxima de audio"); faderDensidad = new CustomFader(CustomFader.HORIZONTAL, densidad, 1, 1, densidadMax); faderDensidad.addCustomFaderListener( this ); faderDensidad.setEnabled(false); faderNumAudios = new CustomFader(CustomFader.HORIZONTAL, numMaxAudios, 1, 1, numTopeAudios); faderNumAudios.addCustomFaderListener( this ); faderNumAudios.setEnabled(false); faderDuracionAudio = new CustomFader(CustomFader.HORIZONTAL, (int)duracionMaximaAudio, 1, (int)duracionMinimaAudio, (int)duracionTopeAudio); faderDuracionAudio.addCustomFaderListener( this ); faderDuracionAudio.setEnabled(false); faderIntensidadAudio = new CustomFader(CustomFader.HORIZONTAL, (int)(intensidadMaximaAudio * 100), 1, (int) (intensidadMinimaAudio * 100), (int) (intensidadTopeAudio * 100)); faderIntensidadAudio.addCustomFaderListener( this ); faderIntensidadAudio.setEnabled(false); texDensidad = new TextField(Integer.toString(densidad), 3); texDensidad.setEnabled(false); texNumAudios = new TextField(Integer.toString(numMaxAudios), 3); texNumAudios.setEnabled(false); texDuracion = new TextField(Integer.toString((int)duracionMaximaAudio), 3); texDuracion.setEnabled(false); texIntensidad = new TextField(Integer.toString((int)(intensidadMaximaAudio * 100)), 3); texIntensidad.setEnabled(false); cb.add(etiDensidad); cb.add(faderDensidad); cb.add(texDensidad); cb.add(etiNumAudios); cb.add(faderNumAudios); cb.add(texNumAudios); cb.add(etiDuracion); cb.add(faderDuracionAudio); cb.add(texDuracion); cb.add(etiIntensidad); cb.add(faderIntensidadAudio); cb.add(texIntensidad); c.add(ca); c.add(cb); sur = new Panel(); sur.setLayout(new GridLayout((lisNumInst.getSelectedIndex() + 1) / 2,2)); add("North", n); add("Center", c); add("South", sur); /* Rutinas para activar el audio */ activarAudio(); /* Synchronize Java display. */ getParent().validate(); getToolkit().sync(); //Generador de valores aleatorios JMSLRandom.randomize(); } void activarAudio() { try { // Make sure we are using the necessary version of JSyn Synth.requestVersion( 142 ); Synth.initialize(); Synth.start( 0, Synth.DEFAULT_FRAME_RATE, tarjetaEntradaID, canalesDeEntrada, tarjetaSalidaID, canalesDeSalida ); //System.out.println("Sistema de audio inicializado"); } catch (SynthException e) { SynthAlert.showError(this,e); } } void constructorDeMateriales() { botConfigurar.setEnabled(false); lisNumInst.setEnabled(false); lisNumSalidas.setEnabled(false); lisNumMinutos.setEnabled(false); botSalvaProg.setEnabled(true); for (int i = 0; i < numProgramas; i++) { botProgramas[i].setEnabled(true); } faderDensidad.setEnabled(true); faderNumAudios.setEnabled(true); faderDuracionAudio.setEnabled(true); faderIntensidadAudio.setEnabled(true); //System.out.println(Integer.toString(lisNumInst.getSelectedIndex() + 1) + " " + Integer.toString(lisNumSalidas.getSelectedIndex() + 1)); entradas = new ChannelIn[lisNumInst.getSelectedIndex() + 1]; grabadores = new SampleWriter_16F1[lisNumInst.getSelectedIndex() + 1]; audios = new SynthSample[lisNumInst.getSelectedIndex() + 1]; botGrabacion = new Button[lisNumInst.getSelectedIndex() + 1]; for (int i = 0; i < lisNumInst.getSelectedIndex() + 1; i++) { entradas[i] = new ChannelIn(i); entradas[i].start(); grabadores[i] = new SampleWriter_16F1(); grabadores[i].start(); entradas[i].output.connect(grabadores[i].input); audios[i] = new SynthSample( (int) Synth.DEFAULT_FRAME_RATE * 60 * (lisNumMinutos.getSelectedIndex() + 1)); botGrabacion[i] = new Button("grabar instrumento No." + (i + 1)); botGrabacion[i].addActionListener(this); botGrabacion[i].setEnabled(false); sur.add(botGrabacion[i]); } botGrabacion[0].setEnabled(true); botActivaProc.setEnabled(true); salidas = new ChannelOut[lisNumSalidas.getSelectedIndex() + 1]; lectorPuertos = new BusReader[lisNumSalidas.getSelectedIndex() + 1]; for (int i = 0; i < lisNumSalidas.getSelectedIndex() + 1; i++) { salidas[i] = new ChannelOut(i); salidas[i].start(); lectorPuertos[i] = new BusReader(); lectorPuertos[i].start(); lectorPuertos[i].output.connect(salidas[i].input); } validate(); } void prendeGrabadoras(int numDeGrab) { numAudiosGrab = numAudiosGrab + 1; botGrabacion[numDeGrab].setEnabled(false); grabadores[numDeGrab].samplePort.queue(audios[numDeGrab]); if (numDeGrab < lisNumInst.getSelectedIndex()) { botGrabacion[numDeGrab + 1].setEnabled(true); } validate(); } void activaProcesosAudio() { botActivaProc.setEnabled(false); central = new CentralDeAudio(); central.launch(JMSL.now()); } void controlProgramas(int numProg) { if (estadoSalvar == false) { System.out.println("voy a cargar el " + numProg); estadoSalvar = false; } else if (estadoSalvar == true) { System.out.println("voy a salvar el " + numProg); botSalvaProg.setBackground(Color.lightGray); estadoSalvar = false; } } void activaSalva() { botSalvaProg.setBackground(Color.red); estadoSalvar = true; } public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == botConfigurar) constructorDeMateriales(); for (int i = 0; i < lisNumInst.getSelectedIndex() + 1; i++) { if (source == botGrabacion[i]) prendeGrabadoras(i); } for (int i = 0; i < numProgramas; i++) { if (source == botProgramas[i]) controlProgramas(i); } if (source == botActivaProc) activaProcesosAudio(); if (source == botSalvaProg) activaSalva(); } public void customFaderValueChanged(Object fader, int value) { System.out.println("Value = " + value); if (fader == faderDensidad) { densidad = value; texDensidad.setText(Integer.toString(value)); } if (fader == faderNumAudios) { numMaxAudios = value; texNumAudios.setText(Integer.toString(value)); } if (fader == faderDuracionAudio) { duracionMaximaAudio = value; texDuracion.setText(Integer.toString(value)); } if (fader == faderIntensidadAudio) { intensidadMaximaAudio = value / 100; texIntensidad.setText(Integer.toString(value)); } } public void stop() { try { Synth.stopEngine(); } catch(SynthException e) { SynthAlert.showError(this,e); } } public class ReproductorAudio { SampleReader_16F1 lectorAudio; BusWriter escritorPuertos[]; EnvelopePlayer lectorEnvolvente; SynthEnvelope envolvente; SynthMixer mezcladora; int numeroSal; double ataque = 0.5; double decaemiento = 0.5; public ReproductorAudio (int numDeSalidas, int numAudioASonar, int lugarTiempo, int duracion, double volumen) { numeroSal = numDeSalidas; double[] amplitudes = { ataque , 1.0, (duracion / Synth.DEFAULT_FRAME_RATE) - ataque - decaemiento , 1.0, decaemiento, 0.0 }; lectorAudio = new SampleReader_16F1(); lectorAudio.start(); envolvente = new SynthEnvelope(3); envolvente.write(0, amplitudes, 0, 3); lectorEnvolvente = new EnvelopePlayer(); lectorEnvolvente.output.connect( 0, lectorAudio.amplitude, 0 ); lectorEnvolvente.start(); mezcladora = new SynthMixer(1, numDeSalidas); mezcladora.connectInput(0, lectorAudio.output, 0); mezcladora.setGain(0, JMSLRandom.choose(numDeSalidas) , volumen); mezcladora.start(); escritorPuertos = new BusWriter[numDeSalidas]; for (int i = 0; i < numDeSalidas; i++) { escritorPuertos[i] = new BusWriter(); mezcladora.connectOutput(i, escritorPuertos[i].input, 0); escritorPuertos[i].busOutput.connect( lectorPuertos[i].busInput); escritorPuertos[i].start(); } lectorEnvolvente.envelopePort.queue( envolvente, 0, envolvente.getNumFrames()); lectorAudio.samplePort.queue(audios[numAudioASonar],lugarTiempo, duracion); BorraTodo borrador = new BorraTodo(); borrador.launch(JMSL.now() + (duracion / Synth.DEFAULT_FRAME_RATE) + .01); } class BorraTodo extends MusicJob { public double start (double playTime) throws InterruptedException { lectorAudio.stop(); lectorAudio.delete(); for (int i = 0; i < numeroSal; i++) { escritorPuertos[i].stop(); escritorPuertos[i].delete(); } lectorEnvolvente.stop(); lectorEnvolvente.delete(); envolvente.delete(); mezcladora.stop(); mezcladora.delete(); numAudiosSonando = numAudiosSonando - 1; return playTime; } } } public class CentralDeAudio extends MusicJob { public double start (double playTime) throws InterruptedException { setRepeats(172800); setRepeatPause(0.5); return playTime; } public double repeat (double playTime) throws InterruptedException { System.out.println(numAudiosSonando); if (0 == JMSLRandom.choose((densidadMax + 1) - densidad)) { if (numAudiosSonando < numMaxAudios) { int audioAzar = JMSLRandom.choose(numAudiosGrab); if ( grabadores[audioAzar].samplePort.getNumFramesMoved() > distanciaMinima) { numAudiosSonando = numAudiosSonando + 1; int cantidadDeSalidas = lisNumSalidas.getSelectedIndex() + 1; int lugarAzar = JMSLRandom.choose(grabadores[audioAzar].samplePort.getNumFramesMoved() - distanciaMinima); double intensidadAzar = JMSLRandom.choose(intensidadMinimaAudio, intensidadMaximaAudio); double duracionAzar = JMSLRandom.choose(duracionMinimaAudio, duracionMaximaAudio); int cuadrosAzar = (int) (duracionAzar * Synth.DEFAULT_FRAME_RATE); if (cuadrosAzar + lugarAzar >= audios[audioAzar].getNumFrames()) lugarAzar = lugarAzar - ((cuadrosAzar + lugarAzar) - audios[audioAzar].getNumFrames()); ReproductorAudio rp = new ReproductorAudio(cantidadDeSalidas, audioAzar, lugarAzar, cuadrosAzar, intensidadAzar); } } } return playTime; } } public class Programas { File archivo; FileInputStream entradaArchivo; BufferedReader lectorArchivo; StringTokenizer palabradores[]; String programas[]; public Programas(int numeroDeProg) throws IOException { archivo = new File("ProgramasUlises.dat"); entradaArchivo = new FileInputStream(archivo); lectorArchivo = new BufferedReader(new InputStreamReader(entradaArchivo)); programas = new String[numeroDeProg]; palabradores = new StringTokenizer[numeroDeProg]; if (archivo.exists()) { System.out.println("Si existe"); String linea_cadena; int i = 0; while ((linea_cadena = lectorArchivo.readLine()) != null && i < numeroDeProg) { programas[i] = linea_cadena; palabradores[i] = new StringTokenizer(programas[i]); System.out.println("Linea " + i + " " + programas[i]); i = i + 1; } } else { System.out.println("No existe"); } } } }