package com.leff.midi.examples;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import com.leff.midi.MidiFile;
import com.leff.midi.MidiTrack;
import com.leff.midi.event.NoteOff;
import com.leff.midi.event.NoteOn;
import com.leff.midi.event.meta.Tempo;
import com.leff.midi.event.meta.TimeSignature;
public class MidiFileFromScratch
{
public static void main(String[] args)
{
// 1. Create some MidiTracks
MidiTrack tempoTrack = new MidiTrack();
MidiTrack noteTrack = new MidiTrack();
// 2. Add events to the tracks
// 2a. Track 0 is typically the tempo map
TimeSignature ts = new TimeSignature();
ts.setTimeSignature(4, 4, TimeSignature.DEFAULT_METER, TimeSignature.DEFAULT_DIVISION);
Tempo t = new Tempo();
t.setBpm(228);
tempoTrack.insertEvent(ts);
tempoTrack.insertEvent(t);
// 2b. Track 1 will have some notes in it
for(int i = 0; i < 80; i++)
{
int channel = 0, pitch = 1 + i, velocity = 100;
NoteOn on = new NoteOn(i * 480, channel, pitch, velocity);
NoteOff off = new NoteOff(i * 480 + 120, channel, pitch, 0);
noteTrack.insertEvent(on);
noteTrack.insertEvent(off);
// There is also a utility function for notes that you should use
// instead of the above.
noteTrack.insertNote(channel, pitch + 2, velocity, i * 480, 120);
}
// It's best not to manually insert EndOfTrack events; MidiTrack will
// call closeTrack() on itself before writing itself to a file
// 3. Create a MidiFile with the tracks we created
ArrayList<MidiTrack> tracks = new ArrayList<MidiTrack>();
tracks.add(tempoTrack);
tracks.add(noteTrack);
MidiFile midi = new MidiFile(MidiFile.DEFAULT_RESOLUTION, tracks);
// 4. Write the MIDI data to a file
File output = new File("exampleout.mid");
try
{
midi.writeToFile(output);
}
catch(IOException e)
{
System.err.println(e);
}
}
}