/* * JFugue - API for Music Programming * Copyright (C) 2003-2008 David Koelle * * http://www.jfugue.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ package org.jfugue; import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MidiDevice; import javax.sound.midi.MidiMessage; import javax.sound.midi.MidiSystem; import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.Receiver; import javax.sound.midi.Sequence; import javax.sound.midi.ShortMessage; /** * Represents an attached MIDI device, such as a keyboard - use this class to * send MIDI from your JFugue program to a keyboard or sythesizer. This class * uses javax.sound.MidiDevice, but is not derived from javax.sound.MidiDevice. * * @author David Koelle * @version 3.0 */ public class DeviceThatWillReceiveMidi { private MidiDevice device; private Receiver receiver; /** * Creates a new DeviceThatWillReceiveMidi using JFugue's Intelligent Device * Resolver to pick the most likely device to open. * * @throws MidiUnavailableException */ public DeviceThatWillReceiveMidi() throws MidiUnavailableException { this.device = IntelligentDeviceResolver.selectReceiverDevice(); init(); } public DeviceThatWillReceiveMidi(MidiDevice.Info info) throws MidiUnavailableException { this.device = MidiSystem.getMidiDevice(info); init(); } private void init() throws MidiUnavailableException { if (!(device.isOpen())) { device.open(); } this.receiver = device.getReceiver(); } /** * Send the given sequence to the MIDI device - use this to send MIDI files * to your keyboard! * * @param sequence * The sequence to send to the MIDI device */ public void sendSequence(Sequence sequence) { TimeFactor.sortAndDeliverMidiMessages(sequence, new MidiMessageRecipient() { @Override public void messageReady(MidiMessage message, long timestamp) { receiver.send(message, -1); } }); // Send messages to turn all controllers and all notes off for all // tracks (channels) ShortMessage allControllersOff = new ShortMessage(); ShortMessage allNotesOff = new ShortMessage(); for (byte track = 0; track < 16; track++) { try { allControllersOff.setMessage(ShortMessage.CONTROL_CHANGE, track, (byte) 121, (byte) 0); receiver.send(allControllersOff, -1); allNotesOff.setMessage(ShortMessage.CONTROL_CHANGE, track, (byte) 123, (byte) 0); receiver.send(allNotesOff, -1); } catch (InvalidMidiDataException e) { throw new JFugueException( JFugueException.ERROR_PLAYING_MUSIC + e); } } } public void close() { receiver.close(); device.close(); } public Receiver getReceiver() { return this.receiver; } }