Subversion Repositories svn.mios

Rev

Rev 272 | Rev 660 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
213 tk 1
/*
2
 * @(#)SIDV2librarian.java  beta1   2008/01/21
3
 *
4
 * Copyright (C) 2008    Rutger Vlek (rutgervlek@hotmail.com)
5
 *
6
 * This application is free software; you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation; either version 2 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * This application is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this application; if not, write to the Free Software
18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
 */
20
 
21
package org.midibox.sidedit.gui.lead;
22
 
23
import java.awt.BorderLayout;
24
import java.util.Vector;
272 rutgerv 25
 
213 tk 26
import javax.swing.BorderFactory;
27
import javax.swing.JComboBox;
28
import javax.swing.JPanel;
29
import javax.swing.JSlider;
30
import javax.swing.JTabbedPane;
31
import javax.swing.JToggleButton;
628 adamjking 32
 
213 tk 33
import org.midibox.sidedit.SIDEditController;
34
import org.midibox.sidedit.SIDSysexParameterControl;
628 adamjking 35
import org.midibox.sidedit.gui.FilterGUI;
36
import org.midibox.sidedit.gui.GlobalGUI;
37
import org.midibox.sidedit.gui.controls.SIDSysexParameterControlCombo;
38
import org.midibox.sidedit.gui.controls.SIDSysexParameterControlGUI;
39
import org.midibox.sidedit.gui.controls.SIDSysexParameterControlKnob;
40
import org.midibox.sidedit.gui.controls.SIDSysexParameterControlLFOSelect;
41
import org.midibox.sidedit.gui.controls.SIDSysexParameterControlSlider;
42
import org.midibox.sidedit.gui.controls.SIDSysexParameterControlToggleButton;
43
import org.midibox.sidedit.gui.controls.SIDSysexParameterControlWaveSelect;
213 tk 44
import org.midibox.utils.gui.ImageLoader;
45
import org.midibox.utils.gui.Knob;
46
import org.midibox.utils.gui.MyButtonUI;
47
 
