Subversion Repositories svn.mios

Rev

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