1/*
2 * Copyright (c) 2007, 2013, 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
26package com.sun.media.sound;
27
28/**
29 * This class is used to store modulator/artiuclation data.
30 * A modulator connects one synthesizer source to
31 * a destination. For example a note on velocity
32 * can be mapped to the gain of the synthesized voice.
33 * It is stored as a "art1" or "art2" chunk inside DLS files.
34 *
35 * @author Karl Helgason
36 */
37public final class DLSModulator {
38
39    // DLS1 Destinations
40    public static final int CONN_DST_NONE = 0x000; // 0
41    public static final int CONN_DST_GAIN = 0x001; // cB
42    public static final int CONN_DST_PITCH = 0x003; // cent
43    public static final int CONN_DST_PAN = 0x004; // 0.1%
44    public static final int CONN_DST_LFO_FREQUENCY = 0x104; // cent (default 5 Hz)
45    public static final int CONN_DST_LFO_STARTDELAY = 0x105; // timecent
46    public static final int CONN_DST_EG1_ATTACKTIME = 0x206; // timecent
47    public static final int CONN_DST_EG1_DECAYTIME = 0x207; // timecent
48    public static final int CONN_DST_EG1_RELEASETIME = 0x209; // timecent
49    public static final int CONN_DST_EG1_SUSTAINLEVEL = 0x20A; // 0.1%
50    public static final int CONN_DST_EG2_ATTACKTIME = 0x30A; // timecent
51    public static final int CONN_DST_EG2_DECAYTIME = 0x30B; // timecent
52    public static final int CONN_DST_EG2_RELEASETIME = 0x30D; // timecent
53    public static final int CONN_DST_EG2_SUSTAINLEVEL = 0x30E; // 0.1%
54    // DLS2 Destinations
55    public static final int CONN_DST_KEYNUMBER = 0x005;
56    public static final int CONN_DST_LEFT = 0x010; // 0.1%
57    public static final int CONN_DST_RIGHT = 0x011; // 0.1%
58    public static final int CONN_DST_CENTER = 0x012; // 0.1%
59    public static final int CONN_DST_LEFTREAR = 0x013; // 0.1%
60    public static final int CONN_DST_RIGHTREAR = 0x014; // 0.1%
61    public static final int CONN_DST_LFE_CHANNEL = 0x015; // 0.1%
62    public static final int CONN_DST_CHORUS = 0x080; // 0.1%
63    public static final int CONN_DST_REVERB = 0x081; // 0.1%
64    public static final int CONN_DST_VIB_FREQUENCY = 0x114; // cent
65    public static final int CONN_DST_VIB_STARTDELAY = 0x115; // dB
66    public static final int CONN_DST_EG1_DELAYTIME = 0x20B; // timecent
67    public static final int CONN_DST_EG1_HOLDTIME = 0x20C; // timecent
68    public static final int CONN_DST_EG1_SHUTDOWNTIME = 0x20D; // timecent
69    public static final int CONN_DST_EG2_DELAYTIME = 0x30F; // timecent
70    public static final int CONN_DST_EG2_HOLDTIME = 0x310; // timecent
71    public static final int CONN_DST_FILTER_CUTOFF = 0x500; // cent
72    public static final int CONN_DST_FILTER_Q = 0x501; // dB
73
74    // DLS1 Sources
75    public static final int CONN_SRC_NONE = 0x000; // 1
76    public static final int CONN_SRC_LFO = 0x001; // linear (sine wave)
77    public static final int CONN_SRC_KEYONVELOCITY = 0x002; // ??db or velocity??
78    public static final int CONN_SRC_KEYNUMBER = 0x003; // ??cent or keynumber??
79    public static final int CONN_SRC_EG1 = 0x004; // linear direct from eg
80    public static final int CONN_SRC_EG2 = 0x005; // linear direct from eg
81    public static final int CONN_SRC_PITCHWHEEL = 0x006; // linear -1..1
82    public static final int CONN_SRC_CC1 = 0x081; // linear 0..1
83    public static final int CONN_SRC_CC7 = 0x087; // linear 0..1
84    public static final int CONN_SRC_CC10 = 0x08A; // linear 0..1
85    public static final int CONN_SRC_CC11 = 0x08B; // linear 0..1
86    public static final int CONN_SRC_RPN0 = 0x100; // ?? // Pitch Bend Range
87    public static final int CONN_SRC_RPN1 = 0x101; // ?? // Fine Tune
88    public static final int CONN_SRC_RPN2 = 0x102; // ?? // Course Tune
89    // DLS2 Sources
90    public static final int CONN_SRC_POLYPRESSURE = 0x007; // linear 0..1
91    public static final int CONN_SRC_CHANNELPRESSURE = 0x008; // linear 0..1
92    public static final int CONN_SRC_VIBRATO = 0x009; // linear 0..1
93    public static final int CONN_SRC_MONOPRESSURE = 0x00A; // linear 0..1
94    public static final int CONN_SRC_CC91 = 0x0DB; // linear 0..1
95    public static final int CONN_SRC_CC93 = 0x0DD; // linear 0..1
96    // DLS1 Transforms
97    public static final int CONN_TRN_NONE = 0x000;
98    public static final int CONN_TRN_CONCAVE = 0x001;
99    // DLS2 Transforms
100    public static final int CONN_TRN_CONVEX = 0x002;
101    public static final int CONN_TRN_SWITCH = 0x003;
102    public static final int DST_FORMAT_CB = 1;
103    public static final int DST_FORMAT_CENT = 1;
104    public static final int DST_FORMAT_TIMECENT = 2;
105    public static final int DST_FORMAT_PERCENT = 3;
106    int source;
107    int control;
108    int destination;
109    int transform;
110    int scale;
111    int version = 1;
112
113    public int getControl() {
114        return control;
115    }
116
117    public void setControl(int control) {
118        this.control = control;
119    }
120
121    public static int getDestinationFormat(int destination) {
122
123        if (destination == CONN_DST_GAIN)
124            return DST_FORMAT_CB;
125        if (destination == CONN_DST_PITCH)
126            return DST_FORMAT_CENT;
127        if (destination == CONN_DST_PAN)
128            return DST_FORMAT_PERCENT;
129
130        if (destination == CONN_DST_LFO_FREQUENCY)
131            return DST_FORMAT_CENT;
132        if (destination == CONN_DST_LFO_STARTDELAY)
133            return DST_FORMAT_TIMECENT;
134
135        if (destination == CONN_DST_EG1_ATTACKTIME)
136            return DST_FORMAT_TIMECENT;
137        if (destination == CONN_DST_EG1_DECAYTIME)
138            return DST_FORMAT_TIMECENT;
139        if (destination == CONN_DST_EG1_RELEASETIME)
140            return DST_FORMAT_TIMECENT;
141        if (destination == CONN_DST_EG1_SUSTAINLEVEL)
142            return DST_FORMAT_PERCENT;
143
144        if (destination == CONN_DST_EG2_ATTACKTIME)
145            return DST_FORMAT_TIMECENT;
146        if (destination == CONN_DST_EG2_DECAYTIME)
147            return DST_FORMAT_TIMECENT;
148        if (destination == CONN_DST_EG2_RELEASETIME)
149            return DST_FORMAT_TIMECENT;
150        if (destination == CONN_DST_EG2_SUSTAINLEVEL)
151            return DST_FORMAT_PERCENT;
152
153        if (destination == CONN_DST_KEYNUMBER)
154            return DST_FORMAT_CENT; // NOT SURE WITHOUT DLS 2 SPEC
155        if (destination == CONN_DST_LEFT)
156            return DST_FORMAT_CB;
157        if (destination == CONN_DST_RIGHT)
158            return DST_FORMAT_CB;
159        if (destination == CONN_DST_CENTER)
160            return DST_FORMAT_CB;
161        if (destination == CONN_DST_LEFTREAR)
162            return DST_FORMAT_CB;
163        if (destination == CONN_DST_RIGHTREAR)
164            return DST_FORMAT_CB;
165        if (destination == CONN_DST_LFE_CHANNEL)
166            return DST_FORMAT_CB;
167        if (destination == CONN_DST_CHORUS)
168            return DST_FORMAT_PERCENT;
169        if (destination == CONN_DST_REVERB)
170            return DST_FORMAT_PERCENT;
171
172        if (destination == CONN_DST_VIB_FREQUENCY)
173            return DST_FORMAT_CENT;
174        if (destination == CONN_DST_VIB_STARTDELAY)
175            return DST_FORMAT_TIMECENT;
176
177        if (destination == CONN_DST_EG1_DELAYTIME)
178            return DST_FORMAT_TIMECENT;
179        if (destination == CONN_DST_EG1_HOLDTIME)
180            return DST_FORMAT_TIMECENT;
181        if (destination == CONN_DST_EG1_SHUTDOWNTIME)
182            return DST_FORMAT_TIMECENT;
183
184        if (destination == CONN_DST_EG2_DELAYTIME)
185            return DST_FORMAT_TIMECENT;
186        if (destination == CONN_DST_EG2_HOLDTIME)
187            return DST_FORMAT_TIMECENT;
188
189        if (destination == CONN_DST_FILTER_CUTOFF)
190            return DST_FORMAT_CENT;
191        if (destination == CONN_DST_FILTER_Q)
192            return DST_FORMAT_CB;
193
194        return -1;
195    }
196
197    public static String getDestinationName(int destination) {
198
199        if (destination == CONN_DST_GAIN)
200            return "gain";
201        if (destination == CONN_DST_PITCH)
202            return "pitch";
203        if (destination == CONN_DST_PAN)
204            return "pan";
205
206        if (destination == CONN_DST_LFO_FREQUENCY)
207            return "lfo1.freq";
208        if (destination == CONN_DST_LFO_STARTDELAY)
209            return "lfo1.delay";
210
211        if (destination == CONN_DST_EG1_ATTACKTIME)
212            return "eg1.attack";
213        if (destination == CONN_DST_EG1_DECAYTIME)
214            return "eg1.decay";
215        if (destination == CONN_DST_EG1_RELEASETIME)
216            return "eg1.release";
217        if (destination == CONN_DST_EG1_SUSTAINLEVEL)
218            return "eg1.sustain";
219
220        if (destination == CONN_DST_EG2_ATTACKTIME)
221            return "eg2.attack";
222        if (destination == CONN_DST_EG2_DECAYTIME)
223            return "eg2.decay";
224        if (destination == CONN_DST_EG2_RELEASETIME)
225            return "eg2.release";
226        if (destination == CONN_DST_EG2_SUSTAINLEVEL)
227            return "eg2.sustain";
228
229        if (destination == CONN_DST_KEYNUMBER)
230            return "keynumber";
231        if (destination == CONN_DST_LEFT)
232            return "left";
233        if (destination == CONN_DST_RIGHT)
234            return "right";
235        if (destination == CONN_DST_CENTER)
236            return "center";
237        if (destination == CONN_DST_LEFTREAR)
238            return "leftrear";
239        if (destination == CONN_DST_RIGHTREAR)
240            return "rightrear";
241        if (destination == CONN_DST_LFE_CHANNEL)
242            return "lfe_channel";
243        if (destination == CONN_DST_CHORUS)
244            return "chorus";
245        if (destination == CONN_DST_REVERB)
246            return "reverb";
247
248        if (destination == CONN_DST_VIB_FREQUENCY)
249            return "vib.freq";
250        if (destination == CONN_DST_VIB_STARTDELAY)
251            return "vib.delay";
252
253        if (destination == CONN_DST_EG1_DELAYTIME)
254            return "eg1.delay";
255        if (destination == CONN_DST_EG1_HOLDTIME)
256            return "eg1.hold";
257        if (destination == CONN_DST_EG1_SHUTDOWNTIME)
258            return "eg1.shutdown";
259
260        if (destination == CONN_DST_EG2_DELAYTIME)
261            return "eg2.delay";
262        if (destination == CONN_DST_EG2_HOLDTIME)
263            return "eg.2hold";
264
265        if (destination == CONN_DST_FILTER_CUTOFF)
266            return "filter.cutoff"; // NOT SURE WITHOUT DLS 2 SPEC
267        if (destination == CONN_DST_FILTER_Q)
268            return "filter.q"; // NOT SURE WITHOUT DLS 2 SPEC
269
270        return null;
271    }
272
273    public static String getSourceName(int source) {
274
275        if (source == CONN_SRC_NONE)
276            return "none";
277        if (source == CONN_SRC_LFO)
278            return "lfo";
279        if (source == CONN_SRC_KEYONVELOCITY)
280            return "keyonvelocity";
281        if (source == CONN_SRC_KEYNUMBER)
282            return "keynumber";
283        if (source == CONN_SRC_EG1)
284            return "eg1";
285        if (source == CONN_SRC_EG2)
286            return "eg2";
287        if (source == CONN_SRC_PITCHWHEEL)
288            return "pitchweel";
289        if (source == CONN_SRC_CC1)
290            return "cc1";
291        if (source == CONN_SRC_CC7)
292            return "cc7";
293        if (source == CONN_SRC_CC10)
294            return "c10";
295        if (source == CONN_SRC_CC11)
296            return "cc11";
297
298        if (source == CONN_SRC_POLYPRESSURE)
299            return "polypressure";
300        if (source == CONN_SRC_CHANNELPRESSURE)
301            return "channelpressure";
302        if (source == CONN_SRC_VIBRATO)
303            return "vibrato";
304        if (source == CONN_SRC_MONOPRESSURE)
305            return "monopressure";
306        if (source == CONN_SRC_CC91)
307            return "cc91";
308        if (source == CONN_SRC_CC93)
309            return "cc93";
310        return null;
311    }
312
313    public int getDestination() {
314        return destination;
315    }
316
317    public void setDestination(int destination) {
318        this.destination = destination;
319    }
320
321    public int getScale() {
322        return scale;
323    }
324
325    public void setScale(int scale) {
326        this.scale = scale;
327    }
328
329    public int getSource() {
330        return source;
331    }
332
333    public void setSource(int source) {
334        this.source = source;
335    }
336
337    public int getVersion() {
338        return version;
339    }
340
341    public void setVersion(int version) {
342        this.version = version;
343    }
344
345    public int getTransform() {
346        return transform;
347    }
348
349    public void setTransform(int transform) {
350        this.transform = transform;
351    }
352}
353