1 /* 2 * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.media.sound; 27 28 import java.util.ArrayList; 29 import java.util.List; 30 31 import javax.sound.midi.Patch; 32 33 /** 34 * A simple instrument that is made of other ModelInstrument, ModelPerformer 35 * objects. 36 * 37 * @author Karl Helgason 38 */ 39 public class SimpleInstrument extends ModelInstrument { 40 41 private static class SimpleInstrumentPart { 42 ModelPerformer[] performers; 43 int keyFrom; 44 int keyTo; 45 int velFrom; 46 int velTo; 47 int exclusiveClass; 48 } 49 protected int preset = 0; 50 protected int bank = 0; 51 protected boolean percussion = false; 52 protected String name = ""; 53 protected List<SimpleInstrumentPart> parts = new ArrayList<>(); 54 55 public SimpleInstrument() { 56 super(null, null, null, null); 57 } 58 59 public void clear() { 60 parts.clear(); 61 } 62 63 public void add(ModelPerformer[] performers, int keyFrom, int keyTo, 64 int velFrom, int velTo, int exclusiveClass) { 65 SimpleInstrumentPart part = new SimpleInstrumentPart(); 66 part.performers = performers; 67 part.keyFrom = keyFrom; 68 part.keyTo = keyTo; 69 part.velFrom = velFrom; 70 part.velTo = velTo; 71 part.exclusiveClass = exclusiveClass; 72 parts.add(part); 73 } 74 75 public void add(ModelPerformer[] performers, int keyFrom, int keyTo, 76 int velFrom, int velTo) { 77 add(performers, keyFrom, keyTo, velFrom, velTo, -1); 78 } 79 80 public void add(ModelPerformer[] performers, int keyFrom, int keyTo) { 81 add(performers, keyFrom, keyTo, 0, 127, -1); 82 } 83 84 public void add(ModelPerformer[] performers) { 85 add(performers, 0, 127, 0, 127, -1); 86 } 87 88 public void add(ModelPerformer performer, int keyFrom, int keyTo, 89 int velFrom, int velTo, int exclusiveClass) { 90 add(new ModelPerformer[]{performer}, keyFrom, keyTo, velFrom, velTo, 91 exclusiveClass); 92 } 93 94 public void add(ModelPerformer performer, int keyFrom, int keyTo, 95 int velFrom, int velTo) { 96 add(new ModelPerformer[]{performer}, keyFrom, keyTo, velFrom, velTo); 97 } 98 99 public void add(ModelPerformer performer, int keyFrom, int keyTo) { 100 add(new ModelPerformer[]{performer}, keyFrom, keyTo); 101 } 102 103 public void add(ModelPerformer performer) { 104 add(new ModelPerformer[]{performer}); 105 } 106 107 public void add(ModelInstrument ins, int keyFrom, int keyTo, int velFrom, 108 int velTo, int exclusiveClass) { 109 add(ins.getPerformers(), keyFrom, keyTo, velFrom, velTo, exclusiveClass); 110 } 111 112 public void add(ModelInstrument ins, int keyFrom, int keyTo, int velFrom, 113 int velTo) { 114 add(ins.getPerformers(), keyFrom, keyTo, velFrom, velTo); 115 } 116 117 public void add(ModelInstrument ins, int keyFrom, int keyTo) { 118 add(ins.getPerformers(), keyFrom, keyTo); 119 } 120 121 public void add(ModelInstrument ins) { 122 add(ins.getPerformers()); 123 } 124 125 @Override 126 public ModelPerformer[] getPerformers() { 127 128 int percount = 0; 129 for (SimpleInstrumentPart part : parts) 130 if (part.performers != null) 131 percount += part.performers.length; 132 133 ModelPerformer[] performers = new ModelPerformer[percount]; 134 int px = 0; 135 for (SimpleInstrumentPart part : parts) { 136 if (part.performers != null) { 137 for (ModelPerformer mperfm : part.performers) { 138 ModelPerformer performer = new ModelPerformer(); 139 performer.setName(getName()); 140 performers[px++] = performer; 141 142 performer.setDefaultConnectionsEnabled( 143 mperfm.isDefaultConnectionsEnabled()); 144 performer.setKeyFrom(mperfm.getKeyFrom()); 145 performer.setKeyTo(mperfm.getKeyTo()); 146 performer.setVelFrom(mperfm.getVelFrom()); 147 performer.setVelTo(mperfm.getVelTo()); 148 performer.setExclusiveClass(mperfm.getExclusiveClass()); 149 performer.setSelfNonExclusive(mperfm.isSelfNonExclusive()); 150 performer.setReleaseTriggered(mperfm.isReleaseTriggered()); 151 if (part.exclusiveClass != -1) 152 performer.setExclusiveClass(part.exclusiveClass); 153 if (part.keyFrom > performer.getKeyFrom()) 154 performer.setKeyFrom(part.keyFrom); 155 if (part.keyTo < performer.getKeyTo()) 156 performer.setKeyTo(part.keyTo); 157 if (part.velFrom > performer.getVelFrom()) 158 performer.setVelFrom(part.velFrom); 159 if (part.velTo < performer.getVelTo()) 160 performer.setVelTo(part.velTo); 161 performer.getOscillators().addAll(mperfm.getOscillators()); 162 performer.getConnectionBlocks().addAll( 163 mperfm.getConnectionBlocks()); 164 } 165 } 166 } 167 168 return performers; 169 } 170 171 @Override 172 public Object getData() { 173 return null; 174 } 175 176 @Override 177 public String getName() { 178 return this.name; 179 } 180 181 public void setName(String name) { 182 this.name = name; 183 } 184 185 @Override 186 public ModelPatch getPatch() { 187 return new ModelPatch(bank, preset, percussion); 188 } 189 190 public void setPatch(Patch patch) { 191 if (patch instanceof ModelPatch && ((ModelPatch)patch).isPercussion()) { 192 percussion = true; 193 bank = patch.getBank(); 194 preset = patch.getProgram(); 195 } else { 196 percussion = false; 197 bank = patch.getBank(); 198 preset = patch.getProgram(); 199 } 200 } 201 }