• 追加された行はこの色です。
  • 削除された行はこの色です。
#navi(../)
*MIDIファイルの演奏 [#q50a5f5c]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2006-01-09~
更新日:&lastmod;
---
category: swing
folder: MidiSystem
title: MIDIファイルの演奏
tags: [Sound, MidiSystem]
author: aterai
pubdate: 2006-01-09T18:08:23+09:00
description: MidiSystemからSequencerを作成取得し、MIDIファイルを演奏します。
image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTP2Xw5rXI/AAAAAAAAAeo/3v8-ggh9ZBE/s800/MidiSystem.png
---
* 概要 [#summary]
`MidiSystem`から`Sequencer`を作成取得し、`MIDI`ファイルを演奏します。

#contents
#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTP2Xw5rXI/AAAAAAAAAeo/3v8-ggh9ZBE/s800/MidiSystem.png)

**概要 [#k362057e]
MidiSystemからSequencerを作成取得し、MIDIファイルを演奏します。
* サンプルコード [#sourcecode]
#code(link){{
URL url = getClass().getResource("Mozart_toruko_k.mid");
URL url = getClass().getResource("Mozart_toruko_k.mid");
SwingWorker<Void, Long> worker = new SwingWorker<Void, Long>() {
  private long tickPos;
  @Override protected Void doInBackground() throws InterruptedException {
    try (Sequencer sequencer = MidiSystem.getSequencer()) {
      sequencer.open();
      sequencer.setSequence(MidiSystem.getSequence(url));
      sequencer.addMetaEventListener(e -> {
        if (e.getType() == END_OF_TRACK) {
          publish(0L);
        }
      });
      EventQueue.invokeLater(() -> addListener(sequencer));
      while (sequencer.isOpen()) {
        updateTickPosition(sequencer);
      }
    } catch (InvalidMidiDataException | MidiUnavailableException | IOException ex) {
      ex.printStackTrace();
      publish(0L);
    } finally {
      System.out.println("try-with-resources: AutoCloseable");
    }
    return null;
  }
  // ...

http://terai.xrea.jp/swing/midisystem/screenshot.png
JButton start = new JButton("start");
start.addActionListener(e -> {
  sequencer.setTickPosition(tickPos);
  sequencer.start();
  initButtons(false);
});
}}

**サンプルコード [#s9901c5c]
 final Sequencer sequencer;
 try{
   sequencer = MidiSystem.getSequencer();
   sequencer.open();
   InputStream is = new BufferedInputStream(
     MainPanel.class.getResourceAsStream("Mozart_toruko_k.mid"));
   Sequence s = MidiSystem.getSequence(is);
   sequencer.setSequence(s);
 }catch(Exception e) {
   e.printStackTrace();
   return;
 }
 start = new JButton(new AbstractAction("start") {
   public void actionPerformed(ActionEvent ae) {
     sequencer.start();
   }
 });
* 解説 [#explanation]
`MidiSystem.getSequencer`メソッドで`Sequencer`を取得し、これに`MidiSystem.getSequence`メソッドで`MIDI`ファイルから生成した`Sequence`を設定します。

-[[サンプルを起動>http://terai.xrea.jp/swing/tabwidth/sample.jnlp]]
-[[jarファイル>http://terai.xrea.jp/swing/tabwidth/sample.jar]]
-[[ソース>http://terai.xrea.jp/swing/tabwidth/src.zip]]
`Sequencer#start()`メソッドで演奏を開始できます。

**解説 [#f3cdbcb2]
MidiSystem.getSequencerメソッドでSequencerを取得し、これにMidiSystem.getSequenceメソッドでMIDIファイルから生成したSequenceを設定します。
Sequencer.startメソッドで演奏を開始することができます。
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/sound/midi/MidiSystem.html MidiSystem (Java Platform SE 8)]
- [http://muimi.com/j/game/sound/ Javaでゲーム - サウンドメモ]
- [http://classic-midi.com/ クラシックMIDI ラインムジーク]
- [[Wavファイルの演奏>Swing/Sound]]
- [[Beep音を鳴らす>Swing/Beep]]
- [[AuditoryCuesでイベント音を設定する>Swing/AuditoryCues]]

**参考リンク [#h23d44e1]
-[[Javaでゲーム - サウンドメモ>http://muimi.com/j/game/sound/]]
-[[クラシックMIDI ラインムジーク>http://classic-midi.com/]]

**コメント [#u2657308]
* コメント [#comment]
#comment
#comment