27 |
import java.io.File; |
import java.io.File; |
28 |
import java.text.DateFormat; |
import java.text.DateFormat; |
29 |
import java.util.logging.Level; |
import java.util.logging.Level; |
30 |
|
import java.util.zip.GZIPOutputStream; |
31 |
|
|
32 |
import org.jsampler.view.JSChannel; |
import org.jsampler.view.JSChannel; |
33 |
import org.jsampler.view.JSChannelsPane; |
import org.jsampler.view.JSChannelsPane; |
41 |
import org.linuxsampler.lscp.Parameter; |
import org.linuxsampler.lscp.Parameter; |
42 |
import org.linuxsampler.lscp.SamplerChannel; |
import org.linuxsampler.lscp.SamplerChannel; |
43 |
|
|
44 |
|
import org.w3c.dom.Document; |
45 |
|
import org.w3c.dom.Element; |
46 |
|
|
47 |
import static org.jsampler.CC.preferences; |
import static org.jsampler.CC.preferences; |
48 |
import static org.jsampler.JSI18n.i18n; |
import static org.jsampler.JSI18n.i18n; |
49 |
|
|
309 |
return s; |
return s; |
310 |
} |
} |
311 |
|
|
312 |
|
public static byte[] |
313 |
|
exportInstrMapsToRGD() { |
314 |
|
Document doc = DOMUtils.createEmptyDocument(); |
315 |
|
|
316 |
|
Element rgd = doc.createElement("rosegarden-data"); |
317 |
|
rgd.setAttribute("version", "1.7.2"); |
318 |
|
doc.appendChild(rgd); |
319 |
|
|
320 |
|
Element studio = doc.createElement("studio"); |
321 |
|
studio.setAttribute("thrufilter", "0"); |
322 |
|
studio.setAttribute("recordfilter", "0"); |
323 |
|
rgd.appendChild(studio); |
324 |
|
|
325 |
|
MidiInstrumentMap[] maps = CC.getSamplerModel().getMidiInstrumentMaps(); |
326 |
|
for(int i = 0; i < maps.length; i++) { |
327 |
|
Element dev = doc.createElement("device"); |
328 |
|
dev.setAttribute("id", String.valueOf(i)); |
329 |
|
dev.setAttribute("name", "LinuxSampler: " + maps[i].getName()); |
330 |
|
dev.setAttribute("type", "midi"); |
331 |
|
studio.appendChild(dev); |
332 |
|
|
333 |
|
Element el = doc.createElement("librarian"); |
334 |
|
el.setAttribute("name", "Grigor Iliev"); |
335 |
|
el.setAttribute("email", "grigor@grigoriliev.com"); |
336 |
|
dev.appendChild(el); |
337 |
|
|
338 |
|
exportInstrumentsToRGD(maps[i], dev); |
339 |
|
} |
340 |
|
|
341 |
|
ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
342 |
|
DOMUtils.writeObject(doc, baos); |
343 |
|
|
344 |
|
// Hack to insert the file name in the archive |
345 |
|
byte[] data2 = null; |
346 |
|
try { |
347 |
|
ByteArrayOutputStream baos2 = new ByteArrayOutputStream(); |
348 |
|
GZIPOutputStream gzos = new GZIPOutputStream(baos2); |
349 |
|
gzos.write(baos.toByteArray()); |
350 |
|
gzos.finish(); |
351 |
|
byte[] data = baos2.toByteArray(); |
352 |
|
data[3] = 8; // File name |
353 |
|
byte[] fn = "x-rosegarden-device".getBytes("US-ASCII"); |
354 |
|
int fnsize = fn.length; |
355 |
|
data2 = new byte[data.length + fnsize + 1]; |
356 |
|
|
357 |
|
for(int i = 0; i < 10; i++) data2[i] = data[i]; |
358 |
|
for(int i = 0; i < fnsize; i++) data2[i + 10] = fn[i]; |
359 |
|
data2[10 + fnsize] = 0; |
360 |
|
for(int i = 10; i < data.length; i++) data2[i + fnsize + 1] = data[i]; |
361 |
|
|
362 |
|
} catch(Exception e) { |
363 |
|
e.printStackTrace(); |
364 |
|
} |
365 |
|
////////////// |
366 |
|
|
367 |
|
return data2; |
368 |
|
} |
369 |
|
|
370 |
|
private static void |
371 |
|
exportInstrumentsToRGD(MidiInstrumentMap map, Element el) { |
372 |
|
int bank = -1; |
373 |
|
int bnkOffset = preferences().getIntProperty(JSPrefs.FIRST_MIDI_BANK_NUMBER); |
374 |
|
Element elBank = null; |
375 |
|
|
376 |
|
for(MidiInstrument i : map.getAllMidiInstruments()) { |
377 |
|
int newBank = i.getInfo().getMidiBank(); |
378 |
|
if(newBank != bank) { |
379 |
|
bank = newBank; |
380 |
|
elBank = el.getOwnerDocument().createElement("bank"); |
381 |
|
elBank.setAttribute("name", "Bank " + (bank + bnkOffset)); |
382 |
|
elBank.setAttribute("msb", String.valueOf((bank >> 7) & 0x7f)); |
383 |
|
elBank.setAttribute("lsb", String.valueOf(bank & 0x7f)); |
384 |
|
el.appendChild(elBank); |
385 |
|
} |
386 |
|
|
387 |
|
Element elProgram = el.getOwnerDocument().createElement("program"); |
388 |
|
elProgram.setAttribute("id", String.valueOf(i.getInfo().getMidiProgram())); |
389 |
|
elProgram.setAttribute("name", i.getName()); |
390 |
|
|
391 |
|
elBank.appendChild(elProgram); |
392 |
|
} |
393 |
|
} |
394 |
|
|
395 |
public static String |
public static String |
396 |
exportSessionToLscpScript() { |
exportSessionToLscpScript() { |
397 |
CC.getSamplerModel().setModified(false); |
CC.getSamplerModel().setModified(false); |