48
public class LeadGUI extends JPanel {
49
    private Vector GUIs, EXT_L, EXT_R, MP_L, MP_R;
272 rutgerv 50
    private SIDEditController sidEditController;
51
    private boolean stereoLinked = true;
52
    private boolean oscLinked = false;
628 adamjking 53
 
272 rutgerv 54
    public LeadGUI(SIDEditController sidEditController) {
55
        this.sidEditController = sidEditController;
213 tk 56
        setLayout(new BorderLayout());
628 adamjking 57
 
213 tk 58
        GUIs = createGUIs(sidEditController);
59
        createLinkGroups();
60
        permanentLink();
628 adamjking 61
        JTabbedPane tabbedPane = new JTabbedPane();
62
        JPanel t1 = new GlobalGUI((Vector) GUIs.elementAt(0), (Vector) GUIs
63
                .elementAt(1));
64
        JPanel t2 = new OscillatorGUI((Vector) GUIs.elementAt(4), (Vector) GUIs
65
                .elementAt(5), (Vector) GUIs.elementAt(6), (Vector) GUIs
66
                .elementAt(7), (Vector) GUIs.elementAt(8), (Vector) GUIs
67
                .elementAt(9), (Vector) GUIs.elementAt(10));
68
        JPanel t3 = new FilterGUI((Vector) GUIs.elementAt(2), (Vector) GUIs
69
                .elementAt(3));
70
        JPanel t4 = new LfoGUI((Vector) GUIs.elementAt(11), (Vector) GUIs
71
                .elementAt(12), (Vector) GUIs.elementAt(13));
72
        JPanel t6 = new ModulationGUI((Vector) GUIs.elementAt(14));
73
        JPanel t7 = new TriggerGUI((Vector) GUIs.elementAt(15));
74
        JPanel t8 = new ArpGUI((Vector) GUIs.elementAt(5), (Vector) GUIs
75
                .elementAt(6), (Vector) GUIs.elementAt(7), (Vector) GUIs
76
                .elementAt(8), (Vector) GUIs.elementAt(9), (Vector) GUIs
77
                .elementAt(10));
78
        JPanel t9 = new WTGUI((Vector) GUIs.elementAt(16));
79
        JPanel t11 = new SwinGUI((Vector) GUIs.elementAt(5), (Vector) GUIs
80
                .elementAt(6), (Vector) GUIs.elementAt(7), (Vector) GUIs
81
                .elementAt(8), (Vector) GUIs.elementAt(9), (Vector) GUIs
82
                .elementAt(10));
83
 
213 tk 84
        tabbedPane.addTab("Global", t1);
85
        tabbedPane.addTab("Oscillator", t2);
86
        tabbedPane.addTab("Filter", t3);
87
        tabbedPane.addTab("LFO/ENV", t4);
88
        tabbedPane.addTab("Modulation", t6);
89
        tabbedPane.addTab("Trigger", t7);
90
        tabbedPane.addTab("Arpeggiator", t8);
91
        tabbedPane.addTab("Wavetable", t9);
92
        tabbedPane.addTab("SwinSID", t11);
628 adamjking 93
 
213 tk 94
        add(tabbedPane, BorderLayout.NORTH);
95
        setOpaque(false);
96
        setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
272 rutgerv 97
        stereoLink(true);
213 tk 98
    }
628 adamjking 99
 
213 tk 100
    protected Vector createGUIs(SIDEditController sidEditController) {
628 adamjking 101
        Vector v_in = (Vector) sidEditController.getEngine();
213 tk 102
        Vector v_out = new Vector();
103
        for (int b = 0; b < v_in.size(); b++) {
628 adamjking 104
            v_out.addElement(createGuiElements((Vector) v_in.elementAt(b)));
213 tk 105
        }
106
        return v_out;
107
    }
628 adamjking 108
 
213 tk 109
    protected Vector createGuiElements(Vector v) {
110
        // Create controller GUI's
111
        Vector midiParameterGUIs = new Vector();
112
        for (int c = 0; c < v.size(); c++) {
628 adamjking 113
            SIDSysexParameterControl midiParameter = (SIDSysexParameterControl) v
114
                    .elementAt(c);
213 tk 115
            switch (midiParameter.getType()) {
628 adamjking 116
            case 0:
117
                // Create knob
118
                Knob knob = new Knob(ImageLoader
119
                        .getImageIcon("plasticknob_strip.png"));
120
                midiParameterGUIs.add(new SIDSysexParameterControlKnob(
121
                        midiParameter, knob, true, BorderLayout.SOUTH, true,
122
                        true));
123
                break;
124
            case 1:
125
                // Create toggle button
126
                JToggleButton button = new JToggleButton();
127
                button.setUI(new MyButtonUI(ImageLoader
128
                        .getImageIcon("button_on.png"), ImageLoader
129
                        .getImageIcon("button.png")));
130
                midiParameterGUIs.add(new SIDSysexParameterControlToggleButton(
131
                        midiParameter, button, false, true, BorderLayout.SOUTH,
132
                        true, false));
133
                break;
134
            case 2:
135
                // Create simple toggle button
136
                JToggleButton simpleButton = new JToggleButton();
137
                simpleButton.setUI(new MyButtonUI(ImageLoader
138
                        .getImageIcon("button_on.png"), ImageLoader
139
                        .getImageIcon("button.png")));
140
                midiParameterGUIs.add(new SIDSysexParameterControlToggleButton(
141
                        midiParameter, simpleButton, false, false,
142
                        BorderLayout.SOUTH, false, false));
143
                break;
144
            case 3:
145
                // Create slider
146
                JSlider slider = new JSlider();
147
                midiParameterGUIs.add(new SIDSysexParameterControlSlider(
148
                        midiParameter, slider, true, BorderLayout.SOUTH, true,
149
                        true));
150
                break;
151
            case 4:
152
                // Create waveform selector (Voice)
153
                midiParameterGUIs.add(new SIDSysexParameterControlWaveSelect(
154
                        midiParameter, true, BorderLayout.NORTH, false, false));
155
                break;
156
            case 5:
157
                // Create waveform selector (LFO)
158
                midiParameterGUIs.add(new SIDSysexParameterControlLFOSelect(
159
                        midiParameter, true, BorderLayout.NORTH, false, false));
160
                break;
161
            case 6:
162
                // Normal combo
163
                JComboBox combo = new JComboBox(midiParameter
164
                        .getSparseValAlias());
165
                midiParameterGUIs.add(new SIDSysexParameterControlCombo(
166
                        midiParameter, combo, true, BorderLayout.NORTH, false,
167
                        false));
168
                break;
169
            case 7:
170
                // Simple rotary
171
                Knob knob1 = new Knob(ImageLoader
172
                        .getImageIcon("plasticknob_strip.png"));
173
                midiParameterGUIs.add(new SIDSysexParameterControlKnob(
174
                        midiParameter, knob1, false, BorderLayout.SOUTH, true,
175
                        true));
176
                break;
177
            default:
178
                midiParameterGUIs.add(midiParameter);
179
                System.out.println("Unknown controller type!");
180
            }
213 tk 181
        }
182
        return midiParameterGUIs;
628 adamjking 183
    }
184
 
213 tk 185
    public void createLinkGroups() {
628 adamjking 186
        // Create vector of pointers to left and right parameters (for linking
187
        // only)
213 tk 188
        EXT_L = new Vector();
189
        EXT_R = new Vector();
190
        for (int c = 0; c < 8; c++) {
628 adamjking 191
            EXT_L.add(((Vector) GUIs.elementAt(1)).elementAt(2 * c));
192
            EXT_R.add(((Vector) GUIs.elementAt(1)).elementAt((2 * c) + 1));
213 tk 193
        }
628 adamjking 194
 
195
        // Create vector of pointers to left and right parameters (for linking
196
        // only)
213 tk 197
        MP_L = new Vector();
628 adamjking 198
        MP_R = new Vector();
213 tk 199
        for (int nmp = 0; nmp < 8; nmp++) {
200
            for (int c = 8; c < 16; c++) {
628 adamjking 201
                MP_L.add(((Vector) GUIs.elementAt(14))
202
                        .elementAt((24 * nmp) + c));
203
                MP_R.add(((Vector) GUIs.elementAt(14)).elementAt((24 * nmp) + c
204
                        + 8));
213 tk 205
            }
206
        }
207
    }
628 adamjking 208
 
213 tk 209
    public void permanentLink() {
210
        // Link Key Sync button to Trigger: LFO Reset at Note On
211
        Vector LFO = new Vector();
212
        Vector TRIGGER = new Vector();
213
        for (int c = 0; c < 6; c++) {
628 adamjking 214
            LFO.add(((Vector) GUIs.elementAt(11)).elementAt(8 + (9 * c)));
215
            TRIGGER.add(((Vector) GUIs.elementAt(15)).elementAt(10 + c));
213 tk 216
        }
628 adamjking 217
        linkPar(LFO, TRIGGER);
213 tk 218
    }
628 adamjking 219
 
220
    public void restLink(boolean b) {
272 rutgerv 221
        if (b) {
628 adamjking 222
            linkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(9)); // Link
223
            // V1
224
            // &
225
            // V5
226
            linkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(10)); // Link
227
            // V1
228
            // &
229
            // V6
230
            linkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(8)); // Link
