Subversion Repositories svn.mios

Rev

Rev 259 | Rev 628 | 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.awt.GridLayout;
25
import java.util.Vector;
272 rutgerv 26
 
27
import javax.sound.midi.SysexMessage;
213 tk 28
import javax.swing.BorderFactory;
29
import javax.swing.BoxLayout;
30
import javax.swing.JComboBox;
31
import javax.swing.JPanel;
32
import javax.swing.JSlider;
33
import javax.swing.JTabbedPane;
34
import javax.swing.JToggleButton;
35
import org.midibox.sidedit.gui.MBSIDV2EditorGUI;
36
import org.midibox.sidedit.SIDSysexInfo;
37
import org.midibox.sidedit.SIDEditController;
38
import org.midibox.sidedit.SIDSysexParameterControl;
39
 
40
import org.midibox.sidedit.gui.controls.*;
41
import org.midibox.utils.gui.ImageLoader;
42
import org.midibox.utils.gui.Knob;
43
import org.midibox.utils.gui.MyButtonUI;
44
import org.midibox.sidedit.gui.GlobalGUI;
45
import org.midibox.sidedit.gui.FilterGUI;
46
 
47
public class LeadGUI extends JPanel {
48
    private Vector GUIs, EXT_L, EXT_R, MP_L, MP_R;
272 rutgerv 49
    private SIDEditController sidEditController;
50
    private boolean stereoLinked = true;
51
    private boolean oscLinked = false;
213 tk 52
 
272 rutgerv 53
    public LeadGUI(SIDEditController sidEditController) {
54
        this.sidEditController = sidEditController;
213 tk 55
        setLayout(new BorderLayout());
56
 
57
        GUIs = createGUIs(sidEditController);
58
        createLinkGroups();
59
        permanentLink();
60
        JTabbedPane tabbedPane = new JTabbedPane();    
61
        JPanel t1 = new GlobalGUI((Vector)GUIs.elementAt(0),(Vector)GUIs.elementAt(1));
62
        JPanel t2 = new OscillatorGUI((Vector)GUIs.elementAt(4),(Vector)GUIs.elementAt(5),(Vector)GUIs.elementAt(6),(Vector)GUIs.elementAt(7),(Vector)GUIs.elementAt(8),(Vector)GUIs.elementAt(9),(Vector)GUIs.elementAt(10));
63
        JPanel t3 = new FilterGUI((Vector)GUIs.elementAt(2),(Vector)GUIs.elementAt(3));
64
        JPanel t4 = new LfoGUI((Vector)GUIs.elementAt(11),(Vector)GUIs.elementAt(12),(Vector)GUIs.elementAt(13));
65
        JPanel t6 = new ModulationGUI((Vector)GUIs.elementAt(14));
66
        JPanel t7 = new TriggerGUI((Vector)GUIs.elementAt(15));
67
        JPanel t8 = new ArpGUI((Vector)GUIs.elementAt(5),(Vector)GUIs.elementAt(6),(Vector)GUIs.elementAt(7),(Vector)GUIs.elementAt(8),(Vector)GUIs.elementAt(9),(Vector)GUIs.elementAt(10));
68
        JPanel t9 =  new WTGUI((Vector)GUIs.elementAt(16));
69
        JPanel t11 = new SwinGUI((Vector)GUIs.elementAt(5),(Vector)GUIs.elementAt(6),(Vector)GUIs.elementAt(7),(Vector)GUIs.elementAt(8),(Vector)GUIs.elementAt(9),(Vector)GUIs.elementAt(10));
70
 
71
        tabbedPane.addTab("Global", t1);
72
        tabbedPane.addTab("Oscillator", t2);
73
        tabbedPane.addTab("Filter", t3);
74
        tabbedPane.addTab("LFO/ENV", t4);
75
        tabbedPane.addTab("Modulation", t6);
76
        tabbedPane.addTab("Trigger", t7);
77
        tabbedPane.addTab("Arpeggiator", t8);
78
        tabbedPane.addTab("Wavetable", t9);
79
        tabbedPane.addTab("SwinSID", t11);
80
 
81
        add(tabbedPane, BorderLayout.NORTH);
82
        setOpaque(false);
83
        setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
272 rutgerv 84
        stereoLink(true);
213 tk 85
    }
86
 
87
    protected Vector createGUIs(SIDEditController sidEditController) {
88
        Vector v_in = (Vector)sidEditController.getEngine();
89
        Vector v_out = new Vector();
90
        for (int b = 0; b < v_in.size(); b++) {
91
            v_out.addElement(createGuiElements((Vector)v_in.elementAt(b)));        
92
        }
93
        return v_out;
94
    }
95
 
96
    protected Vector createGuiElements(Vector v) {
97
        // Create controller GUI's
98
        Vector midiParameterGUIs = new Vector();
99
        for (int c = 0; c < v.size(); c++) {
100
            SIDSysexParameterControl midiParameter = (SIDSysexParameterControl) v.elementAt(c);
101
            switch (midiParameter.getType()) {
102
                case 0:
103
                    // Create knob
104
                    Knob knob = new Knob(ImageLoader.getImageIcon("plasticknob_strip.png"));       
105
                    midiParameterGUIs.add(new SIDSysexParameterControlKnob(midiParameter, knob, true, BorderLayout.SOUTH, true, true));
106
                    break;
107
                case 1:
108
                    // Create toggle button
109
                    JToggleButton button = new JToggleButton();
110
                    button.setUI(new MyButtonUI(ImageLoader.getImageIcon("button_on.png"), ImageLoader.getImageIcon("button.png")));
111
                    midiParameterGUIs.add(new SIDSysexParameterControlToggleButton(midiParameter, button, false, true, BorderLayout.SOUTH, true, false));
112
                    break;
113
                case 2:
114
                    // Create simple toggle button
115
                    JToggleButton simpleButton = new JToggleButton();
116
                    simpleButton.setUI(new MyButtonUI(ImageLoader.getImageIcon("button_on.png"), ImageLoader.getImageIcon("button.png")));
117
                    midiParameterGUIs.add(new SIDSysexParameterControlToggleButton(midiParameter, simpleButton, false, false, BorderLayout.SOUTH, false, false));
118
                    break;
119
                case 3:
120
                    // Create slider
121
                    JSlider slider = new JSlider();
122
                    midiParameterGUIs.add(new SIDSysexParameterControlSlider(midiParameter, slider, true, BorderLayout.SOUTH,true,true));
123
                    break;
124
                case 4:
125
                    // Create waveform selector (Voice)
126
                    midiParameterGUIs.add(new SIDSysexParameterControlWaveSelect(midiParameter, true, BorderLayout.NORTH,false,false));
127
                    break;
128
                case 5:
129
                    // Create waveform selector (LFO)
130
                    midiParameterGUIs.add(new SIDSysexParameterControlLFOSelect(midiParameter, true, BorderLayout.NORTH,false,false));
131
                    break;     
132
                case 6:
133
                    // Normal combo
134
                    JComboBox combo = new JComboBox(midiParameter.getSparseValAlias());
135
                    midiParameterGUIs.add(new SIDSysexParameterControlCombo(midiParameter,combo,true,BorderLayout.NORTH,false,false));
136
                    break;
137
                case 7:
138
                    // Simple rotary
139
                    Knob knob1 = new Knob(ImageLoader.getImageIcon("plasticknob_strip.png"));      
140
                    midiParameterGUIs.add(new SIDSysexParameterControlKnob(midiParameter, knob1, false, BorderLayout.SOUTH, true, true));
141
                    break;
142
                default: midiParameterGUIs.add(midiParameter);System.out.println("Unknown controller type!");
143
            }  
144
        }
145
        return midiParameterGUIs;
146
    }  
147
 
148
    public void createLinkGroups() {
149
        // Create vector of pointers to left and right parameters (for linking only)
150
        EXT_L = new Vector();
151
        EXT_R = new Vector();
152
        for (int c = 0; c < 8; c++) {
153
            EXT_L.add(((Vector)GUIs.elementAt(1)).elementAt(2*c));
154
            EXT_R.add(((Vector)GUIs.elementAt(1)).elementAt((2*c)+1));
155
        }
156
 
157
        // Create vector of pointers to left and right parameters (for linking only)
158
        MP_L = new Vector();
159
        MP_R = new Vector();       
160
        for (int nmp = 0; nmp < 8; nmp++) {
161
            for (int c = 8; c < 16; c++) {
162
                MP_L.add(((Vector)GUIs.elementAt(14)).elementAt((24*nmp)+ c));         
163
                MP_R.add(((Vector)GUIs.elementAt(14)).elementAt((24*nmp) + c + 8));
164
            }
165
        }
166
    }
167
 
168
    public void permanentLink() {
169
        // Link Key Sync button to Trigger: LFO Reset at Note On
170
        Vector LFO = new Vector();
171
        Vector TRIGGER = new Vector();
172
        for (int c = 0; c < 6; c++) {
173
            LFO.add(((Vector)GUIs.elementAt(11)).elementAt(8+(9*c)));
174
            TRIGGER.add(((Vector)GUIs.elementAt(15)).elementAt(10+c));
175
        }
176
        linkPar(LFO,TRIGGER);  
177
    }
178
 
272 rutgerv 179
    public void restLink(boolean b) {      
180
        if (b) {
181
            linkPar((Vector)GUIs.elementAt(5),(Vector)GUIs.elementAt(9));   // Link V1 & V5
182
            linkPar((Vector)GUIs.elementAt(5),(Vector)GUIs.elementAt(10));  // Link V1 & V6
183
            linkPar((Vector)GUIs.elementAt(6),(Vector)GUIs.elementAt(8));   // Link V2 & V4         
184
            linkPar((Vector)GUIs.elementAt(6),(Vector)GUIs.elementAt(10));  // Link V2 & V6         
185
            linkPar((Vector)GUIs.elementAt(7),(Vector)GUIs.elementAt(8));   // Link V3 & V4
186
            linkPar((Vector)GUIs.elementAt(7),(Vector)GUIs.elementAt(9));   // Link V3 & V5         
187
        } else {
188
            unlinkPar((Vector)GUIs.elementAt(5),(Vector)GUIs.elementAt(9));     // Unlink V1 & V5
189
            unlinkPar((Vector)GUIs.elementAt(5),(Vector)GUIs.elementAt(10));    // Unlink V1 & V6
190
            unlinkPar((Vector)GUIs.elementAt(6),(Vector)GUIs.elementAt(8));     // Unlink V2 & V4           
191
            unlinkPar((Vector)GUIs.elementAt(6),(Vector)GUIs.elementAt(10));    // Unlink V2 & V6           
192
            unlinkPar((Vector)GUIs.elementAt(7),(Vector)GUIs.elementAt(8));     // Unlink V3 & V4
193
            unlinkPar((Vector)GUIs.elementAt(7),(Vector)GUIs.elementAt(9));     // Unlink V3 & V5           
194
        }
213 tk 195
    }
196
 
272 rutgerv 197
    public void oscLink(boolean b) {
198
        if (b) {
199
            sidEditController.getPatch().setOscillatorLink(true);
200
            linkPar((Vector)GUIs.elementAt(5),(Vector)GUIs.elementAt(6));   // Link V1 & V2
201
            linkPar((Vector)GUIs.elementAt(6),(Vector)GUIs.elementAt(7));   // Link V2 & V3 
202
            linkPar((Vector)GUIs.elementAt(7),(Vector)GUIs.elementAt(5));   // Link V3 & V1             
203
            linkPar((Vector)GUIs.elementAt(8),(Vector)GUIs.elementAt(9));   // Link V4 & V5
204
            linkPar((Vector)GUIs.elementAt(9),(Vector)GUIs.elementAt(10));  // Link V5 & V6 
205
            linkPar((Vector)GUIs.elementAt(10),(Vector)GUIs.elementAt(8));  // Link V6 & V4         
206
        } else {
207
            sidEditController.getPatch().setOscillatorLink(false);
208
            unlinkPar((Vector)GUIs.elementAt(5),(Vector)GUIs.elementAt(6)); // Unlink V1 & V2
209
            unlinkPar((Vector)GUIs.elementAt(6),(Vector)GUIs.elementAt(7)); // Unlink V2 & V3
210
            unlinkPar((Vector)GUIs.elementAt(7),(Vector)GUIs.elementAt(5)); // Unlink V3 & V1           
211
            unlinkPar((Vector)GUIs.elementAt(8),(Vector)GUIs.elementAt(9)); // Unlink V4 & V5
212
            unlinkPar((Vector)GUIs.elementAt(9),(Vector)GUIs.elementAt(10));// Unlink V5 & V6
213
            unlinkPar((Vector)GUIs.elementAt(10),(Vector)GUIs.elementAt(8));// Unlink V6 & V4               
214
        }
215
        if (stereoLinked) {
216
            restLink(b);
217
        }      
218
        oscLinked = b;
219
    }
213 tk 220
 
272 rutgerv 221
    public void stereoLink(boolean b) {
222
        if (b) {
223
            sidEditController.getPatch().setStereoLink(true);
224
            linkPar(EXT_L,EXT_R);                                           // Link external outputs 2 by 2
225
            linkPar(MP_L,MP_R);                                             // Link MP direct assign left & right
226
            linkPar((Vector)GUIs.elementAt(2),(Vector)GUIs.elementAt(3));   // Link filter left & right
227
            linkPar((Vector)GUIs.elementAt(5),(Vector)GUIs.elementAt(8));   // Link V1 & V4
228
            linkPar((Vector)GUIs.elementAt(6),(Vector)GUIs.elementAt(9));   // Link V2 & V5
229
            linkPar((Vector)GUIs.elementAt(7),(Vector)GUIs.elementAt(10));  // Link V3 & V6 
230
        } else {
231
            sidEditController.getPatch().setStereoLink(false);
232
            unlinkPar(EXT_L,EXT_R);                                           // Unlink external outputs 2 by 2
233
            unlinkPar(MP_L,MP_R);                                             // Unlink MP direct assign left & right
234
            unlinkPar((Vector)GUIs.elementAt(2),(Vector)GUIs.elementAt(3));   // Unlink filter left & right
235
            unlinkPar((Vector)GUIs.elementAt(5),(Vector)GUIs.elementAt(8));   // Unlink V1 & V4
236
            unlinkPar((Vector)GUIs.elementAt(6),(Vector)GUIs.elementAt(9));   // Unlink V2 & V5
237
            unlinkPar((Vector)GUIs.elementAt(7),(Vector)GUIs.elementAt(10));  // Unlink V3 & V6 
238
        }
239
        if (oscLinked) {
240
            restLink(b);
241
        }
242
        stereoLinked = b;
243
    }
244
 
213 tk 245
    protected void linkPar(Vector left, Vector right) {
246
        for (int c = 0; c < left.size(); c++) {
247
            SIDSysexParameterControlGUI g1 = (SIDSysexParameterControlGUI) left.elementAt(c);
248
            SIDSysexParameterControlGUI g2 = (SIDSysexParameterControlGUI) right.elementAt(c);
249
            g1.addMidiParameter(g2.getMidiParameter());
250
            g2.addMidiParameter(g1.getMidiParameter());
251
        }
252
    }
253
 
254
    protected void unlinkPar(Vector left, Vector right) {
255
        for (int c = 0; c < left.size(); c++) {
256
            SIDSysexParameterControlGUI g1 = (SIDSysexParameterControlGUI) left.elementAt(c);
257
            SIDSysexParameterControlGUI g2 = (SIDSysexParameterControlGUI) right.elementAt(c);
258
            g1.removeMidiParameter(g2.getMidiParameter());
259
            g2.removeMidiParameter(g1.getMidiParameter());
260
        }
261
    }
262
}
272 rutgerv 263