Subversion Repositories svn.mios

Rev

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