Gervill и SF2 звучат неправильно на некоторых миди-файлах

Буду признателен за ваши идеи по приложенному исходному коду / проблеме.
Приведенный ниже код отлично работает для большинства файлов midi. Однако некоторые звучат неправильно.
Они производят звук Wha-Wha. Мне удалось обойти эту проблему для чистых произведений фортепиано, таких как использованная ниже, изменив Java StandardMidiFileReader для отбрасывания сообщений 176/1/77/0 (глубина вибрато)
У кого-нибудь есть идея, как действительно решить эту проблему; это не просто одно музыкальное произведение.

Я считаю, что в Gervill может быть ошибка, как в случае с Gervill на пути к классам (или Java 7, где Gervill, кажется, является частью дистрибутива (и, как я только что узнал, в текущих версиях java 6)), некоторые другие файлы не могут воспроизводиться правильно совсем. Примером является http://mb-s2.sakura.ne.jp/tirol/junk/midi/wagner_walkurenritt.mid
(примерно через 20 секунд тот же забавный фоновый шум Wha-Wha начинается, когда используется Gervill)
Заменив стандартный синтезатор расширенной версией Timidity++ Keishi Suenaga и используя тот же SF2, все части звучат нормально, поэтому это не поврежденные миди-файлы.

Код: для поддержки Java SF2 Gervill должен быть на пути к классам
Soundfont: я опробовал JCLIVE.SF2 и Steinway SF2;
звуковые шрифты доступны, например, на hammersound.net или synthfont.com
Распаковщик sfarc можно загрузить с melodymachine.com или если сайт не работает sourceforge.net/projects/miditool/files/third%20party/

package test;

import java.io.File;
import java.io.FileInputStream;


import javax.sound.midi.Instrument;
import javax.sound.midi.MidiDevice;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.sound.midi.Soundbank;
import javax.sound.midi.Synthesizer;

import com.sun.media.sound.SF2Soundbank;

public class SF2Test2 {
    static Synthesizer synthesizer;
    static Sequencer sequencer;
    static MidiDevice dev;


    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            synthesizer=MidiSystem.getSynthesizer();
            synthesizer.open();
        //  soundbank =synthesizer.getDefaultSoundbank();
        //  p("Soundbank: "  + soundbank.getName() + " / "  + soundbank.getDescription()+ " / " + soundbank.getVendor());
            } 
        catch (Exception e) {e.printStackTrace();}

        loadSF2();

        File f = new File("D:\\SF2\\rach.mid");  //http://mb-s2.sakura.ne.jp/tirol/junk/midi/rachmaninoff_op3_2.mid

        play(f);
    }





    private static void loadSF2() {
        String filename;
        boolean duringInitialLoad=false;
        try{
            filename="D:/SF2/JC.SF2";   
            File f= new File(filename);
            if(f.exists()){
                Soundbank soundbank=new SF2Soundbank(
                        new FileInputStream(f));
                synthesizer.loadAllInstruments(soundbank);
                //synthesizer.open(); 
                //moving open command to here: synthesizer will still run on default (Gervill) soundbank
                p("\n now loaded on synthesizer: ");
                printInstruments(soundbank,synthesizer.getLoadedInstruments());
            }
            else {
                p(filename + " not found");
                System.exit(0);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }




    private static void play(File file){

        try {
            sequencer=MidiSystem.getSequencer();
            Sequence sequence= MidiSystem.getSequence(file);
            sequencer.setSequence(sequence);
            sequencer.open();
            sequencer.getTransmitter().setReceiver(synthesizer.getReceiver());
            p("starting Sequence...");
            sequencer.start();
            Thread.sleep(15000);
            sequencer.stop();
            sequencer.close();

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



    private static void printInstruments(Soundbank soundbank,Instrument[] instruments){
        p("");
        p("----------------------------------------------------------------------------");
        p("Soundbank name: " + soundbank.getName());
        p("Soundbank version: " + soundbank.getVersion());
        p("Description: " + soundbank.getDescription());
        p("Author:  " + soundbank.getVendor() + ".");
        p("Number of instruments: " + soundbank.getInstruments().length);

        for (Instrument i : instruments)
        {
            p(  "Bank="    + i.getPatch().getBank() + 
                   " Patch="   + i.getPatch().getProgram() +
                   " Instr.="  + i);
        }
    }

    public static void p(Object o){
        System.out.println(o);
    }
}

Я также попытался загрузить отдельные инструменты из звуковых файлов SF2 в синтезатор, где я не полагаюсь на класс com.sun.media.sound.SF2Soundbank, тот же результат:

try{
    filename="D:/SF2/JCLIVE.SF2";
    File f= new File(filename);
    if(f.exists()){
        Soundbank soundbank=MidiSystem.getSoundbank(f);
        Instrument [] sf2Instruments = soundbank.getInstruments();
        Instrument [] newInstruments = new Instrument[128];
        int replaced=0;
        //load pianos only
        for(int i=0;i<3;i++){
            try{
                int num=sf2Instruments[i].getPatch().getProgram();
                newInstruments[i]=sf2Instruments[num];
                synthesizer.loadInstrument(sf2Instruments[num]);
                replaced++;
            }catch(Exception e){}
        }
        //synthesizer.loadAllInstruments(soundbank);
        p("\nreplaced: "+ replaced);
        p("\n now loaded on synthesizer: ");
        printInstruments(soundbank,synthesizer.getLoadedInstruments());
    }
}catch(Exception e){
    e.printStackTrace();
}

0 ответов

Другие вопросы по тегам