App Android para gerar arquivo MIDI - Java

Bom dia, sou iniciante nesse forum, e em programacão. Estou tentando fazer uma App para android que gere um arquivo MIDI. Comecei com um App simples com um botão que gera um midi definido em array de char (que futuramente será manipulado).
Consegui fazer rodar o código java no Eclipse em ambiente Linux e Windows, usando biblioteca javax.sound.midi, porém ao tentar usar em um app android não funciona, mas não gera nenhum erro. Tive que importar o modulo javax de https://github.com/kshoji/javax.sound.midi-for-Android, e inseri vários Toast para tentar localizar onde o código está rodando e onde não roda e verifiquei que está parando de executar na linha: MidiSystem.write(sequence, allowedTypes[0], new File(filename)); pois executa o Toast anterior e não executa o Toast após.
Porém não estou descobrindo o porquê não está rodando e nem como fazer funcionar. Segue abaixo o código completo.
Quem conseguir ajudar já agradeco.

package com.example.brunomr.midi;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;

import jp.kshoji.javax.sound.midi.InvalidMidiDataException;
import jp.kshoji.javax.sound.midi.MetaEventListener;
import jp.kshoji.javax.sound.midi.MetaMessage;
import jp.kshoji.javax.sound.midi.MidiEvent;
import jp.kshoji.javax.sound.midi.MidiSystem;
import jp.kshoji.javax.sound.midi.MidiUnavailableException;
import jp.kshoji.javax.sound.midi.Sequence;
import jp.kshoji.javax.sound.midi.Sequencer;
import jp.kshoji.javax.sound.midi.ShortMessage;
import jp.kshoji.javax.sound.midi.Synthesizer;
import jp.kshoji.javax.sound.midi.Track;
import jp.kshoji.javax.sound.midi.spi.MidiFileWriter;

public class MidiActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_midi);

    Button novoMidi = (Button) findViewById(R.id.botao);
    novoMidi.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            try {
                Toast.makeText(MidiActivity.this, "Iniciando...", Toast.LENGTH_SHORT).show();
                toMIDI();
            } catch (InvalidMidiDataException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (MidiUnavailableException e) {
                e.printStackTrace();
            }
        }
    });

}

public static final int DAMPER_PEDAL = 64;
public static final int DAMPER_ON = 127;
public static final int DAMPER_OFF = 0;
public static final int END_OF_TRACK = 47;

public void toMIDI() throws MidiUnavailableException, InvalidMidiDataException, IOException {

    Toast.makeText(MidiActivity.this, "Comecando midi file", Toast.LENGTH_SHORT).show();
    int instrument = 0;
    int tempo = 120;
    String filename = "midifile3.mid";

    char[] notes = { 'C', ' ', 'D', ' ', 'E', ' ', 'F', ' ', 'G', ' ', '+',  'A', ' ', 'B', ' ', 'C' };

    Sequence sequence = new Sequence(Sequence.PPQ, 16);
    addTrack(sequence, instrument, tempo, notes);
    if (filename == null){
        Sequencer sequencer = MidiSystem.getSequencer();
        sequencer.open();
        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();
        sequencer.getTransmitter().setReceiver(synthesizer.getReceiver());

        sequencer.setSequence(sequence);
        sequencer.setTempoInBPM(tempo);

        sequencer.addMetaEventListener(new MetaEventListener(){
            public void meta(MetaMessage m){
                if (m.getType() == END_OF_TRACK) System.exit(0);
            }
        });

        sequencer.start();
    } else {
        int[] allowedTypes = MidiSystem.getMidiFileTypes(sequence);
        Toast.makeText(MidiActivity.this, "Tipo permitido " + allowedTypes[1], Toast.LENGTH_SHORT).show();
        if (allowedTypes.length == 0){
            System.err.println("No supported MIDI files types");
        } else{
            Toast.makeText(MidiActivity.this, "Gravando", Toast.LENGTH_SHORT).show();
            MidiSystem.write(sequence, allowedTypes[0], new File(filename));
            Toast.makeText(MidiActivity.this, "Fim arquivo midi2", Toast.LENGTH_SHORT).show();
            System.exit(0);
        }

    }


}

static final int[] offsets = { -3, -1, 0 ,2 ,4 ,5 ,7 };

public void addTrack(Sequence s, int instrument, int tempo, char[] notes) throws InvalidMidiDataException {

    Toast.makeText(MidiActivity.this, "Adicionando trilha ", Toast.LENGTH_SHORT).show();
    Track track = s.createTrack();

    ShortMessage sm = new ShortMessage();
    sm.setMessage(ShortMessage.PROGRAM_CHANGE, 0 , instrument, 0);
    track.add(new MidiEvent(sm, 0));

    int n = 0;
    int t = 0;
    int notelength = 16;
    int velocity = 64;
    int basekey = 60;
    boolean sustain = false;
    int numnotes = 0;

    while (n < notes.length){
        char c = notes[n++];
        if (c == '+') basekey += 12;
        else if (c == '-') basekey -= 12;

        else if (c == '>') basekey += 16;
        else if (c == '<') basekey -= 16;

        else if (c == '/') {
            char d = notes[n++];
            if (d == '2') notelength = 32;
            else if (d == '4') notelength = 16;
            else if (d == '8') notelength = 8;
            else if (d == '3' && notes[n++] =='2') notelength = 2;
            else if (d == '6' && notes[n++] =='4') notelength = 1;
            else if (d == '1') {
                if (n < notes.length && notes[n] == '6') notelength =4;
                else notelength= 64;
            }
        } else if (c == 's') {
            sustain = !sustain;
            ShortMessage m = new ShortMessage();
            m.setMessage(ShortMessage.CONTROL_CHANGE, 0 , DAMPER_PEDAL, sustain ? DAMPER_ON : DAMPER_OFF);
            track.add(new MidiEvent(m, t));
        } else if (c >= 'A' && c <= 'G') {
            int key = basekey + offsets[c - 'A'];
            if (n < notes.length){
                if (notes[n] == 'b') {
                    key--;
                    n++;
                } else if(notes[n] == '#') {
                    key++;
                    n++;
                }
            }

            addNote(track, t, notelength, key, velocity);
            numnotes++;

        } else if (c == ' ') {
            if (numnotes > 0){
                t += notelength;
                numnotes = 0;
            }
        } else if (c == '.') {
            if (numnotes > 0){
                t += notelength;
                numnotes = 0;
            }
            t += notelength;
        }
    }
}

public void addNote(Track track, int startTick, int tickLength, int key, int velocity) throws InvalidMidiDataException {
    Toast.makeText(MidiActivity.this, "Adicionando nota " + key, Toast.LENGTH_SHORT).show();
    ShortMessage on = new ShortMessage();
    on.setMessage(ShortMessage.NOTE_ON, 0, key, velocity);
    ShortMessage off = new ShortMessage();
    off.setMessage(ShortMessage.NOTE_OFF, 0, key, velocity);
    track.add(new MidiEvent(on, startTick));
    track.add(new MidiEvent(off, startTick + tickLength));
}

}