Subversion Repositories svn.mios

Rev

Rev 555 | Rev 666 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 555 Rev 628
Line 18... Line 18...
18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
 */
19
 */
20
20
21
package org.midibox.sidlibr;
21
package org.midibox.sidlibr;
22
22
-
 
23
import java.awt.event.ActionEvent;
-
 
24
import java.awt.event.ActionListener;
23
import java.util.Observable;
25
import java.util.Observable;
24
import java.util.Observer;
-
 
25
import java.util.Vector;
-
 
-
 
26
26
import org.midibox.midi.MidiUtils;
27
import javax.sound.midi.MidiMessage;
27
import javax.sound.midi.Receiver;
28
import javax.sound.midi.Receiver;
-
 
29
import javax.sound.midi.SysexMessage;
-
 
30
import javax.swing.JOptionPane;
-
 
31
import javax.swing.ProgressMonitor;
-
 
32
import javax.swing.Timer;
28
33
29
import org.midibox.sidlibr.Patch;
34
import org.midibox.midi.MidiUtils;
30
import org.midibox.sidedit.SIDSysexInfo;
35
import org.midibox.sidedit.SIDSysexInfo;
31
import javax.swing.*;
-
 
32
import java.awt.event.*;
-
 
33
36
34
import javax.sound.midi.MidiMessage;
-
 
35
import javax.sound.midi.SysexMessage;
-
 
36
import java.io.IOException;
-
 
37
public class SysExController extends Observable implements Receiver, ActionListener  {
37
public class SysExController extends Observable implements Receiver,
-
 
38
        ActionListener {
38
    public static Object PATCH = new Object();
39
    public static Object PATCH = new Object();
39
    public static Object ENSEMBLE = new Object();  
40
    public static Object ENSEMBLE = new Object();
40
   
41
41
    public Object pickMeUp;
42
    public Object pickMeUp;
42
   
43
Line 79... Line 80...
79
   
80
80
    public boolean isDone() {
81
    public boolean isDone() {
81
        return (STATE==IDLE);
82
        return (STATE == IDLE);
82
    }
83
    }
83
   
84
84
    public void close() {}
85
    public void close() {
-
 
86
    }
85
   
87
86
    // ****************** Forwarding functions ***********************  
88
    // ****************** Forwarding functions ***********************
87
    public void resetForwarding() {
89
    public void resetForwarding() {
88
        String init = getForwardSyx(0);
90
        String init = getForwardSyx(0);
89
        sendSyx(init);
91
        sendSyx(init);
Line 104... Line 106...
104
    public void scanHardware() {
106
    public void scanHardware() {
105
        if (isDone()) {
107
        if (isDone()) {
106
            setForwarding(15);
108
            setForwarding(15);
107
            String message = SIDSysexInfo.pingSysex;
109
            String message = SIDSysexInfo.pingSysex;
108
            message = message.replace("<device>", zeroPadToHex(masterCore));
110
            message = message.replace("<device>", zeroPadToHex(masterCore));
109
            progress = new ProgressMonitor(null, "", "Receiving SysEx data...", 0, 1);
111
            progress = new ProgressMonitor(null, "", "Receiving SysEx data...",
-
 
112
                    0, 1);
110
            timer.start();
113
            timer.start();
111
            STATE = SCANNING;
114
            STATE = SCANNING;
112
            sendSyx(message);
115
            sendSyx(message);
113
        }
116
        }
114
    }
117
    }
Line 137... Line 140...
137
            requestPatch = new int[]{patch};
140
            requestPatch = new int[] { patch };
138
            requestBank = bank;
141
            requestBank = bank;
139
            timer.start();
142
            timer.start();
140
            requestCount = 0;      
143
            requestCount = 0;
141
            tempSyxType = PATCH;
144
            tempSyxType = PATCH;
142
            progress = new ProgressMonitor(null, "", "Receiving SysEx data...", 0, requestPatch.length);       
145
            progress = new ProgressMonitor(null, "", "Receiving SysEx data...",
-
 
146
                    0, requestPatch.length);
143
            STATE = COLLECTING;        
147
            STATE = COLLECTING;
144
            String message = SIDSysexInfo.editPatchRequestSysex;
148
            String message = SIDSysexInfo.editPatchRequestSysex;
145
            message = message.replace("<device>", zeroPadToHex(coreNumber));
149
            message = message.replace("<device>", zeroPadToHex(coreNumber));
146
            sendSyx(message);
150
            sendSyx(message);
147
        }
151
        }
Line 152... Line 156...
152
        if (requestCount < requestPatch.length) {
156
        if (requestCount < requestPatch.length) {
153
            timer.restart();
157
            timer.restart();
154
            String message = SIDSysexInfo.hardPatchRequestSysex;
158
            String message = SIDSysexInfo.hardPatchRequestSysex;
155
            message = message.replace("<device>", "00");
159
            message = message.replace("<device>", "00");
156
            message = message.replace("<bank>", zeroPadToHex(requestBank));    
160
            message = message.replace("<bank>", zeroPadToHex(requestBank));
-
 
161
            message = message.replace("<patch>",
157
            message = message.replace("<patch>", zeroPadToHex(requestPatch[requestCount]));
162
                    zeroPadToHex(requestPatch[requestCount]));
158
            sendSyx(message);
163
            sendSyx(message);
159
        } else {
164
        } else {
160
            stopRequest();
165
            stopRequest();
161
        }
166
        }
162
    }
167
    }
