Example usage for javax.sound.midi Track add

List of usage examples for javax.sound.midi Track add

Introduction

In this page you can find the example usage for javax.sound.midi Track add.

Prototype

public boolean add(MidiEvent event) 

Source Link

Document

Adds a new event to the track.

Usage

From source file:Main.java

public static void main(String[] args) {
    JFrame frame = new JFrame();
    DrawPanel dp = new DrawPanel();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(dp);//from w  w w.j av a  2s  .  c  o m
    frame.pack();
    frame.setLocationByPlatform(true);
    try {
        Sequence seq = new Sequence(Sequence.PPQ, 4);
        Track track = seq.createTrack();
        for (int i = 0; i < 120; i += 4) {
            int d = (int) Math.abs(new Random().nextGaussian() * 24) + 32;
            track.add(makeEvent(ShortMessage.NOTE_ON, 1, d, 127, i));
            track.add(makeEvent(ShortMessage.CONTROL_CHANGE, 1, 127, 0, i));
            track.add(makeEvent(ShortMessage.NOTE_OFF, 1, d, 127, i));
        }
        Sequencer sequencer = MidiSystem.getSequencer();
        sequencer.open();
        sequencer.setSequence(seq);
        sequencer.addControllerEventListener(dp, new int[] { 127 });
        sequencer.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
    frame.setVisible(true);
}

From source file:PlayerPiano.java

public static void addTrack(Sequence s, int instrument, int tempo, char[] notes)
        throws InvalidMidiDataException {
    Track track = s.createTrack(); // Begin with a new track

    // Set the instrument on channel 0
    ShortMessage sm = new ShortMessage();
    sm.setMessage(ShortMessage.PROGRAM_CHANGE, 0, instrument, 0);
    track.add(new MidiEvent(sm, 0));

    int n = 0; // current character in notes[] array
    int t = 0; // time in ticks for the composition

    // These values persist and apply to all notes 'till changed
    int notelength = 16; // default to quarter notes
    int velocity = 64; // default to middle volume
    int basekey = 60; // 60 is middle C. Adjusted up and down by octave
    boolean sustain = false; // is the sustain pedal depressed?
    int numnotes = 0; // How many notes in current chord?

    while (n < notes.length) {
        char c = notes[n++];

        if (c == '+')
            basekey += 12; // increase octave
        else if (c == '-')
            basekey -= 12; // decrease octave
        else if (c == '>')
            velocity += 16; // increase volume;
        else if (c == '<')
            velocity -= 16; // decrease volume;
        else if (c == '/') {
            char d = notes[n++];
            if (d == '2')
                notelength = 32; // half note
            else if (d == '4')
                notelength = 16; // quarter note
            else if (d == '8')
                notelength = 8; // eighth note
            else if (d == '3' && notes[n++] == '2')
                notelength = 2;//from w ww . ja  v  a  2s  . c  om
            else if (d == '6' && notes[n++] == '4')
                notelength = 1;
            else if (d == '1') {
                if (n < notes.length && notes[n] == '6')
                    notelength = 4; // 1/16th note
                else
                    notelength = 64; // whole note
            }
        } else if (c == 's') {
            sustain = !sustain;
            // Change the sustain setting for channel 0
            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') { // flat
                    key--;
                    n++;
                } else if (notes[n] == '#') { // sharp
                    key++;
                    n++;
                }
            }

            addNote(track, t, notelength, key, velocity);
            numnotes++;
        } else if (c == ' ') {
            // Spaces separate groups of notes played at the same time.
            // But we ignore them unless they follow a note or notes.
            if (numnotes > 0) {
                t += notelength;
                numnotes = 0;
            }
        } else if (c == '.') {
            // Rests are like spaces in that they force any previous
            // note to be output (since they are never part of chords)
            if (numnotes > 0) {
                t += notelength;
                numnotes = 0;
            }
            // Now add additional rest time
            t += notelength;
        }
    }
}

From source file:PlayerPiano.java

public static void addNote(Track track, int startTick, int tickLength, int key, int velocity)
        throws InvalidMidiDataException {
    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));
}