import javax.sound.midi.*; class MidiSeq { Sequencer sequencer; Track track; int tickLength = 63; MidiSeq() { try { MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo(); for(int i = 0; i < infos.length; i++) { println(infos[i].toString()); } Sequence s = new Sequence(Sequence.PPQ, 4); track = s.createTrack(); //ShortMessage vol = new ShortMessage(); //vol.setMessage(ShortMessage.CONTROL_CHANGE, 1, 7, 127); //track.add(new MidiEvent(vol, 0)); ShortMessage prog = new ShortMessage(); prog.setMessage(ShortMessage.PROGRAM_CHANGE, 1, 25, 0); track.add(new MidiEvent(prog, 0)); // this is so the track will be tickLength long even when empty MetaMessage meta = new MetaMessage(); meta.setMessage(0, new byte[] {}, 0); track.add(new MidiEvent(meta, tickLength)); // track for bullets Track btrack = s.createTrack(); for(int i = 0; i <= tickLength; i++) { int note = 42; int vel = (i%4 == 0) ? 80 : 64; ShortMessage on = new ShortMessage(); on.setMessage(ShortMessage.NOTE_ON, 9, note, vel); //ShortMessage off = new ShortMessage(); //off.setMessage(ShortMessage.NOTE_OFF, 9, note, vel); btrack.add(new MidiEvent(on, i)); //track.add(new MidiEvent(off, i)); } // track for the ship engine Track strack = s.createTrack(); int beats = (tickLength+1)/4; for(int i = 0; i < beats; i++) { ShortMessage on = new ShortMessage(); on.setMessage(ShortMessage.NOTE_ON, 9, 36, 100); strack.add(new MidiEvent(on, i*4)); } println("The sequence is " + s.getTickLength() + " ticks long."); sequencer = MidiSystem.getSequencer(); sequencer.open(); sequencer.setSequence(s); sequencer.setTempoInBPM(160); sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY); sequencer.start(); muteBulletTrack(); muteShipTrack(); } catch (Exception e) { println(e.getMessage()); } } void playBulletTrack() { if ( sequencer.getTrackMute(1) ) { sequencer.setTrackMute(1, false); } } void muteBulletTrack() { if ( !sequencer.getTrackMute(1) ) { sequencer.setTrackMute(1, true); } } void playShipTrack() { if ( sequencer.getTrackMute(2) ) { println("Unmuting ship track."); sequencer.setTrackMute(2, false); } } void muteShipTrack() { if ( !sequencer.getTrackMute(2) ) { println("Muting ship track."); sequencer.setTrackMute(2, true); } } void addNote(int note, int vel) { long currTick = sequencer.getTickPosition(); long tick = (currTick + 1) % sequencer.getTickLength(); try { ShortMessage on = new ShortMessage(); on.setMessage(ShortMessage.NOTE_ON, 1, note, vel); ShortMessage off = new ShortMessage(); off.setMessage(ShortMessage.NOTE_OFF, 1, note, vel); track.add(new MidiEvent(on, tick)); track.add(new MidiEvent(off, tick+1)); println("Added " + note + " at tick " + tick); } catch(Exception e) { println(e.getMessage()); } } void close() { sequencer.stop(); } }