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.multi;
22
 
23
import java.awt.BorderLayout;
24
import java.util.Vector;
628 adamjking 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;
32
 
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 MultiGUI extends JPanel {
49
    private boolean linked = false;
50
    private Vector GUIs, EXT_L, EXT_R;
272 rutgerv 51
    private boolean oscLinked = false;
52
    private boolean stereoLinked = false;
628 adamjking 53
 
272 rutgerv 54
    private SIDEditController sidEditController;
628 adamjking 55
 
56
    public MultiGUI(SIDEditController sidEditController) {
272 rutgerv 57
        this.sidEditController = sidEditController;
213 tk 58
        setLayout(new BorderLayout());
628 adamjking 59
 
213 tk 60
        GUIs = createGUIs(sidEditController);
61
        createLinkGroups();
62
        JTabbedPane tabbedPane = new JTabbedPane();
628 adamjking 63
 
64
        JPanel t1 = new GlobalGUI((Vector) GUIs.elementAt(0), (Vector) GUIs
65
                .elementAt(1));
66
        JPanel t2 = new FilterGUI((Vector) GUIs.elementAt(2), (Vector) GUIs
67
                .elementAt(3));
68
        JPanel t3 = new InstrumentGUI((Vector) GUIs.elementAt(4), (Vector) GUIs
69
                .elementAt(10));
70
        JPanel t4 = new InstrumentGUI((Vector) GUIs.elementAt(5), (Vector) GUIs
71
                .elementAt(11));
72
        JPanel t5 = new InstrumentGUI((Vector) GUIs.elementAt(6), (Vector) GUIs
73
                .elementAt(12));
74
        JPanel t6 = new InstrumentGUI((Vector) GUIs.elementAt(7), (Vector) GUIs
75
                .elementAt(13));
76
        JPanel t7 = new InstrumentGUI((Vector) GUIs.elementAt(8), (Vector) GUIs
77
                .elementAt(14));
78
        JPanel t8 = new InstrumentGUI((Vector) GUIs.elementAt(9), (Vector) GUIs
79
                .elementAt(15));
80
        JPanel t9 = new WTGUI((Vector) GUIs.elementAt(16), (Vector) GUIs
81
                .elementAt(10), (Vector) GUIs.elementAt(11), (Vector) GUIs
82
                .elementAt(12), (Vector) GUIs.elementAt(13), (Vector) GUIs
83
                .elementAt(14), (Vector) GUIs.elementAt(15));
84
 
213 tk 85
        tabbedPane.addTab("Global", t1);
86
        tabbedPane.addTab("Filter", t2);
87
        tabbedPane.addTab("Instr.1", t3);
88
        tabbedPane.addTab("Instr.2", t4);
89
        tabbedPane.addTab("Instr.3", t5);
90
        tabbedPane.addTab("Instr.4", t6);
91
        tabbedPane.addTab("Instr.5", t7);
92
        tabbedPane.addTab("Instr.6", t8);
93
        tabbedPane.addTab("Wavetable", t9);
628 adamjking 94
 
213 tk 95
        add(tabbedPane, BorderLayout.NORTH);
96
        setOpaque(false);
97
        setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
628 adamjking 98
        stereoLink(true);
213 tk 99
    }
628 adamjking 100
 
213 tk 101
    protected Vector createGUIs(SIDEditController sidEditController) {
628 adamjking 102
        Vector v_in = (Vector) sidEditController.getEngine();
213 tk 103
        Vector v_out = new Vector();
104
        for (int b = 0; b < v_in.size(); b++) {
628 adamjking 105
            v_out.addElement(createGuiElements((Vector) v_in.elementAt(b)));
213 tk 106
        }
107
        return v_out;
108
    }
628 adamjking 109
 
213 tk 110
    protected Vector createGuiElements(Vector v) {
111
        // Create controller GUI's
112
        Vector midiParameterGUIs = new Vector();
113
        for (int c = 0; c < v.size(); c++) {
628 adamjking 114
            SIDSysexParameterControl midiParameter = (SIDSysexParameterControl) v
115
                    .elementAt(c);
213 tk 116
            switch (midiParameter.getType()) {
628 adamjking 117
            case 0:
118
                // Create knob
119
                Knob knob = new Knob(ImageLoader
120
                        .getImageIcon("plasticknob_strip.png"));
121
                midiParameterGUIs.add(new SIDSysexParameterControlKnob(
122
                        midiParameter, knob, true, BorderLayout.SOUTH, true,
123
                        true));
124
                break;
125
            case 1:
126
                // Create toggle button
127
                JToggleButton button = new JToggleButton();
128
                button.setUI(new MyButtonUI(ImageLoader
129
                        .getImageIcon("button_on.png"), ImageLoader
130
                        .getImageIcon("button.png")));
131
                midiParameterGUIs.add(new SIDSysexParameterControlToggleButton(
132
                        midiParameter, button, false, true, BorderLayout.SOUTH,
133
                        true, false));
134
                break;
135
            case 2:
136
                // Create simple toggle button
137
                JToggleButton simpleButton = new JToggleButton();
138
                simpleButton.setUI(new MyButtonUI(ImageLoader
139
                        .getImageIcon("button_on.png"), ImageLoader
140
                        .getImageIcon("button.png")));
141
                midiParameterGUIs.add(new SIDSysexParameterControlToggleButton(
142
                        midiParameter, simpleButton, false, false,
143
                        BorderLayout.SOUTH, true, false));
144
                break;
145
            case 3:
146
                // Create slider
147
                JSlider slider = new JSlider();
148
                midiParameterGUIs.add(new SIDSysexParameterControlSlider(
149
                        midiParameter, slider, true, BorderLayout.SOUTH, true,
150
                        true));
151
                break;
152
            case 4:
153
                // Create waveform selector (Voice)
154
                midiParameterGUIs.add(new SIDSysexParameterControlWaveSelect(
155
                        midiParameter, true, BorderLayout.NORTH, false, false));
156
                break;
157
            case 5:
158
                // Create waveform selector (LFO)
159
                midiParameterGUIs.add(new SIDSysexParameterControlLFOSelect(
160
                        midiParameter, true, BorderLayout.NORTH, false, false));
161
                break;
162
            case 6:
163
                // Normal combo
164
                JComboBox combo = new JComboBox(midiParameter
165
                        .getSparseValAlias());
166
                midiParameterGUIs.add(new SIDSysexParameterControlCombo(
167
                        midiParameter, combo, true, BorderLayout.NORTH, false,
168
                        false));
169
                break;
170
            case 7:
171
                // Simple rotary
172
                Knob knob1 = new Knob(ImageLoader
173
                        .getImageIcon("plasticknob_strip.png"));
174
                midiParameterGUIs.add(new SIDSysexParameterControlKnob(
175
                        midiParameter, knob1, false, BorderLayout.SOUTH, true,
176
                        true));
177
                break;
178
            default:
179
                midiParameterGUIs.add(midiParameter);
180
                System.out.println("Unknown controller type!");
181
            }
213 tk 182
        }
183
        return midiParameterGUIs;
628 adamjking 184
    }
185
 
213 tk 186
    public void createLinkGroups() {
628 adamjking 187
        // Create vector of pointers to left and right parameters (for linking
188
        // only)
213 tk 189
        EXT_L = new Vector();
190
        EXT_R = new Vector();
191
        for (int c = 0; c < 8; c++) {
628 adamjking 192
            EXT_L.add(((Vector) GUIs.elementAt(1)).elementAt(2 * c));
193
            EXT_R.add(((Vector) GUIs.elementAt(1)).elementAt((2 * c) + 1));
213 tk 194
        }
195
    }
628 adamjking 196
 
197
    public void restLink(boolean b) {
272 rutgerv 198
        if (b) {
628 adamjking 199
            linkPar((Vector) GUIs.elementAt(4), (Vector) GUIs.elementAt(8)); // Link
200
            // V1
201
            // &
202
            // V5
203
            linkPar((Vector) GUIs.elementAt(10), (Vector) GUIs.elementAt(14)); // Link
204
            // V1
205
            // &
206
            // V5
207
            // rest
208
            linkPar((Vector) GUIs.elementAt(4), (Vector) GUIs.elementAt(9)); // Link
209
            // V1
210
            // &
211
            // V6
212
            linkPar((Vector) GUIs.elementAt(10), (Vector) GUIs.elementAt(15)); // Link
213
            // V1
214
            // &
215
            // V6
216
            // rest
217
            linkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(7)); // Link
218
            // V2
219
            // &
220
            // V4
221
            linkPar((Vector) GUIs.elementAt(11), (Vector) GUIs.elementAt(13)); // Link
222
            // V2
223
            // &
224
            // V4
225
            // rest
226
            linkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(9)); // Link
227
            // V2
228
            // &
229
            // V6
230
            linkPar((Vector) GUIs.elementAt(11), (Vector) GUIs.elementAt(15)); // Link
231
            // V2
232
            // &
233
            // V6
234
            // rest
235
            linkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(7)); // Link
