2015-11-27 4 views
1

Я пытаюсь создать программу, которая может воспроизводить ноты на MIDI-клавиатуре. Я не мог заставить всю программу работать, но теперь я пытаюсь создать меньшее доказательство концептуальной программы, чтобы попытаться ее решить.Java Sound Midi Выход на аппаратную клавиатуру

Для этого я пытаюсь воспроизвести файл .mid на клавиатуре (A Casio CTK-3000), MidiPlay может играть на клавиатуре. Проблема в том, что когда я пытаюсь играть на клавиатуре в своей программе, она просто ничего не играет. Мой код ниже:

public class midiOut { 

    public static void main(String[] args) throws IOException, MidiUnavailableException, InvalidMidiDataException 
    { 

     while(true) { 
      //List Midi Devices 
      MidiDevice.Info[] midiInfo = MidiSystem.getMidiDeviceInfo(); 
      int i = 0; 
      for (MidiDevice.Info info : midiInfo) { 
       System.out.println(i + ": " +info.getName()); 
       i+=1; 
      } 
      //Select Device 
      Scanner in = new Scanner(System.in); 
      int input = in.nextInt(); 

      if(input == -1) 
      { 
       break; 
      } 
      //Get Device and Open it 
      MidiDevice selectedDevice = MidiSystem.getMidiDevice(midiInfo[input]); 
      System.out.println(selectedDevice.getDeviceInfo().getName()); 
      selectedDevice.open(); 
      //Get Sequencer and Receiver, load the File and start playing 
      Receiver receiver = selectedDevice.getReceiver(); 
      Sequencer sequencer = MidiSystem.getSequencer(); 
      sequencer.getTransmitter().setReceiver(receiver); 
      sequencer.open(); 
      sequencer.setSequence(MidiSystem.getSequence(new File("C:\\Users\\Harris Mirza\\Downloads\\PennyLane.mid"))); 
      sequencer.start(); 

      selectedDevice.close(); 

     } 
    } 
} 

ответ

1

Реализованный моя ошибка, я закрывала устройство слишком рано, добавил проверку перед закрытием, исправленный код здесь:

import javax.sound.midi.*; 
import java.io.File; 
import java.io.IOException; 
import java.util.Scanner; 

public class midiOut { 

    public static void main(String[] args) throws IOException, MidiUnavailableException, InvalidMidiDataException 
    { 

     while(true) { 
      //List Midi Devices 
      MidiDevice.Info[] midiInfo = MidiSystem.getMidiDeviceInfo(); 
      int i = 0; 
      for (MidiDevice.Info info : midiInfo) { 
       System.out.println(i + ": " +info.getName()); 
       i+=1; 
      } 
      //Select Device 
      Scanner in = new Scanner(System.in); 
      int input = in.nextInt(); 

      if(input == -1) 
      { 
       break; 
      } 
      //Get Device and Open it 
      MidiDevice selectedDevice = MidiSystem.getMidiDevice(midiInfo[input]); 
      System.out.println(selectedDevice.getDeviceInfo().getName()); 
      selectedDevice.open(); 
      //Get Sequencer and Receiver, load the File and start playing 
      Receiver receiver = selectedDevice.getReceiver(); 
      Sequencer sequencer = MidiSystem.getSequencer(); 
      sequencer.getTransmitter().setReceiver(receiver); 
      sequencer.open(); 
      sequencer.setSequence(MidiSystem.getSequence(new File("C:\\Users\\Harris Mirza\\Downloads\\Eight_bar_blues.mid"))); 
      sequencer.start(); 

      sequencer.addMetaEventListener(new MetaEventListener() { 
       @Override 
       public void meta(MetaMessage meta) { 
        if(meta.getType() == 47) 
        { 
         sequencer.close(); 
        } 
       } 
      }); 

      while (sequencer.isOpen()){} 
     } 
    } 
} 
+0

Как ни странно, когда я делаю это также играет через Колонки для ПК. – olafgarten

Смежные вопросы