Subversion Repositories svn.mios

Rev

Rev 710 | 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;
660 adamjking 24
import java.awt.Color;
213 tk 25
import java.util.Vector;
272 rutgerv 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;
628 adamjking 33
 
213 tk 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 LeadGUI extends JPanel {
52
    private Vector GUIs, EXT_L, EXT_R, MP_L, MP_R;
272 rutgerv 53
    private SIDEditController sidEditController;
54
    private boolean stereoLinked = true;
55
    private boolean oscLinked = false;
628 adamjking 56
 
272 rutgerv 57
    public LeadGUI(SIDEditController sidEditController) {
58
        this.sidEditController = sidEditController;
213 tk 59
        setLayout(new BorderLayout());
628 adamjking 60
 
213 tk 61
        GUIs = createGUIs(sidEditController);
62
        createLinkGroups();
63
        permanentLink();
628 adamjking 64
        JTabbedPane tabbedPane = new JTabbedPane();
65
        JPanel t1 = new GlobalGUI((Vector) GUIs.elementAt(0), (Vector) GUIs
66
                .elementAt(1));
67
        JPanel t2 = new OscillatorGUI((Vector) GUIs.elementAt(4), (Vector) GUIs
68
                .elementAt(5), (Vector) GUIs.elementAt(6), (Vector) GUIs
69
                .elementAt(7), (Vector) GUIs.elementAt(8), (Vector) GUIs
70
                .elementAt(9), (Vector) GUIs.elementAt(10));
71
        JPanel t3 = new FilterGUI((Vector) GUIs.elementAt(2), (Vector) GUIs
72
                .elementAt(3));
73
        JPanel t4 = new LfoGUI((Vector) GUIs.elementAt(11), (Vector) GUIs
74
                .elementAt(12), (Vector) GUIs.elementAt(13));
75
        JPanel t6 = new ModulationGUI((Vector) GUIs.elementAt(14));
76
        JPanel t7 = new TriggerGUI((Vector) GUIs.elementAt(15));
77
        JPanel t8 = new ArpGUI((Vector) GUIs.elementAt(5), (Vector) GUIs
78
                .elementAt(6), (Vector) GUIs.elementAt(7), (Vector) GUIs
79
                .elementAt(8), (Vector) GUIs.elementAt(9), (Vector) GUIs
80
                .elementAt(10));
81
        JPanel t9 = new WTGUI((Vector) GUIs.elementAt(16));
82
        JPanel t11 = new SwinGUI((Vector) GUIs.elementAt(5), (Vector) GUIs
83
                .elementAt(6), (Vector) GUIs.elementAt(7), (Vector) GUIs
84
                .elementAt(8), (Vector) GUIs.elementAt(9), (Vector) GUIs
85
                .elementAt(10));
86
 
213 tk 87
        tabbedPane.addTab("Global", t1);
88
        tabbedPane.addTab("Oscillator", t2);
89
        tabbedPane.addTab("Filter", t3);
90
        tabbedPane.addTab("LFO/ENV", t4);
91
        tabbedPane.addTab("Modulation", t6);
92
        tabbedPane.addTab("Trigger", t7);
93
        tabbedPane.addTab("Arpeggiator", t8);
94
        tabbedPane.addTab("Wavetable", t9);
95
        tabbedPane.addTab("SwinSID", t11);
628 adamjking 96
 
660 adamjking 97
        tabbedPane.setUI(new MBSIDV2EditorTabbedPaneUI(
98
                new Color(245, 245, 245), new Color(200, 200, 200)));
99
 
213 tk 100
        add(tabbedPane, BorderLayout.NORTH);
101
        setOpaque(false);
102
        setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
710 rutgerv 103
        stereoLink(true);
213 tk 104
    }
628 adamjking 105
 
213 tk 106
    protected Vector createGUIs(SIDEditController sidEditController) {
628 adamjking 107
        Vector v_in = (Vector) sidEditController.getEngine();
213 tk 108
        Vector v_out = new Vector();
109
        for (int b = 0; b < v_in.size(); b++) {
628 adamjking 110
            v_out.addElement(createGuiElements((Vector) v_in.elementAt(b)));
213 tk 111
        }
112
        return v_out;
113
    }
628 adamjking 114
 
213 tk 115
    protected Vector createGuiElements(Vector v) {
116
        // Create controller GUI's
117
        Vector midiParameterGUIs = new Vector();
118
        for (int c = 0; c < v.size(); c++) {
628 adamjking 119
            SIDSysexParameterControl midiParameter = (SIDSysexParameterControl) v
120
                    .elementAt(c);
213 tk 121
            switch (midiParameter.getType()) {
628 adamjking 122
            case 0:
123
                // Create knob
124
                Knob knob = new Knob(ImageLoader
125
                        .getImageIcon("plasticknob_strip.png"));
126
                midiParameterGUIs.add(new SIDSysexParameterControlKnob(
127
                        midiParameter, knob, true, BorderLayout.SOUTH, true,
128
                        true));
129
                break;
130
            case 1:
131
                // Create toggle button
132
                JToggleButton button = new JToggleButton();
133
                button.setUI(new MyButtonUI(ImageLoader
134
                        .getImageIcon("button_on.png"), ImageLoader
135
                        .getImageIcon("button.png")));
136
                midiParameterGUIs.add(new SIDSysexParameterControlToggleButton(
137
                        midiParameter, button, false, true, BorderLayout.SOUTH,
138
                        true, false));
139
                break;
140
            case 2:
141
                // Create simple toggle button
142
                JToggleButton simpleButton = new JToggleButton();
143
                simpleButton.setUI(new MyButtonUI(ImageLoader
144
                        .getImageIcon("button_on.png"), ImageLoader
145
                        .getImageIcon("button.png")));
146
                midiParameterGUIs.add(new SIDSysexParameterControlToggleButton(
147
                        midiParameter, simpleButton, false, false,
148
                        BorderLayout.SOUTH, false, false));
149
                break;
150
            case 3:
151
                // Create slider
152
                JSlider slider = new JSlider();
153
                midiParameterGUIs.add(new SIDSysexParameterControlSlider(
154
                        midiParameter, slider, true, BorderLayout.SOUTH, true,
155
                        true));
156
                break;
157
            case 4:
158
                // Create waveform selector (Voice)
159
                midiParameterGUIs.add(new SIDSysexParameterControlWaveSelect(
160
                        midiParameter, true, BorderLayout.NORTH, false, false));
161
                break;
162
            case 5:
163
                // Create waveform selector (LFO)
164
                midiParameterGUIs.add(new SIDSysexParameterControlLFOSelect(
165
                        midiParameter, true, BorderLayout.NORTH, false, false));
166
                break;
167
            case 6:
168
                // Normal combo
169
                JComboBox combo = new JComboBox(midiParameter
170
                        .getSparseValAlias());
171
                midiParameterGUIs.add(new SIDSysexParameterControlCombo(
172
                        midiParameter, combo, true, BorderLayout.NORTH, false,
173
                        false));
174
                break;
175
            case 7:
176
                // Simple rotary
177
                Knob knob1 = new Knob(ImageLoader
178
                        .getImageIcon("plasticknob_strip.png"));
179
                midiParameterGUIs.add(new SIDSysexParameterControlKnob(
180
                        midiParameter, knob1, false, BorderLayout.SOUTH, true,
181
                        true));
182
                break;
183
            default:
184
                midiParameterGUIs.add(midiParameter);
185
                System.out.println("Unknown controller type!");
186
            }
213 tk 187
        }
188
        return midiParameterGUIs;
628 adamjking 189
    }
190
 
213 tk 191
    public void createLinkGroups() {
628 adamjking 192
        // Create vector of pointers to left and right parameters (for linking
193
        // only)
213 tk 194
        EXT_L = new Vector();
195
        EXT_R = new Vector();
196
        for (int c = 0; c < 8; c++) {
628 adamjking 197
            EXT_L.add(((Vector) GUIs.elementAt(1)).elementAt(2 * c));
198
            EXT_R.add(((Vector) GUIs.elementAt(1)).elementAt((2 * c) + 1));
213 tk 199
        }
628 adamjking 200
 
201
        // Create vector of pointers to left and right parameters (for linking
202
        // only)
213 tk 203
        MP_L = new Vector();
628 adamjking 204
        MP_R = new Vector();
213 tk 205
        for (int nmp = 0; nmp < 8; nmp++) {
206
            for (int c = 8; c < 16; c++) {
628 adamjking 207
                MP_L.add(((Vector) GUIs.elementAt(14))
208
                        .elementAt((24 * nmp) + c));
209
                MP_R.add(((Vector) GUIs.elementAt(14)).elementAt((24 * nmp) + c
210
                        + 8));
213 tk 211
            }
212
        }
213
    }
628 adamjking 214
 
213 tk 215
    public void permanentLink() {
216
        // Link Key Sync button to Trigger: LFO Reset at Note On
217
        Vector LFO = new Vector();
218
        Vector TRIGGER = new Vector();
219
        for (int c = 0; c < 6; c++) {
628 adamjking 220
            LFO.add(((Vector) GUIs.elementAt(11)).elementAt(8 + (9 * c)));
221
            TRIGGER.add(((Vector) GUIs.elementAt(15)).elementAt(10 + c));
213 tk 222
        }
628 adamjking 223
        linkPar(LFO, TRIGGER);
213 tk 224
    }
628 adamjking 225
 
226
    public void restLink(boolean b) {
272 rutgerv 227
        if (b) {
628 adamjking 228
            linkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(9)); // Link
229
            // V1
230
            // &
231
            // V5
232
            linkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(10)); // Link
233
            // V1
234
            // &
235
            // V6
236
            linkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(8)); // Link
