| /* | |
| * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. | |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| * | |
| * This code is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License version 2 only, as | |
| * published by the Free Software Foundation. Oracle designates this | |
| * particular file as subject to the "Classpath" exception as provided | |
| * by Oracle in the LICENSE file that accompanied this code. | |
| * | |
| * This code is distributed in the hope that it will be useful, but WITHOUT | |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| * version 2 for more details (a copy is included in the LICENSE file that | |
| * accompanied this code). | |
| * | |
| * You should have received a copy of the GNU General Public License version | |
| * 2 along with this work; if not, write to the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| * | |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| * or visit www.oracle.com if you need additional information or have any | |
| * questions. | |
| */ | |
| package com.sun.media.sound; | |
| import java.util.ArrayList; | |
| import java.util.List; | |
| import javax.sound.midi.Patch; | |
| /** | |
| * A simple instrument that is made of other ModelInstrument, ModelPerformer | |
| * objects. | |
| * | |
| * @author Karl Helgason | |
| */ | |
| public class SimpleInstrument extends ModelInstrument { | |
| private static class SimpleInstrumentPart { | |
| ModelPerformer[] performers; | |
| int keyFrom; | |
| int keyTo; | |
| int velFrom; | |
| int velTo; | |
| int exclusiveClass; | |
| } | |
| protected int preset = 0; | |
| protected int bank = 0; | |
| protected boolean percussion = false; | |
| protected String name = ""; | |
| protected List<SimpleInstrumentPart> parts = new ArrayList<>(); | |
| public SimpleInstrument() { | |
| super(null, null, null, null); | |
| } | |
| public void clear() { | |
| parts.clear(); | |
| } | |
| public void add(ModelPerformer[] performers, int keyFrom, int keyTo, | |
| int velFrom, int velTo, int exclusiveClass) { | |
| SimpleInstrumentPart part = new SimpleInstrumentPart(); | |
| part.performers = performers; | |
| part.keyFrom = keyFrom; | |
| part.keyTo = keyTo; | |
| part.velFrom = velFrom; | |
| part.velTo = velTo; | |
| part.exclusiveClass = exclusiveClass; | |
| parts.add(part); | |
| } | |
| public void add(ModelPerformer[] performers, int keyFrom, int keyTo, | |
| int velFrom, int velTo) { | |
| add(performers, keyFrom, keyTo, velFrom, velTo, -1); | |
| } | |
| public void add(ModelPerformer[] performers, int keyFrom, int keyTo) { | |
| add(performers, keyFrom, keyTo, 0, 127, -1); | |
| } | |
| public void add(ModelPerformer[] performers) { | |
| add(performers, 0, 127, 0, 127, -1); | |
| } | |
| public void add(ModelPerformer performer, int keyFrom, int keyTo, | |
| int velFrom, int velTo, int exclusiveClass) { | |
| add(new ModelPerformer[]{performer}, keyFrom, keyTo, velFrom, velTo, | |
| exclusiveClass); | |
| } | |
| public void add(ModelPerformer performer, int keyFrom, int keyTo, | |
| int velFrom, int velTo) { | |
| add(new ModelPerformer[]{performer}, keyFrom, keyTo, velFrom, velTo); | |
| } | |
| public void add(ModelPerformer performer, int keyFrom, int keyTo) { | |
| add(new ModelPerformer[]{performer}, keyFrom, keyTo); | |
| } | |
| public void add(ModelPerformer performer) { | |
| add(new ModelPerformer[]{performer}); | |
| } | |
| public void add(ModelInstrument ins, int keyFrom, int keyTo, int velFrom, | |
| int velTo, int exclusiveClass) { | |
| add(ins.getPerformers(), keyFrom, keyTo, velFrom, velTo, exclusiveClass); | |
| } | |
| public void add(ModelInstrument ins, int keyFrom, int keyTo, int velFrom, | |
| int velTo) { | |
| add(ins.getPerformers(), keyFrom, keyTo, velFrom, velTo); | |
| } | |
| public void add(ModelInstrument ins, int keyFrom, int keyTo) { | |
| add(ins.getPerformers(), keyFrom, keyTo); | |
| } | |
| public void add(ModelInstrument ins) { | |
| add(ins.getPerformers()); | |
| } | |
| @Override | |
| public ModelPerformer[] getPerformers() { | |
| int percount = 0; | |
| for (SimpleInstrumentPart part : parts) | |
| if (part.performers != null) | |
| percount += part.performers.length; | |
| ModelPerformer[] performers = new ModelPerformer[percount]; | |
| int px = 0; | |
| for (SimpleInstrumentPart part : parts) { | |
| if (part.performers != null) { | |
| for (ModelPerformer mperfm : part.performers) { | |
| ModelPerformer performer = new ModelPerformer(); | |
| performer.setName(getName()); | |
| performers[px++] = performer; | |
| performer.setDefaultConnectionsEnabled( | |
| mperfm.isDefaultConnectionsEnabled()); | |
| performer.setKeyFrom(mperfm.getKeyFrom()); | |
| performer.setKeyTo(mperfm.getKeyTo()); | |
| performer.setVelFrom(mperfm.getVelFrom()); | |
| performer.setVelTo(mperfm.getVelTo()); | |
| performer.setExclusiveClass(mperfm.getExclusiveClass()); | |
| performer.setSelfNonExclusive(mperfm.isSelfNonExclusive()); | |
| performer.setReleaseTriggered(mperfm.isReleaseTriggered()); | |
| if (part.exclusiveClass != -1) | |
| performer.setExclusiveClass(part.exclusiveClass); | |
| if (part.keyFrom > performer.getKeyFrom()) | |
| performer.setKeyFrom(part.keyFrom); | |
| if (part.keyTo < performer.getKeyTo()) | |
| performer.setKeyTo(part.keyTo); | |
| if (part.velFrom > performer.getVelFrom()) | |
| performer.setVelFrom(part.velFrom); | |
| if (part.velTo < performer.getVelTo()) | |
| performer.setVelTo(part.velTo); | |
| performer.getOscillators().addAll(mperfm.getOscillators()); | |
| performer.getConnectionBlocks().addAll( | |
| mperfm.getConnectionBlocks()); | |
| } | |
| } | |
| } | |
| return performers; | |
| } | |
| @Override | |
| public Object getData() { | |
| return null; | |
| } | |
| @Override | |
| public String getName() { | |
| return this.name; | |
| } | |
| public void setName(String name) { | |
| this.name = name; | |
| } | |
| @Override | |
| public ModelPatch getPatch() { | |
| return new ModelPatch(bank, preset, percussion); | |
| } | |
| public void setPatch(Patch patch) { | |
| if (patch instanceof ModelPatch && ((ModelPatch)patch).isPercussion()) { | |
| percussion = true; | |
| bank = patch.getBank(); | |
| preset = patch.getProgram(); | |
| } else { | |
| percussion = false; | |
| bank = patch.getBank(); | |
| preset = patch.getProgram(); | |
| } | |
| } | |
| } |