163
   
168
164
    private void startRequest(Object type) {
169
    private void startRequest(Object type) {
165
        timer.start();
170
        timer.start();
166
        requestCount = -1;     
171
        requestCount = -1;
167
        tempSyxType = type;
172
        tempSyxType = type;
168
        progress = new ProgressMonitor(null, "", "Receiving SysEx data...", 0, requestPatch.length);       
173
        progress = new ProgressMonitor(null, "", "Receiving SysEx data...", 0,
-
 
174
                requestPatch.length);
169
        STATE = COLLECTING;
175
        STATE = COLLECTING;
170
        requestNext();
176
        requestNext();
171
    }
177
    }
172
       
178
173
    private void stopRequest() {
179
    private void stopRequest() {
Line 177... Line 183...
177
            progress.close();
183
            progress.close();
178
        }
184
        }
179
    }
185
    }
180
       
186
181
    private void scanSyx(String m) {
187
    private void scanSyx(String m) {
-
 
188
        if (progress.isCanceled()
182
        if (progress.isCanceled() || (tempResponse.substring(0, 5).equals("ERROR"))) {
189
                || (tempResponse.substring(0, 5).equals("ERROR"))) {
183
            stopScan();
190
            stopScan();
184
        } else if (tempResponse.substring(0, 12).equals("ACKNOWLEDGED")) {
191
        } else if (tempResponse.substring(0, 12).equals("ACKNOWLEDGED")) {
185
            stopScan();
192
            stopScan();
186
            pickMeUp = Integer.parseInt(m.substring(14, 16),16);
193
            pickMeUp = Integer.parseInt(m.substring(14, 16), 16);
187
            setChanged();
194
            setChanged();
Line 192... Line 199...
192
       
199
193
    protected void collectSyx(String m) {
200
    protected void collectSyx(String m) {
194
        if (progress.isCanceled()) {
201
        if (progress.isCanceled()) {
195
            stopRequest();
202
            stopRequest();
196
        } else {   
203
        } else {
197
            if (!(m.indexOf(SIDSysexInfo.acknowledgedSysex.replace("<device>", "00"))== 0)) {
204
            if (!(m.indexOf(SIDSysexInfo.acknowledgedSysex.replace("<device>",
-
 
205
                    "00")) == 0)) {
198
                if(m.substring(0, 2).equalsIgnoreCase("F0") ) {       // select next array item with each F0
206
                if (m.substring(0, 2).equalsIgnoreCase("F0")) { // select next
-
 
207
                    // array item
-
 
208
                    // with each F0
199
                    tempSyx = m;
209
                    tempSyx = m;
200
                } else {
210
                } else {
201
                    if ( m.substring(0, 2).equalsIgnoreCase("F7") ) { // for windows (1024 byte limit, F7 added at beginning of next chunk)
211
                    if (m.substring(0, 2).equalsIgnoreCase("F7")) { // for
-
 
212
                        // windows
-
 
213
                        // (1024
-
 
214
                        // byte
-
 
215
                        // limit, F7
-
 
216
                        // added at
-
 
217
                        // beginning
-
 
218
                        // of next
-
 
219
                        // chunk)
202
                        m = m.substring(2);
220
                        m = m.substring(2);
203
                    }
221
                    }
204
                    tempSyx += m;
222
                    tempSyx += m;
205
                }
223
                }
206
                timer.restart();
224
                timer.restart();
Line 235... Line 253...
235
    public boolean statusCheck(String status) {
253
    public boolean statusCheck(String status) {
236
        boolean b = false;
254
        boolean b = false;
237
        if (status=="succesful") {
255
        if (status == "succesful") {
238
            b = true;
256
            b = true;
239
        } else if (status=="checksum error") {
257
        } else if (status == "checksum error") {
240
            JOptionPane.showMessageDialog(null,"Checksum error!","Error",JOptionPane.ERROR_MESSAGE);
258
            JOptionPane.showMessageDialog(null, "Checksum error!", "Error",
-
 
259
                    JOptionPane.ERROR_MESSAGE);
241
        } else if (status=="parse error error") {
260
        } else if (status == "parse error error") {
-
 
261
            JOptionPane.showMessageDialog(null,
242
            JOptionPane.showMessageDialog(null,"An error occured while parsing a patch!","Error",JOptionPane.ERROR_MESSAGE);
262
                    "An error occured while parsing a patch!", "Error",
-
 
263
                    JOptionPane.ERROR_MESSAGE);
243
        }      
264
        }
244
        return b;
265
        return b;
245
    }
266
    }
246
   
267
247
    // ****************** Transmit functions ***********************
268
    // ****************** Transmit functions ***********************
Line 250... Line 271...
250
            String[] s = new String[p.length+1];   
271
            String[] s = new String[p.length + 1];
251
            s[0] = getForwardSyx(0);
272
            s[0] = getForwardSyx(0);
252
            for(int i=0;i<p.length;i++) {
273
            for (int i = 0; i < p.length; i++) {
253
                String dataStr = p[i].getSysexString();
274
                String dataStr = p[i].getSysexString();
254
                String strMessage = SIDSysexInfo.hardPatchDumpSysex;
275
                String strMessage = SIDSysexInfo.hardPatchDumpSysex;
255
                strMessage = strMessage.replace("<device>", zeroPadToHex(masterCore));
276
                strMessage = strMessage.replace("<device>",
-
 
277
                        zeroPadToHex(masterCore));
256
                strMessage = strMessage.replace("<bank>", zeroPadToHex(bankNumber));   
278
                strMessage = strMessage.replace("<bank>",
-
 
279
                        zeroPadToHex(bankNumber));
257
                strMessage = strMessage.replace("<patch>", zeroPadToHex(patchNumber[i]));
280
                strMessage = strMessage.replace("<patch>",
-
 
281
                        zeroPadToHex(patchNumber[i]));
258
                strMessage = strMessage.replace("<data><checksum>", dataStr);
282
                strMessage = strMessage.replace("<data><checksum>", dataStr);
259
                s[i+1] = strMessage;
283
                s[i + 1] = strMessage;
260
            }      
284
            }
261
            startDump(s);          
285
            startDump(s);
262
        }
286
        }
263
    }
287
    }
264
   
288
265
    public void dumpPatchToBuffer(Patch p, int cores) {
289
    public void dumpPatchToBuffer(Patch p, int cores) {
266
        if (isDone() && cores!=0) {
290
        if (isDone() && cores != 0) {
267
            String strMessage = SIDSysexInfo.editPatchDumpSysex;                           
291
            String strMessage = SIDSysexInfo.editPatchDumpSysex;
268
            strMessage = strMessage.replace("<device>", zeroPadToHex(masterCore));
292
            strMessage = strMessage.replace("<device>",
-
 
293
                    zeroPadToHex(masterCore));
269
            strMessage = strMessage.replace("<data><checksum>", p.getSysexString());
294
            strMessage = strMessage.replace("<data><checksum>", p
-
 
295
                    .getSysexString());
270
            startDump(new String[]{getForwardSyx(cores),strMessage});
296
            startDump(new String[] { getForwardSyx(cores), strMessage });
271
        }
297
        }
272
    }
298
    }
273
   
299
274
    public void dumpPatchBank(Bank b, int bankNumber) {
300
    public void dumpPatchBank(Bank b, int bankNumber) {
Line 285... Line 311...
285
   
311
286
    private void startDump(String[] s) {
312
    private void startDump(String[] s) {
287
        dumpStack = s;
313
        dumpStack = s;
288
        dumpCount = 0;
314
        dumpCount = 0;
289
        System.out.println("Transmitting SysEx data...");
315
        System.out.println("Transmitting SysEx data...");
290
        progress = new ProgressMonitor(null, "", "Transmitting SysEx data...", 0, dumpStack.length);
316
        progress = new ProgressMonitor(null, "", "Transmitting SysEx data...",
-
 
317
                0, dumpStack.length);
291
        timer.start();
318
        timer.start();
292
        STATE = DUMPING;
319
        STATE = DUMPING;
293
        tempResponse="";
320
        tempResponse = "";
294
        sendNext();
321
        sendNext();
295
    }
322
    }
Line 314... Line 341...
314
            timer.restart();
341
            timer.restart();
315
        }
342
        }
316
    }
343
    }
317
   
344
318
    protected void dumpSyx(String m) {
345
    protected void dumpSyx(String m) {
-
 
346
        if (progress.isCanceled()
319
        if (progress.isCanceled() || (tempResponse.substring(0, 5).equals("ERROR"))) {
347
                || (tempResponse.substring(0, 5).equals("ERROR"))) {
320
            stopDump();
348
            stopDump();
321
        } else if (tempResponse.substring(0, 12).equals("ACKNOWLEDGED")) {
349
        } else if (tempResponse.substring(0, 12).equals("ACKNOWLEDGED")) {
322
            tempResponse="";
350
            tempResponse = "";
323
            sendNext();        
351
            sendNext();
324
        }
352
        }
325
    }
353
    }
326
   
354
327
    // ****************** General functions ***********************
355
    // ****************** General functions ***********************
328
    public void send(MidiMessage message, long timestamp) {
356
    public void send(MidiMessage message, long timestamp) {
329
        String m = MidiUtils.getHexString(message.getMessage()).replace(" ", "");
357
        String m = MidiUtils.getHexString(message.getMessage())
-
 
358
                .replace(" ", "");
330
       
359
331
        if (syxErrorChk) {
360
        if (syxErrorChk) {
332
            checkError(m);
361
            checkError(m);
333
        }
362
        }
334
       
363
Line 355... Line 384...
355
            }
384
            }
356
           
385
357
            if (STATE==SCANNING) {
386
            if (STATE == SCANNING) {
358
                stopScan();
387
                stopScan();
359
            }
388
            }
-
 
389
            JOptionPane
-
 
390
                    .showMessageDialog(
-
 
391
                            null,
360
            JOptionPane.showMessageDialog(null,"The MBSID V2 is not responding. Please check all connections!","Error",JOptionPane.ERROR_MESSAGE);
392
                            "The MBSID V2 is not responding. Please check all connections!",
-
 
393
                            "Error", JOptionPane.ERROR_MESSAGE);
361
        }
394
        }
362
    }
395
    }