237
            // V2
238
            // &
239
            // V4
240
            linkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(10)); // Link
241
            // V2
242
            // &
243
            // V6
244
            linkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(8)); // Link
245
            // V3
246
            // &
247
            // V4
248
            linkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(9)); // Link
249
            // V3
250
            // &
251
            // V5
272 rutgerv 252
        } else {
628 adamjking 253
            unlinkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(9)); // Unlink
254
            // V1
255
            // &
256
            // V5
257
            unlinkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(10)); // Unlink
258
            // V1
259
            // &
260
            // V6
261
            unlinkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(8)); // Unlink
262
            // V2
263
            // &
264
            // V4
265
            unlinkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(10)); // Unlink
266
            // V2
267
            // &
268
            // V6
269
            unlinkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(8)); // Unlink
270
            // V3
271
            // &
272
            // V4
273
            unlinkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(9)); // Unlink
274
            // V3
275
            // &
276
            // V5
272 rutgerv 277
        }
213 tk 278
    }
628 adamjking 279
 
272 rutgerv 280
    public void oscLink(boolean b) {
281
        if (b) {
738 adamjking 282
            ((Patch) sidEditController.getPatch()).setOscillatorLink(true);
628 adamjking 283
            linkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(6)); // Link
284
            // V1
285
            // &
286
            // V2
287
            linkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(7)); // Link
