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 
SimpleInstrument()55     public SimpleInstrument() {
56         super(null, null, null, null);
57     }
58 
clear()59     public void clear() {
60         parts.clear();
61     }
62 
add(ModelPerformer[] performers, int keyFrom, int keyTo, int velFrom, int velTo, int exclusiveClass)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 
add(ModelPerformer[] performers, int keyFrom, int keyTo, int velFrom, int velTo)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 
add(ModelPerformer[] performers, int keyFrom, int keyTo)80     public void add(ModelPerformer[] performers, int keyFrom, int keyTo) {
81         add(performers, keyFrom, keyTo, 0, 127, -1);
82     }
83 
add(ModelPerformer[] performers)84     public void add(ModelPerformer[] performers) {
85         add(performers, 0, 127, 0, 127, -1);
86     }
87 
add(ModelPerformer performer, int keyFrom, int keyTo, int velFrom, int velTo, int exclusiveClass)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 
add(ModelPerformer performer, int keyFrom, int keyTo, int velFrom, int velTo)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 
add(ModelPerformer performer, int keyFrom, int keyTo)99     public void add(ModelPerformer performer, int keyFrom, int keyTo) {
100         add(new ModelPerformer[]{performer}, keyFrom, keyTo);
101     }
102 
add(ModelPerformer performer)103     public void add(ModelPerformer performer) {
104         add(new ModelPerformer[]{performer});
105     }
106 
add(ModelInstrument ins, int keyFrom, int keyTo, int velFrom, int velTo, int exclusiveClass)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 
add(ModelInstrument ins, int keyFrom, int keyTo, int velFrom, int velTo)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 
add(ModelInstrument ins, int keyFrom, int keyTo)117     public void add(ModelInstrument ins, int keyFrom, int keyTo) {
118         add(ins.getPerformers(), keyFrom, keyTo);
119     }
120 
add(ModelInstrument ins)121     public void add(ModelInstrument ins) {
122         add(ins.getPerformers());
123     }
124 
125     @Override
getPerformers()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
getData()172     public Object getData() {
173         return null;
174     }
175 
176     @Override
getName()177     public String getName() {
178         return this.name;
179     }
180 
setName(String name)181     public void setName(String name) {
182         this.name = name;
183     }
184 
185     @Override
getPatch()186     public ModelPatch getPatch() {
187         return new ModelPatch(bank, preset, percussion);
188     }
189 
setPatch(Patch patch)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 }
202