363
   
396
364
    protected void checkError(String m) {
397
    protected void checkError(String m) {
365
        if (m.indexOf(SIDSysexInfo.acknowledgedSysex.replace("<device>", "00"))== 0) {
398
        if (m.indexOf(SIDSysexInfo.acknowledgedSysex.replace("<device>", "00")) == 0) {
366
            tempResponse="ACKNOWLEDGED" + m.substring(14, 16); 
399
            tempResponse = "ACKNOWLEDGED" + m.substring(14, 16);
367
        }else if (m.equals(SIDSysexInfo.error1Sysex.replace("<device>", "00"))) {
400
        } else if (m.equals(SIDSysexInfo.error1Sysex.replace("<device>", "00"))) {
368
            tempResponse="ERROR1";
401
            tempResponse = "ERROR1";
-
 
402
            JOptionPane.showMessageDialog(null,
369
            JOptionPane.showMessageDialog(null,"MBSID says: Received less bytes then expected!","Error",JOptionPane.ERROR_MESSAGE);
403
                    "MBSID says: Received less bytes then expected!", "Error",
-
 
404
                    JOptionPane.ERROR_MESSAGE);
370
        }else if (m.equals(SIDSysexInfo.error2Sysex.replace("<device>", "00"))) {
405
        } else if (m.equals(SIDSysexInfo.error2Sysex.replace("<device>", "00"))) {
371
            tempResponse="ERROR2";
406
            tempResponse = "ERROR2";
372
            JOptionPane.showMessageDialog(null,"MBSID says: Wrong checksum!","Error",JOptionPane.ERROR_MESSAGE);
407
            JOptionPane.showMessageDialog(null, "MBSID says: Wrong checksum!",
-
 
408
                    "Error", JOptionPane.ERROR_MESSAGE);
373
        }else if (m.equals(SIDSysexInfo.error3Sysex.replace("<device>", "00"))) {
409
        } else if (m.equals(SIDSysexInfo.error3Sysex.replace("<device>", "00"))) {
374
            tempResponse="ERROR3";
410
            tempResponse = "ERROR3";
-
 
411
            JOptionPane
-
 
412
                    .showMessageDialog(
-
 
413
                            null,
375
            JOptionPane.showMessageDialog(null,"MBSID says: Bankstick or patch/drumset/ensemble not available!","Error",JOptionPane.ERROR_MESSAGE);
414
                            "MBSID says: Bankstick or patch/drumset/ensemble not available!",
-
 
415
                            "Error", JOptionPane.ERROR_MESSAGE);
376
        }else if (m.equals(SIDSysexInfo.error4Sysex.replace("<device>", "00"))) {
416
        } else if (m.equals(SIDSysexInfo.error4Sysex.replace("<device>", "00"))) {
377
            tempResponse="ERROR4";
417
            tempResponse = "ERROR4";
-
 
418
            JOptionPane.showMessageDialog(null,
378
            JOptionPane.showMessageDialog(null,"MBSID says: Parameter not available!","Error",JOptionPane.ERROR_MESSAGE);
419
                    "MBSID says: Parameter not available!", "Error",
-
 
420
                    JOptionPane.ERROR_MESSAGE);
379
        }else if (m.equals(SIDSysexInfo.error5Sysex.replace("<device>", "00"))) {
421
        } else if (m.equals(SIDSysexInfo.error5Sysex.replace("<device>", "00"))) {
380
            tempResponse="ERROR5";
422
            tempResponse = "ERROR5";
-
 
423
            JOptionPane.showMessageDialog(null,
381
            JOptionPane.showMessageDialog(null,"MBSID says: RAM access not supported!","Error",JOptionPane.ERROR_MESSAGE);
424
                    "MBSID says: RAM access not supported!", "Error",
-
 
425
                    JOptionPane.ERROR_MESSAGE);
382
        }else if (m.equals(SIDSysexInfo.error6Sysex.replace("<device>", "00"))) {
426
        } else if (m.equals(SIDSysexInfo.error6Sysex.replace("<device>", "00"))) {
383
            tempResponse="ERROR6";
427
            tempResponse = "ERROR6";
-
 
428
            JOptionPane.showMessageDialog(null,
384
            JOptionPane.showMessageDialog(null,"MBSID says: BankStick too small for 128 patches!","Error",JOptionPane.ERROR_MESSAGE);
429
                    "MBSID says: BankStick too small for 128 patches!",
-
 
430
                    "Error", JOptionPane.ERROR_MESSAGE);
385
        }else {
431
        } else {
386
            //System.out.println("MBSID: " + m);                    
432
            // System.out.println("MBSID: " + m);
387
        }  
433
        }
388
    }
434
    }