288
            // V2
289
            // &
290
            // V3
291
            linkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(5)); // Link
292
            // V3
293
            // &
294
            // V1
295
            linkPar((Vector) GUIs.elementAt(8), (Vector) GUIs.elementAt(9)); // Link
296
            // V4
297
            // &
298
            // V5
299
            linkPar((Vector) GUIs.elementAt(9), (Vector) GUIs.elementAt(10)); // Link
300
            // V5
301
            // &
302
            // V6
303
            linkPar((Vector) GUIs.elementAt(10), (Vector) GUIs.elementAt(8)); // Link
304
            // V6
305
            // &
306
            // V4
272 rutgerv 307
        } else {
738 adamjking 308
            ((Patch) sidEditController.getPatch()).setOscillatorLink(false);
628 adamjking 309
            unlinkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(6)); // Unlink
310
            // V1
311
            // &
312
            // V2
313
            unlinkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(7)); // Unlink
314
            // V2
315
            // &
316
            // V3
317
            unlinkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(5)); // Unlink
318
            // V3
319
            // &
320
            // V1
321
            unlinkPar((Vector) GUIs.elementAt(8), (Vector) GUIs.elementAt(9)); // Unlink
322
            // V4
323
            // &
324
            // V5
325
            unlinkPar((Vector) GUIs.elementAt(9), (Vector) GUIs.elementAt(10));// Unlink
