import javax.sound.midi.*;

import com.brackeen.javagamebook.sound.MidiPlayer;

/**
    Przykład odtwarzania sekwencji MIDI. Na początku sekwencja jest odtwarzana
    z wyłączoną ścieżką 1. Następnie jest odtwarzana z włączoną ścieżką 1.
    Ścieżka 1 w przykładowym pliku MIDI zawiera bębny.
*/
public class MidiTest implements MetaEventListener {

    // Ścieżka w pliku MIDI zawierająca bębny
    private static final int DRUM_TRACK = 1;

    public static void main(String[] args) {
        new MidiTest().run();
    }

    private MidiPlayer player;

    public void run() {

        player = new MidiPlayer();

        // Ładowanie sekwencji:
        Sequence sequence =
            player.getSequence("../sounds/music.midi");

        // Odtwarzanie sekwencji:
        player.play(sequence, true);

        // Wyłączenie bębnów:
        System.out.println("Odtwarzanie (bez bębnów)...");
        Sequencer sequencer = player.getSequencer();
        sequencer.setTrackMute(DRUM_TRACK, true);
        sequencer.addMetaEventListener(this);
    }

    /**
        Metoda jest wywoływana przez system dźwiękowy po zajściu
        zdarzenia meta. W tym przypadku, gdy otrzymane zostanie
        zdarzenie meta dla końca ścieżki, włączana jest ścieżka bębnów.
    */
    public void meta(MetaMessage event) {
        if (event.getType() == MidiPlayer.END_OF_TRACK_MESSAGE) {
            Sequencer sequencer = player.getSequencer();
            if (sequencer.getTrackMute(DRUM_TRACK)) {
                // Włączanie ścieżki bębnów:
                System.out.println("Włączanie bębnów...");
                sequencer.setTrackMute(DRUM_TRACK, false);
            }
            else {
                // Zamknięcie sekwensera i koniec odtwarzania:
                System.out.println("Wyłączanie...");
                player.close();
                System.exit(0);
            }
        }
    }
}