236
            // V3
237
            // &
238
            // V4
239
            linkPar((Vector) GUIs.elementAt(12), (Vector) GUIs.elementAt(13)); // Link
240
            // V3
241
            // &
242
            // V4
243
            // rest
244
            linkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(8)); // Link
245
            // V3
246
            // &
247
            // V5
248
            linkPar((Vector) GUIs.elementAt(12), (Vector) GUIs.elementAt(14)); // Link
249
            // V3
250
            // &
251
            // V5
252
            // rest
272 rutgerv 253
        } else {
628 adamjking 254
            unlinkPar((Vector) GUIs.elementAt(4), (Vector) GUIs.elementAt(8)); // Unlink
255
            // V1
256
            // &
257
            // V5
258
            unlinkPar((Vector) GUIs.elementAt(10), (Vector) GUIs.elementAt(14)); // Unlink
259
            // V1
260
            // &
261
            // V5
262
            // rest
263
            unlinkPar((Vector) GUIs.elementAt(4), (Vector) GUIs.elementAt(9)); // Unlink
264
            // V1
265
            // &
266
            // V6
267
            unlinkPar((Vector) GUIs.elementAt(10), (Vector) GUIs.elementAt(15)); // Unlink
268
            // V1
269
            // &
270
            // V6
271
            // rest
272
            unlinkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(7)); // Unlink
