package vafusion.gui; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JComponent; import jm.audio.Instrument; import jm.music.data.CPhrase; import jm.music.data.Note; import jm.music.data.Part; import jm.music.data.Score; import jm.util.Play; import vafusion.inst.PluckInst; @SuppressWarnings("serial") public class PianoComponent extends JComponent{ private vafusion.data.Piano piano; private vafusion.data.Score score; private Pianel parent; PianoComponent(int x, int y, int height, int width, Pianel parent){ this.piano = new vafusion.data.Piano(x, y, height, width, 60); this.parent = parent; for(KeyComponent k : piano.getBlackKeys()) this.add(k); for(KeyComponent k : piano.getWhiteKeys()) this.add(k); //this.addMouseMotionListener(parent.charRecog.createMouseMotionListener()); this.addMouseListener(new MouseListener(){ @Override public void mouseClicked(MouseEvent arg0) { PianoComponent.this.parent.charRecog.dispatchEvent(arg0); PianoComponent.this.parent.staff.dispatchEvent(arg0); } @Override public void mouseEntered(MouseEvent arg0) {} @Override public void mouseExited(MouseEvent arg0) {} @Override public void mousePressed(MouseEvent arg0) { KeyComponent k = piano.getKeyComponentAt(arg0.getX(), arg0.getY()); if(k != null && arg0.getX() < PianoComponent.this.getX() + PianoComponent.this.getWidth() && arg0.getY() < PianoComponent.this.getY() + PianoComponent.this.getHeight()){ System.out.println("mouse press (Piano): x: " + arg0.getX() + " y: " + arg0.getY()); k.press(); PianoComponent.this.repaint(); } else { //not a key press //arg0.consume(); PianoComponent.this.parent.charRecog.dispatchEvent(arg0); PianoComponent.this.parent.staff.dispatchEvent(arg0); } } @Override public void mouseReleased(MouseEvent arg0) { KeyComponent k = piano.getKeyComponentAt(arg0.getX(), arg0.getY()); if(k != null){ System.out.println("mouse release (Piano): x: " + arg0.getX() + " y: " + arg0.getY()); k.unpress(); PianoComponent.this.repaint(); /* * just unpress ALL the keys. this will fix that stuck key bug. Also, clear the current chord. * */ for(KeyComponent kc : piano.getBlackKeys()) kc.unpress(); for(KeyComponent kc : piano.getWhiteKeys()) kc.unpress(); PianoComponent.this.repaint(); } else { PianoComponent.this.parent.charRecog.dispatchEvent(arg0); PianoComponent.this.parent.staff.dispatchEvent(arg0); } } }); } @Override public void paint(Graphics g){ Graphics2D g2d = (Graphics2D) g; g2d.setColor(Color.WHITE); g2d.fillRect(piano.getX(), piano.getY(), piano.getWidth(), piano.getHeight()); g2d.setColor(Color.black); for(KeyComponent k : piano.getWhiteKeys()){ k.paint(g2d); } for(KeyComponent k : piano.getBlackKeys()){ k.paint(g2d); } if(!piano.getCurrentChord().isEmpty()) { CPhrase chord = new CPhrase(); chord.addChord(piano.getCurrentChord().toArray(new Note[0])); Part p = new Part("Piano", 0, 0); p.addCPhrase(chord); Instrument[] insts = new PluckInst[1]; insts[0] = new PluckInst(2000); Score s = new Score(p); try { Play.midi(s, false); } catch(IllegalThreadStateException e) { piano.getCurrentChord().removeAll(piano.getCurrentChord()); } } } public vafusion.data.Piano getPiano(){ return piano; } public vafusion.data.Score getScore() { return score; } public void setScore(vafusion.data.Score score) { this.score = score; } }