231
            // V2
232
            // &
233
            // V4
234
            linkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(10)); // Link
235
            // V2
236
            // &
237
            // V6
238
            linkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(8)); // Link
239
            // V3
240
            // &
241
            // V4
242
            linkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(9)); // Link
243
            // V3
244
            // &
245
            // V5
272 rutgerv 246
        } else {
628 adamjking 247
            unlinkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(9)); // Unlink
248
            // V1
249
            // &
250
            // V5
251
            unlinkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(10)); // Unlink
252
            // V1
253
            // &
254
            // V6
255
            unlinkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(8)); // Unlink
256
            // V2
257
            // &
258
            // V4
259
            unlinkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(10)); // Unlink
260
            // V2
261
            // &
262
            // V6
263
            unlinkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(8)); // Unlink
264
            // V3
265
            // &
266
            // V4
267
            unlinkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(9)); // Unlink
268
            // V3
269
            // &
270
            // V5
272 rutgerv 271
        }
213 tk 272
    }
628 adamjking 273
 
272 rutgerv 274
    public void oscLink(boolean b) {
275
        if (b) {
276
            sidEditController.getPatch().setOscillatorLink(true);
628 adamjking 277
            linkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(6)); // Link
278
            // V1
279
            // &
280
            // V2
281
            linkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(7)); // Link
282
            // V2
283
            // &
284
            // V3
285
            linkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(5)); // Link
286
            // V3
287
            // &
288
            // V1
289
            linkPar((Vector) GUIs.elementAt(8), (Vector) GUIs.elementAt(9)); // Link
290
            // V4
291
            // &
292
            // V5
