// http://www.hakkaku.net/articles/20071019-56 ---------------- // Receiverを使う ** import javax.sound.midi.*; public class TestReceiver { // メイン public static void main(String[] args) throws Exception { Receiver receiver = MidiSystem.getReceiver(); // send receiver.send(NoteOn(60, 120), 1000); // c receiver.send(NoteOn(64, 120), 1000); // e receiver.send(NoteOn(67, 120), 1000); // g // sleep Thread.sleep(1500); receiver.close(); } // 発音用のメッセージを生成する public static ShortMessage NoteOn(int noteno, int velocity) throws Exception { ShortMessage sm = new ShortMessage(); sm.setMessage(ShortMessage.NOTE_ON, noteno, velocity); return sm; } } // http://www.ruimo.com/howto/java/midi/ ---------------- // Receiverを使う public class ReceiverSample { // メイン public static void main(String[] args) throws Exception { Receiver receiver = null; try { receiver = MidiSystem.getReceiver(); ShortMessage noteOn1 = new ShortMessage(); noteOn1.setMessage(ShortMessage.NOTE_ON, 60, 90); receiver.send(noteOn1, 1); ShortMessage noteOn2 = new ShortMessage(); noteOn2.setMessage(ShortMessage.NOTE_ON, 62, 90); receiver.send(noteOn2, 1000L * 1000); Thread.sleep(1100); } finally { if (receiver != null) receiver.close(); } } } // ******************************************************************************** // http://www.hakkaku.net/articles/20071019-56 ---------------- // Sequencerを使う ** import javax.sound.midi.*; public class TestSequencer { public static void main(String[] args) throws Exception { // 演奏データの作成 Sequence sequence = new Sequence(Sequence.PPQ, 96); Track track = sequence.createTrack(); track.add(NoteOn ( 0, 60, 120)); track.add(NoteOff( 90, 60, 0)); track.add(NoteOn ( 96, 62, 120)); track.add(NoteOff(188, 62, 0)); track.add(NoteOn (192, 64, 120)); track.add(NoteOff(282, 64, 0)); // 演奏 Sequencer sequencer = MidiSystem.getSequencer(); sequencer.open(); sequencer.setSequence(sequence); sequencer.start(); while (sequencer.isRunning()) Thread.sleep(100); sequencer.close(); } // イベントの作成 public static MidiEvent NoteOn(int time, int noteno, int velocity) throws Exception { ShortMessage sm = new ShortMessage(); sm.setMessage(ShortMessage.NOTE_ON, noteno, velocity); return new MidiEvent(sm, time); } public static MidiEvent NoteOff(int time, int noteno, int velocity) throws Exception { ShortMessage sm = new ShortMessage(); sm.setMessage(ShortMessage.NOTE_OFF, noteno, velocity); return new MidiEvent(sm, time); } } // http://www.ruimo.com/howto/java/midi/ ---------------- // Sequencerを使う public class Test { public static void main(String[] args) throws Exception { Sequencer sequencer = null; try { sequencer = MidiSystem.getSequencer(); sequencer.open(); Sequence seq = new Sequence(Sequence.PPQ, 240); Track track = seq.createTrack(); MetaMessage tempo = new MetaMessage(); tempo.setMessage(0x51, new byte[] {0x07, (byte)0xa1, 0x20}, 3); track.add(new MidiEvent(tempo, 0)); ShortMessage noteOn1 = new ShortMessage(); noteOn1.setMessage(ShortMessage.NOTE_ON, 60, 64); track.add(new MidiEvent(noteOn1, 0)); ShortMessage noteOn2 = new ShortMessage(); noteOn2.setMessage(ShortMessage.NOTE_OFF, 60, 0); track.add(new MidiEvent(noteOn2, 480)); sequencer.setSequence(seq); sequencer.start(); while (sequencer.isRunning()) Thread.sleep(100); } finally { if (sequencer != null && sequencer.isOpen()) sequencer.close(); } } } // ******************************************************************************** // http://dlc.sun.com.edgesuite.net/jdk/jdk-api-localizations/jdk-api-ja/builds/latest/html/ja/technotes/guides/sound/programmer_guide/chapter9.html ---------------- // デバイスの取得 /* 別の例として、ユーザーを介在させずに、プログラムによってデバイスを選択する方法について考えましょう。ほとんどの音色を同時に再生できるシンセサイザを取得するとします。 上記のように、すべての MidiDevice.Info オブジェクトを繰り返し処理して、デバイスがシンセサイザであることを確認できた時点で、Synthesizer の getMaxPolyphony メソッドを呼び出して機能を問い合わせます。次の節で示すように、最大のポリフォニー (同時に演奏できる音) を保持するシンセサイザを予約します。ユーザーにシンセサイザの選択を求めない場合でも、ユーザーへの参考情報として、選択した MidiDevice.Info オブジェクトから返る文字列を表示することもできます。*/ // Obtain information about all the installed synthesizers. Vector synthInfos; MidiDevice device; MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo(); for (int i = 0; i < infos.length; i++) { try { device = MidiSystem.getMidiDevice(infos[i]); } catch (MidiUnavailableException e) { // Handle or throw exception... } if (device instanceof Synthesizer) { synthInfos.add(infos[i]); } } // Now, display strings from synthInfos list in GUI. // デバイスのオープン /* 前の節では、インストールされているデバイスを取得する方法を示しました。ただし、デバイスはインストールされていても、利用できない場合があります。たとえば、別のアプリケーションプログラムが、排他的に使用している場合があります。 使用するプログラム用にデバイスを確実に予約するには、次のように MidiDevice の open メソッドを使用する必要があります。*/ if (!(device.isOpen())) { try { device.open(); } catch (MidiUnavailableException e) { // Handle or throw exception... } } // http://www.ruimo.com/howto/java/midi/ ---------------- // デバイスの取得 ** public class DeviceList { public static void main(String[] args) throws Exception { MidiDevice.Info[] info = MidiSystem.getMidiDeviceInfo(); System.err.println("There are " + info.length + " devices."); for (int i = 0; i < info.length; i++) { System.err.println("*** " + i + " ***"); System.err.println(" Description:" + info[i].getDescription()); System.err.println(" Name:" + info[i].getName()); System.err.println(" Vendor:" + info[i].getVendor()); MidiDevice device = MidiSystem.getMidiDevice(info[i]); if (device instanceof Sequencer) { System.err.println(" *** This is Sequencer."); } if (device instanceof Synthesizer) { System.err.println(" *** This is Synthesizer."); } System.err.println(); } } } // ******************************************************************************** // JFrameTest.java import java.awt.*; import java.awt.event.*; import javax.swing.*; class JFrameTest extends JFrame implements ActionListener { JFrameTest() { getContentPane().setLayout(new FlowLayout()); // Button JButton b1 = new JButton("OK"); b1.addActionListener(this); getContentPane().add(b1); // ComboBox JComboBox cb = new JComboBox(); cb.addItem("ComboA"); cb.addItem("ComboB"); cb.addItem("ComboC"); cb.addActionListener(this); getContentPane().add(cb); // ScrollBar JScrollBar sb = new JScrollBar(JScrollBar.HORIZONTAL, 30, 5, 0, 105); sb.setPreferredSize(new Dimension(150, 17)); sb.addAdjustmentListener(this); getContentPane().add(sb); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("JFrameTest"); setSize(200, 120); setVisible(true); } public static void main(String[] args) { new JFrameTest(); } public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox)e.getSource(); System.out.println(cb.getSelectedItem()); } public void adjustmentValueChanged(AdjustmentEvent e) { JScrollBar sb = (JScrollBar)e.getSource(); System.out.println(sb.getValue()); } } // ******************************************************************************** // MenuTest.java import java.awt.*; import java.awt.event.*; class MenuTest extends Frame implements ActionListener, ItemListener { public static void main(String[] args) { new MenuTest(); } MenuTest() { setTitle("MenuTest"); setSize(200, 120); setLayout(new FlowLayout()); MenuBar menuBar = new MenuBar(); setMenuBar(menuBar); // [File] Menu menuFile = new Menu("File"); menuFile.addActionListener(this); menuBar.add(menuFile); // [File]-[Open] MenuItem menuOpen = new MenuItem("Open...", new MenuShortcut('O')); menuFile.add(menuOpen); // [File]-[----] menuFile.addSeparator(); // [File]-[Exit] MenuItem menuExit = new MenuItem("Exit"); menuFile.add(menuExit); // [View] Menu menuView = new Menu("View"); menuView.addActionListener(this); menuBar.add(menuView); // [View]-[Status Bar] CheckboxMenuItem menuStatusBar = new CheckboxMenuItem("Status Bar"); menuStatusBar.addItemListener(this); menuView.add(menuStatusBar); // [View]-[Size] Menu menuSize = new Menu("Size"); menuSize.addActionListener(this); menuView.add(menuSize); // [View]-[Size]-[Large] MenuItem menuSizeLarge = new MenuItem("Large"); menuSize.add(menuSizeLarge); // [View]-[Size]-[Small] MenuItem menuSizeSmall = new MenuItem("Small"); menuSize.add(menuSizeSmall); show(); } public void actionPerformed(ActionEvent e) { System.out.println(e.getActionCommand()); } public void itemStateChanged(ItemEvent e) { CheckboxMenuItem menu = (CheckboxMenuItem)e.getSource(); if (menu.getState()) { System.out.println(menu.getLabel() + " SELECTED"); } else { System.out.println(menu.getLabel() + " DESELECTED"); } } }