Pergunta

Este código simples não está produzindo qualquer som em um par de máquinas que eu usei para testá-lo. Estou executando o código de dentro do Eclipse, mas eu também tentei usar a linha de comando sem sucesso.

public static void main(String[] args)
{
    try {
        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();

        MidiChannel[] channels = synthesizer.getChannels();

        channels[0].noteOn(60, 60);
        Thread.sleep(200);
        channels[0].noteOff(60);

        synthesizer.close();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}

Eu sou capaz de obter êxito som, obtendo um Sequencer, a adição de eventos MIDI para a seqüência, e jogar a seqüência, mas eu estou tentando fazer alguns efeitos de música em tempo real, que o seqüenciador não suporta.

Todas as idéias?

EDIT COM SOLUÇÃO: Acontece que o problema é que, por padrão, o JRE não vem com um banco de som (interessante, então, que usando o Sequencer funcionou, mas usando o didn Synthesizer 't). Obrigado, thejmc !

Para resolver o problema, eu baixado um soundbank de java.sun .com e colocou-o (em WinXP) C:. \ Program Files \ jre1.6.0_07 \ lib \ áudio (teve de fazer a pasta de áudio)

Foi útil?

Solução

Algumas instalações do JRE não incluem o soundbank.gm JavaSound (em ordem para economizar espaço) para que o seu código não teria uma fonte de som para disparar nessas máquinas.

Verificar a existência do banco de som nas máquinas que não funcionam. Você também pode colocar o banco de som no mesmo diretório que o seu arquivo .class e vai encontrá-lo.

É possível adicionar o banco de som ou para atualizar instalar o Java naqueles máquina - a dor da inconsistência, eu sei:)

Outras dicas

Você já tentou usar canal diferente? Pode ser este discusson vai chegar mais perto de uma solução ...

Eu testei seu código em minha máquina (Windows XP, JRE 1.6) e ele faz tocar as notas. Talvez apenas uma única nota é muito pouco para ouvi-lo. Tente adicionar mais notas. Além disso, tente definir o mais alto volume.

Apenas precisam de mais 1 ação sono antes próximo sintetizador:

public static void main(String[] args)
{
    try {
        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();

        MidiChannel[] channels = synthesizer.getChannels();

        channels[0].noteOn(60, 60);
        Thread.sleep(200);
        channels[0].noteOff(60);
        Thread.sleep(200);

        synthesizer.close();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top