2015-08-05 12 views
0

Я пытаюсь установить возможность кода javax.sound.midi для создания простого звука, так что я могу настроить его, чтобы начать работу над более сложным MIDI-кодом. Но приведенный ниже код не создает звук. Пример кода составляет всего около 50 строк и представляет собой веб-пример, который должен просто работать из коробки. Но вместо этого он производит следующее сообщение об ошибке в консоли при запуске программы:Простой звук, не играющий в java midi test code

Synthesizer: [email protected] 
Aug 04, 2015 5:03:20 PM java.util.prefs.WindowsPreferences <init> 
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5. 
MidiChannel: [email protected] 

Кроме того, ЗВУК, вырабатываемой. ОС - Windows 8.1, если это имеет значение.

В чем причина этой ошибки? Как я могу изменить небольшой раздел кода ниже, чтобы заставить его играть простой звук?

Вот полный ~ 50 строк кода, который бросает выше выход:

package main; 

import javax.sound.midi.*; 

public class MidiMain { 
private static boolean DEBUG = true; 

public static void main(String[] args){ 
    /** The MIDI channel to use for playing the note. */ 
    int nChannelNumber = 1; 
    int nNoteNumber = 20; // MIDI key number 
    int nVelocity = 20; 

    /* Time between note on and note off event in milliseconds. Note that on most systems, the 
    * best resolution you can expect are 10 ms.*/ 
    int nDuration = 20; 
    nNoteNumber = Math.min(127, Math.max(0, nNoteNumber)); 
    nVelocity = Math.min(127, Math.max(0, nVelocity)); 
    nDuration = Math.max(0, nDuration); 

    /* We need a synthesizer to play the note on. Here, we simply request the default synthesizer. */ 
    Synthesizer synth = null; 
    try { synth = MidiSystem.getSynthesizer();} 
    catch (MidiUnavailableException e){ 
     e.printStackTrace(); 
     System.exit(1); 
    } 
    if (DEBUG) out("Synthesizer: " + synth); 

    /* Of course, we have to open the synthesizer to produce any sound for us. */ 
    try {synth.open();} 
    catch (MidiUnavailableException e){ 
     e.printStackTrace(); 
     System.exit(1); 
    } 

    /* Turn the note on on MIDI channel 1. (Index zero means MIDI channel 1) */ 
    MidiChannel[] channels = synth.getChannels(); 
    MidiChannel channel = channels[nChannelNumber]; 
    if (DEBUG) out("MidiChannel: " + channel); 
    channel.noteOn(nNoteNumber, nVelocity); 

    /* Wait for the specified amount of time (the duration of the note). */ 
    try {Thread.sleep(nDuration);} 
    catch (InterruptedException e){e.printStackTrace();} 

    /* Turn the note off. */ 
    channel.noteOff(nNoteNumber); 

    /* Close the synthesizer. */ 
    synth.close(); 
} 

private static void out(String strMessage){ System.out.println(strMessage);}  
} 

ответ

1

20 миллисекунд короткий промежуток времени. Вы пробовали больше времени? Возможно, вам также понадобится еще немного спать в конце, прежде чем вы выходите из программы.

Когда вы делаете synth.close(), вы больше не будете получать звуковой сигнал со звуковой карты. Вероятно, вам нужно будет предоставить дополнительное время, прежде чем закрывать его для латентности софт-синтезатора и эхо-сигнала.

Задержка может быть получена synth.getLatency() и находится в микросекундах. Вы можете захотеть Thread.sleep() за это время как минимум до закрытия синтезатора.

... 
Thread.sleep(TimeUnit.MICROSECONDS.toMillis(synth.getLatency())); 
synth.close(); 

Но добавление некоторого времени для инструментального эха даст лучший звук вместо внезапного отсечения.

+0

Я не буду на своем компьютере несколько часов. Этот API для меня совершенно незначителен, хотя я читал учебники. Можете ли вы показать рабочий код для wjat, который вы предлагаете, чтобы ваши предложения были ясными, когда я снова нахожусь на своем ПК? – CodeMed

+0

* «Вы пробовали больше времени?» * Он работает здесь с большей продолжительностью (2000), но едва заметен при задержке 20 мс. Сказав это, вышеприведенная ошибка выглядит так, что у API возникают проблемы с настройкой MIDI-системы. OP - вы успешно использовали другие приложения. на той машине, которая будет воспроизводить MIDI? –

+0

@ Параметр AndNotThompson 'nDuration = 1000' получает примечание к воспроизведению, но не разрешает сообщение об ошибке. Нет, я никогда раньше не использовал миди с java. Вот почему я приводил такой простой пример кода. Что еще я могу настроить, чтобы разрешить все еще постоянное сообщение об ошибке? – CodeMed