import jass.render.*; import jass.engine.*; import jass.patches.*; import jass.generators.*; import java.util.*; import java.awt.*; import javax.swing.*; public class TestColorSonificator extends Thread { public static void main (String args[]) throws Exception { new TestColorSonificator(args); } public TestColorSonificator(String args[]) throws Exception { boolean nativeSound = false; float srate = 44100.f; int bufferSize = 64; int bufferSizeJavaSound = 1024*10; int numRtAudioBuffersNative = 512/bufferSize; final ColorDisplay[] frameArray = new ColorDisplay[1]; if(args!=null && (args.length != 0)) { System.out.println("Usage: java TestColorSonificator"); return; } final SourcePlayer player = new SourcePlayer(bufferSize,bufferSizeJavaSound,srate); if(nativeSound) { player.setUseNativeSound(true); player.setNumRtAudioBuffersNative(numRtAudioBuffersNative); } final LowpassColorSonificator lowpassColorSonificator = new LowpassColorSonificator(srate,bufferSize); final RandOut input = new RandOut(bufferSize); final Mixer mixer = new Mixer(bufferSize,1); // 1 source lowpassColorSonificator.addSource(input); mixer.addSource(lowpassColorSonificator); player.addSource(mixer); mixer.setGain(0,1); // Add control panel // experimentally sounds best: min =3 (otherwise instabiliteis when rapidly changing f) maxd = 25 fudgepow = .35 String[] names = {"Hue ","Saturation ","Brightness ","mind ","maxd ","fudgePow ", "vel "}; final double[] val2 = {.5, .5, .5, 3, 25, .35, 1}; double[] min = {0, 0, 0, .5, 10, .1, 0}; double[] max = {1, 1, 1, 5, 50, 1, 2.5}; int nbuttons = 4; final boolean[] doLoop = {false}; Controller a_controlPanel = new Controller(new java.awt.Frame ("TestColorSonificator"),false,val2.length,nbuttons) { public void onButton(int k) { switch(k) { case 0: player.resetAGC(); break; case 1: { FileDialog fd = new FileDialog(new Frame(),"Save"); fd.setMode(FileDialog.SAVE); fd.setVisible(true); saveToFile(fd.getFile()); } break; case 2: { FileDialog fd = new FileDialog(new Frame(),"Load"); fd.setMode(FileDialog.LOAD); fd.setVisible(true); loadFromFile(fd.getFile()); break; } case 3: doLoop[0] = !doLoop[0]; if(doLoop[0]) { setButtonName("Loop off (is on)",k); } else { setButtonName("Loop on (is off)",k); } break; } } float rgb[] = new float[3]; float lch[] = new float[3]; public void onSlider(int k) { Color c=null; switch(k) { case 0: case 1: case 2: val2[k]=(float)this.val[k]; float pitch = (float)jass.utils.PitchMap.hue2pitch(val2[0]); lowpassColorSonificator.setHSB_V(pitch,(float)val2[1],(float)val2[2],(float)val2[6]); /* int rgbint = java.awt.Color.HSBtoRGB((float)val2[0],(float)val2[1],(float)val2[2]); int red = (rgbint >> 16) & 0xff; int green = (rgbint >> 8) & 0xff; int blue = (rgbint ) & 0xff; rgb[0] = (float)(red/255.); rgb[1] = (float)(green/255.); rgb[2] = (float)(blue/255.); lch = jass.utils.Color.Rgb2lch(rgb); lowpassColorSonificator.setHSB_V(lch[2],lch[1],lch[0],(float)val2[6]); */ c = Color.getHSBColor((float)val2[0],(float)val2[1],(float)val2[2]); if(frameArray[0] != null) { frameArray[0].setColor(c); frameArray[0].repaint(); } break; case 3: val2[k]=(float)this.val[k]; lowpassColorSonificator.setSaturationLimits((float)val2[3],(float)val2[4]); break; case 4: val2[k]=(float)this.val[k]; lowpassColorSonificator.setSaturationLimits((float)val2[3],(float)val2[4]); break; case 5: val2[k]=(float)this.val[k]; lowpassColorSonificator.setFudgePower((float)val2[k]); break; case 6: val2[k]=(float)this.val[k]; lowpassColorSonificator.setHSB_V((float)val2[0],(float)val2[1],(float)val2[2],(float)val2[k]); break; } } }; a_controlPanel.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { System.out.println("Close handler called"); player.stopPlaying(); try{ sleep(500); } catch(Exception e3) { } System.exit(0); } }); a_controlPanel.setSliders(val2,min,max,names); a_controlPanel.setButtonNames (new String[] {"Reset","Save","Load","Loop on (is off)"}); //UIManager.LookAndFeelInfo[] lfinfo = UIManager.getInstalledLookAndFeels(); //for(int i=0;i<lfinfo.length;i++) { // System.out.println(lfinfo[i].toString()); //} //UIManager.setLookAndFeel(new javax.swing.plaf.metal.MetalLookAndFeel()); //UIManager.setLookAndFeel(new com.sun.java.swing.plaf.windows.WindowsLookAndFeel()); //UIManager.setLookAndFeel(new com.sun.java.swing.plaf.motif.MotifLookAndFeel()); a_controlPanel.setVisible(true); for(int i=0;i<names.length;i++) { a_controlPanel.onSlider(i); } // display the color frameArray[0] = new ColorDisplay(); frameArray[0].setSize(new Dimension(640,400)); frameArray[0].setResizable(false); frameArray[0].setVisible(true); //frameArray[0].setLocationRelativeTo(a_controlPanel); player.start(); // loop hue... float hue =0,dhue = .01f; while(true) { if(doLoop[0]) { hue += dhue; if(hue>1) { hue -= 1; } val2[0] = hue; a_controlPanel.setSliders(val2,min,max,names); a_controlPanel.onSlider(0); // sethue } try { sleep(100); } catch(Exception e) { } } } } class ColorDisplay extends JFrame { private Color color; public void setColor(Color c) { color = c; } public void paint(Graphics g) { //System.out.println("Paint: "+color); g.setColor(color); Dimension dim = this.getSize(); g.fillRect(0,0,dim.width,dim.height); } }