389
   
435
Line 391... Line 437...
391
        SysexMessage sysexMessage = new SysexMessage();
437
        SysexMessage sysexMessage = new SysexMessage();
392
        try {
438
        try {
393
            byte[] abMessage = toByteArray(s);
439
            byte[] abMessage = toByteArray(s);
394
            sysexMessage.setMessage(abMessage, abMessage.length);  
440
            sysexMessage.setMessage(abMessage, abMessage.length);
395
        } catch (Exception e) {        
441
        } catch (Exception e) {
-
 
442
            JOptionPane.showMessageDialog(null,
396
            JOptionPane.showMessageDialog(null,"The System Exclusive data could not be sent!","Error",JOptionPane.ERROR_MESSAGE);
443
                    "The System Exclusive data could not be sent!", "Error",
-
 
444
                    JOptionPane.ERROR_MESSAGE);
397
        }
445
        }
398
        receiver.send(sysexMessage, -1);
446
        receiver.send(sysexMessage, -1);
399
    }
447
    }
400
   
448
401
    protected byte[] toByteArray(String s) {
449
    protected byte[] toByteArray(String s) {
402
        int nLengthInBytes = s.length() / 2;
450
        int nLengthInBytes = s.length() / 2;
403
        byte[]  abMessage = new byte[nLengthInBytes];
451
        byte[] abMessage = new byte[nLengthInBytes];
404
        for (int i = 0; i < nLengthInBytes; i++)
452
        for (int i = 0; i < nLengthInBytes; i++) {
405
        {
-
 
406
            abMessage[i] = (byte) Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16);             
453
            abMessage[i] = (byte) Integer.parseInt(s
-
 
454
                    .substring(i * 2, i * 2 + 2), 16);
407
        }      
455
        }
408
        return abMessage;
456
        return abMessage;
409
    }
457
    }
410
458
411
    protected String zeroPadToHex(int i) {
459
    protected String zeroPadToHex(int i) {