package com.frinika.sequencer.gui.pianoroll; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.Receiver; import javax.sound.midi.ShortMessage; import javax.swing.Timer; import com.frinika.project.ProjectContainer; import com.frinika.sequencer.model.MidiLane; import com.frinika.sequencer.model.MidiPart; import com.frinika.sequencer.model.NoteEvent; public class AudioFeedBack implements ActionListener { NoteEvent ev=null; Receiver recv = null; private int chan; private int pitch; Timer timer; ProjectContainer project; public AudioFeedBack(ProjectContainer project) { this.project=project; timer=new Timer(0,this); timer.setRepeats(false); } public void select(NoteEvent ev) { off(); this.ev=ev; on(); } public void on() { MidiPart part = ev.getPart(); MidiLane lane = ((MidiLane) (part.getLane())); chan = lane.getMidiChannel(); if (chan < 0 ) return; recv = lane.getReceiver(); if (recv == null) return; pitch = ev.getNote(); ShortMessage shm = new ShortMessage(); try { shm.setMessage(ShortMessage.NOTE_ON, chan, lane.mapNote(pitch), ev.getVelocity()); } catch (InvalidMidiDataException e) { e.printStackTrace(); } recv.send(shm, -1); int millis = (int) ((60000.0*ev.getDuration()/project.getSequence().getResolution())/project.getSequencer().getTempoInBPM()); timer.setInitialDelay(millis); timer.restart(); } public void off() { timer.stop(); if (recv == null) return; ShortMessage shm = new ShortMessage(); MidiPart part = ev.getPart(); MidiLane lane = ((MidiLane) (part.getLane())); try { shm.setMessage(ShortMessage.NOTE_ON, chan, lane.mapNote(pitch), 0); } catch (InvalidMidiDataException e) { e.printStackTrace(); } recv.send(shm, -1); recv = null; } public void actionPerformed(ActionEvent arg0) { off(); } }