293
            linkPar((Vector) GUIs.elementAt(9), (Vector) GUIs.elementAt(10)); // Link
294
            // V5
295
            // &
296
            // V6
297
            linkPar((Vector) GUIs.elementAt(10), (Vector) GUIs.elementAt(8)); // Link
298
            // V6
299
            // &
300
            // V4
272 rutgerv 301
        } else {
302
            sidEditController.getPatch().setOscillatorLink(false);
628 adamjking 303
            unlinkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(6)); // Unlink
304
            // V1
305
            // &
306
            // V2
307
            unlinkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(7)); // Unlink
308
            // V2
309
            // &
310
            // V3
311
            unlinkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(5)); // Unlink
312
            // V3
313
            // &
314
            // V1
315
            unlinkPar((Vector) GUIs.elementAt(8), (Vector) GUIs.elementAt(9)); // Unlink
316
            // V4
317
            // &
318
            // V5
319
            unlinkPar((Vector) GUIs.elementAt(9), (Vector) GUIs.elementAt(10));// Unlink
320
            // V5
321
            // &
322
            // V6
323
            unlinkPar((Vector) GUIs.elementAt(10), (Vector) GUIs.elementAt(8));// Unlink
324
            // V6
325
            // &
326
            // V4
272 rutgerv 327
        }
328
        if (stereoLinked) {
329
            restLink(b);
628 adamjking 330
        }
272 rutgerv 331
        oscLinked = b;
332
    }
628 adamjking 333
 
272 rutgerv 334
    public void stereoLink(boolean b) {
335
        if (b) {
336
            sidEditController.getPatch().setStereoLink(true);
628 adamjking 337
            linkPar(EXT_L, EXT_R); // Link external outputs 2 by 2
338
            linkPar(MP_L, MP_R); // Link MP direct assign left & right
339
            linkPar((Vector) GUIs.elementAt(2), (Vector) GUIs.elementAt(3)); // Link
340
            // filter
341
            // left
342
            // &
343
            // right
344
            linkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(8)); // Link
345
            // V1
346
            // &
347
            // V4
348
            linkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(9)); // Link
349
            // V2
350
            // &
351
            // V5
352
            linkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(10)); // Link
353
            // V3
354
            // &
355
            // V6
272 rutgerv 356
        } else {
357
            sidEditController.getPatch().setStereoLink(false);
628 adamjking 358
            unlinkPar(EXT_L, EXT_R); // Unlink external outputs 2 by 2
359
            unlinkPar(MP_L, MP_R); // Unlink MP direct assign left & right
360
            unlinkPar((Vector) GUIs.elementAt(2), (Vector) GUIs.elementAt(3)); // Unlink
361
            // filter
362
            // left
363
            // &
364
            // right
365
            unlinkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(8)); // Unlink
366
            // V1
367
            // &
368
            // V4
369
            unlinkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(9)); // Unlink
370
            // V2
371
            // &
372
            // V5
373
            unlinkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(10)); // Unlink
374
            // V3
375
            // &
376
            // V6
272 rutgerv 377
        }
378
        if (oscLinked) {
379
            restLink(b);
380
        }
381
        stereoLinked = b;
382
    }
628 adamjking 383
 
213 tk 384
    protected void linkPar(Vector left, Vector right) {
385
        for (int c = 0; c < left.size(); c++) {
628 adamjking 386
            SIDSysexParameterControlGUI g1 = (SIDSysexParameterControlGUI) left
387
                    .elementAt(c);
388
            SIDSysexParameterControlGUI g2 = (SIDSysexParameterControlGUI) right
389
                    .elementAt(c);
213 tk 390
            g1.addMidiParameter(g2.getMidiParameter());
391
            g2.addMidiParameter(g1.getMidiParameter());
392
        }
393
    }
628 adamjking 394
 
213 tk 395
    protected void unlinkPar(Vector left, Vector right) {
396
        for (int c = 0; c < left.size(); c++) {
628 adamjking 397
            SIDSysexParameterControlGUI g1 = (SIDSysexParameterControlGUI) left
398
                    .elementAt(c);
399
            SIDSysexParameterControlGUI g2 = (SIDSysexParameterControlGUI) right
400
                    .elementAt(c);
213 tk 401
            g1.removeMidiParameter(g2.getMidiParameter());
402
            g2.removeMidiParameter(g1.getMidiParameter());
403
        }
404
    }
405
}