273
            // V2
274
            // &
275
            // V4
276
            unlinkPar((Vector) GUIs.elementAt(11), (Vector) GUIs.elementAt(13)); // Unlink
277
            // V2
278
            // &
279
            // V4
280
            // rest
281
            unlinkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(9)); // Unlink
282
            // V2
283
            // &
284
            // V6
285
            unlinkPar((Vector) GUIs.elementAt(11), (Vector) GUIs.elementAt(15)); // Unlink
286
            // V2
287
            // &
288
            // V6
289
            // rest
290
            unlinkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(7)); // Unlink
291
            // V3
292
            // &
293
            // V4
294
            unlinkPar((Vector) GUIs.elementAt(12), (Vector) GUIs.elementAt(13)); // Unlink
295
            // V3
296
            // &
297
            // V4
298
            // rest
299
            unlinkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(8)); // Unlink
300
            // V3
301
            // &
302
            // V5
303
            unlinkPar((Vector) GUIs.elementAt(12), (Vector) GUIs.elementAt(14)); // Unlink
304
            // V3
305
            // &
306
            // V5
307
            // rest
272 rutgerv 308
        }
309
    }
628 adamjking 310
 
272 rutgerv 311
    public void oscLink(boolean b) {
312
        if (b) {
313
            sidEditController.getPatch().setOscillatorLink(true);
628 adamjking 314
            linkPar((Vector) GUIs.elementAt(4), (Vector) GUIs.elementAt(5)); // Link
315
            // V1
316
            // &
317
            // V2
318
            linkPar((Vector) GUIs.elementAt(10), (Vector) GUIs.elementAt(11)); // Link
319
            // V1
320
            // &
321
            // V2
322
            // rest
323
            linkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(6)); // Link
324
            // V2
325
            // &
326
            // V3
327
            linkPar((Vector) GUIs.elementAt(11), (Vector) GUIs.elementAt(12)); // Link
328
            // V2
329
            // &
330
            // V3
331
            // rest
332
            linkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(4)); // Link
