import java.awt.*; import java.applet.*; public class beats extends Applet { public Image offScreenImage; mycan c; public int f1 = 57; public int f2 = 50; public void init() { super.init(); setBackground(Color.white); offScreenImage = createImage(500,180); c = new mycan(this,offScreenImage); //{{INIT_CONTROLS setLayout(new BorderLayout(0,0)); resize(500,200); panel1 = new java.awt.Panel(); panel1.setLayout(new GridLayout(0,6,0,0)); panel1.reshape(0,150,500,50); add("South", panel1); f1Scroll = new java.awt.Scrollbar(Scrollbar.HORIZONTAL,57,0,1,100); f1Scroll.reshape(0,0,83,50); panel1.add(f1Scroll); label1 = new java.awt.Label("f1 = 57 Hz"); label1.reshape(83,0,83,50); panel1.add(label1); labelBlank1 = new java.awt.Label(""); labelBlank1.reshape(166,0,83,50); panel1.add(labelBlank1); f2Scroll = new java.awt.Scrollbar(Scrollbar.HORIZONTAL,50,0,1,100); f2Scroll.reshape(249,0,83,50); panel1.add(f2Scroll); label2 = new java.awt.Label("f2 = 50 Hz"); label2.reshape(332,0,83,50); panel1.add(label2); //}} add("Center",c); } public boolean handleEvent(Event evt) { if(evt.target == f1Scroll){ f1 = f1Scroll.getValue(); label1.setText("f1 = "+f1+" Hz"); c.repaint(); return true; } if(evt.target == f2Scroll){ f2 = f2Scroll.getValue(); label2.setText("f2 = "+f2+" Hz"); c.repaint(); return true; } return super.handleEvent(evt); } //{{DECLARE_CONTROLS java.awt.Panel panel1; java.awt.Scrollbar f1Scroll; java.awt.Label label1; java.awt.Label labelBlank1; java.awt.Scrollbar f2Scroll; java.awt.Label label2; //}} } class mycan extends java.awt.Canvas { public double scale=0.003; public int phase = 0; public int x0 = 0; Image offScreenImage; beats a; public mycan(beats myApplet, Image myImage) { offScreenImage = myImage; a = myApplet; resize(500,180); repaint(); } public void update(Graphics g){ Graphics offg = offScreenImage.getGraphics(); paint(offg); g.drawImage(offScreenImage, 0, 0, this); } public void paint(Graphics g){ int y1 = 0; g.setColor(Color.white); // background g.fillRect(0,0,500,180); g.setColor(Color.black); // axis g.drawLine(0,90,500,90); /* g.setColor(Color.pink); // envelope for (int i=1; i<500; i++) { int y = 90 + (int)(80.0*Math.cos((phase+i)*scale*(a.f1-a.f2))); if (i>1) { g.drawLine(i-1,y1,i,y); g.drawLine(i-1,180-y1,i,180-y); } y1 = y; } */ g.setColor(Color.red); // beats for (int i=1; i<500; i++) { int y = 90 + (int)(80.0*Math.cos((-phase+i)*scale*(a.f1-a.f2)) *Math.sin((-phase+i)*scale*(a.f1+a.f2))); if (i>1) g.drawLine(i-1,y1,i,y); y1 = y; } } public boolean handleEvent(Event evt){ if (evt.target == this && evt.id == Event.MOUSE_DOWN) { x0 = evt.x; return true; } if (evt.target == this && evt.id == Event.MOUSE_DRAG) { phase = evt.x - x0; repaint(); return true; } return false; } }