/*
 * Created on Oct 2, 2005 by Nick Didkovsky
 *
 */
package jmsltestsuite;

import java.io.IOException;

import com.softsynth.jmsl.JMSL;
import com.softsynth.jmsl.JMSLRandom;
import com.softsynth.jmsl.midi.MidiIO;
import com.softsynth.jmsl.midi.MidiLogger;

/**
 * You can use MidiLogger to simply write MIDI events into the logger and finally write out a MIDI
 * file. Do not expect to hear anything in this example. Just writes a few events to the logger and
 * creates a MIDI file.
 * 
 * @author Nick Didkovsky, (c) 2005 Nick Didkovsky, didkovn@mail.rockefeller.edu
 *  
 */
public class TestMidiLoggerNonRealTime {
    public static void main(String[] args) {
        MidiLogger logger = new MidiLogger();
        double startTime = JMSL.realTime();
        logger.setMidiLogging(true);
        
        // opening chord with higher pitch sustaining a little longer
        // log(double timestamp, int status, int data1, int data2)
        logger.log(startTime, MidiIO.NOTE_ON, 48, 100);
        logger.log(startTime + 2.0, MidiIO.NOTE_OFF, 48, 0);
        
        logger.log(startTime, MidiIO.NOTE_ON, 67, 100);
        logger.log(startTime + 3.0, MidiIO.NOTE_OFF, 67, 0);

        // now a fast chromatic run starting 5 sec into the piece
        startTime += 5;
        for (int i = 0; i < 25; i++) {
            logger.log(startTime, MidiIO.NOTE_ON, 60 + i, 100);
            logger.log(startTime + 0.1, MidiIO.NOTE_OFF, 60 + i, 0);
            startTime += 0.0625;
        }
        
        // Now for some out-of-order time stamps which MidiLogger will sort before writing file.
        // Fill a four second span with a uniformly random distribution of note events
        for (int i = 0; i < 25; i++) {
            double onTime = startTime + JMSLRandom.choose(4.0);
            double offTime = onTime + JMSLRandom.choose(2.0);            
            int pitch = JMSLRandom.choose(60, 84);
            int vel = JMSLRandom.choose(30, 70);
            logger.log(onTime, MidiIO.NOTE_ON, pitch, vel);
            logger.log(offTime, MidiIO.NOTE_OFF, pitch, 0);
        }
        try {
            // write out the MIDI file
            logger.writeMidiFile("JMSL_SONG.MID");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}