333
            // V3
334
            // &
335
            // V1
336
            linkPar((Vector) GUIs.elementAt(12), (Vector) GUIs.elementAt(10)); // Link
337
            // V3
338
            // &
339
            // V1
340
            // rest
341
            linkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(8)); // Link
342
            // V4
343
            // &
344
            // V5
345
            linkPar((Vector) GUIs.elementAt(13), (Vector) GUIs.elementAt(14)); // Link
346
            // V4
347
            // &
348
            // V5
349
            // rest
350
            linkPar((Vector) GUIs.elementAt(8), (Vector) GUIs.elementAt(9)); // Link
351
            // V5
352
            // &
353
            // V6
354
            linkPar((Vector) GUIs.elementAt(14), (Vector) GUIs.elementAt(15)); // Link
355
            // V5
356
            // &
357
            // V6
358
            // rest
359
            linkPar((Vector) GUIs.elementAt(9), (Vector) GUIs.elementAt(7)); // Link
360
            // V6
361
            // &
362
            // V4
363
            linkPar((Vector) GUIs.elementAt(15), (Vector) GUIs.elementAt(13)); // Link
364
            // V6
365
            // &
366
            // V4
367
            // rest
272 rutgerv 368
        } else {
369
            sidEditController.getPatch().setOscillatorLink(false);
628 adamjking 370
            unlinkPar((Vector) GUIs.elementAt(4), (Vector) GUIs.elementAt(5)); // Unlink
371
            // V1
372
            // &
373
            // V2
374
            unlinkPar((Vector) GUIs.elementAt(10), (Vector) GUIs.elementAt(11)); // Unlink
375
            // V1
376
            // &
377
            // V2
378
            // rest
379
            unlinkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(6)); // Unlink
380
            // V2
381
            // &
382
            // V3
383
            unlinkPar((Vector) GUIs.elementAt(11), (Vector) GUIs.elementAt(12)); // Unlink
384
            // V2
385
            // &
386
            // V3
387
            // rest
388
            unlinkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(4)); // Unlink
389
            // V3
390
            // &
391
            // V1
392
            unlinkPar((Vector) GUIs.elementAt(12), (Vector) GUIs.elementAt(10)); // Unlink
393
            // V3
394
            // &
395
            // V1
396
            // rest
397
            unlinkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(8)); // Unlink
398
            // V4
399
            // &
400
            // V5
401
            unlinkPar((Vector) GUIs.elementAt(13), (Vector) GUIs.elementAt(14)); // Unlink
402
            // V4
403
            // &
404
            // V5
405
            // rest
406
            unlinkPar((Vector) GUIs.elementAt(8), (Vector) GUIs.elementAt(9)); // Unlink
407
            // V5
408
            // &
409
            // V6
410
            unlinkPar((Vector) GUIs.elementAt(14), (Vector) GUIs.elementAt(15)); // Unlink
411
            // V5
412
            // &
413
            // V6
414
            // rest
415
            unlinkPar((Vector) GUIs.elementAt(9), (Vector) GUIs.elementAt(7)); // Unlink
416
            // V6
417
            // &
418
            // V4
419
            unlinkPar((Vector) GUIs.elementAt(15), (Vector) GUIs.elementAt(13)); // Unlink
420
            // V6
421
            // &
422
            // V4
423
            // rest
272 rutgerv 424
        }
425
        if (stereoLinked) {
426
            restLink(b);
628 adamjking 427
        }
272 rutgerv 428
        oscLinked = b;
213 tk 429
    }
628 adamjking 430
 
