This is a useful piece of code if you have a DLS soundbank and want to minimize it with just the instruments/samples actually used in the song(s). If you for example bundle your soundbank in the jar-file, you can get some significant savings.
You'll have to get the gervill.jar first which is available here:
http://java.net/projects/gervill/downloads1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map;
import com.sun.media.sound.DLSInstrument; import com.sun.media.sound.DLSRegion; import com.sun.media.sound.DLSSample; import com.sun.media.sound.DLSSoundbank; import com.sun.media.sound.ModelPatch;
public class DLSUtils {
public static DLSSoundbank createSimplifiedSoundbank( DLSSoundbank soundbank, Map<Integer, Collection<Integer>> patches, Map<Integer, Collection<Integer>> percussionKeys) {
DLSSoundbank result = new DLSSoundbank();
LinkedHashSet<DLSSample> samples = new LinkedHashSet<DLSSample>();
for (Integer bank : patches.keySet()) {
Collection<Integer> programs = patches.get(bank); for (Integer program : programs) { ModelPatch patch = new ModelPatch(bank, program, false); DLSInstrument instrument = (DLSInstrument) soundbank .getInstrument(patch);
List<DLSRegion> regions = instrument.getRegions();
for (DLSRegion region : regions) { DLSSample sample = region.getSample(); samples.add(sample); } result.addInstrument(instrument); } } for (Integer program : percussionKeys.keySet()) {
Collection<Integer> keys = percussionKeys.get(program); ModelPatch patch = new ModelPatch(0, program, true); DLSInstrument instrument = (DLSInstrument) soundbank .getInstrument(patch);
List<DLSRegion> regions = instrument.getRegions();
ArrayList<DLSRegion> toRemove = new ArrayList<DLSRegion>(); for (DLSRegion region : regions) { boolean add = false; for (Integer key : keys) { if (region.getKeyfrom() <= key && region.getKeyto() >= key) { add = true; break; } } if (add) { DLSSample sample = region.getSample(); samples.add(sample); } else { toRemove.add(region); } } regions.removeAll(toRemove); result.addInstrument(instrument); } for (DLSSample sample : samples) { result.addResource(sample); }
return result; }
public static void main(String[] args) throws Exception { DLSSoundbank sb = new DLSSoundbank(new FileInputStream( "thepath/gm.dls"));
Map<Integer, Collection<Integer>> patches = new LinkedHashMap<Integer, Collection<Integer>>(); Map<Integer, Collection<Integer>> percussionKeys = new LinkedHashMap<Integer, Collection<Integer>>(); ArrayList<Integer> percussionKeysList = new ArrayList<Integer>(); percussionKeysList.add(35); percussionKeysList.add(38); percussionKeys.put(0, percussionKeysList);
ArrayList<Integer> melodicInstrumentList = new ArrayList<Integer>(); melodicInstrumentList.add(0); patches.put(0, melodicInstrumentList);
DLSSoundbank sbResult = createSimplifiedSoundbank(sb, patches, percussionKeys);
sbResult .save(new File("thepath/gm2.dls"));
}
} |