Javax.sound.midi studying code not working on MacOS X

I'm trying to run code importing classes from javax.sound.midi package, but nothing works. Code had compiled and run successfully, but there is no sound. I've download soundbank for Java, and put it in audio folder, but it's still not working.

Macbook Pro mid 2010

Mac OS X High Sierra

Java version 12.0.1 from 2019-04-16

Java(TM) SE Runtime Environment (build 12.0.1+12)
Java HotSpot(TM) 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)
import javax.sound.midi.*;


public class MiniMiniMusicApp {

    public static void main(String[] args) {
        MiniMiniMusicApp mini = new MiniMiniMusicApp();
        mini.play();
    }

    public void play() {
        try {
            Sequencer player = MidiSystem.getSequencer();
            player.open();

            Sequence seq = new Sequence(Sequence.PPQ, 4);

            Track track = seq.createTrack();

            ShortMessage a = new ShortMessage();
            a.setMessage(128, 1, 44, 100);
            MidiEvent noteOn = new MidiEvent(a, 1);
            track.add(noteOn);

            ShortMessage b = new ShortMessage();
            b.setMessage(128, 1, 44, 100);
            MidiEvent noteOff = new MidiEvent(b, 16);
            track.add(noteOff);

            player.setSequence(seq);

            player.start();

        } catch (Exception ex) {ex.printStackTrace();}
    }
}

Upvotes: 2

Views: 219

Answers (1)

Butiri Dan
Butiri Dan

Reputation: 1772

The problem is that you use command 128 for both a and b. Base on ShortMessage the command 128 is note off event.

  • 144 Note On Event
  • 128 Note Off Event
  • 192 Program Change for changing default instrument etc
  • 176 Control change for sending events
  • 224 Pitch Bend

As example change the a.setMessage(128, 1, 44, 100); with a.setMessage(ShortMessage.NOTE_ON, 1, 44, 100); and you will get sound.

public static void play() {
    try {
        Sequencer player = MidiSystem.getSequencer();
        player.open();

        Sequence seq = new Sequence(Sequence.PPQ, 4);

        Track track = seq.createTrack();

        ShortMessage a = new ShortMessage();
        a.setMessage(ShortMessage.NOTE_ON, 1, 44, 100);
        MidiEvent noteOn = new MidiEvent(a, 5);
        track.add(noteOn);

        ShortMessage b = new ShortMessage();
        b.setMessage(ShortMessage.NOTE_OFF, 1, 44, 100);
        MidiEvent noteOff = new MidiEvent(b, 16);
        track.add(noteOff);

        player.setSequence(seq);

        player.start();

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

Upvotes: 1

Related Questions