326
            // V5
327
            // &
328
            // V6
329
            unlinkPar((Vector) GUIs.elementAt(10), (Vector) GUIs.elementAt(8));// Unlink
330
            // V6
331
            // &
332
            // V4
272 rutgerv 333
        }
334
        if (stereoLinked) {
335
            restLink(b);
628 adamjking 336
        }
272 rutgerv 337
        oscLinked = b;
338
    }
628 adamjking 339
 
272 rutgerv 340
    public void stereoLink(boolean b) {
341
        if (b) {
738 adamjking 342
            ((Patch) sidEditController.getPatch()).setStereoLink(true);
628 adamjking 343
            linkPar(EXT_L, EXT_R); // Link external outputs 2 by 2
344
            linkPar(MP_L, MP_R); // Link MP direct assign left & right
345
            linkPar((Vector) GUIs.elementAt(2), (Vector) GUIs.elementAt(3)); // Link
346
            // filter
347
            // left
348
            // &
349
            // right
350
            linkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(8)); // Link
351
            // V1
352
            // &
353
            // V4
354
            linkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(9)); // Link
355
            // V2
356
            // &
357
            // V5
358
            linkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(10)); // Link
359
            // V3
360
            // &
361
            // V6
272 rutgerv 362
        } else {
738 adamjking 363
            ((Patch) sidEditController.getPatch()).setStereoLink(false);
628 adamjking 364
            unlinkPar(EXT_L, EXT_R); // Unlink external outputs 2 by 2
365
            unlinkPar(MP_L, MP_R); // Unlink MP direct assign left & right
366
            unlinkPar((Vector) GUIs.elementAt(2), (Vector) GUIs.elementAt(3)); // Unlink
367
            // filter
368
            // left
369
            // &
370
            // right
371
            unlinkPar((Vector) GUIs.elementAt(5), (Vector) GUIs.elementAt(8)); // Unlink
372
            // V1
373
            // &
374
            // V4
375
            unlinkPar((Vector) GUIs.elementAt(6), (Vector) GUIs.elementAt(9)); // Unlink
376
            // V2
377
            // &
378
            // V5
379
            unlinkPar((Vector) GUIs.elementAt(7), (Vector) GUIs.elementAt(10)); // Unlink
380
            // V3
381
            // &
382
            // V6
272 rutgerv 383
        }
384
        if (oscLinked) {
385
            restLink(b);
386
        }
387
        stereoLinked = b;
388
    }
628 adamjking 389
 
213 tk 390
    protected void linkPar(Vector left, Vector right) {
391
        for (int c = 0; c < left.size(); c++) {
628 adamjking 392
            SIDSysexParameterControlGUI g1 = (SIDSysexParameterControlGUI) left
393
                    .elementAt(c);
394
            SIDSysexParameterControlGUI g2 = (SIDSysexParameterControlGUI) right
395
                    .elementAt(c);
213 tk 396
            g1.addMidiParameter(g2.getMidiParameter());
397
            g2.addMidiParameter(g1.getMidiParameter());
398
        }
399
    }
628 adamjking 400
 
213 tk 401
    protected void unlinkPar(Vector left, Vector right) {
402
        for (int c = 0; c < left.size(); c++) {
628 adamjking 403
            SIDSysexParameterControlGUI g1 = (SIDSysexParameterControlGUI) left
404
                    .elementAt(c);
405
            SIDSysexParameterControlGUI g2 = (SIDSysexParameterControlGUI) right
406
                    .elementAt(c);
213 tk 407
            g1.removeMidiParameter(g2.getMidiParameter());
408
            g2.removeMidiParameter(g1.getMidiParameter());
409
        }
410
    }
411
}