272 rutgerv 431
    public void stereoLink(boolean b) {
432
        if (b) {
433
            sidEditController.getPatch().setStereoLink(true);
628 adamjking 434
            linkPar(EXT_L, EXT_R); // Link external outputs 2 by 2
435
            linkPar((Vector) GUIs.elementAt(2), (Vector) GUIs.elementAt(3)); // Link
436
            // filter
437
            // left
438
            // &
439
            // right
440
            linkPar((Vector) GUIs.elementAt(4), (Vector) GUIs.elementAt(7)); // Link
441
            // V1
442
            // &
443
            // V4
444
            linkPar((Vector) GUIs.elementAt(10), (Vector) GUIs.elementAt(13)); // Link
445
            // V1
446
            // &
447
            // V4
448
            // rest
449
            linkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(8)); // Link
450
            // V2
451
            // &
452
            // V5
453
            linkPar((Vector) GUIs.elementAt(11), (Vector) GUIs.elementAt(14)); // Link
454
            // V2
455
            // &
456
            // V5
457
            // rest
458
            linkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(9)); // Link
459
            // V3
460
            // &
461
            // V6
462
            linkPar((Vector) GUIs.elementAt(12), (Vector) GUIs.elementAt(15)); // Link
463
            // V3
464
            // &
465
            // V6
466
            // rest
272 rutgerv 467
        } else {
468
            sidEditController.getPatch().setStereoLink(false);
628 adamjking 469
            unlinkPar(EXT_L, EXT_R); // Unlink external outputs 2 by 2
470
            unlinkPar((Vector) GUIs.elementAt(2), (Vector) GUIs.elementAt(3)); // Unlink
471
            // filter
472
            // left
473
            // &
474
            // right
475
            unlinkPar((Vector) GUIs.elementAt(2), (Vector) GUIs.elementAt(3)); // Unlink
476
            // filter
477
            // left
478
            // &
479
            // right
480
            unlinkPar((Vector) GUIs.elementAt(4), (Vector) GUIs.elementAt(7)); // Unlink
481
            // V1
482
            // &
483
            // V4
484
            unlinkPar((Vector) GUIs.elementAt(10), (Vector) GUIs.elementAt(13)); // Unlink
485
            // V1
486
            // &
487
            // V4
488
            // rest
489
            unlinkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(8)); // Unlink
490
            // V2
491
            // &
492
            // V5
493
            unlinkPar((Vector) GUIs.elementAt(11), (Vector) GUIs.elementAt(14)); // Unlink
494
            // V2
495
            // &
496
            // V5
497
            // rest
498
            unlinkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(9)); // Unlink
499
            // V3
500
            // &
501
            // V6
502
            unlinkPar((Vector) GUIs.elementAt(12), (Vector) GUIs.elementAt(15)); // Unlink
503
            // V3
504
            // &
505
            // V6
506
            // rest
507
        }
272 rutgerv 508
        if (oscLinked) {
509
            restLink(b);
510
        }
628 adamjking 511
        stereoLinked = b;
272 rutgerv 512
    }
628 adamjking 513
 
213 tk 514
    protected void linkPar(Vector left, Vector right) {
515
        for (int c = 0; c < left.size(); c++) {
628 adamjking 516
            SIDSysexParameterControlGUI g1 = (SIDSysexParameterControlGUI) left
517
                    .elementAt(c);
518
            SIDSysexParameterControlGUI g2 = (SIDSysexParameterControlGUI) right
519
                    .elementAt(c);
213 tk 520
            g1.addMidiParameter(g2.getMidiParameter());
521
            g2.addMidiParameter(g1.getMidiParameter());
522
        }
523
    }
628 adamjking 524
 
213 tk 525
    protected void unlinkPar(Vector left, Vector right) {
526
        for (int c = 0; c < left.size(); c++) {
628 adamjking 527
            SIDSysexParameterControlGUI g1 = (SIDSysexParameterControlGUI) left
528
                    .elementAt(c);
529
            SIDSysexParameterControlGUI g2 = (SIDSysexParameterControlGUI) right
530
                    .elementAt(c);
213 tk 531
            g1.removeMidiParameter(g2.getMidiParameter());
532
            g2.removeMidiParameter(g1.getMidiParameter());
533
        }
534
    }
535
}