Subversion Repositories svn.mios

Rev

Rev 213 | 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.sidlibr;
22
 
628 adamjking 23
import java.io.File;
213 tk 24
import java.io.FileInputStream;
25
import java.io.FileOutputStream;
26
import java.io.IOException;
27
 
628 adamjking 28
import javax.sound.midi.Receiver;
29
import javax.swing.JFileChooser;
30
import javax.swing.JOptionPane;
31
import javax.swing.filechooser.FileFilter;
213 tk 32
 
33
import org.midibox.midi.MidiUtils;
34
import org.midibox.sidedit.SIDSysexInfo;
35
 
36
public class FileHandler {
37
    final JFileChooser fc = new JFileChooser();
628 adamjking 38
 
213 tk 39
    public FileHandler() {
40
        fc.addChoosableFileFilter(new SysExFilter());
41
    }
628 adamjking 42
 
213 tk 43
    public void savePatchBank(Bank b, int bankNumber) {
44
        try {
45
            saveData(toByteArray(getBankDumpSysex(b, bankNumber)));
46
        } catch (IOException e) {
628 adamjking 47
            JOptionPane.showMessageDialog(null,
48
                    "An error has occurred while writing the file!", "Error",
49
                    JOptionPane.ERROR_MESSAGE);
213 tk 50
        }
51
    }
628 adamjking 52
 
213 tk 53
    public void saveEnsembleBank() {
628 adamjking 54
 
213 tk 55
    }
628 adamjking 56
 
213 tk 57
    public void savePatch(Patch p, int bankNumber, int patchNumber) {
58
        try {
59
            saveData(toByteArray(getPatchDumpSysex(p, bankNumber, patchNumber)));
60
        } catch (IOException e) {
628 adamjking 61
            JOptionPane.showMessageDialog(null,
62
                    "An error has occurred while writing the file!", "Error",
63
                    JOptionPane.ERROR_MESSAGE);
213 tk 64
        }
65
    }
628 adamjking 66
 
213 tk 67
    public void saveEnsemble() {
628 adamjking 68
 
213 tk 69
    }
628 adamjking 70
 
213 tk 71
    public Bank loadPatchBank(Receiver receiver) {
628 adamjking 72
        Bank b = null;
213 tk 73
        try {
74
            byte[] data = loadData();
628 adamjking 75
            if (data != null) {
76
                String s = MidiUtils.getHexString(data).replace(" ", "");
77
                if ((s.length() != 128 * Bank.patchSize)
78
                        && (s.length() != 64 * Bank.patchSize)) {
79
                    JOptionPane
80
                            .showMessageDialog(
81
                                    null,
82
                                    "This file does not contain a bank with 64 or 128 valid patches!",
83
                                    "Error", JOptionPane.ERROR_MESSAGE);
84
                } else {
85
                    Bank tempBank = new Bank(receiver);
213 tk 86
                    String status = tempBank.parseBankSyx(s);
87
                    if (statusCheck(status)) {
628 adamjking 88
                        b = tempBank;
89
                    }
213 tk 90
                }
91
            }
92
        } catch (IOException e) {
628 adamjking 93
            JOptionPane.showMessageDialog(null,
94
                    "An error has occurred while reading the file!", "Error",
95
                    JOptionPane.ERROR_MESSAGE);
213 tk 96
        }
97
        return b;
98
    }
628 adamjking 99
 
213 tk 100
    public Patch loadPatch(Receiver receiver) {
101
        Patch p = null;
102
        try {
103
            byte[] data = loadData();
628 adamjking 104
            if (data != null) {
105
                String s = MidiUtils.getHexString(data).replace(" ", "");
106
                ;
107
                if (s.length() != Bank.patchSize) {
108
                    JOptionPane.showMessageDialog(null,
109
                            "This file does not contain a valid patch!",
110
                            "Error", JOptionPane.ERROR_MESSAGE);
111
                } else {
112
                    Patch tempPatch = new Patch(receiver);
213 tk 113
                    String status = tempPatch.parsePatch(s);
114
                    if (statusCheck(status)) {
628 adamjking 115
                        p = tempPatch;
116
                    }
213 tk 117
                }
118
            }
119
        } catch (IOException e) {
628 adamjking 120
            JOptionPane.showMessageDialog(null,
121
                    "An error has occurred while reading the file!", "Error",
122
                    JOptionPane.ERROR_MESSAGE);
213 tk 123
        }
124
        return p;
125
    }
628 adamjking 126
 
213 tk 127
    public void loadEnsemble() {
628 adamjking 128
 
213 tk 129
    }
130
 
131
    public void loadEnsembleBank() {
628 adamjking 132
 
213 tk 133
    }
628 adamjking 134
 
213 tk 135
    private void saveData(byte[] b) throws IOException {
136
        boolean write = false;
137
        while (!write) {
138
            int returnVal = fc.showSaveDialog(null);
139
            if (returnVal == JFileChooser.APPROVE_OPTION) {
628 adamjking 140
                if (fc.getSelectedFile().exists()) {
141
                    int response = JOptionPane.showConfirmDialog(null,
142
                            "File already exists! Do you want to overwrite?",
143
                            "Overwrite?", JOptionPane.YES_NO_OPTION,
144
                            JOptionPane.QUESTION_MESSAGE);
145
                    if (response == JOptionPane.YES_OPTION) {
146
                        write = true;
147
                    }
148
                } else {
149
                    write = true;
150
                }
151
 
213 tk 152
            } else {
153
                break;
154
            }
155
        }
156
        if (write) {
157
            File file = fc.getSelectedFile();
158
            FileOutputStream out = null;
628 adamjking 159
            try {
160
                out = new FileOutputStream(file);
161
                for (int i = 0; i < b.length; i++) {
162
                    out.write(b[i]);
163
                }
164
            } finally {
165
                if (out != null) {
166
                    out.close();
167
                }
168
            }
213 tk 169
        }
628 adamjking 170
    }
171
 
213 tk 172
    private byte[] loadData() throws IOException {
173
        byte[] b = null;
174
        int returnVal = fc.showOpenDialog(null);
175
        if (returnVal == JFileChooser.APPROVE_OPTION) {
628 adamjking 176
            File file = fc.getSelectedFile();
177
            FileInputStream in = null;
178
            b = new byte[(int) file.length()];
179
            try {
180
                in = new FileInputStream(file);
181
                for (int i = 0; i < file.length(); i++) {
182
                    b[i] = (byte) in.read();
183
                }
184
            } finally {
185
                if (in != null) {
186
                    in.close();
187
                }
188
            }
189
        }
213 tk 190
        return b;
628 adamjking 191
    }
192
 
193
    private String getBankDumpSysex(Bank b, int bankNumber) {
194
        String s = "";
213 tk 195
        for (int i = 0; i < b.bankSize; i++) {
628 adamjking 196
            s = s + getPatchDumpSysex(b.getPatchAt(i), bankNumber, i);
213 tk 197
        }
198
        return s;
199
    }
628 adamjking 200
 
201
    private String getPatchDumpSysex(Patch p, int bankNumber, int patchNumber) {
213 tk 202
        String dataStr = p.getSysexString();
203
        String patchStr = Integer.toHexString(patchNumber);
628 adamjking 204
        if (patchStr.length() == 1) {
213 tk 205
            patchStr = "0" + patchStr;
628 adamjking 206
        }
213 tk 207
        String strMessage = SIDSysexInfo.hardPatchDumpSysex;
208
        strMessage = strMessage.replace("<device>", "00");
628 adamjking 209
        strMessage = strMessage.replace("<bank>", "0"
210
                + Integer.toHexString(bankNumber));
213 tk 211
        strMessage = strMessage.replace("<patch>", patchStr);
628 adamjking 212
        strMessage = strMessage.replace("<data><checksum>", dataStr);
213 tk 213
        return strMessage;
214
    }
628 adamjking 215
 
216
    private byte[] toByteArray(String s) {
217
        int nLengthInBytes = s.length() / 2;
218
        byte[] abMessage = new byte[nLengthInBytes];
219
        for (int i = 0; i < nLengthInBytes; i++) {
220
            abMessage[i] = (byte) Integer.parseInt(s
221
                    .substring(i * 2, i * 2 + 2), 16);
222
        }
213 tk 223
        return abMessage;
224
    }
628 adamjking 225
 
226
    private boolean statusCheck(String status) {
213 tk 227
        boolean b = false;
628 adamjking 228
        if (status == "succesful") {
213 tk 229
            b = true;
628 adamjking 230
        } else if (status == "checksum error") {
231
            JOptionPane.showMessageDialog(null, "Checksum error!", "Error",
232
                    JOptionPane.ERROR_MESSAGE);
233
        } else if (status == "parse error error") {
234
            JOptionPane.showMessageDialog(null,
235
                    "An error occured while parsing a patch!", "Error",
236
                    JOptionPane.ERROR_MESSAGE);
237
        }
213 tk 238
        return b;
239
    }
240
 
628 adamjking 241
    public class SysExFilter extends FileFilter {
242
        public final static String syx = "syx";
213 tk 243
 
628 adamjking 244
        public String getExtension(File f) {
245
            String ext = null;
246
            String s = f.getName();
247
            int i = s.lastIndexOf('.');
213 tk 248
 
628 adamjking 249
            if (i > 0 && i < s.length() - 1) {
250
                ext = s.substring(i + 1).toLowerCase();
251
            }
252
            return ext;
253
        }
213 tk 254
 
628 adamjking 255
        public boolean accept(File f) {
256
            if (f.isDirectory()) {
257
                return true;
258
            }
259
            String extension = getExtension(f);
260
            if (extension != null) {
261
                if (extension.equals(syx)) {
262
                    return true;
263
                } else {
264
                    return false;
265
                }
266
            }
267
            return false;
268
        }
269
 
270
        public String getDescription() {
271
            return "SysEx files (*.syx)";
272
        }
273
    }
213 tk 274
}