diff options
| author | Starla Insigna <hatkirby@fourisland.com> | 2009-02-10 17:37:14 -0500 |
|---|---|---|
| committer | Starla Insigna <hatkirby@fourisland.com> | 2009-02-10 17:37:14 -0500 |
| commit | 7fbf2187cf557f75c3f63ba36d2563592b066536 (patch) | |
| tree | 3794f956775486fe6d1a6886aadfdbffa92d1417 | |
| parent | 9529954ca65660e976f12ed0a3f81e880581fee7 (diff) | |
| download | fourpuzzle-7fbf2187cf557f75c3f63ba36d2563592b066536.tar.gz fourpuzzle-7fbf2187cf557f75c3f63ba36d2563592b066536.tar.bz2 fourpuzzle-7fbf2187cf557f75c3f63ba36d2563592b066536.zip | |
Engine: Removed Music starting delay
This annoying bug was finally removed by creating a seperate MidiParser class that takes a Sequence and parses out the non-emitting messages. This is run in ObjectLoader so the result is cached. Fixes #3
| -rwxr-xr-x | src/com/fourisland/fourpuzzle/Audio.java | 1 | ||||
| -rw-r--r-- | src/com/fourisland/fourpuzzle/util/MidiParser.java | 83 | ||||
| -rwxr-xr-x | src/com/fourisland/fourpuzzle/util/ObjectLoader.java | 7 |
3 files changed, 91 insertions, 0 deletions
| diff --git a/src/com/fourisland/fourpuzzle/Audio.java b/src/com/fourisland/fourpuzzle/Audio.java index c8cd75b..5fe0dfc 100755 --- a/src/com/fourisland/fourpuzzle/Audio.java +++ b/src/com/fourisland/fourpuzzle/Audio.java | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | package com.fourisland.fourpuzzle; | 6 | package com.fourisland.fourpuzzle; |
| 7 | 7 | ||
| 8 | import com.fourisland.fourpuzzle.util.MidiParser; | ||
| 8 | import com.fourisland.fourpuzzle.util.ObjectLoader; | 9 | import com.fourisland.fourpuzzle.util.ObjectLoader; |
| 9 | import java.util.concurrent.Executor; | 10 | import java.util.concurrent.Executor; |
| 10 | import java.util.concurrent.Executors; | 11 | import java.util.concurrent.Executors; |
| diff --git a/src/com/fourisland/fourpuzzle/util/MidiParser.java b/src/com/fourisland/fourpuzzle/util/MidiParser.java new file mode 100644 index 0000000..84dea26 --- /dev/null +++ b/src/com/fourisland/fourpuzzle/util/MidiParser.java | |||
| @@ -0,0 +1,83 @@ | |||
| 1 | /* | ||
| 2 | * To change this template, choose Tools | Templates | ||
| 3 | * and open the template in the editor. | ||
| 4 | */ | ||
| 5 | |||
| 6 | package com.fourisland.fourpuzzle.util; | ||
| 7 | |||
| 8 | import javax.sound.midi.InvalidMidiDataException; | ||
| 9 | import javax.sound.midi.MidiEvent; | ||
| 10 | import javax.sound.midi.MidiMessage; | ||
| 11 | import javax.sound.midi.Sequence; | ||
| 12 | import javax.sound.midi.ShortMessage; | ||
| 13 | import javax.sound.midi.Track; | ||
| 14 | |||
| 15 | /** | ||
| 16 | * | ||
| 17 | * @author hatkirby | ||
| 18 | */ | ||
| 19 | public class MidiParser { | ||
| 20 | |||
| 21 | private Sequence seq; | ||
| 22 | private Track currentTrack; | ||
| 23 | public MidiParser(Sequence seq) | ||
| 24 | { | ||
| 25 | this.seq = seq; | ||
| 26 | } | ||
| 27 | |||
| 28 | public Sequence parse() throws InvalidMidiDataException | ||
| 29 | { | ||
| 30 | Sequence temp = temp = new Sequence(seq.getDivisionType(), seq.getResolution()); | ||
| 31 | |||
| 32 | for (Track t : seq.getTracks()) | ||
| 33 | { | ||
| 34 | parseTrack(t, temp.createTrack()); | ||
| 35 | } | ||
| 36 | |||
| 37 | return temp; | ||
| 38 | } | ||
| 39 | |||
| 40 | private void parseTrack(Track t, Track nt) | ||
| 41 | { | ||
| 42 | currentTrack = nt; | ||
| 43 | |||
| 44 | for (int i = 0; i < t.size(); i++) | ||
| 45 | { | ||
| 46 | MidiEvent mi = t.get(i); | ||
| 47 | |||
| 48 | parseEvent(mi.getMessage(), mi.getTick()); | ||
| 49 | } | ||
| 50 | } | ||
| 51 | |||
| 52 | private void parseEvent(MidiMessage mm, long tick) | ||
| 53 | { | ||
| 54 | if (mm instanceof ShortMessage) | ||
| 55 | { | ||
| 56 | parseShortMessage((ShortMessage) mm,tick); | ||
| 57 | } else { | ||
| 58 | currentTrack.add(new MidiEvent(mm, tick)); | ||
| 59 | } | ||
| 60 | } | ||
| 61 | |||
| 62 | private long firstReal = 0; | ||
| 63 | private boolean foundFirstReal = false; | ||
| 64 | private void parseShortMessage(ShortMessage mm, long tick) | ||
| 65 | { | ||
| 66 | if ((mm.getCommand() == ShortMessage.NOTE_ON) || (mm.getCommand() == ShortMessage.NOTE_OFF)) | ||
| 67 | { | ||
| 68 | if (!foundFirstReal) | ||
| 69 | { | ||
| 70 | if (mm.getData2() != 0) | ||
| 71 | { | ||
| 72 | foundFirstReal = true; | ||
| 73 | firstReal = tick; | ||
| 74 | } else { | ||
| 75 | return; | ||
| 76 | } | ||
| 77 | } | ||
| 78 | } | ||
| 79 | |||
| 80 | currentTrack.add(new MidiEvent(mm, tick-firstReal)); | ||
| 81 | } | ||
| 82 | |||
| 83 | } | ||
| diff --git a/src/com/fourisland/fourpuzzle/util/ObjectLoader.java b/src/com/fourisland/fourpuzzle/util/ObjectLoader.java index 2000a1c..3f518cf 100755 --- a/src/com/fourisland/fourpuzzle/util/ObjectLoader.java +++ b/src/com/fourisland/fourpuzzle/util/ObjectLoader.java | |||
| @@ -119,6 +119,13 @@ public class ObjectLoader { | |||
| 119 | Logger.getLogger(ObjectLoader.class.getName()).log(Level.SEVERE, null, ex); | 119 | Logger.getLogger(ObjectLoader.class.getName()).log(Level.SEVERE, null, ex); |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | MidiParser mp = new MidiParser(seq); | ||
| 123 | try { | ||
| 124 | seq = mp.parse(); | ||
| 125 | } catch (InvalidMidiDataException ex) { | ||
| 126 | Logger.getLogger(ObjectLoader.class.getName()).log(Level.SEVERE, null, ex); | ||
| 127 | } | ||
| 128 | |||
| 122 | addToObjectCache("Music", name, seq); | 129 | addToObjectCache("Music", name, seq); |
| 123 | } | 130 | } |
| 124 | 131 | ||
